[open-ils-commits] [GIT] Evergreen ILS branch rel_2_4_mergery created. 34aef8b8be3d70593b243761d1191af466fe6797

Evergreen Git git at git.evergreen-ils.org
Wed Jun 12 22:17:08 EDT 2013


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Evergreen ILS".

The branch, rel_2_4_mergery has been created
        at  34aef8b8be3d70593b243761d1191af466fe6797 (commit)

- Log -----------------------------------------------------------------
commit 34aef8b8be3d70593b243761d1191af466fe6797
Author: Mike Rylander <mrylander at gmail.com>
Date:   Tue Jun 11 16:44:35 2013 -0400

    Use the centralized initialization method for QP
    
    QueryParser maintains an effective singleton for internal configuration of
    the driver in order to avoid going to the database on every search request
    to gather configuration parameters.  There is also a centralized sub that
    has the task of properly configuring said singleton.  Previous to this commit
    we were not using that centralized initializer in one case, and that case
    happened to be the most important initialization of QP in all of Evergreen.
    The fallout from that was that some configuration was not being gathered
    and passed to QueryParser, resulting in incorrect search SQL being generated.
    
    This is rectified by using the centralized initializer everywhere that it
    is needed and can be used -- and particularly in the effected case.
    
    Signed-off-by: Mike Rylander <mrylander at gmail.com>
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/metabib.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/metabib.pm
index 9709fa8..32d2cab 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/metabib.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/metabib.pm
@@ -3202,46 +3202,7 @@ sub query_parser_fts_wrapper {
     my $parser = $OpenILS::Application::Storage::QParser;
     $parser->use;
 
-    if (!$parser->initialization_complete) {
-        my $cstore = OpenSRF::AppSession->create( 'open-ils.cstore' );
-        $parser->initialize(
-            config_record_attr_index_norm_map =>
-                $cstore->request(
-                    'open-ils.cstore.direct.config.record_attr_index_norm_map.search.atomic',
-                    { id => { "!=" => undef } },
-                    { flesh => 1, flesh_fields => { crainm => [qw/norm/] }, order_by => [{ class => "crainm", field => "pos" }] }
-                )->gather(1),
-            search_relevance_adjustment         =>
-                $cstore->request(
-                    'open-ils.cstore.direct.search.relevance_adjustment.search.atomic',
-                    { id => { "!=" => undef } }
-                )->gather(1),
-            config_metabib_field                =>
-                $cstore->request(
-                    'open-ils.cstore.direct.config.metabib_field.search.atomic',
-                    { id => { "!=" => undef } }
-                )->gather(1),
-            config_metabib_search_alias         =>
-                $cstore->request(
-                    'open-ils.cstore.direct.config.metabib_search_alias.search.atomic',
-                    { alias => { "!=" => undef } }
-                )->gather(1),
-            config_metabib_field_index_norm_map =>
-                $cstore->request(
-                    'open-ils.cstore.direct.config.metabib_field_index_norm_map.search.atomic',
-                    { id => { "!=" => undef } },
-                    { flesh => 1, flesh_fields => { cmfinm => [qw/norm/] }, order_by => [{ class => "cmfinm", field => "pos" }] }
-                )->gather(1),
-            config_record_attr_definition       =>
-                $cstore->request(
-                    'open-ils.cstore.direct.config.record_attr_definition.search.atomic',
-                    { name => { "!=" => undef } }
-                )->gather(1),
-        );
-
-        $cstore->disconnect;
-        die("Cannot initialize $parser!") unless ($parser->initialization_complete);
-    }
+    _initialize_parser($parser) unless $parser->initialization_complete;
 
 	if (! scalar( keys %{$args{searches}} )) {
 		die "No search arguments were passed to ".$self->api_name;

commit 9dad67f69610a7956d0f2d938e7999ea4afa199c
Author: Mike Rylander <mrylander at gmail.com>
Date:   Tue Apr 30 16:45:55 2013 -0400

    Search clicked /and/ preceding sf values
    
    When looking for authority records to control a bib field, we currently
    search using exactly, and only, the subfield that was clicked.  This
    commit changes that so that the full field up to and including the clicked
    subfield is used in the simple authority heading search we perform to find
    the best-match (pivot) authority record.
    
    Signed-off-by: Mike Rylander <mrylander at gmail.com>
    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>

diff --git a/Open-ILS/xul/staff_client/server/cat/marcedit.js b/Open-ILS/xul/staff_client/server/cat/marcedit.js
index 9e85116..186e360 100644
--- a/Open-ILS/xul/staff_client/server/cat/marcedit.js
+++ b/Open-ILS/xul/staff_client/server/cat/marcedit.js
@@ -1716,10 +1716,17 @@ function browseAuthority (sf_popup, menu_id, target, sf, limit, page) {
         page = 0;
     }
 
+    var sf_string = '';
+    var sf_list = sf.parent().subfield;
+    for ( var i in sf_list) {
+        sf_string += sf_list[i].toString() + ' ';
+        if (sf_list[i] === sf) break;
+    }
+
     var url = '/opac/extras/browse/marcxml/'
         + type + '.refs'
         + '/1' // OU - currently unscoped
-        + '/' + sf.toString()
+        + '/' + sf_string
         + '/' + page
         + '/' + limit
     ;

commit 2955200d81f076fd3734d1293d1a8dce0710fa86
Author: Angela Kilsdonk <akilsdonk at esilibrary.com>
Date:   Tue Jun 11 10:56:01 2013 -0400

    Edits to documentation
    
    Edits to fit documentation structure.
    
    Signed-off-by: Angela Kilsdonk <akilsdonk at esilibrary.com>

diff --git a/docs/opac/advanced_features.txt b/docs/opac/advanced_features.txt
index 04dd267..f926239 100644
--- a/docs/opac/advanced_features.txt
+++ b/docs/opac/advanced_features.txt
@@ -10,7 +10,8 @@ Use the Catalog to Retrieve Records with Specified Date Ranges:
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
-*Search by Create Date or Range*
+Search by Create Date or Range
+++++++++++++++++++++++++++++++
 
 To find records that were created on or after a specific date, enter the term, create_date, and the date in the catalog search field.  For example, to find records that were created on or after April 1, 2013, enter the following into the catalog search field:
 
@@ -26,7 +27,8 @@ create_date(2013-04-01,2013-04-08)
 
 
 
-*Search by Edit Date or Range*
+Search by Edit Date or Range
+++++++++++++++++++++++++++++
 
 
 To find records that were edited on or before a specific date, enter the term, edit-date, and the date in the catalog search field.  The date should be preceded by a comma.   For example, to find records that were edited on or before April 1, 2013, enter the following into the catalog search field:
@@ -49,7 +51,8 @@ edit_date(2013-04-01,2013-04-08)
 
 
 
-*Search by Deleted Status*
+Search by Deleted Status
+++++++++++++++++++++++++
 
 
 To search for deleted records, enter in your catalog search field the term, edit_date, the date that you want to search, and the term, #deleted.  For example, to find records that were deleted on or after April 1, 2013, enter the following into the catalog search field:
diff --git a/docs/root.txt b/docs/root.txt
index 742a879..c562b3c 100644
--- a/docs/root.txt
+++ b/docs/root.txt
@@ -352,13 +352,13 @@ include::opac/my_lists.txt[]
 
 include::opac/kids_opac.txt[]
 
+include::opac/advanced_features.txt[]
+
 // Push titles down one level.
 :leveloffset: 1
 
 include::opac/search_form.txt[]
 
-include::opac/advanced_features.txt[]
-
 // Return to normal title levels.
 :leveloffset: 0
 

commit 40834d602db7aaf5912498308ba68b6e31d566e6
Author: Angela Kilsdonk <akilsdonk at esilibrary.com>
Date:   Mon Jun 10 16:17:08 2013 -0400

    Documentation for Binary MARC21 Feeds and search enhancements
    
    Documentation for Binary MARC21 Feeds and Bibliographic Search Enhancements added to opac/advanced_features.
    
    Signed-off-by: Angela Kilsdonk <akilsdonk at esilibrary.com>

diff --git a/docs/opac/advanced_features.txt b/docs/opac/advanced_features.txt
new file mode 100644
index 0000000..04dd267
--- /dev/null
+++ b/docs/opac/advanced_features.txt
@@ -0,0 +1,95 @@
+Bibliographic Search Enhancements
+---------------------------------
+
+Enhancements to the bibliographic search function enable you to search for records that were created, edited, or deleted within a date range. You can use the catalog interface or the record feed to search for records with specific date ranges.
+
+Note that all dates should be formatted as YYYY-MM-DD and should be included in parentheses.
+
+
+Use the Catalog to Retrieve Records with Specified Date Ranges:
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+*Search by Create Date or Range*
+
+To find records that were created on or after a specific date, enter the term, create_date, and the date in the catalog search field.  For example, to find records that were created on or after April 1, 2013, enter the following into the catalog search field:
+
+
+create_date(2013-04-01)
+
+
+To find records that were created within a specific date range, enter the term, create_date, followed by comma-separated dates in parentheses.  For example, to find records that were created between April 1, 2013 and April 8, 2013, enter the following into the catalog search field:
+
+
+create_date(2013-04-01,2013-04-08)
+
+
+
+
+*Search by Edit Date or Range*
+
+
+To find records that were edited on or before a specific date, enter the term, edit-date, and the date in the catalog search field.  The date should be preceded by a comma.   For example, to find records that were edited on or before April 1, 2013, enter the following into the catalog search field:
+
+
+edit_date(,2013-04-01)
+
+
+To find records that were edited on or after a sepcific date, enter the term, edit_date, and the date in the catalog search field.  For example, to find records that were edited on or after April 1, 2013, enter the following into the catalog search field:
+
+
+edit_date(2013-04-01)
+
+
+To find records that were edited within a specific range, enter the term, edit_date, followed by comma-separated dates in parentheses.  For example, to find records that were edited between April 1, 2013 and April 8, 2013, enter the following into the catalog search field:
+
+
+edit_date(2013-04-01,2013-04-08)
+
+
+
+
+*Search by Deleted Status*
+
+
+To search for deleted records, enter in your catalog search field the term, edit_date, the date that you want to search, and the term, #deleted.  For example, to find records that were deleted on or after April 1, 2013, enter the following into the catalog search field:
+
+edit_date(2013-04-01)#deleted
+
+
+
+To find records that were deleted within a specific range, enter the term, edit_date, followed by comma-separated dates in parentheses.  For example, to find records that were deleted between April 1, 2013 and April 8, 2013, enter the following into the catalog search field:
+
+
+edit_date(2013-04-01,2013-04-08)#deleted
+
+
+
+Use a Feed to Retrieve Records with Specified Date Ranges:
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+You can use a feed to retrieve records that were created, edited, or deleted within specific date ranges by adding the dates to the catalog's URL.  You can do this manually, or you can write a script that would automatically retrieve this information.
+
+To manually retrieve records that were created, edited, or deleted within a specific date, enter the terms and dates as specified above within the search terms in the URL.  For example, to retrieve records created on or after April 1, 2013, enter the following in your URL:
+
+
+http://test.esilibrary.com/opac/extras/opensearch/1.1/-/html-full?searchTerms=create_date(2013-04-01)&searchClass=keyword
+
+
+NOTE: To retrieve deleted records, replace the # with %23 in your URL.
+
+
+Binary MARC21 Feeds
+-------------------
+Evergreen's OpenSearch service can return search results in many formats, including HTML, MARCXML, and MODS.  As of version 2.4, it can also return results in binary MARC21 format.  
+
+When making an HTTP request to an Evergreen system using the OpenSearch API, you must include the term "marc21" in the appropriate location within the URL to retrieve a feed of MARC21 records in a binary format.  The following example demonstrates the appropriate form of the URL: 
+
+http://test.esilibrary.com/opac/extras/opensearch/1.1/-/marc21?searchTerms=create_date%282013-04-01%29&searchClass=keyword
+
+You can add this term manually to the URL produced by a catalog search, or you can create a script that would retrieve this information automatically.
+
+
+
+
+
diff --git a/docs/root.txt b/docs/root.txt
index 13af7bf..742a879 100644
--- a/docs/root.txt
+++ b/docs/root.txt
@@ -357,6 +357,8 @@ include::opac/kids_opac.txt[]
 
 include::opac/search_form.txt[]
 
+include::opac/advanced_features.txt[]
+
 // Return to normal title levels.
 :leveloffset: 0
 

commit 7c0f69735c5b8f434128240ec1084ddc68a4f90a
Author: Angela Kilsdonk <akilsdonk at esilibrary.com>
Date:   Mon Jun 10 15:29:20 2013 -0400

    Documentation for MARC Import Remove Fields
    
    MARC Import Remove Field documentation added to docs/admin
    
    Signed-off-by: Angela Kilsdonk <akilsdonk at esilibrary.com>

diff --git a/docs/admin/MARC_Import_Remove_Fields.txt b/docs/admin/MARC_Import_Remove_Fields.txt
new file mode 100644
index 0000000..8bb7506
--- /dev/null
+++ b/docs/admin/MARC_Import_Remove_Fields.txt
@@ -0,0 +1,57 @@
+MARC Import Remove Fields
+-------------------------
+
+MARC Import Remove Fields allows staff to configure MARC tags to be automatically removed from bibliographic records when they are imported into Evergreen.  This feature allows specific MARC tags to be removed from records that are imported through three different interfaces:
+
+* Cataloging -> Import Record from Z39.50
+* Cataloging -> MARC Batch Import/Export
+* Acquisitions -> Load MARC Order Records
+
+
+Create a MARC Import Remove Fields profile
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+To create a MARC Import Remove Fields profile, go to *Admin -> Server Administration -> MARC Import Remove Fields*.
+
+. Click *New Field Group*.
+. Assign the Field Group a *Label*.  This label will appear in the import interfaces.
+. Assign an Org Unit *Owner*.
+. Check the box next to *Always Apply* if you want Evergreen to apply this Remove Fields profile to all MARC records that are imported through the three affected interfaces.  If you do not select *Always Apply*, staff will have the option to choose which Remove Fields profile to use when importing records.
+. Click *Save*.
+. The profile that you created will now appear in the list of MARC Import Remove Fields.
+. Click on the hyperlinked *ID* number.  This will bring you into the Remove Fields profile to configure the MARC tags to be removed.
+. Click *New Field*. 
+. In the *Field*, enter the MARC tag to be removed.
+. Click *Save*.
+. Add *New Fields* until you have configured all the tags needed for this profile.
+. Click *Return to Groups* to go back to the list of Remove Field profiles.
+
+
+image::media/marc_import_remove_fields3.JPG[MARC Remove Fields Profile]
+
+
+Import Options
+~~~~~~~~~~~~~~
+The Label for each of the MARC Import Remove Fields profiles will appear on the three affected import screens.  To select a profile, check the box next to the desired Label before importing the records.
+
+*Cataloging -> Import Record from Z39.50*
+
+image::media/marc_import_remove_fields1.JPG[Import Record from Z39.50]
+{nbsp}
+
+*Cataloging -> MARC Batch Import/Export*
+
+image::media/marc_import_remove_fields2.JPG[MARC Batch Import/Export]
+{nbsp}
+
+*Acquisitions -> Load MARC Order Records*
+
+image::media/marc_import_remove_fields5.JPG[Load MARC Order Records]
+
+
+Permissions to use this Feature
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+The following permissions are required to use this feature:
+
+* CREATE_IMPORT_TRASH_FIELD
+* UPDATE_IMPORT_TRASH_FIELD
+* DELETE_IMPORT_TRASH_FIELD
diff --git a/docs/media/marc_import_remove_fields1.JPG b/docs/media/marc_import_remove_fields1.JPG
new file mode 100644
index 0000000..67e5731
Binary files /dev/null and b/docs/media/marc_import_remove_fields1.JPG differ
diff --git a/docs/media/marc_import_remove_fields2.JPG b/docs/media/marc_import_remove_fields2.JPG
new file mode 100644
index 0000000..71d658b
Binary files /dev/null and b/docs/media/marc_import_remove_fields2.JPG differ
diff --git a/docs/media/marc_import_remove_fields3.JPG b/docs/media/marc_import_remove_fields3.JPG
new file mode 100644
index 0000000..dcdc699
Binary files /dev/null and b/docs/media/marc_import_remove_fields3.JPG differ
diff --git a/docs/media/marc_import_remove_fields5.JPG b/docs/media/marc_import_remove_fields5.JPG
new file mode 100644
index 0000000..6acb2ab
Binary files /dev/null and b/docs/media/marc_import_remove_fields5.JPG differ
diff --git a/docs/root.txt b/docs/root.txt
index c3215d0..13af7bf 100644
--- a/docs/root.txt
+++ b/docs/root.txt
@@ -190,6 +190,8 @@ include::admin/restrict_Z39.50_sources_by_perm_group.txt[]
 
 include::admin/booking-admin.txt[]
 
+include::admin/MARC_Import_Remove_Fields.txt[]
+
 include::admin/Org_Unit_Proximity_Adjustments.txt[]
 
 include::admin/permissions.txt[]

commit e24907978fb05cf9f60e49505f8a2f9123cd4858
Author: Dan Scott <dscott at laurentian.ca>
Date:   Thu Jun 6 14:01:07 2013 -0400

    Fix Latin-1 encoding that broke doc output
    
    asciidoc only expects and can only handle utf-8 encoding :)
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/docs/opac/my_lists.txt b/docs/opac/my_lists.txt
index 76cf790..e7b2483 100644
--- a/docs/opac/my_lists.txt
+++ b/docs/opac/my_lists.txt
@@ -62,17 +62,12 @@ image::media/My_Lists7.jpg[My_Lists7]
 
 As of Evergreen version 2.4, when a title is added to a list in the TPAC, a local call number will be displayed in the list to assist patrons in locating the physical item.  Evergreen will look at the following locations to identify the most relevant call number to display in the list:  
 
-1)	Physical location – the physical library location where the search takes place
-2)	Preferred library – the Preferred Search Location, which is set in patron OPAC account Search and History Preferences, or the patron’s Home Library
-3)	Search library – the search library or org unit that is selected in the OPAC search interface
+1)	Physical location - the physical library location where the search takes place
+2)	Preferred library - the Preferred Search Location, which is set in patron OPAC account Search and History Preferences, or the patron's Home Library
+3)	Search library - the search library or org unit that is selected in the OPAC search interface
 
 The call number that is displayed will be the most relevant call number to the searcher.  If the patron is searching at the library, Evergreen will display a call number from that library location.  If the patron is not searching at a library, but is logged in to their OPAC account, Evergreen will display a call number from their Home Library or Preferred Search Location.  If the patron is not searching at the library and is not signed in to their OPAC account, then Evergreen will display a call number from the org unit, or library, that they choose to search in the OPAC search interface.
 
 The local call number and associated library location will appear in the list:
 
 image::media/my_list_call_numbers.JPG[Local Call Number in List]
-
-
-
-
-

commit d90985bfe71382e5e19dea7ae237e82ac3ad1f7f
Author: Thomas Berezansky <tsbere at mvlc.org>
Date:   Thu Jul 26 10:25:32 2012 -0400

    Make Force/Recall holds always return as nearest
    
    Without even running the hold rules.
    
    Signed-off-by: Thomas Berezansky <tsbere at mvlc.org>
    Signed-off-by: Mike Rylander <mrylander at gmail.com>
    
    Conflicts:
    	Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Holds.pm
    
    (Just whitespace conflicts on tab vs space -- repaired by hand.)

diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Holds.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Holds.pm
index cde9619..d63f907 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Holds.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Holds.pm
@@ -3041,6 +3041,11 @@ sub find_nearest_permitted_hold {
         $logger->info("circulator: checking if hold $holdid is permitted for copy $bc");
 
         my $hold = $editor->retrieve_action_hold_request($holdid) or next;
+        # Force and recall holds bypass all rules
+        if ($hold->hold_type eq 'R' || $hold->hold_type eq 'F') {
+            $best_hold = $hold;
+            last;
+        }
         my $reqr = $reqr_cache{$hold->requestor} || $editor->retrieve_actor_user($hold->requestor);
         my $rlib = $org_cache{$hold->request_lib} || $editor->retrieve_actor_org_unit($hold->request_lib);
 

commit c333d835dfc2e5473bda4a41d459086313f2442e
Author: Ben Shum <bshum at biblio.org>
Date:   Sat Mar 2 02:21:58 2013 -0500

    TPAC - set autofocus to user input when placing holds in staff client
    
    When placing holds in TPAC via the staff client, the focus had been on the
    basic search field above. Change this to have autofocus on the input field
    for the hold user by default.
    
    This can potentially save staff from having to perform an extra click to
    select the input field. Now they can immediately begin entering the barcode
    of the user they plan to create a hold on behalf of.
    
    Signed-off-by: Ben Shum <bshum at biblio.org>
    Signed-off-by: Mike Rylander <mrylander at gmail.com>

diff --git a/Open-ILS/src/templates/opac/parts/place_hold.tt2 b/Open-ILS/src/templates/opac/parts/place_hold.tt2
index 3ce5f06..07bdcc7 100644
--- a/Open-ILS/src/templates/opac/parts/place_hold.tt2
+++ b/Open-ILS/src/templates/opac/parts/place_hold.tt2
@@ -22,7 +22,7 @@
             <label for="hold_usr_is_requestor_not">
                 [% l("Place hold for patron by barcode:") %]
             </label>
-            <input type="text" name="hold_usr" id="hold_usr_input" onchange="staff_hold_usr_barcode_changed();" onpaste="setTimeout(staff_hold_usr_barcode_changed,1);" onkeypress="return no_hold_submit(event)" /> <span id="patron_name"></span><span id="patron_usr_barcode_not_found" style="display: none">[% l('Patron barcode was not found') %]</span><br />
+            <input type="text" name="hold_usr" id="hold_usr_input" onchange="staff_hold_usr_barcode_changed();" onpaste="setTimeout(staff_hold_usr_barcode_changed,1);" onkeypress="return no_hold_submit(event)" autofocus /> <span id="patron_name"></span><span id="patron_usr_barcode_not_found" style="display: none">[% l('Patron barcode was not found') %]</span><br />
             <input type="hidden" id="staff_barcode" value="[% ctx.staff_recipient.card.barcode | html %]"/>
             <span>
                 <input type="radio" id="hold_usr_is_requestor"
diff --git a/Open-ILS/src/templates/opac/place_hold.tt2 b/Open-ILS/src/templates/opac/place_hold.tt2
index 423198c..cb97e88 100644
--- a/Open-ILS/src/templates/opac/place_hold.tt2
+++ b/Open-ILS/src/templates/opac/place_hold.tt2
@@ -1,6 +1,9 @@
 [%- PROCESS "opac/parts/header.tt2";
     WRAPPER "opac/parts/base.tt2";
     INCLUDE "opac/parts/topnav.tt2";
+    IF ctx.is_staff;
+        basic_search = "f";
+    END;
     ctx.page_title = l("Place Hold") %]
     <div id="search-wrapper">
         [% INCLUDE "opac/parts/searchbar.tt2" %]

commit 0a82e565366833583b60d58391e226f18d642cd9
Author: Angela Kilsdonk <akilsdonk at esilibrary.com>
Date:   Fri Jun 7 10:04:27 2013 -0400

    Asciidoc edit for My Lists documentation
    
    Change to asciidoc structure in opac/my_lists.txt
    
    Signed-off-by: Angela Kilsdonk <akilsdonk at esilibrary.com>

diff --git a/docs/opac/my_lists.txt b/docs/opac/my_lists.txt
index db485ca..76cf790 100644
--- a/docs/opac/my_lists.txt
+++ b/docs/opac/my_lists.txt
@@ -58,8 +58,8 @@ image::media/My_Lists7.jpg[My_Lists7]
 16) When you no longer need a list, click *Delete List*. 
 
 
-Local Call Number in My Lists
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+*Local Call Number in My Lists*
+
 As of Evergreen version 2.4, when a title is added to a list in the TPAC, a local call number will be displayed in the list to assist patrons in locating the physical item.  Evergreen will look at the following locations to identify the most relevant call number to display in the list:  
 
 1)	Physical location – the physical library location where the search takes place

commit 9fcf1d1b1934dc1f1f3cdebff1fe2d7a0663e7c9
Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
Date:   Mon Apr 15 14:06:54 2013 -0400

    Acq: Be fuzzy about case when retrieving EDI documents
    
    The edi_fetcher relies on a routine in OpenILS::Acq::EDI to, among
    other things, try to avoid fetching the same EDI document multiple times
    when many rows in acq.edi_account refer to the same host and login
    credentials.
    
    Since in practice most vendors seem to run FTP servers for EDI on
    Windows, not UNIX, and pathnames are therefore case-insensitive, that
    test for other occurrences ought also to be case-insensitive.
    
    If I were to look at this as a purist, I could argue that vendor servers
    might sometimes by run on UNIX, and that for some reason it is possible
    that different vendor-to-buyer EDI documents (order responses or
    invoices) could have pathnames that differ only in the case of some
    characters.  But that seems wildly unlikely.  If anyone does take this
    possibility seriously, perhaps acq.edi_account needs a Boolean column to
    indicate the remote host's case [in]sensitivity.
    
    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
    Signed-off-by: Ben Shum <bshum at biblio.org>

diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/EDI.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/EDI.pm
index a84b1c3..924787a 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/EDI.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/EDI.pm
@@ -135,7 +135,7 @@ sub retrieve_core {
                             password => $account->password,
                             in_dir => $account->in_dir
                         },
-                        remote_file => $remote_file,
+                        remote_file => {ilike => $remote_file},
                         status      => {'in' => [qw/ processed /]},
                     },
                     { join => {"acqedi" => {}}, limit => 1 }

commit e516b154c151981da4cfccb4ae5d9db49d198b1a
Author: Dan Scott <dscott at laurentian.ca>
Date:   Thu Jun 6 09:40:59 2013 -0400

    Fedora RPM for bzip2 headers is bzip2-devel
    
    There was an attempt to add the right RPM for the bzip2 headers in
    Makefile.install, but that failed on Fedora 19. Swap in bzip2-devel
    instead to correct that.
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/src/extras/Makefile.install b/Open-ILS/src/extras/Makefile.install
index a49ea6a..6fa4def 100644
--- a/Open-ILS/src/extras/Makefile.install
+++ b/Open-ILS/src/extras/Makefile.install
@@ -121,6 +121,7 @@ EXTRA_DEBS_PRECISE = \
 FEDORA_RPMS = \
 	aspell \
 	aspell-en \
+	bzip2-devel \
 	libdbi \
 	libdbi-dbd-pgsql \
 	libdbi-devel \

commit 049caab6c6b8dd8927c68d1e229ee5feb24404fe
Author: Angela Kilsdonk <akilsdonk at esilibrary.com>
Date:   Thu Jun 6 10:38:42 2013 -0400

    Asciidoc fix for documentation
    
    Fixed faulty asciidoc in docs/admin/lsa-library_settings_editor.
    
    Signed-off-by: Angela Kilsdonk <akilsdonk at esilibrary.com>

diff --git a/docs/admin/lsa-library_settings_editor.txt b/docs/admin/lsa-library_settings_editor.txt
index b9ab298..0a72ea6 100644
--- a/docs/admin/lsa-library_settings_editor.txt
+++ b/docs/admin/lsa-library_settings_editor.txt
@@ -80,7 +80,7 @@ message appears automatically, and the patron is not required to take further
 action.
 
 Org Unit Hiding in TPAC
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
+~~~~~~~~~~~~~~~~~~~~~~~
 
 This feature enables you to hide specific org units from patron view in the OPAC.  Org units that have not inherited this setting will display in patron-facing dropdowns.
 

commit ad7a079e56929911ffe788291c406bf91aa5230b
Author: Simon Hieu Mai <hieu.mai at mnsu.edu>
Date:   Mon Jun 3 17:45:08 2013 -0400

    LP#1053074: Editimg MARC Fixed Fields jumps cursor to marc record
    
    Put the cursor back to the current fixed field after reload
    the MARC record table.
    
    Signed-off-by: Simon Hieu Mai <hieu.mai at mnsu.edu>
    Signed-off-by: Dan Wells <dbw2 at calvin.edu>

diff --git a/Open-ILS/xul/staff_client/server/cat/marcedit.js b/Open-ILS/xul/staff_client/server/cat/marcedit.js
index 614061f..9e85116 100644
--- a/Open-ILS/xul/staff_client/server/cat/marcedit.js
+++ b/Open-ILS/xul/staff_client/server/cat/marcedit.js
@@ -828,6 +828,8 @@ function updateFixedFields (element) {
     xml_record = new XML( xml_string );
     if (xml_record..record[0]) xml_record = xml_record..record[0];
     loadRecord();
+    // Put the cursor back to the current fixed field
+    element.select();
 
     return true;
 }

commit cf8c1222d7d5be18447acc2a40e89b8e9625ef9d
Author: Bill Erickson <berick at esilibrary.com>
Date:   Thu May 23 09:11:25 2013 -0400

    LP1183340 selectivly apply editable funds sorting
    
    Avoid sorting editable funds to the front of the fund list when there
    are no org units at which the user has the ADMIN_ACQ_FUND permission.
    Otherwise, we are sorting on an empty 'IN' list in pcrud, which results
    in an error.
    
    Signed-off-by: Bill Erickson <berick at esilibrary.com>
    Signed-off-by: Dan Wells <dbw2 at calvin.edu>

diff --git a/Open-ILS/web/js/ui/default/acq/financial/list_funds.js b/Open-ILS/web/js/ui/default/acq/financial/list_funds.js
index abad41d..334de95 100644
--- a/Open-ILS/web/js/ui/default/acq/financial/list_funds.js
+++ b/Open-ILS/web/js/ui/default/acq/financial/list_funds.js
@@ -116,22 +116,23 @@ function loadFundGrid(year) {
     year = year || fundFilterYearSelect.attr('value');
     cachedFunds = [];
 
+    var order_by = [{'class' : 'acqf', field : 'name'}];
+
+    if (adminPermOrgs.length) {
+        // sort funds I can edit to the front
+        order_by.unshift({   
+            'class' : 'acqf',
+            field : 'org',
+            compare : {'in' : adminPermOrgs},
+            direction : 'desc'
+        });
+    }
+
     lfGrid.loadAll(
-        {
+        {   
             flesh : 1,  
             flesh_fields : {acqf : fundFleshFields},
-            
-            // by default, sort funds I can edit to the front
-            order_by : [
-                {   'class' : 'acqf',
-                    field : 'org',
-                    compare : {'in' : adminPermOrgs},
-                    direction : 'desc'
-                },
-                {   'class' : 'acqf',
-                    field : 'name'
-                }
-            ]
+            order_by : order_by,
         }, {   
             year : year, 
             org : fieldmapper.aou.descendantNodeList(contextOrg, true) 

commit 63fddafae9eebb132d5533620c2d4ce607dc35e8
Author: Tracy Swaim <tswaim at mvlc.org>
Date:   Sat Jun 1 01:13:13 2013 -0400

    Documentation for preset tabs and auto login
    
    Missed the actual documentation in the last commit for preset tabs and
    auto login docs. Here it is.
    
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/docs/admin/staff_client-login.txt b/docs/admin/staff_client-login.txt
index 3f8aac5..4cd0e4d 100644
--- a/docs/admin/staff_client-login.txt
+++ b/docs/admin/staff_client-login.txt
@@ -35,6 +35,127 @@ indexterm:[staff client, standalone interface]
 If your connection to Evergreen is lost, click _Standalone
 Interface_ tio circulate items or register patrons while connection is down. 
 
+[[preset_tabs]]
+Preset Tabs in Evergreen Client
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+To have preset tabs waiting when Evergreen opens you will need to modify the
+*Evergreen shortcut* on your desktop.
+
+. First, you need to copy your shortcut. There are a couple of ways to do this. 
+.. Right-mouse click and drag icon; upon release select *Create Shortcut
+Here*. 
++
+image::media/create_shortcut_here.png[]
++
+.. Right-mouse click icon, select *Send to*, and select *Desktop (create
+shortcut)*.
++
+image::media/send_to_desktop.png[]
++
+. Right-mouse click the new shortcut and select *Properties*.
++
+image::media/shortcut_properties.png[]
++
+. Listed in the *Target* box you will see something like the following path
+surrounded by quotation marks:   "C:\Program Files\Evergreen Staff Client MVLC\evergreen.exe"
++
+image::media/shortcut_properties_window.png[]
++
+. Place your cursor after the ending quotation mark. Enter a space after the
+last quotation mark and then enter the tab code from the list below. Add
+multiple tabs with a space separating them.
++
+image::media/preset_tabs.png[]
++
+For Example, to have Checkout, Checkin, Catalog Search, and a blank tab preset:
+"C:\Program Files\Evergreen Staff Client MVLC\evergreen.exe" -ilscheckout -ilscheckin -ilsurl XUL_OPAC_WRAPPER -ilstab
+. The following options are available:
+
+- -ILScheckin : Opens the Check In interface
+- -ILScheckout : Opens the Check Out interface
+- -ILSurl <url/constant> : Opens the specified page
+- -ILSnew : Opens a new "menu" window
+- -ILStab : Opens a new (default) tab
+- -ILSnew_default : Opens a new "menu" window with a guaranteed default tab
+- -ILSoffline/-ILSstandalone : Opens the standalone interface
+- -ILSlogin : Opens the login page
++
+[TIP]
+.Useful Tab Codes
+=====================
+      - -ilsurl XUL_PATRON_DISPLAY : Opens a Patron Search tab
+      - -ilsurl XUL_HOLD_PULL_LIST : Opens a Pull List tab
+      - -ilsurl XUL_HOLDS_BROWSER :        Opens a Browse Holds Shelf tab
+      - -ilsurl XUL_OPAC_WRAPPER : Opens an Advanced Catalog search tab
+      - -ilsurl XUL_COPY_STATUS : Opens an Item status by barcode tab
+      - -ilsurl XUL_RECORD_BUCKETS : Opens a Manage Record Buckets tab
+      - -ilsurl XUL_COPY_BUCKETS : Opens a Manage Copy Buckets tab
+      - -ilsurl XUL_MARC_NEW : Opens a Create new MARC record tab
+      - -ilsurl XUL_Z3950_IMPORT : Opens an Import record from Z39.50 tab
+      - To open two windows, one with checkin and checkout, one with Marc and Z39.50, use:
+      +
+      -ilscheckin -ilscheckout -ilsnew -ilsurl XUL_MARC_NEW -ilsurl XUL_Z3950_IMPORT
+========================
++
+. You may want to rename your shortcut to reflect its purpose. For example, you
+could have one icon set to open circulation-related tabs and one icon to open
+cataloging-related tabs. Right-mouse click and select *Rename* to do this.
+
+Auto Login
+~~~~~~~~~~~
+
+To use auto login, you will need to modify the *Evergreen shortcut* on your desktop. There are three new commands which are necessary for automatic login:
+
+- -ilsuser
+- -ilspassword
+- -ilshost
+
+You will need all three to have your client successfully login. To enable
+automatic login we need to modify the Evergreen shortcut on your desktop. If
+your shortcut already has preset tab commands, then place the automatic login
+commands after those commands. 
+
+. First, if your workstation will have multiple logins (circ, cat, admin) you need to copy a shortcut for each. There are a couple of ways to do this.
+.. Right-mouse click and drag icon; upon release select *Create Shortcut Here*. 
++
+image::media/create_shortcut_here.png[]
++
+.. Right-mouse click icon, select *Send to*, and select *Desktop (create shortcut)*.
++
+image::media/send_to_desktop.png[]
++
+. Right-mouse click the new shortcut and select *Properties*.
++
+image::media/shortcut_properties.png[]
++
+Listed in the *Target* box you will see something like the following path
+surrounded by quotation marks: "C:\Program Files\Evergreen Staff Client MVLC\evergreen.exe"
++
+image::media/shortcut_properties_window.png[]
++
+. Place your cursor after the ending quotation mark and enter a space after the
+last quotation mark.
++
+image::media/target_box.png[]
++
+.. After the space enter the login code for username followed by a space and
+the username +
+-ilsuser circuser
+.. Enter a space and then the login code for password followed by the password +
+-ilspassword circpass
+.. Finally, enter the login code for host followed by a space and the host
+address (this is the exact address which shows up in the Server Hostname box
+when you manually login to the client. +
+-ilshost evergreen.mvlcstaff.org
++
+image::media/auto_login.png[]
++
+[NOTE]
+When you double-click on the new shortcut it may seem like nothing is
+happening, but it really is! It takes the program a few moments to digest the
+new requests and to do the login.
+
 Logging Out
 ~~~~~~~~~~~
 

commit f8d3663ff641a128df80bdd2dc8645b7e6c819a4
Author: Tracy Swaim <tswaim at mvlc.org>
Date:   Sat Jun 1 01:00:26 2013 -0400

    Pre-set tabs and auto login
    
    Adding staff client documentation for pre-set tabs and auto login.
    
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/docs/media/auto_login.png b/docs/media/auto_login.png
new file mode 100644
index 0000000..44baa21
Binary files /dev/null and b/docs/media/auto_login.png differ
diff --git a/docs/media/create_shortcut_here.png b/docs/media/create_shortcut_here.png
new file mode 100644
index 0000000..e9348c6
Binary files /dev/null and b/docs/media/create_shortcut_here.png differ
diff --git a/docs/media/preset_tabs.png b/docs/media/preset_tabs.png
new file mode 100644
index 0000000..afd32e8
Binary files /dev/null and b/docs/media/preset_tabs.png differ
diff --git a/docs/media/send_to_desktop.png b/docs/media/send_to_desktop.png
new file mode 100644
index 0000000..6622e53
Binary files /dev/null and b/docs/media/send_to_desktop.png differ
diff --git a/docs/media/shortcut_properties.png b/docs/media/shortcut_properties.png
new file mode 100644
index 0000000..5e677ec
Binary files /dev/null and b/docs/media/shortcut_properties.png differ
diff --git a/docs/media/shortcut_properties_window.png b/docs/media/shortcut_properties_window.png
new file mode 100644
index 0000000..48dc306
Binary files /dev/null and b/docs/media/shortcut_properties_window.png differ
diff --git a/docs/media/target_box.png b/docs/media/target_box.png
new file mode 100644
index 0000000..66f08b2
Binary files /dev/null and b/docs/media/target_box.png differ

commit ca32eb4ab0e17145488962cc443157500939a25f
Author: Kathy Lussier <klussier at masslnc.org>
Date:   Fri May 24 20:52:01 2013 -0400

    Acquisitions Admin updates
    
    Updates to the chapter on acquisitions administration, including 1) the
    reintroduction of the Providers section, which appears to have dropped out
    of the docs after 2.1 2) the new default # copies and improvements to
    distributions formulas introduced in 2.4 and 3) minor copy editing.
    
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
    Signed-off-by: Dan Scott <dscott at laurentian.ca>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/docs/admin/acquisitions_admin.txt b/docs/admin/acquisitions_admin.txt
index 8e6d3ec..f496d3d 100644
--- a/docs/admin/acquisitions_admin.txt
+++ b/docs/admin/acquisitions_admin.txt
@@ -1,20 +1,42 @@
 Acquisitions Administration
 ---------------------------
 
-Acquisitions Permissions in the Admin module
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Acquisitions Settings
+~~~~~~~~~~~~~~~~~~~~~
 
 indexterm:[acquisitions,permissions]
 
-Several setting in the Library Settings area of the Admin module pertain to functions in the Acquisitions module. You can access these settings by clicking _Admin -> Local Administration ->Library Settings Editor_.
-
-* CAT: Delete bib if all copies are deleted via Acquisitions lineitem cancellation - If you cancel a line item, then all of the on order copies in the catalog are deleted. If, when you cancel a line item, you also want to delete the bib record, then set this setting to TRUE.
-* Default circulation modifier - This modifier would be applied to items that are created in the acquisitions module
-* Default copy location - This copy location would be applied to items that are created in the acquisitions module
-* Fund Spending Limit for Block - When the amount remaining in the fund, including spent money and encumbrances, goes below this percentage, attempts to spend from the fund will be blocked.
-* Fund Spending Limit for Warning - When the amount remaining in the fund, including spent money and encumbrances, goes below this percentage, attempts to spend from the fund will result in a warning to the staff.
-* Temporary barcode prefix - Temporary barcode prefix for items that are created in the acquisitions module
-* Temporary call number prefix - Temporary call number prefix for items that are created in the acquisitions module
+Several setting in the Library Settings area of the Admin module pertain to
+functions in the Acquisitions module. You can access these settings by clicking
+_Admin -> Local Administration ->Library Settings Editor_.
+
+* CAT: Delete bib if all copies are deleted via Acquisitions lineitem
+cancellation - If you cancel a line item, then all of the on order copies in the
+catalog are deleted. If, when you cancel a line item, you also want to delete
+the bib record, then set this setting to TRUE.
+* Allow funds to be rolled over without bringing the money along - enables you
+to move a fund's encumbrances from one year to the next without moving unspent
+money. Unused money is not added to the next year's fund and is not available
+for use.
+* Allows patrons to create automatic holds from purchase requests.
+* Default circulation modifier - This modifier would be applied to items that
+are created in the acquisitions module
+* Default copy location - This copy location would be applied to items that are
+created in the acquisitions module
+* Fund Spending Limit for Block - When the amount remaining in the fund,
+including spent money and encumbrances, goes below this percentage, attempts to
+spend from the fund will be blocked.
+* Fund Spending Limit for Warning - When the amount remaining in the fund,
+including spent money and encumbrances, goes below this percentage, attempts to
+spend from the fund will result in a warning to the staff.
+* Rollover Distribution Formulae Funds - When set to true, during fiscal
+rollover, all distribution formulae will update to use new funds.
+* Set copy creator as receiver - When receiving a copy in acquisitions, set the
+copy "creator" to be the staff that received the copy
+* Temporary barcode prefix - Temporary barcode prefix for items that are created
+in the acquisitions module
+* Temporary call number prefix - Temporary call number prefix for items that are
+created in the acquisitions module
 
 Cancel/Suspend reasons
 ~~~~~~~~~~~~~~~~~~~~~~
@@ -22,22 +44,36 @@ Cancel/Suspend reasons
 indexterm:[acquisitions,purchase order,cancellation]
 indexterm:[acquisitions,line item,cancellation]
 
-The Cancel reasons link enables you to predefine the reasons for which a line item or a PO can be cancelled. A default list of reasons appears, but you can add custom reasons to this list. Applying the cancel reason will prevent the item from appearing in a claims list and will allow you to cancel debits associated with the purchase. Cancel reasons also enable you to suspend or delay a purchase. For example, you could create a cancel reason of 'back ordered,' and you could choose to keep the debits associated with the purchase.
+The Cancel reasons link enables you to predefine the reasons for which a line
+item or a PO can be cancelled. A default list of reasons appears, but you can
+add custom reasons to this list. Applying the cancel reason will prevent the
+item from appearing in a claims list and will allow you to cancel debits
+associated with the purchase. Cancel reasons also enable you to suspend or delay
+a purchase. For example, you could create a cancel reason of 'back ordered,' and
+you could choose to keep the debits associated with the purchase.
 
 Create a cancel/suspend reason
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-. To add a new cancel reason, click _Administration -> Server Administration -> Acquisitions -> Cancel reasons_.
+. To add a new cancel reason, click _Administration -> Server Administration ->
+Acquisitions -> Cancel reasons_.
 
 . Click _New Cancel Reason_.
 
-. Select a using library from the drop down menu. The using library indicates the organizational units whose staff can use this cancel reason. This menu is populated with the shortnames that you created for your libraries in the organizational units tree (See Admin -> Server Administration -> Organizational Units.)
+. Select a using library from the drop-down menu. The using library indicates
+the organizational units whose staff can use this cancel reason. This menu is
+populated with the shortnames that you created for your libraries in the
+organizational units tree (See Admin -> Server Administration -> Organizational
+Units.)
 
-. Create a label for the cancel reason. This label will appear when you select a cancel reason on an item or a PO.
+. Create a label for the cancel reason. This label will appear when you select a
+cancel reason on an item or a PO.
 
-. Create a description of the cancel reason. This is a free text field and can be comprised of any text of your choosing.
+. Create a description of the cancel reason. This is a free text field and can
+be comprised of any text of your choosing.
 
-. If you want to retain the debits associated with the cancelled purchase, click the box adjacent to Keep Debits->
+. If you want to retain the debits associated with the cancelled purchase, click
+the box adjacent to Keep Debits->
 
 . Click _Save_.
 
@@ -46,21 +82,30 @@ Claiming
 
 indexterm:[acquisitions,claiming]
 
-Currently, all claiming is manual, but the admin module enables you to build claim policies and specify the action(s) that users should take to claim items.
+Currently, all claiming is manual, but the admin module enables you to build
+claim policies and specify the action(s) that users should take to claim items.
 
 Create a claim policy
 ^^^^^^^^^^^^^^^^^^^^^
 
-The claim policy link enables you to name the claim policy and specify the organization that owns it.
-
-. To create a claim policy, click _Admin -> Server Administration -> Acquisitions -> Claim Policies_.
-. Create a claim policy name. No limits exist on the number of characters that can be entered in this field.
-. Select an org unit from the drop down menu. The org unit indicates the organizational units whose staff can use this claim policy. This menu is populated with the shortnames that you created for your libraries in the organizational units tree (See Admin -> Server Administration -> Organizational Units).
+The claim policy link enables you to name the claim policy and specify the
+organization that owns it.
+
+. To create a claim policy, click _Admin -> Server Administration -> 
+Acquisitions -> Claim Policies_.
+. Create a claim policy name. No limits exist on the number of characters that
+can be entered in this field.
+. Select an org unit from the drop-down menu. The org unit indicates the
+organizational units whose staff can use this claim policy. This menu is
+populated with the shortnames that you created for your libraries in the
+organizational units tree (See Admin -> Server Administration -> Organizational
+Units).
 +
 [NOTE]
 The rule of parental inheritance applies to this list.
 +
-. Enter a description. No limits exist on the number of characters that can be entered in this field.
+. Enter a description. No limits exist on the number of characters that can be
+entered in this field.
 . Click _Save_.
 
 Create a claim type
@@ -68,98 +113,138 @@ Create a claim type
 
 The claim type link enables you to specify the reason for a type of claim.
 
-. To create a claim type, click _Admin -> Server Administration -> Acquisitions -> Claim types_.
-. Create a claim type. No limits exist on the number of characters that can be entered in this field.
-. Select an org unit from the drop down menu. The org unit indicates the organizational units whose staff can use this claim type. This menu is populated with the shortnames that you created for your libraries in the organizational units tree (See Admin -> Server Administration -> Organizational Units).
+. To create a claim type, click _Admin -> Server Administration -> Acquisitions 
+-> Claim types_.
+. Create a claim type. No limits exist on the number of characters that can be
+entered in this field.
+. Select an org unit from the drop-down menu. The org unit indicates the
+organizational units whose staff can use this claim type. This menu is populated
+with the shortnames that you created for your libraries in the organizational
+units tree (See Admin -> Server Administration -> Organizational Units).
 +
 [NOTE]
 The rule of parental inheritance applies to this list.
 +
-. Enter a description. No limits exist on the number of characters that can be entered in this field.
+. Enter a description. No limits exist on the number of characters that can be
+entered in this field.
 . Click _Save_.
 
 Create a claim event type
 ^^^^^^^^^^^^^^^^^^^^^^^^^
 
-The claim event type describes the physical action that should occur when an item needs to be claimed. For example, the user should notify the vendor via email that the library is claiming an item.
-
-. To access the claim event types, click _Admin -> Server Administration -> Acquisitions ->Claim event type_.
-. Enter a code for the claim event type. No limits exist on the number of characters that can be entered in this field.
-. Select an org unit from the drop down menu. The org unit indicates the organizational units whose staff can use this event type. This menu is populated with the shortnames that you created for your libraries in the organizational units tree (See Admin -> Server Administration -> Organizational Units).
+The claim event type describes the physical action that should occur when an
+item needs to be claimed. For example, the user should notify the vendor via
+email that the library is claiming an item.
+
+. To access the claim event types, click _Admin -> Server Administration ->
+Acquisitions -> Claim event type_.
+. Enter a code for the claim event type. No limits exist on the number of
+characters that can be entered in this field.
+. Select an org unit from the drop-down menu. The org unit indicates the
+organizational units whose staff can use this event type. This menu is populated
+with the shortnames that you created for your libraries in the organizational
+units tree (See Admin -> Server Administration -> Organizational Units).
 +
 [NOTE]
 The rule of parental inheritance applies to this list.
 +
-. Enter a description. No limits exist on the number of characters that can be entered in this field.
-. If this claim is initiated by the user, then check the box adjacent to Library Initiated.
+. Enter a description. No limits exist on the number of characters that can be
+entered in this field.
+. If this claim is initiated by the user, then check the box adjacent to Library
+Initiated.
 +
 [NOTE]
-Currently, all claims are initiated by a user. The ILS cannot automatically claim an issue.
+Currently, all claims are initiated by a user. The ILS cannot automatically
+claim an issue.
 +
 . Click _Save_.
 
 Create a claim policy action
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-The claim policy action enables you to specify how long a user should wait before claiming the item.
+The claim policy action enables you to specify how long a user should wait
+before claiming the item.
 
-. To access claim policy actions, click _Admin -> Server Administration -> Acquisitions ->Claim Policy Actions_.
+. To access claim policy actions, click _Admin -> Server Administration -> 
+Acquisitions ->Claim Policy Actions_.
 
-. Select an Action (Event Type) from the drop down menu.
+. Select an Action (Event Type) from the drop-down menu.
 
-. Enter an action interval. This field indicates how long a user should wait before claiming the item.
+. Enter an action interval. This field indicates how long a user should wait
+before claiming the item.
 
-. In the Claim Policy ID field, select a claim policy from the drop down menu.
+. In the Claim Policy ID field, select a claim policy from the drop-down menu.
 
 . Click _Save_.
 
 [NOTE]
-You can create claim cycles by adding multiple claim policy actions to a claim policy.
+You can create claim cycles by adding multiple claim policy actions to a claim
+ policy.
 
 Currency Types
 ~~~~~~~~~~~~~~
 
-indexterm:[acquisitions,currency types]
+indexterm:[acquisitions,currency types] 
+
+Currency types can be created and applied to funds in the administrative module. 
+When a fund is applied to a copy or line item for purchase, the item will be 
+purchased in the currency associated with that fund. 
+
 
-Currency types can be created and applied to funds in the administrative module. When a fund is applied to a copy or line item for purchase, the item will be purchased in the currency associated with that fund.
 
 Create a currency type
 ^^^^^^^^^^^^^^^^^^^^^^
 
-. To create a new currency type, click _Admin -> Server Administration -> Acquisitions -> Currency types_.
+. To create a new currency type, click _Admin -> Server Administration -> 
+Acquisitions -> Currency types_. 
 
-. Enter the currency code. No limits exist on the number of characters that can be entered in this field.
+. Enter the currency code. No limits exist on the number of characters that can 
+be entered in this field. 
+
+. Enter the name of the currency type in Currency Label field. No limits exist 
+on the number of characters that can be entered in this field. 
+
+. Click Save. 
 
-. Enter the name of the currency type in Currency Label field. No limits exist on the number of characters that can be entered in this field.
 
-. Click Save.
 
 Edit a currency type
 ^^^^^^^^^^^^^^^^^^^^
 
-. To edit a currency type, click your cursor in the row that you want to edit. The row will turn blue.
+. To edit a currency type, click your cursor in the row that you want to edit.
+The row will turn blue.
 
-. Double~click. The pop~up box will appear, and you can edit the fields.
+. Double click. The pop-up box will appear, and you can edit the fields.
 
 . After making changes, click Save.
 
 [NOTE]
-From the currency types interface, you can delete currencies that have never been applied to funds or used to make purchases.
+From the currency types interface, you can delete currencies that have never
+been applied to funds or used to make purchases.
 
 Distribution Formulas
 ~~~~~~~~~~~~~~~~~~~~~
 
-indexterm:[acquisitions,distribution formulas]
+indexterm:[acquisitions,distribution formulas, templates]
 
-Distribution formulas allow you to specify the number of copies that should be distributed to specific branches. You can create and reuse formulas as needed.
+Distribution formulas allow you to specify the number of copies that should be
+distributed to specific branches. They can also serve as templates allowing you
+to predefine settings for your copies. You can create and reuse formulas as
+needed.
 
 Create a distribution formula
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-. Click _Admin -> Server Administration -> Acquisitions ->Distribution Formulas_.
+. Click _Admin -> Server Administration -> Acquisitions ->Distribution
+Formulas_.
 . Click _New Formula_.
-. Enter a Formula Name. No limits exist on the number of characters that can be entered in this field.
-. Choose a Formula Owner from the drop down menu. The Formula Owner indicates the organizational units whose staff can use this formula. This menu is populated with the shortnames that you created for your libraries in the organizational units tree (See Admin -> Server Administration -> Organizational Units).
+. Enter a Formula Name. No limits exist on the number of characters that can be
+entered in this field.
+. Choose a Formula Owner from the drop-down menu. The Formula Owner indicates
+the organizational units whose staff can use this formula. This menu is
+populated with the shortnames that you created for your libraries in the
+organizational units tree (See Admin -> Server Administration -> Organizational
+Units).
 +
 [NOTE]
 The rule of parental inheritance applies to this list.
@@ -167,14 +252,27 @@ The rule of parental inheritance applies to this list.
 . Ignore the Skip Count field which is currently not used.
 . Click _Save_.
 . Click _New Entry_.
-. Select an Owning Library from the drop down menu. This indicates the branch that will receive the items. This menu is populated with the shortnames that you created for your libraries in the organizational units tree (See _Admin -> Server Administration -> Organizational Units_).
-. Select a Shelving Location from the drop down menu.
-. In the Item Count field, enter the number of items that should be distributed to the branch. You can enter the number or use the arrows on the right side of the field.
+. Select an Owning Library from the drop-down menu. This indicates the branch
+that will receive the items. This menu is populated with the shortnames that you
+created for your libraries in the organizational units tree (See _Admin -> 
+Server Administration -> Organizational Units_).
+. Select/enter any of the following copy details you want to predefine in the
+distribution formula.
+* Copy Location
+* Fund
+* Circ Modifier
+* Collection Code 
+. In the Item Count field, enter the number of items that should be distributed
+to the branch. You can enter the number or use the arrows on the right side of
+the field.
 . Click _Apply Changes_. The screen will reload.
-. To view the changes to your formula, click Admin -> Server Administration -> Acquisitions -> Distribution Formulas. The item_count will reflect the entries to your distribution formula.
+. To view the changes to your formula, click Admin -> Server Administration -> 
+Acquisitions -> Distribution Formulas. The item_count will reflect the entries 
+to your distribution formula.
 
 [NOTE]
-To edit the Formula Name, click the hyperlinked name of the formula in the top left corner. A pop up box will enable you to enter a new formula name.
+To edit the Formula Name, click the hyperlinked name of the formula in the top
+left corner. A pop-up box will enable you to enter a new formula name.
 
 Edit a distribution formula
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -183,14 +281,18 @@ To edit a distribution formula, click the hyperlinked title of the formula.
 
 EDI
 ~~~
-Many libraries use Electronic Data Interchange (EDI) accounts to order new acquisitions. Users can set up EDI accounts and manage EDI messages in the admin module. EDI messages and notes can be viewed in the acquisitions module.  See also the link:../installation/edi_setup.txt[EDI Installation Instructions] because this is required for use of EDI.
+Many libraries use Electronic Data Interchange (EDI) accounts to order new
+acquisitions. Users can set up EDI accounts and manage EDI messages in the admin
+ module. EDI messages and notes can be viewed in the acquisitions module.  See
+also the link:../installation/edi_setup.txt[EDI Installation Instructions]
+because this is required for use of EDI.
 
 The following fields are required to create an EDI account: 
 
 [NOTE]
 host, username, password, path, and incoming directory.
 
-EDI Accounts
+EDI accounts
 ^^^^^^^^^^^^
 
 indexterm:[acquisitions,EDI,accounts]
@@ -198,56 +300,82 @@ indexterm:[EDI,accounts]
 
 Create EDI Accounts to communicate electronically with providers.
 
-. Create a label. The label allows you to differentiate between accounts for the same provider. No limits exist on the number of characters that can be entered in this field.
-. Enter a host. Your provider will provide you with the requisite FTP or SCP information.
+. Create a label. The label allows you to differentiate between accounts for the
+same provider. No limits exist on the number of characters that can be entered
+in this field.
+. Enter a host. Your provider will provide you with the requisite FTP or SCP
+information.
 . Enter the username that has been supplied by your provider.
 . Enter the password that has been supplied by your provider.
-. Enter account information. This field enables you to add a supplemental password for entry to a remote system after log in has been completed. This field is optional for the ILS but may be required by your provider.
-. Select an owner from the drop down menu. The owner indicates the organizational units whose staff can use this EDI account. This menu is populated with the shortnames that you created for your libraries in the organizational units tree (See Admin -> Server Administration -> Organizational Units).
+. Enter account information. This field enables you to add a supplemental
+password for entry to a remote system after log in has been completed. This 
+field is optional for the ILS but may be required by your provider.
+. Select an owner from the drop-down menu. The owner indicates the 
+organizational units whose staff can use this EDI account. This menu is 
+populated with the shortnames that you created for your libraries in the
+organizational units tree (See Admin -> Server Administration -> Organizational 
+Units).
 +
 [NOTE]
 The rule of parental inheritance applies to this list.
 +
-. The Last Activity updates automatically with any inbound or outbound communication.
-. Select a provider from the drop down menu to whom this account belongs.
-. Enter a path. The path indicates the remote location on the server from which files are pulled in to the ILS.
-. Enter the incoming directory. This directory indicates the location on your local network to which the files download.
+. The Last Activity updates automatically with any inbound or outbound
+communication.
+. Select a provider from the drop-down menu to whom this account belongs.
+. Enter a path. The path indicates the remote location on the server from which
+files are pulled in to the ILS.
+. Enter the incoming directory. This directory indicates the location on your
+local network to which the files download.
 . Enter the vendor account number supplied by your provider.
 . Enter the vendor account code supplied by your provider.
 . Click Save.
 
-EDI Messages
+EDI messages
 ^^^^^^^^^^^^
 
 indexterm:[EDI,messages]
 indexterm:[acquisitions,EDI,messages]
 
 
-The EDI messages screen displays all incoming and outgoing messages between the library and the vendor.
+The EDI messages screen displays all incoming and outgoing messages between the 
+library and the vendor.
 
 Exchange Rates
 ~~~~~~~~~~~~~~
 
 indexterm:[acquisitions,exchange rates]
 
-Exchange rates define the rate of exchange between currencies. Evergreen will automatically calculate exchange rates for purchases. Evergreen assumes that the currency of the purchasing fund is identical to the currency of the provider, but it provides for two unique situations: If the currency of the fund that is used for the purchase is different from the currency of the provider as listed in the provider profile, then Evergreen will use the exchange rate to calculate the price of the item in the currency of the fund and debit the fund accordingly. When money is transferred between funds that use different currency types, Evergreen will automatically use the exchange rate to convert the money to the currency of the receiving fund. During such transfers, however, staff can override the automatic conversion by providing an explicit amount to credit to the receiving fund.
+Exchange rates define the rate of exchange between currencies. Evergreen will
+automatically calculate exchange rates for purchases. Evergreen assumes that the
+currency of the purchasing fund is identical to the currency of the provider, 
+but it provides for two unique situations: If the currency of the fund that is 
+used for the purchase is different from the currency of the provider as listed 
+in the provider profile, then Evergreen will use the exchange rate to calculate
+the price of the item in the currency of the fund and debit the fund 
+accordingly. When money is transferred between funds that use different
+currency types, Evergreen will automatically use the exchange rate to convert
+the money to the currency of the receiving fund. During such transfers, 
+however, staff can override the automatic conversion by providing an explicit
+amount to credit to the receiving fund.
 
 Create an exchange rate
 ^^^^^^^^^^^^^^^^^^^^^^^
 
-. To create a new exchange rate, click _Admin -> Server Administration -> Acquisitions -> Exchange Rates_.
+. To create a new exchange rate, click _Admin -> Server Administration -> 
+Acquisitions -> Exchange Rates_.
 
 . Click New Exchange Rate.
 
-. Enter the From Currency from the drop down menu populated by the currency types.
+. Enter the From Currency from the drop-down menu populated by the currency
+types.
 
-. Enter the To Currency from the drop down menu populated by the currency types.
+. Enter the To Currency from the drop-down menu populated by the currency types.
 
 . Enter the exchange Ratio.
 
 . Click _Save_.
 
-Edit an Exchange Rate
+Edit an exchange rate
 ^^^^^^^^^^^^^^^^^^^^^
 
 Edit an exchange rate just as you would edit a currency type.
@@ -258,17 +386,25 @@ MARC Federated Search
 
 indexterm:[acquisitions,MARC federated search]
 
-The MARC Federated Search enables you to import bibliographic records into a selection list or purchase order from a Z39.50 source.
+The MARC Federated Search enables you to import bibliographic records into a
+selection list or purchase order from a Z39.50 source.
 
 . Click _Acquisitions -> MARC Federated Search_.
-. Check the boxes of Z39.50 services that you want to search. Your local Evergreen Catalog is checked by default. Click Submit.
+. Check the boxes of Z39.50 services that you want to search. Your local 
+Evergreen Catalog is checked by default. Click Submit.
 +
 image::media/acq_marc_search.png[search form]
 +
-. A list of results will appear. Click the _Copies_ link to add copy information to the line item. See <<line_item_features, Line Item Feratures>> for more information.
-. Click the Notes link to add notes or line item alerts to the line item. See <<line_item_features, Line Item Feratures>> for more information.
+. A list of results will appear. Click the _Copies_ link to add copy information
+to the line item. See <<line_item_features, Line Item Feratures>> for more 
+information.
+. Click the Notes link to add notes or line item alerts to the line item. See
+<<line_item_features, Line Item Feratures>> for more information.
 . Enter a price in the _Estimated Price_ field.
-. You can save the line item(s) to a selection list by checking the box on the line item and clicking _Actions -> Save Items to Selection List_. You can also create a purchase order from the line item(s) by checking the box on the line item and clicking _Actions -> Create Purchase Order_.
+. You can save the line item(s) to a selection list by checking the box on the
+line item and clicking _Actions -> Save Items to Selection List_. You can also
+create a purchase order from the line item(s) by checking the box on the line
+item and clicking _Actions -> Create Purchase Order_.
 
 image::media/acq_marc_search-2.png[line item]
 
@@ -277,18 +413,31 @@ Fund Tags
 
 indexterm:[acquisitions,funds,tags]
 
-You can apply tags to funds so that you can group funds for easy reporting. For example, you have three funds for children's materials: Children's Board Books, Children's DVDs, and Children's CDs. Assign a fund tag of 'children's' to each fund. When you need to report on the amount that has been spent on all children's materials, you can run a report on the fund tag to find total expenditures on children's materials rather than reporting on each individual fund.
+You can apply tags to funds so that you can group funds for easy reporting. For
+example, you have three funds for children's materials: Children's Board Books,
+Children's DVDs, and Children's CDs. Assign a fund tag of 'children's' to each
+fund. When you need to report on the amount that has been spent on all 
+hildren's materials, you can run a report on the fund tag to find total
+ expenditures on children's materials rather than reporting on each individual
+fund.
 
 Create a Fund Tag
 
-. To create a fund tag, click _Admin -> Server Administration -> Acquisitions -> Fund Tags_.
-. Click _New Fund Tag_. No limits exist on the number of characters that can be entered in this field.
-. Select a Fund Tag Owner from the drop down menu. The owner indicates the organizational unit(s) whose staff can use this fund tag. This menu is populated with the shortnames that you created for your libraries in the organizational units tree (See Admin -> Server Administration -> Organizational Units).
+. To create a fund tag, click _Admin -> Server Administration -> Acquisitions ->
+Fund Tags_.
+. Click _New Fund Tag_. No limits exist on the number of characters that can be
+entered in this field.
+. Select a Fund Tag Owner from the drop-down menu. The owner indicates the
+organizational unit(s) whose staff can use this fund tag. This menu is
+populated with the shortnames that you created for your libraries in the
+organizational units tree (See Admin -> Server Administration -> Organizational
+Units).
 +
 [NOTE]
 The rule of parental inheritance applies to this list.
 +
-. Enter a Fund Tag Name. No limits exist on the number of characters that can be entered in this field.
+. Enter a Fund Tag Name. No limits exist on the number of characters that can be
+entered in this field.
 . Click _Save_.
 
 Funding Sources
@@ -296,30 +445,49 @@ Funding Sources
 
 indexterm:[acquisitions,funding sources]
 
-Funding sources allow you to specify the sources that contribute monies to your fund(s). You can create as few or as many funding sources as you need.   These can be used to track exact amounts for accounts in your general ledger.  You can then use funds to track spending and purchases for specific collections.
+Funding sources allow you to specify the sources that contribute monies to your
+fund(s). You can create as few or as many funding sources as you need.   These
+can be used to track exact amounts for accounts in your general ledger.  You can
+ then use funds to track spending and purchases for specific collections.
 
 Create a funding source
 ^^^^^^^^^^^^^^^^^^^^^^^
 
-. To create a new funding source, click _Admin -> Server Administration -> Acquisitions -> Funding Source_.
-. Enter a funding source name. No limits exist on the number of characters that can be entered in this field.
-. Select an owner from the drop down menu. The owner indicates the organizational unit(s) whose staff can use this funding source. This menu is populated with the shortnames that you created for your libraries in the organizational units tree (See Admin -> Server Administration -> Organizational Units).
+. To create a new funding source, click _Admin -> Server Administration ->
+Acquisitions -> Funding Source_.
+. Enter a funding source name. No limits exist on the number of characters that
+can be entered in this field.
+. Select an owner from the drop-down menu. The owner indicates the
+organizational unit(s) whose staff can use this funding source. This menu is
+populated with the shortnames that you created for your libraries in the
+organizational units tree (See Admin -> Server Administration -> Organizational 
+Units).
 +
 [NOTE]
-The rule of parental inheritance applies to this list. For example, if a system is made the owner of a funding source, then users with appropriate permissions at the branches within the system could also use the funding source.
+The rule of parental inheritance applies to this list. For example, if a system
+is made the owner of a funding source, then users with appropriate permissions
+at the branches within the system could also use the funding source.
 +
-. Create a code for the source. No limits exist on the number of characters that can be entered in this field.
-. Select a currency from the drop down menu. This menu is populated from the choices in the Currency Types interface.
+. Create a code for the source. No limits exist on the number of characters that
+ can be entered in this field.
+. Select a currency from the drop-down menu. This menu is populated from the
+choices in the Currency Types interface.
 . Click _Save_.
 
-Allocate Credits to Funding Sources
+Allocate credits to funding sources
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 . Apply a credit to this funding source.
 
-. Enter the amount of money that the funding source contributes to the organization. Funding sources are not tied to fiscal or calendar years, so you can continue to add money to the same funding source over multiple years, e.g. County Funding. Alternatively, you can name funding sources by year, e.g. County Funding 2010 and County Funding 2011, and apply credits each year to the matching source.
+. Enter the amount of money that the funding source contributes to the
+organization. Funding sources are not tied to fiscal or calendar years, so you
+can continue to add money to the same funding source over multiple years, e.g.
+County Funding. Alternatively, you can name funding sources by year, e.g. County
+Funding 2010 and County Funding 2011, and apply credits each year to the 
+matching source.
 
-. To apply a credit, click on the hyperlinked name of the funding source. The Funding Source Details will appear.
+. To apply a credit, click on the hyperlinked name of the funding source. The
+Funding Source Details will appear.
 
 . Click _Apply Credit_.
 
@@ -332,7 +500,10 @@ Allocate Credits to Funding Sources
 Allocate credits to funds
 ^^^^^^^^^^^^^^^^^^^^^^^^^
 
-If you have already set up your funds, then you can then click the Allocate to Fund button to apply credits from the funding sources to the funds. If you have not yet set up your funds, or you need to add a new one, you can allocate credits to funds from the funds interface. See section 1.2 for more information.
+If you have already set up your funds, then you can then click the Allocate to
+Fund button to apply credits from the funding sources to the funds. If you have
+not yet set up your funds, or you need to add a new one, you can allocate
+credits to funds from the funds interface. See section 1.2 for more information.
 
 . To allocate credits to funds, click _Allocate to Fund_.
 
@@ -342,50 +513,87 @@ If you have already set up your funds, then you can then click the Allocate to F
 
 . Click _Apply_.
 
-Track Debits and Credits
+Track debits and credits
 ^^^^^^^^^^^^^^^^^^^^^^^^
 
-You can track credits to and allocations from each funding source. These amounts are updated when credits and allocations are made in the Funding Source Details. Access the Funding Source Details by clicking on the hyperlinked name of the Funding Source.
+You can track credits to and allocations from each funding source. These amounts
+ are updated when credits and allocations are made in the Funding Source
+ Details. Access the Funding Source Details by clicking on the hyperlinked name 
+ of the Funding Source.
 
 Funds
 ~~~~~
 
 indexterm:[acquisitions,funds]
 
-Funds allow you to allocate credits toward specific purchases. In the funds interface, you can create funds; allocate credits from funding sources to funds; transfer money between funds; and apply fund tags to funds. Funds are created for a specific year, either fiscal or calendar. These funds are owned by org units. At the top of the funds interface, you can set a contextual org unit and year. The drop down menu at the top of the screen enables you to focus on funds that are owned by specific organizational units during specific years.
+Funds allow you to allocate credits toward specific purchases. In the funds
+interface, you can create funds; allocate credits from funding sources to funds;
+ transfer money between funds; and apply fund tags to funds. Funds are created
+ for a specific year, either fiscal or calendar. These funds are owned by org
+ units. At the top of the funds interface, you can set a contextual org unit and
+ year. The drop-down menu at the top of the screen enables you to focus on funds
+ that are owned by specific organizational units during specific years.
 
 Create a fund
 ^^^^^^^^^^^^^
 
-. To create a new fund, click _Admin -> Server Administration -> Acquisitions -> Funds_.
-. Enter a name for the fund. No limits exist on the number of characters that can be entered in this field.
-. Create a code for the fund. No limits exist on the number of characters that can be entered in this field.
-. Enter a year for the fund. This can be a fiscal year or a calendar year. The format of the year is YYYY.
-. Select an org unit from the drop down menu. The org unit indicates the organizational units whose staff can use this fund. This menu is populated with the shortnames that you created for your libraries in the organizational units tree (See Admin -> Server Administration -> Organizational Units).
+. To create a new fund, click _Admin -> Server Administration -> Acquisitions ->
+ Funds_.
+. Enter a name for the fund. No limits exist on the number of characters that
+can be entered in this field.
+. Create a code for the fund. No limits exist on the number of characters that
+can be entered in this field.
+. Enter a year for the fund. This can be a fiscal year or a calendar year. The
+format of the year is YYYY.
+. Select an org unit from the drop-down menu. The org unit indicates the
+organizational units whose staff can use this fund. This menu is populated with
+the shortnames that you created for your libraries in the organizational units
+tree (See Admin -> Server Administration -> Organizational Units).
 +
 [NOTE]
 The rule of parental inheritance applies to this list. See section
 +
-. Select a currency type from the drop down menu. This menu is comprised of entries in the currency types menu. When a fund is applied to a line item or copy, the price of the item will be encumbered in the currency associated with the fund.
-. Click the Active box to activate this fund. You cannot make purchases from this fund if it is not active.
-. Enter a Balance Stop Percent. The balance stop percent prevents you from making purchases when only a specified amount of the fund remains. For example, if you want to spend 95 percent of your funds, leaving a five percent balance in the fund, then you would enter 95 in the field. When the fund reaches its balance stop percent, it will appear in red when you apply funds to copies.
-. Enter a Balance Warning Percent. The balance warning percent gives you a warning that the fund is low. You can specify any percent. For example, if you want to spend 90 percent of your funds and be warned when the fund has only 10 percent of its balance remaining, then enter 90 in the field. When the fund reaches its balance warning percent, it will appear in yellow when you apply funds to copies.
-. Check the Propagate box to propagate funds. When you propagate a fund, the ILS will create a new fund for the following fiscal year with the same parameters as your current fund. All of the settings transfer except for the year and the amount of money in the fund. Propagation occurs during the fiscal year close~out operation.
-. Check the Rollover box if you want to roll over remaining funds into the same fund next year.
+. Select a currency type from the drop-down menu. This menu is comprised of
+entries in the currency types menu. When a fund is applied to a line item or
+copy, the price of the item will be encumbered in the currency associated with
+the fund.
+. Click the Active box to activate this fund. You cannot make purchases from 
+this fund if it is not active.
+. Enter a Balance Stop Percent. The balance stop percent prevents you from 
+making purchases when only a specified amount of the fund remains. For example,
+if you want to spend 95 percent of your funds, leaving a five percent balance in
+ the fund, then you would enter 95 in the field. When the fund reaches its
+ balance stop percent, it will appear in red when you apply funds to copies.
+. Enter a Balance Warning Percent. The balance warning percent gives you a 
+warning that the fund is low. You can specify any percent. For example, if you
+want to spend 90 percent of your funds and be warned when the fund has only 10
+percent of its balance remaining, then enter 90 in the field. When the fund
+reaches its balance warning percent, it will appear in yellow when you apply
+funds to copies.
+. Check the Propagate box to propagate funds. When you propagate a fund, the ILS
+will create a new fund for the following fiscal year with the same parameters
+as your current fund. All of the settings transfer except for the year and the
+amount of money in the fund. Propagation occurs during the fiscal year close-out
+operation.
+. Check the Rollover box if you want to roll over remaining funds into the same
+fund next year. You should also check this box if you only want to roll over
+encumbrances into next year's fund.
 . Click _Save_.
 
-Allocate Credits from Funding Sources to Funds
+Allocate credits from funding sources to funds
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-Credits can be applied to funds from funding sources using the fund interface. The credits that you apply to the fund can be applied later to purchases.
+Credits can be applied to funds from funding sources using the fund interface.
+The credits that you apply to the fund can be applied later to purchases.
 
-. To access funds, click _Admin -> Server Administration -> Acquisitions -> Funds_.
+. To access funds, click _Admin -> Server Administration -> Acquisitions -> 
+Funds_.
 
 . Click the hyperlinked name of the fund.
 
 . To add a credit to the fund, click the Create Allocation tab.
 
-. Choose a Funding Source from the drop down menu.
+. Choose a Funding Source from the drop-down menu.
 
 . Enter an amount that you want to apply to the fund from the funding source.
 
@@ -396,9 +604,12 @@ Credits can be applied to funds from funding sources using the fund interface. T
 Transfer credits between funds
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-The credits that you allocate to funds can be transferred between funds if desired. In the following example, you can transfer $500.00 from the Young Adult Fiction fund to the Children's DVD fund.
+The credits that you allocate to funds can be transferred between funds if
+desired. In the following example, you can transfer $500.00 from the Young Adult
+Fiction fund to the Children's DVD fund.
 
-. To access funds, click _Admin -> Server Administration -> Acquisitions -> Funds_.
+. To access funds, click _Admin -> Server Administration -> Acquisitions -> 
+Funds_.
 
 . Click the hyperlinked name of the originating fund.
 
@@ -406,37 +617,47 @@ The credits that you allocate to funds can be transferred between funds if desir
 
 . Enter the amount that you would like to transfer.
 
-. From the drop down menu, select the destination fund.
+. From the drop-down menu, select the destination fund.
 
 . Add a note. This field is optional.
 
 . Click _Transfer_.
 
-Track Balances and Expenditures
+Track balances and expenditures
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-The Fund Details allows you to track the fund's balance, encumbrances, and amount spent. It also allows you to track allocations from the funding source(s), debits, and fund tags.
+The Fund Details allows you to track the fund's balance, encumbrances, and
+amount spent. It also allows you to track allocations from the funding
+source(s), debits, and fund tags.
 
-. To access the fund details, click on the hyperlinked name of the fund that you created.
+. To access the fund details, click on the hyperlinked name of the fund that you
+created.
 
 . The Summary allows you to track the following:
 
-. Balance - The balance is calculated by subtracting both items that have been invoiced and encumbrances from the total allocated to the fund.
-. Total Allocated - This amount is the total amount allocated from the Funding Source.
-. Spent Balance - This balance is calculated by subtracting only the items that have been invoiced from the total allocated to the fund. It does not include encumbrances.
-. Total Debits - The total debits are calculated by adding the cost of items that have been invoiced and encumbrances.
-. Total Spent - The total spent is calculated by adding the cost of items that have been invoiced. It does not include encumbrances.
-. Total Encumbered - The total encumbered is calculated by adding all encumbrances.
+. Balance - The balance is calculated by subtracting both items that have been
+invoiced and encumbrances from the total allocated to the fund.
+. Total Allocated - This amount is the total amount allocated from the Funding
+Source.
+. Spent Balance - This balance is calculated by subtracting only the items that
+have been invoiced from the total allocated to the fund. It does not include
+encumbrances.
+. Total Debits - The total debits are calculated by adding the cost of items
+that have been invoiced and encumbrances.
+. Total Spent - The total spent is calculated by adding the cost of items that
+have been invoiced. It does not include encumbrances.
+. Total Encumbered - The total encumbered is calculated by adding all
+encumbrances.
 
 
-Core Source Added for Fund Reporting
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Fund reporting
+^^^^^^^^^^^^^^
 
 indexterm:[aquisitions,funds,reports]
 indexterm:[reports,funds]
 
-A new core source, Fund Summary, has been added to the reports interface.  This
-core source enables librarians to run easily a report on fund activity.  Fields
+A core source, Fund Summary, is available in the reports interface.  This
+core source enables librarians to easily run a report on fund activity.  Fields
 that are accessible in this interface include Remaining Balance, Total
 Allocated, Total Encumbered, and Total Spent.
 
@@ -445,126 +666,267 @@ image::media/Core_Source_1.jpg[Core_Source1]
 
 
 
-Edit a Fund
+Edit a fund
 ^^^^^^^^^^^
 
 Edit a fund just as you would edit a currency type.
 
-Perform Year End Closeout Operation
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Perform fiscal year close-out operation
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 indexterm:[aquisitions,funds,fiscal rollover]
 
-The Year End Closeout Operation allows you to deactivate funds for the current year and create analogous funds for the next year. It transfers encumbrances to the analogous funds, and it rolls over any remaining funds if you checked the rollover box when creating the fund.
+The Fiscal Year Close-Out Operation allows you to deactivate funds for the
+current year and create analogous funds for the next year. It transfers
+encumbrances to the analogous funds, and it rolls over any remaining funds if
+you checked the rollover box when creating the fund.
 
-. To access the year end closeout of a fund, click Admin -> Server Administration -> Acquisitions -> Funds.
+. To access the year end closeout of a fund, click Admin -> Server
+Administration -> Acquisitions -> Funds.
 
 . Click _Fund Propagation and Rollover_.
 
-. Check the box adjacent to _Perform Fiscal Year Close~Out Operation_.
-
-. Notice that the context org unit reflects the context org unit that you selected at the top of the Funds screen.
-
-. If you want to perform the close~out operation on the context org unit and its child units, then check the box adjacent to Include Funds for Descendant Org Units.
-
-. Check the box adjacent to dry run if you want to test changes to the funds before they are enacted. Evergreen will generate a summary of the changes that would occur during the selected operations. No data will be changed.
-
-. Click _Process_.
-
-. Evergreen will begin the propagation process. Evergreen will make a clone of each fund, but it will increment the year by .
+. Check the box adjacent to _Perform Fiscal Year Close-Out Operation_.
 
-Enhancements to Fiscal Rollover
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-indexterm:[aquisitions,funds,fiscal rollover]
+. For funds that have the "Rollover" setting enabled, if you want to move the
+fund's encumbrances to the next year without moving unspent money, check the
+box adjacent to _Limit Fiscal Year Close-out Operation to Encumbrances_.
++
+[NOTE]
+The _Limit Fiscal Year Close-out Operation to Encumbrances_ will only display
+if the _Allow funds to be rolled over without bringing the money along_ Library
+Setting has been enabled. This setting is available in the Library Setting
+Editor accessible via _Administration_ -> _Local Administration_ -> _Library
+Settings Editor_.
++
+image::media/Fiscal_Rollover1.jpg[Fiscal_Rollover1]
 
-An enhancement to the fiscal rollover process enables you to move a fund's
-encumbrances from one year to the next without moving unspent money.  Unused
-money is not added to the next year's fund and is not available for use.
+. Notice that the context org unit reflects the context org unit that you
+selected at the top of the Funds screen.
 
-To enable this enhancement, you must configure a new org unit setting:
+. If you want to perform the close-out operation on the context org unit and its
+child units, then check the box adjacent to Include Funds for Descendant Org
+Units.
 
-. Click *Administration* -> *Local Administration* -> *Library Settings
-Editor*.
-. Search for the setting, *Allow funds to be rolled over without bringing the
-money along*.
-. Click *Edit*.
-. Set the value to *True*.
-. Click *Update Setting*.
+. Check the box adjacent to dry run if you want to test changes to the funds
+before they are enacted. Evergreen will generate a summary of the changes that
+would occur during the selected operations. No data will be changed.
 
-Enabling this setting will display a new check box in the *Fund Propagation &
-Rollover* drop down menu.  To use this feature during the fiscal rollover
-process, click the check box adjacent to *Limit Fiscal Year Close-out Operation
-to Encumbrances*. 
+. Click _Process_.
 
-image::media/Fiscal_Rollover1.jpg[Fiscal_Rollover1]
+. Evergreen will begin the propagation process. Evergreen will make a clone of
+each fund, but it will increment the year by 1.
 
 Invoice menus
 ~~~~~~~~~~~~~
 
 indexterm:[acquisitions,invoices]
 
-Invoice menus allow you to create drop down menus that appear on invoices. You can create an invoice item type or invoice payment method.
+Invoice menus allow you to create drop-down menus that appear on invoices. You
+can create an invoice item type or invoice payment method.
 
 Invoice item type
 ^^^^^^^^^^^^^^^^^
 
-The invoice item type allows you to enter the types of additional charges that you can add to an invoice. Examples of additional charge types might include taxes or processing fees. Charges for bibliographic items are listed separately from these additional charges. A default list of charge types displays, but you can add custom charge types to this list. Invoice item types can also be used when adding non~bibliographic items to a purchase order. When invoiced, the invoice item type will copy from the purchase order to the invoice.
+The invoice item type allows you to enter the types of additional charges that
+you can add to an invoice. Examples of additional charge types might include
+taxes or processing fees. Charges for bibliographic items are listed separately
+from these additional charges. A default list of charge types displays, but you
+can add custom charge types to this list. Invoice item types can also be used
+when adding non-bibliographic items to a purchase order. When invoiced, the
+invoice item type will copy from the purchase order to the invoice.
 
-. To create a new charge type, click _Admin -> Server Administration -> Acquisitions -> Invoice Item Type_.
+. To create a new charge type, click _Admin -> Server Administration ->
+Acquisitions -> Invoice Item Type_.
 
 . Click _New Invoice Item Type_.
 
-. Create a code for the charge type. No limits exist on the number of characters that can be entered in this field.
+. Create a code for the charge type. No limits exist on the number of characters
+that can be entered in this field.
 
-. Create a label. No limits exist on the number of characters that can be entered in this field. The text in this field appears in the drop down menu on the invoice.
+. Create a label. No limits exist on the number of characters that can be
+entered in this field. The text in this field appears in the drop-down menu on
+the invoice.
 
-. If items on the invoice were purchased with the monies in multiple funds, then you can divide the additional charge across funds. Check the box adjacent to Prorate-> if you want to prorate the charge across funds.
+. If items on the invoice were purchased with the monies in multiple funds, then
+you can divide the additional charge across funds. Check the box adjacent to
+Prorate-> if you want to prorate the charge across funds.
 
 . Click _Save_.
 
 Invoice payment method
 ^^^^^^^^^^^^^^^^^^^^^^
 
-The invoice payment method allows you to predefine the type(s) of invoices and payment method(s) that you accept. The text that you enter in the admin module will appear as a drop down menu in the invoice type and payment method fields on the invoice.
+The invoice payment method allows you to predefine the type(s) of invoices and
+payment method(s) that you accept. The text that you enter in the admin module
+will appear as a drop-down menu in the invoice type and payment method fields on
+the invoice.
 
-. To create a new invoice payment method, click _Admin -> Server Administration -> Acquisitions -> Invoice Payment Method_.
+. To create a new invoice payment method, click _Admin -> Server Administration 
+-> Acquisitions -> Invoice Payment Method_.
 
 . Click _New Invoice Payment Method_.
 
-. Create a code for the invoice payment method. No limits exist on the number of characters that can be entered in this field.
+. Create a code for the invoice payment method. No limits exist on the number of
+characters that can be entered in this field.
 
-. Create a name for the invoice payment method. No limits exist on the number of characters that can be entered in this field. The text in this field appears in the drop down menu on the invoice.
+. Create a name for the invoice payment method. No limits exist on the number of
+characters that can be entered in this field. The text in this field appears in
+the drop-down menu on the invoice.
 
 . Click _Save_.
 
 Payment methods can be deleted from this screen.
 
-Line item features
+Line Item Features
 ~~~~~~~~~~~~~~~~~~
 [[line_item_features]]
 
 indexterm:[acquisitions,line items]
 
-Line item alerts are predefined text that can be added to line items that are on selection lists or purchase orders. You can define the alerts from which staff can choose. Line item alerts appear in a pop up box when the line item, or any of its copies, are marked as received.
+Line item alerts are predefined text that can be added to line items that are on
+selection lists or purchase orders. You can define the alerts from which staff
+can choose. Line item alerts appear in a pop-up box when the line item, or any
+of its copies, are marked as received.
 
 Create a line item alert
 ^^^^^^^^^^^^^^^^^^^^^^^^
 
-. To create a line item alert, click _Administration -> Server Administration -> Acquisitions -> Line Item Alerts_.
+. To create a line item alert, click _Administration -> Server Administration ->
+Acquisitions -> Line Item Alerts_.
 
 . Click _New Line Item Alert Text_.
 
-. Create a code for the text. No limits exist on the number of characters that can be entered in this field.
+. Create a code for the text. No limits exist on the number of characters that
+can be entered in this field.
 
-. Create a description for the text. No limits exist on the number of characters that can be entered in this field.
+. Create a description for the text. No limits exist on the number of characters
+that can be entered in this field.
 
-. Select an owning library from the drop down menu. The owning library indicates the organizational units whose staff can use this alert. This menu is populated with the shortnames that you created for your libraries in the organizational units tree (See Admin -> Server Administration -> Organizational Units).
+. Select an owning library from the drop-down menu. The owning library indicates
+the organizational units whose staff can use this alert. This menu is populated
+with the shortnames that you created for your libraries in the organizational
+units tree (See Admin -> Server Administration -> Organizational Units).
 
 . Click _Save_.
 
-Line Item MARC Attribute Definitions
+Line item MARC attribute definitions
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-Line item attributes define the fields that Evergreen needs to extract from the bibliographic records that are in the acquisitions database to display in the catalog. Also, these attributes will appear as fields in the New Brief Record interface. You will be able to enter information for the brief record in the fields where attributes have been defined.
+Line item attributes define the fields that Evergreen needs to extract from the
+bibliographic records that are in the acquisitions database to display in the
+catalog. Also, these attributes will appear as fields in the New Brief Record
+interface. You will be able to enter information for the brief record in the
+fields where attributes have been defined.
+
+Providers
+~~~~~~~~~
+
+Providers are vendors. You can create a provider profile that includes contact
+information for the provider, holdings information, invoices, and other
+information.
+
+Create a provider
+^^^^^^^^^^^^^^^^^
+
+. To create a new provider, click _Admin_ -> _Server Administration_ -> 
+_Acquisitions_ -> _Providers_.
+
+. Enter the provider name.
+
+. Create a code for the provider. No limits exist on the number of characters
+that can be entered in this field.
+
+. Select an owner from the drop-down menu. The owner indicates the
+organizational units whose staff can use this provider. This menu is populated
+with the shortnames that you created for your libraries in the organizational
+units tree (See Admin -> Server Administration -> Organizational Units).
++
+[NOTE]
+The rule of parental inheritance applies to this list.
++
+. Select a currency from the drop-down menu. This drop-down list is populated by
+the list of currencies available in the currency types.
+
+. A provider must be active in order for purchases to be made from that
+provider. To activate the provider, check the box adjacent to Active. To
+deactivate a vendor, uncheck the box.
+
+. Add the default # of copies that are typically ordered through the provider.
+This number will automatically populate the line item's _Copies_ box on any PO's
+associated with this provider. If another quantity is entered during the
+selection or ordering process, it will override this default. If no number is
+specified, the default number of copies will be zero.
+
+. Select a default claim policy from the drop-down box. This list is derived
+from the claim policies that can be created
+
+. Select an EDI default. This list is derived from the EDI accounts that can be
+created.
+
+. Enter the provider's email address.
+
+. In the Fax Phone field, enter the provider's fax number.
+
+. In the holdings tag field, enter the tag in which the provider places holdings
+data.
+
+. In the phone field, enter the provider's phone number.
+
+. If prepayment is required to purchase from this provider, then check the box
+adjacent to prepayment required.
+
+. Enter the Standard Address Number (SAN) for your provider.
+
+. Enter the web address for the provider's website in the URL field.
+
+. Click Save.
+
+Add contact and holdings information to providers
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+After you save the provider profile, the screen reloads so that you can save
+additional information about the provider. You can also access this screen by
+clicking the hyperlinked name of the provider on the Providers screen. The tabs
+allow you to add a provider address and contact, attribute definitions, and
+holding subfields. You can also view invoices associated with the provider.
+
+. Enter a Provider Address, and click Save.
++
+[NOTE]
+Required fields for the provider address are: Street 1, city, state, country,
+post code. You may have multiple valid addresses.
++
+. Enter the Provider Contact, and click Save.
+
+. Your vendor may include information that is specific to your organization in
+MARC tags. You can specify the types of information that should be entered in
+each MARC tag. Enter attribute definitions to correlate MARC tags with the
+information that they should contain in incoming vendor records. Some technical
+knowledge is required to enter XPath information. As an example, if you need to
+import the PO Name, you could set up an attribute definition by adding an XPath
+similar to:
++
+------------------------------------------------------------------------------
+code => purchase_order
+xpath => //*[@tag="962"]/*[@code="p"]
+Is Identifier => false
+------------------------------------------------------------------------------
++
+where 962 is the holdings tag and p is the subfield that contains the PO Name.
+
+
+. You may have entered a holdings tag when you created the provider profile. You
+can also enter holdings subfields. Holdings subfields allow you to
+specify subfields within the holdings tag to which your vendor adds holdings
+information, such as quantity ordered, fund, and estimated price.
+
+. Click invoices to access invoices associated with a provider.
+
+Edit a provider
+^^^^^^^^^^^^^^^
+
+Edit a provider just as you would edit a currency type.
+
+You can delete providers only if no purchase orders have been assigned to them.
 

commit a8f1cb24b68423ab65e87eafecca862aeb85965c
Author: Angela Kilsdonk <akilsdonk at esilibrary.com>
Date:   Fri May 31 15:09:11 2013 -0400

    Documentation for Org Unit Hiding in TPAC
    
    Added Org Unit Hiding in TPAC documentation to admin/lsa-library_settings_editor.txt.
    
    Signed-off-by: Angela Kilsdonk <akilsdonk at esilibrary.com>

diff --git a/docs/admin/lsa-library_settings_editor.txt b/docs/admin/lsa-library_settings_editor.txt
index 5568cc1..b9ab298 100644
--- a/docs/admin/lsa-library_settings_editor.txt
+++ b/docs/admin/lsa-library_settings_editor.txt
@@ -78,3 +78,16 @@ failure message appears, and the patron must click _Submit_ to override the hold
 In version 2.3, with the appropriate org unit setting enabled, the hold success
 message appears automatically, and the patron is not required to take further
 action.
+
+Org Unit Hiding in TPAC
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This feature enables you to hide specific org units from patron view in the OPAC.  Org units that have not inherited this setting will display in patron-facing dropdowns.
+
+*To enable Org Unit Hiding in TPAC:*
+
+1) Click *Admin* -> *Local Administration* -> *Library Settings Editor* -> *Org Unit Hiding Depth*.  Note: This setting is inherited.
+
+2) Enter a value of 0, 1, or 2 as appropriate.  Values are described in the setting description.  To view the setting description, click the *Edit* link in the first column on the *Library Settings* interface.
+
+3) Click *Update Setting*.

commit 4ce314f5d86b2b20a94a8dfde94523125f725052
Author: Angela Kilsdonk <akilsdonk at esilibrary.com>
Date:   Thu May 30 11:12:40 2013 -0400

    Documentation for Call Numbers in My Lists
    
    Signed-off-by: Angela Kilsdonk <akilsdonk at esilibrary.com>

diff --git a/docs/media/my_list_call_numbers.JPG b/docs/media/my_list_call_numbers.JPG
new file mode 100644
index 0000000..9b3fde0
Binary files /dev/null and b/docs/media/my_list_call_numbers.JPG differ
diff --git a/docs/opac/my_lists.txt b/docs/opac/my_lists.txt
index 0e018e3..db485ca 100644
--- a/docs/opac/my_lists.txt
+++ b/docs/opac/my_lists.txt
@@ -1,5 +1,5 @@
-My Lists 2.2
-------------
+My Lists
+--------
 
 The *My Lists* feature replaces the bookbag feature that was available in versions proior to 2.2.  The *My Lists* feature is a part of the Template Toolkit OPAC that is available in version 2.2.  This feature enables you to create temporary and permanent lists; create and edit notes for items in lists; place holds on items in lists; and share lists via RSS feeds and CSV files.
 
@@ -58,6 +58,21 @@ image::media/My_Lists7.jpg[My_Lists7]
 16) When you no longer need a list, click *Delete List*. 
 
 
+Local Call Number in My Lists
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+As of Evergreen version 2.4, when a title is added to a list in the TPAC, a local call number will be displayed in the list to assist patrons in locating the physical item.  Evergreen will look at the following locations to identify the most relevant call number to display in the list:  
+
+1)	Physical location – the physical library location where the search takes place
+2)	Preferred library – the Preferred Search Location, which is set in patron OPAC account Search and History Preferences, or the patron’s Home Library
+3)	Search library – the search library or org unit that is selected in the OPAC search interface
+
+The call number that is displayed will be the most relevant call number to the searcher.  If the patron is searching at the library, Evergreen will display a call number from that library location.  If the patron is not searching at a library, but is logged in to their OPAC account, Evergreen will display a call number from their Home Library or Preferred Search Location.  If the patron is not searching at the library and is not signed in to their OPAC account, then Evergreen will display a call number from the org unit, or library, that they choose to search in the OPAC search interface.
+
+The local call number and associated library location will appear in the list:
+
+image::media/my_list_call_numbers.JPG[Local Call Number in List]
+
+
 
 
 

commit f87e1f1c02023fa6dfcbe73bf0850a2a89a322dd
Author: Ben Shum <bshum at biblio.org>
Date:   Thu May 23 16:32:49 2013 -0400

    LP1081576 - fix utf8 characters in searches using portal page
    
    Replace escape() with encodeURIComponent() on the portal page to allow utf8
    characters to be passed more appropriately to the subsequent search in catalog.
    
    Thanks Dan Scott for pointing this out.
    
    Signed-off-by: Ben Shum <bshum at biblio.org>
    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>

diff --git a/Open-ILS/xul/staff_client/server/index.xhtml b/Open-ILS/xul/staff_client/server/index.xhtml
index 69c7baf..f39e75f 100644
--- a/Open-ILS/xul/staff_client/server/index.xhtml
+++ b/Open-ILS/xul/staff_client/server/index.xhtml
@@ -41,9 +41,9 @@
         var search_depth = 0; // 0 = consortium, 1 = system, 2 = library, 3 = sub-library, etc.
         
         if(textbox && textbox.value != "") {
-                var opac_url =  xulG.url_prefix('opac_rresult') + "?rt=keyword&tp=keyword&l=" + home_ou_id + "&d=" + search_depth +"&f=&t=" + escape(textbox.value);
+                var opac_url =  xulG.url_prefix('opac_rresult') + "?rt=keyword&tp=keyword&l=" + home_ou_id + "&d=" + search_depth +"&f=&t=" + encodeURIComponent(textbox.value);
                 if (urls.opac_rresult.match(/\/eg\/opac\/results/)) {
-                    opac_url =  xulG.url_prefix('opac_rresult') + "?query=" + escape(textbox.value);
+                    opac_url =  xulG.url_prefix('opac_rresult') + "?query=" + encodeURIComponent(textbox.value);
                 }
                 var params = {'tab_name':'Catalog'};
                 var content_params = { 'session' : ses(), 'authtime' : ses('authtime'), 'opac_url' : opac_url };

commit 46fa88eaf355b6e0911ae8d0ac807ac3e8f7c4bf
Author: Kathy Lussier <klussier at masslnc.org>
Date:   Thu May 30 13:01:38 2013 -0400

    Documentation updates for acquisitions invoices
    
    Updates to acquisitions invoices documentation, including new 2.4
    features. Also moves up some 2.1 documentation that is still relevant.
    
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/docs/acquisitions/invoices.txt b/docs/acquisitions/invoices.txt
index def1f1e..c47c361 100644
--- a/docs/acquisitions/invoices.txt
+++ b/docs/acquisitions/invoices.txt
@@ -4,25 +4,86 @@ Invoices
 
 indexterm:[acquisitions,invoices]
 
-Electronic Invoicing
-~~~~~~~~~~~~~~~~~~~~
+You can create invoices for purchase orders, individual line items, and blanket purchases. You can also link existing invoices to purchase order.
 
-indexterm:[acquisitions,invoices,electronic]
+You can invoice items before you receive the items if desired. You can also
+reopen closed invoices, and you can print all invoices.
 
-Evergreen can receive electronic invoices from providers.  To
-access an electronic invoice, you must:
+Creating invoices and adding line items
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+You can add specific line items to an invoice from the PO or acquisitions
+search results screen. You can also search for relevant line items from within 
+the invoice interface. In addition, you can add all line items from an entire
+Purchase order to an invoice or you can create a blanket invoice for items that are not 
+attached to a purchase order.
 
-. Configure EDI for your provider. 
-. Evergreen will receive invoices electronically from the provider.
-. Click *Acquisitions* -> *Open Invoices* to view a list of open invoices, or
-use the *General Search* to retrieve invoices.  Click a hyperlinked invoice
-number to view the invoice.
+Creating a blanket invoice
+^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-image::media/Electronic_invoicing1.jpg[Electronic_invoicing1]
+You can create a blanket invoice for purchases that are not attached to a purchase order.
+
+. Click Acquisitions -> Create invoice.
+. Enter the invoice information in the top half of the screen.
+. To add charges for materials not attached to a purchase order, click _Add
+Charge..._ This functionality may also be used to add shipping, tax, and other fees.
+. Select a charge type from the drop-down menu.
++
+[NOTE]
+New charge types can be added via _Admin_ -> _Server Administration_ ->
+_Acquisitions_ -> _Invoice Item Type_.
++
+. Select a fund from the drop-down menu.
+. Enter a _Title/Description_ of the resource.
+. Enter the amount that you were billed.
+. Enter the amount that you paid.
+. Save the invoice.
+
+image::media/acq_invoice_blanket.png[Blanket invoice]
+
+Adding line items from a Purchase Order or search results screen to an invoice
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+You can create an invoice or add line items to an invoice directly from a
+Purchase Order or an acquisitions search results screen. 
 
+. Place a checkmark in the box for selected line items from the Purchase Order' or acquisitions search results page.
+. If you are creating a new invoice, click _Actions_ -> _Create Invoice From
+Selected Line Items_.  Enter the invoice information in the top half of the
+screen.
+. If you are adding the line items to an existing invoice, click _Actions_ ->
+_Link Selected Line Items to Invoice_. Enter the Invoice # and Provider and
+then click the _Link_ button.
+. Evergreen automatically enters the number of items that was ordered in
+the # Invoiced and # Paid fields. Adjust these quantities as needed.
+. Enter the amount that the organization was billed. This entry will
+automatically propragate to the Paid field.
+. You have the option to add charge types if applicable. Charge types are
+additional charges that can be selected from the drop-down menu. Common charge
+types include taxes and handling fees.
+. You have four options for saving an invoice.
 
-Search for Line Items from an Invoice
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+- Click _Save_ to save the changes you have made while staying in the current
+invoice.
+- Click _Save & Clear_ to save the changes you have made and to replace the 
+current invoice with a new invoice so that you can continue invoicing items.
+- Click _Prorate_ to save the invoice and prorate any additional charges, such
+as taxes, across funds, if multiple funds have been used to pay the invoice.
+
++
+[NOTE]
+Prorating will only be applied to charge types that have the _Prorate?_ flag set
+to true. This setting can be adjusted via _Admin_ -> _Server Administration_
+-> _Acquisitions_ -> _Invoice Item Type_.
++
+
+- Click _Close_. Choose this option when you have completed the invoice. This
+option will also save any changes that have been made.
+
+. You can re-open a closed invoice by clicking the link, _Re-open invoice_. This
+link appears at the bottom of a closed invoice.
+
+Search for line items from an invoice
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 indexterm:[acquisitions,lineitems,searching for]
 indexterm:[acquisitions,invoices,searching for lineitems]
@@ -36,21 +97,21 @@ In this example, we'll add line items to a new invoice:
 
 indexterm:[acquisitions,lineitems,adding]
 
-. Click *Acquisitions* -> *Create Invoice*.
+. Click _Acquisitions_ -> _Create Invoice_.
 . An invoice summary appears at the top of the invoice and includes the number
 of line items on the invoice and the expected cost of the items.  This number
 will change as we add line items to the invoice.
 . Enter the invoice details (optional).  If you do not enter the invoice
-details, then Evergreen will populate the *Provider* and *Receiver* fields with
+details, then Evergreen will populate the _Provider_ and _Receiver_ fields with
 information from the line items.  
 +
-NOTE: If you do not want to display the details, click *Hide Details*.
+NOTE: If you do not want to display the details, click _Hide Details_.
 +
 image::media/Search_for_line_items_from_an_invoice1.jpg[Search_for_line_items_from_an_invoice1]
 +
-. Click the *Search* tab to add line items to an invoice.
-. Select your search criteria from the drop down menu.  
-. On the right side of the screen, *Limit to Invoiceable Items* is checked by
+. Click the _Search_ tab to add line items to an invoice.
+. Select your search criteria from the drop-down menu.  
+. On the right side of the screen, _Limit to Invoiceable Items_ is checked by
 default.  Invoiceable items are those that are on order, have not been
 cancelled, and have not yet been invoiced.  Evergreen also filters out items
 that have already been added to an invoice.  Finally, if this box is checked,
@@ -66,24 +127,142 @@ search results list to build with each subsequent search. This option is useful
 for libraries that might search for line items by scanning an ISBN. Several
 ISBNs can be scanned and then the entire result set can be selected and moved
 to the invoice in a batch.
-. Click *Search*.
+. Click _Search_.
 +    
 image::media/Search_for_line_items_from_an_invoice2.jpg[Search_for_line_items_from_an_invoice2]
 +
-. Use the *Next* button to page through results, or select a line item(s), and
-click *Add Selected Items to Invoice*.
-+
+. Use the _Next_ button to page through results, or select a line item(s), and
+click _Add Selected Items to Invoice_.
 .The rows that you selected are highlighted, and the invoice summary at the
 top of the screen updates.
 +
 image::media/Search_for_line_items_from_an_invoice3.jpg[Search_for_line_items_from_an_invoice3]
 +
-. Click the *Invoice* tab to see the updated invoice.
-. Enter the number of copies for which you were invoiced, the amount that was
-billed, and the amount that was paid.  The *Per Copy* field calculates the cost
-of each copy by dividing the amount that was billed by the number of copies for
-which the library paid.
-. Save the invoice.  A new option, *Save and Clear*, saves the current invoice
-and replaces it with a new invoice so that you can continue invoicing items.
+. Click the _Invoice_ tab to see the updated invoice.
+. Evergreen automatically enters the number of items that was ordered in the
+# Invoiced and # Paid fields. Adjust these quantities as needed.
+. Enter the amount that the organization was billed. This entry will
+automatically propragate to the Paid field. The _Per Copy_ field calculates the
+cost of each copy by dividing the amount that was billed by the number of
+copies for which the library paid.
 
 image::media/Search_for_line_items_from_an_invoice5.jpg[Search_for_line_items_from_an_invoice5]
+
+Create an invoice for a purchase order
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+You can create an invoice for all of the line items on a purchase order. With
+the exception of fields with drop-down menus, no limitations on the data that you enter exist.
+
+. Open a purchase order.
+. Click _Create Invoice_.
+. Enter a Vendor Invoice ID. This number may be listed on the paper invoice
+sent from your vendor.
+. Choose a Receive Method from the drop-down menu. The system will default to
+_Paper_.
+. The Provider is generated from the purchase order and is entered by default.
+. Enter a note (optional).
+. Select a payment method from the drop-down menu (optional).
+. The Invoice Date is entered by default as the date that you create the
+invoice. You can change the date by clicking in the field. A calendar drops
+down.
+. Enter an Invoice Type (optional).
+. The Shipper defaults to the provider that was entered in the purchase order.
+. Enter a Payment Authorization (optional).
+. The Receiver defaults to the branch at which your workstation is registered.
+You can change the receiver by selecting an org unit from the drop-down menu.
++
+[NOTE]
+The bibliographic line items are listed in the next section of the invoice.
+Along with the _title_ and _author_ of the line items is a _summary of copies
+ordered, received, invoiced, claimed,_ and _cancelled_. You can also view the
+_amounts estimated, encumbered,_ and _paid_ for each line item. Finally, each
+line item has a _line item ID_ and links to the _selection list_ (if used) and
+the _purchase order_.
++
+. Evergreen automatically enters the number of items that was ordered in the
+# Invoiced and # Paid fields. Adjust these quantities as needed.
+. Enter the amount that the organization was billed. This entry will
+automatically propragate to the Paid field. The _Per Copy_ field calculates the
+cost of each copy by dividing the amount that was billed by the number of
+copies for which the library paid.
+. You have the option to add charge types if applicable. Charge types are
+additional charges that can be selected from the drop-down menu. Common charge
+types include taxes and handling fees.
+. You have four options for saving an invoice.
+
+- Click _Save_ to save the changes you have made while staying in the current
+invoice.
+- Click _Save & Clear_ to save the changes you have made and to replace the
+current invoice with a new invoice so that you can continue invoicing items.
+- Click _Prorate_ to save the invoice and prorate any additional charges, such
+as taxes, across funds, if multiple funds have been used to pay the invoice.
+
++
+[NOTE]
+Prorating will only be applied to charge types that have the Prorate? flag set
+to true. This setting can be adjusted via _Admin_ -> _Server Administration_
+-> _Acquisitions_ -> Invoice Item Type.
++
+
+- Click _Close_. Choose this option when you have completed the invoice. This
+option will also save any changes that have been made.
+
+. You can re-open a closed invoice by clicking the link, _Re-open invoice_. This
+link appears at the bottom of a closed invoice.
+
+Link an existing invoice to a purchase order
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+You can use the link invoice feature to link an existing invoice to a purchase
+order. For example, an invoice is received for a shipment with items on
+purchase order #1 and purchase order #2. When the invoice arrives, purchase
+order #1 is retrieved, and the invoice is created. To receive the items on
+purchase order #2, simply link the invoice to the purchase order. You do not
+need to recreate it.
+
+. Open a purchase order.
+. Click _Link Invoice_.
+. Enter the Invoice # and the Provider of the invoice to which you wish to link.
+. Click _Link_.
+
+image::media/acq_invoice_link.png[Link Invoice]
+
+Electronic Invoicing
+~~~~~~~~~~~~~~~~~~~~
+
+indexterm:[acquisitions,invoices,electronic]
+
+Evergreen can receive electronic invoices from providers.  To
+access an electronic invoice, you must:
+
+. Configure EDI for your provider.
+. Evergreen will receive invoices electronically from the provider.
+. Click _Acquisitions_ -> _Open Invoices_ to view a list of open invoices, or
+use the _General Search_ to retrieve invoices.  Click a hyperlinked invoice
+number to view the invoice.
+
+image::media/Electronic_invoicing1.jpg[Electronic_invoicing1]
+
+View an invoice
+~~~~~~~~~~~~~~~
+
+You can view an invoice in one of four ways: view open invoices; view invoices
+on a purchase order; view invoices by searching specific invoice fields; view
+invoices attached to a line item.
+
+. To view open invoices, click _Acquisitions_ -> _Open invoices_. This opens
+the Acquisitions Search screen. The default fields search for open invoices.
+Click _Search_.
++
+image::media/acq_invoice_view.png[Open Invoice Search]
++
+. To view invoices on a purchase order, open a purchase order and click the
+_View Invoices_ link. The number in parentheses inidicates the number of
+invoices that are attached to the purchase order.
++
+image::media/acq_invoice_view-2.png[View Invoices from PO]
++
+. To view invoices by searching specific invoice fields, see the section on
+searching the acquisitions module.
+. To view invoices for a line item, see the section on line item invoices.

commit 945b6815a55379634556e3a7dfdbc6377158c150
Author: Ben Shum <bshum at biblio.org>
Date:   Sat Apr 13 22:28:53 2013 -0400

    LP1168186 - Add tag 111 and remove subfield 4 from author pool
    
    Add meeting/conference main entry (111) to TPAC author pool.
    
    Remove subfield 4 from the author data because the information contained
    refers to relator and may not be helpful at this time.
    
    Signed-off-by: Ben Shum <bshum at biblio.org>
    Signed-off-by: Mark Cooper <markchristophercooper at gmail.com>

diff --git a/Open-ILS/src/templates/opac/parts/misc_util.tt2 b/Open-ILS/src/templates/opac/parts/misc_util.tt2
index fa29420..a1dbb94 100644
--- a/Open-ILS/src/templates/opac/parts/misc_util.tt2
+++ b/Open-ILS/src/templates/opac/parts/misc_util.tt2
@@ -7,7 +7,7 @@
         FOR node IN xml.findnodes('//*[@tag="' _ target_field _ '"]');
             raw_vals = [];
             core_val = '';
-            FOR subnode IN node.findnodes('./*[not(contains("w 0 5 6 8 9", @code))]');
+            FOR subnode IN node.findnodes('./*[not(contains("w 0 4 5 6 8 9", @code))]');
                 raw_vals.push(subnode.textContent());
             END;
             core_val = raw_vals.join(" ");
@@ -111,6 +111,7 @@
         graphic_880s = [];
         get_graphic_880s(target_field='100');
         get_graphic_880s(target_field='110');
+        get_graphic_880s(target_field='111');
         args.graphic_authors = graphic_880s;
         args.authors = [];
         FOR author IN args.graphic_authors;

commit 69deb930fb33bed914a29f5dfb9aa8dfc5cdbb56
Author: Dan Wells <dbw2 at calvin.edu>
Date:   Thu Apr 11 19:54:12 2013 -0400

    Add corporate author (110) to TPAC author pool
    
    As requested in LP#1168186, here is a simple attempt to add corporate
    authors to the author 'pool' in TPAC.
    
    We may also want to consider adding 111 (meeting or conference as
    main entry), but that isn't totally clear cut.
    
    Signed-off-by: Dan Wells <dbw2 at calvin.edu>
    Signed-off-by: Mark Cooper <markchristophercooper at gmail.com>
    Signed-off-by: Ben Shum <bshum at biblio.org>

diff --git a/Open-ILS/src/templates/opac/parts/misc_util.tt2 b/Open-ILS/src/templates/opac/parts/misc_util.tt2
index fa3ed90..fa29420 100644
--- a/Open-ILS/src/templates/opac/parts/misc_util.tt2
+++ b/Open-ILS/src/templates/opac/parts/misc_util.tt2
@@ -110,6 +110,7 @@
 
         graphic_880s = [];
         get_graphic_880s(target_field='100');
+        get_graphic_880s(target_field='110');
         args.graphic_authors = graphic_880s;
         args.authors = [];
         FOR author IN args.graphic_authors;

commit b06e0d0be9050b84ee09858706474d1e5aade70f
Author: Angela Kilsdonk <akilsdonk at esilibrary.com>
Date:   Wed May 29 15:44:56 2013 -0400

    Documentation for Best Hold Selection Sort Order
    
    Signed-off-by: Angela Kilsdonk <akilsdonk at esilibrary.com>

diff --git a/docs/admin/Best_Hold_Selection_Sort_Order.txt b/docs/admin/Best_Hold_Selection_Sort_Order.txt
new file mode 100644
index 0000000..c525116
--- /dev/null
+++ b/docs/admin/Best_Hold_Selection_Sort_Order.txt
@@ -0,0 +1,60 @@
+Best-Hold Selection Sort Order
+------------------------------
+
+Best-Hold Selection Sort Order allows libraries to configure customized rules for Evergreen to use to select the best hold to fill at opportunistic capture.  When a copy is captured for a hold upon check-in, Evergreen evaluates the holds in the system that the item could fill.  Evergreen uses a set of rules, or a Best-Hold Selection Sort Order, to determine the best hold to fill with the item.  In previous version of Evergreen, there were two sets of rules for Evergreen to use to determine the best hold to fulfill: Traditional and FIFO (First In, First Out).  Traditional uses Org Unit Proximity to identify the nearest hold to fill.  FIFO follows a strict order of first-in, first-out rules.  This feature allows new, custom Best-Hold Selection Sort Orders to be created.  Existing Best-Hold Selection Sort Orders can also be modified.
+
+
+Preconfigured Best-Hold Orders
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Evergreen comes with six preconfigured Best-Hold Selection Sort Orders to choose from:
+
+* Traditional
+* Traditional with Holds-go-home
+* Traditional with Holds-always-go-home
+* FIFO
+* FIFO with Holds-go-home
+* FIFO with Holds-always-go-home
+
+The Holds-go-home and Holds-always-go-home options allow libraries to determine how long they want to allow items to transit outside of the item’s home library, before it must return to its home library to fulfill any holds that are to be picked up there.  Libraries can set this time limit in the library setting *Holds: Max foreign-circulation time*.  The Library Settings Editor can be found under *Admin -> Local Administration -> Library Settings Editor*.  
+
+Create a New Best-Hold Selection Sort Order
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+To create a new Best-Hold Selection Sort Order, go to *Admin -> Server Administration -> Best-Hold Selection Sort Order*.  
+
+. Click *Create New*.
+. Assign your Best-Hold Selection Sort Order a *Name*.
+. Next, use the *Move Up* and *Move Down* buttons to arrange the fields in the order that you would like Evergreen to check when looking for the best hold to fill with a copy at opportunistic capture.
+. Click *Save Changes* to create your custom Best-Hold Selection Sort Order.  
+
+image::media/best_hold_sort_order1.jpg[Best-Hold Selection Sort Order]
+
+
+Edit an Existing Best-Hold Selection Sort Order
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+To edit an existing Best-Hold Selection Sort Order, go to *Admin -> Server Administration -> Best-Hold Selection Sort Order*.  
+
+. Click *Edit Existing*.
+. Choose the Best-Hold Selection Sort Order that you would like to edit from the drop down menu.
+. Next, use the *Move Up* and *Move Down* buttons to arrange the fields in the new order that you would like Evergreen to check when looking for the best hold to fill with a copy at opportunistic capture.
+. Click *Save Changes* to save your edits.  
+
+Choosing the Best-Hold Selection Sort Order
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+The Best-Hold Selection Sort Order can be set for an Org Unit in the *Library Settings Editor*.  
+
+To select the Best-Hold Selection Sort Order that your Org Unit will use:
+
+. Go to *Admin -> Local Administration -> Library Settings Editor*.  
+. Locate the setting *Holds: Best-hold selection sort order*, and click *Edit*.
+. Choose the *Context* org unit for this setting.
+. Select the Best-hold selection sort order, or *Value*, from the drop down menu.
+. Click *Update Setting*. 
+
+image::media/best_hold_sort_order2.jpg[Library Settings Editor]
+
+
+Permissions to use this Feature
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+To administer the custom Best-Hold Selection Sort Order interface, you need the following permission:
+
+* ADMIN_HOLD_CAPTURE_SORT
\ No newline at end of file
diff --git a/docs/media/best_hold_sort_order1.jpg b/docs/media/best_hold_sort_order1.jpg
new file mode 100644
index 0000000..6aba665
Binary files /dev/null and b/docs/media/best_hold_sort_order1.jpg differ
diff --git a/docs/media/best_hold_sort_order2.jpg b/docs/media/best_hold_sort_order2.jpg
new file mode 100644
index 0000000..d8e22d6
Binary files /dev/null and b/docs/media/best_hold_sort_order2.jpg differ
diff --git a/docs/root.txt b/docs/root.txt
index 46eaebe..c3215d0 100644
--- a/docs/root.txt
+++ b/docs/root.txt
@@ -180,6 +180,8 @@ include::admin/acquisitions_admin.txt[]
 
 include::admin/authorities.txt[]
 
+include::admin/Best_Hold_Selection_Sort_Order.txt[]
+
 include::admin/cn_prefixes_and_suffixes.txt[]
 
 include::admin/circulation_limit_groups.txt[]

commit 728a5ec96c3809e0bf464fcf7f55bb034fd828fe
Author: Angela Kilsdonk <akilsdonk at esilibrary.com>
Date:   Wed May 29 15:40:19 2013 -0400

    Updated root
    
    Signed-off-by: Angela Kilsdonk <akilsdonk at esilibrary.com>

diff --git a/docs/root.txt b/docs/root.txt
index 4130f09..46eaebe 100644
--- a/docs/root.txt
+++ b/docs/root.txt
@@ -1,4 +1,4 @@
-Evergreen Documentation
+Evergreen Documentation
 =======================
 Documentation Interest Group
 :doctype: book
@@ -188,6 +188,8 @@ include::admin/restrict_Z39.50_sources_by_perm_group.txt[]
 
 include::admin/booking-admin.txt[]
 
+include::admin/Org_Unit_Proximity_Adjustments.txt[]
+
 include::admin/permissions.txt[]
 
 include::admin/SMS_messaging.txt[]

commit 7150fe7dc91fb2752988cb747827e797642b41b5
Author: akilsdonk <akilsdonk at esilibrary.com>
Date:   Wed May 29 14:59:48 2013 -0400

    Org Unit Proximity Adjustment documentation
    
    Signed-off-by: akilsdonk <akilsdonk at esilibrary.com>

diff --git a/docs/admin/Org_Unit_Proximity_Adjustments.txt b/docs/admin/Org_Unit_Proximity_Adjustments.txt
new file mode 100644
index 0000000..11e235a
--- /dev/null
+++ b/docs/admin/Org_Unit_Proximity_Adjustments.txt
@@ -0,0 +1,44 @@
+Org Unit Proximity Adustments
+-----------------------------
+
+Org Unit Proximity Adustments
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Org Unit Proximity Adjustments allow libraries to indicate lending preferences for holds between libraries in an Evergreen consortium.  When a hold is placed in Evergreen, the hold targeter looks for copies that can fill the hold.  One factor that the hold targeter uses to choose the best copy to fill the hold is the distance, or proximity, between the capturing library and the pickup library for the request.  The proximity is based on the number of steps through the org tree that it takes to get from one org unit to another.    
+
+image::media/Org_Unit_Prox_Adj1.PNG[Org Unit Proximity]
+Org Unit Proximity between BR1 and BR4 = 4
+
+Org Unit Proximity Adjustments allow libraries to customize the distances between org units, which provides more control over which libraries are looked at when targeting copies to fill a hold.  Evergreen can also be configured to take Org Unit Proximity Adjustments into account during opportunistic capture through the creation of a custom Best-Hold Selection Sort Order.  See documentation <here> for more information on Best-Hold Selection Sort Order. 
+ 
+An Org Unit Proximity Adjustment can be created to tell Evergreen which libraries to look at first for copies to fill a hold or which library to look at last.  This may be useful for accounting for true transit costs or physical distances between libraries.  It can also be used to identify libraries that have special lending agreements or preferences.  Org Unit Proximity Adjustments can be created for all holds between two org units, or they can be created for holds on specific Copy Locations and Circulation Modifiers.  
+ 
+Absolute and Relative Adjustments
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Two types of proximity adjustments can be created in Evergreen: Absolute adjustments and Relative adjustments.  
+
+Absolute proximity adjustments allow you to replace the default proximity distance between two org units.  An absolute adjustment could be made to tell the hold targeter to look at a specific library or library system first to find an item to fill a hold, before looking elsewhere in the consortium.  
+ 
+Relative proximity adjustments allows the proximity between org units to be treated as closer or farther from one another than the default distance.  A relative proximity adjustment could be used to identify a library that has limited hours or slow transit times to tell the hold targeter to look at that library last for copies to fill a hold.  
+
+Create an Org Unit Proximity Adjustment
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.To create an Org Unit Proximity Adjustment between two libraries:
+. In the Admin menu choose *Server Administration -> Org Unit Proximity Adjustments*.
+. Click *New OU Proximity Adjustment*.
+. Choose an *Item Circ Lib* from the drop down menu.  
+. Choose a *Hold Request Lib* from the drop down menu.
+. If this proximity adjustment applies to a specific copy location, select the appropriate *Copy Location*  from the drop down menu.
+. If this proximity adjustment applies to a specific material type, select the appropriate *Circ Modifier* from the drop down menu.
+. If this is an Absolute proximity adjustment, check the box next to *Absolute adjustment?*  If you leave the box blank, a relative proximity adjustment will be applied.
+. Enter the *Proximity Adjustment* between the *Item Circulating Library* and the *Request Library*.
+. Click *Save*.
+
+image::media/03/Org_Unit_Prox_Adj2.PNG[Org Unit Proximity Adjustment]
+
+This will create a one-way proximity adjustment between Org Units.  In this example this adjustment will apply to items requested at by a patron BR4 and filled at BR1.  To create the reciprocal proximity adjustment, for items requested at BR1 and filled at BR4, create a second proximity adjustment between the two Org Units.
+
+Permissions to use this Feature
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+To create Org Unit Proximity Adjustments, you will need the following permission:
+
+* ADMIN_PROXIMITY_ADJUSTMENT
\ No newline at end of file
diff --git a/docs/media/Org_Unit_Prox_Adj1.PNG b/docs/media/Org_Unit_Prox_Adj1.PNG
new file mode 100644
index 0000000..25e3377
Binary files /dev/null and b/docs/media/Org_Unit_Prox_Adj1.PNG differ
diff --git a/docs/media/Org_Unit_Prox_Adj2.PNG b/docs/media/Org_Unit_Prox_Adj2.PNG
new file mode 100644
index 0000000..9ccf7e5
Binary files /dev/null and b/docs/media/Org_Unit_Prox_Adj2.PNG differ

commit e31ce5fe90f4661a388f26fbec40f26a257400f2
Author: Bill Erickson <berick at esilibrary.com>
Date:   Thu May 23 09:43:52 2013 -0400

    LP1183357 Pass locale to bib search (tpac)
    
    Pass the TPAC locale value, which is collected at each page load, to the
    bib search API call.  This allows us to take advantage of language-based
    relevance bumps.
    
    Signed-off-by: Bill Erickson <berick at esilibrary.com>
    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
    Signed-off-by: Dan Wells <dbw2 at calvin.edu>

diff --git a/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Search.pm b/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Search.pm
index dea0145..8d81cf5 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Search.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Search.pm
@@ -417,8 +417,12 @@ sub load_rresults {
             my $method = 'open-ils.search.biblio.multiclass.query';
             $method .= '.staff' if $ctx->{is_staff};
 
+            my $ses = OpenSRF::AppSession->create('open-ils.search');
+            $ses->session_locale($OpenILS::Utils::CStoreEditor::default_locale); # set in EGWeb
+
             $self->timelog("Firing off the multiclass query");
-            $results = $U->simplereq('open-ils.search', $method, $args, $query, 1);
+            my $req = $ses->request($method, $args, $query, 1);
+            $results = $req->gather(1);
             $self->timelog("Returned from the multiclass query");
 
         } catch Error with {

commit 16ddfc0724e1a7170a9473d6762cc372b981cae3
Author: Dan Scott <dscott at laurentian.ca>
Date:   Fri May 10 13:12:55 2013 -0400

    TPAC: Death date missing from authors in record details
    
    The trailing period prescribed by ISBD punctuation for x00 $d subfields
    in certain circumstances confounds the regex that was expected the $d
    subfield to match ^\s*\d{4}-\d{4}\s*$. As a result, death dates were
    often being omitted from the record detail display. Relaxing the regex
    to match against a trailing .* instead of \s* resolves the issue.
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>
    Signed-off-by: Pasi Kallinen <pasi.kallinen at pttk.fi>
    Signed-off-by: Ben Shum <bshum at biblio.org>

diff --git a/Open-ILS/src/templates/opac/parts/record/authors.tt2 b/Open-ILS/src/templates/opac/parts/record/authors.tt2
index 7205e8f..d2adff0 100644
--- a/Open-ILS/src/templates/opac/parts/record/authors.tt2
+++ b/Open-ILS/src/templates/opac/parts/record/authors.tt2
@@ -55,8 +55,8 @@ BLOCK build_author_links;
                 IF subfield.textContent.match('^\s*\d{4}');
                     birthdate = subfield.textContent.replace('^\s*(\d{4}).*$', '$1');
                 END;
-                IF subfield.textContent.match('-\d{4}\s*$');
-                    deathdate = subfield.textContent.replace('^\s*.{4}\-(\d{4})\s*$', '$1');
+                IF subfield.textContent.match('-\d{4}.*$');
+                    deathdate = subfield.textContent.replace('^\s*.{4}\-(\d{4}).*$', '$1');
                 END;
             ELSE;
                 term = term _ ' ' _ sf;

commit 58e0268362dd1c9e05fb4de9749142ead43f22fa
Author: Jason Stephenson <jstephenson at mvlc.org>
Date:   Thu May 23 11:44:05 2013 -0400

    Fix Launchpad Bug 1183418.
    
    Clicking on an author with a dash or dates in the name on the search
    results page comes up with 0 results. It looks like the dash is stripped
    from the date and/or name.
    
    Clicking on such a link from the record view actually works because
    the dash is replaced with a space.
    
    This branch changes table.tt2 to replace special characters in author
    output with a space in the same way that authors.tt2 does.
    
    Signed-off-by: Jason Stephenson <jstephenson at mvlc.org>
    Signed-off-by: Ben Shum <bshum at biblio.org>

diff --git a/Open-ILS/src/templates/opac/parts/result/table.tt2 b/Open-ILS/src/templates/opac/parts/result/table.tt2
index f77327c..0c0b27c 100644
--- a/Open-ILS/src/templates/opac/parts/result/table.tt2
+++ b/Open-ILS/src/templates/opac/parts/result/table.tt2
@@ -72,7 +72,7 @@ END;
                                                         <a title="[% l("Perform an Author Search") %]"
                                                                 class="record_author" name='item_author'
                                                                 href="[%- 
-                                                                    authorquery = attrs.author | replace('[#"^$\+\-,\.:;&|\[\]()]', '');
+                                                                    authorquery = attrs.author | replace('[#"^$\+\-,\.:;&|\[\]()]', ' ');
                                                                     mkurl(ctx.opac_root _ '/results', {qtype => 'author', query => authorquery}, ['page'])
                                                                     -%]">[% attrs.author | html %]</a>
                                                                     [%- UNLESS CGI.param('detail_record_view')

commit 6ff6dc9bd3717c30bb53374fc2b58498a69cb428
Author: Galen Charlton <gmc at esilibrary.com>
Date:   Tue May 21 15:00:13 2013 -0400

    LP#1182360: typo fix
    
    Signed-off-by: Galen Charlton <gmc at esilibrary.com>

diff --git a/Open-ILS/src/templates/url_verify/create_session.tt2 b/Open-ILS/src/templates/url_verify/create_session.tt2
index 734b981..fc6c127 100644
--- a/Open-ILS/src/templates/url_verify/create_session.tt2
+++ b/Open-ILS/src/templates/url_verify/create_session.tt2
@@ -38,7 +38,7 @@
         <table class="create-session-form">
             <tr>
                 <th>
-                    <label for="uv-session-name">[% l("Sesssion name:") %]</label>
+                    <label for="uv-session-name">[% l("Session name:") %]</label>
                 </th>
                 <td>
                     <input dojoType="dijit.form.TextBox"

commit d5d6e2c32cdd28128a3256aad34bdfe0df50208f
Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
Date:   Thu May 16 16:12:14 2013 -0400

    Database upgrade script for 2.2.9
    
    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
    Signed-off-by: Bill Erickson <berick at esilibrary.com>

diff --git a/Open-ILS/src/sql/Pg/version-upgrade/2.2.8-2.2.9-upgrade-db.sql b/Open-ILS/src/sql/Pg/version-upgrade/2.2.8-2.2.9-upgrade-db.sql
new file mode 100644
index 0000000..aa13b29
--- /dev/null
+++ b/Open-ILS/src/sql/Pg/version-upgrade/2.2.8-2.2.9-upgrade-db.sql
@@ -0,0 +1,40 @@
+--Upgrade Script for 2.2.8 to 2.2.9
+\set eg_version '''2.2.9'''
+BEGIN;
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('2.2.9', :eg_version);
+
+SELECT evergreen.upgrade_deps_block_check('0788', :eg_version);
+
+-- New view including 264 as a potential tag for publisher and pubdate
+CREATE OR REPLACE VIEW reporter.old_super_simple_record AS
+SELECT  r.id,
+    r.fingerprint,
+    r.quality,
+    r.tcn_source,
+    r.tcn_value,
+    FIRST(title.value) AS title,
+    FIRST(author.value) AS author,
+    ARRAY_TO_STRING(ARRAY_ACCUM( DISTINCT publisher.value), ', ') AS publisher,
+    ARRAY_TO_STRING(ARRAY_ACCUM( DISTINCT SUBSTRING(pubdate.value FROM $$\d+$$) ), ', ') AS pubdate,
+    ARRAY_ACCUM( DISTINCT REPLACE(SUBSTRING(isbn.value FROM $$^\S+$$), '-', '') ) AS isbn,
+    ARRAY_ACCUM( DISTINCT REGEXP_REPLACE(issn.value, E'^\\S*(\\d{4})[-\\s](\\d{3,4}x?)', E'\\1 \\2') ) AS issn
+  FROM  biblio.record_entry r
+    LEFT JOIN metabib.full_rec title ON (r.id = title.record AND title.tag = '245' AND title.subfield = 'a')
+    LEFT JOIN metabib.full_rec author ON (r.id = author.record AND author.tag IN ('100','110','111') AND author.subfield = 'a')
+    LEFT JOIN metabib.full_rec publisher ON (r.id = publisher.record AND (publisher.tag = '260' OR (publisher.tag = '264' AND publisher.ind2 = '1')) AND publisher.subfield = 'b')
+    LEFT JOIN metabib.full_rec pubdate ON (r.id = pubdate.record AND (pubdate.tag = '260' OR (pubdate.tag = '264' AND pubdate.ind2 = '1')) AND pubdate.subfield = 'c')
+    LEFT JOIN metabib.full_rec isbn ON (r.id = isbn.record AND isbn.tag IN ('024', '020') AND isbn.subfield IN ('a','z'))
+    LEFT JOIN metabib.full_rec issn ON (r.id = issn.record AND issn.tag = '022' AND issn.subfield = 'a')
+  GROUP BY 1,2,3,4,5;
+
+-- Update reporter.materialized_simple_record with new 264-based values for publisher and pubdate
+DELETE FROM reporter.materialized_simple_record WHERE id IN (
+    SELECT DISTINCT record FROM metabib.full_rec WHERE tag = '264' AND subfield IN ('b', 'c')
+);
+
+INSERT INTO reporter.materialized_simple_record
+    SELECT DISTINCT rossr.* FROM reporter.old_super_simple_record rossr INNER JOIN metabib.full_rec mfr ON mfr.record = rossr.id
+        WHERE mfr.tag = '264' AND mfr.subfield IN ('b', 'c')
+;
+
+COMMIT;

commit 268e81e493ebbcb3ad5737600f627d81359721ac
Author: Bill Erickson <berick at esilibrary.com>
Date:   Thu May 16 15:52:38 2013 -0400

    2.3.6 -> 2.3.7 DB upgrade script
    
    Signed-off-by: Bill Erickson <berick at esilibrary.com>
    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>

diff --git a/Open-ILS/src/sql/Pg/version-upgrade/2.3.6-2.3.7-upgrade-db.sql b/Open-ILS/src/sql/Pg/version-upgrade/2.3.6-2.3.7-upgrade-db.sql
new file mode 100644
index 0000000..28bf112
--- /dev/null
+++ b/Open-ILS/src/sql/Pg/version-upgrade/2.3.6-2.3.7-upgrade-db.sql
@@ -0,0 +1,40 @@
+--Upgrade Script for 2.3.6 to 2.3.7
+\set eg_version '''2.3.7'''
+BEGIN;
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('2.3.7', :eg_version);
+
+SELECT evergreen.upgrade_deps_block_check('0788', :eg_version);
+
+-- New view including 264 as a potential tag for publisher and pubdate
+CREATE OR REPLACE VIEW reporter.old_super_simple_record AS
+SELECT  r.id,
+    r.fingerprint,
+    r.quality,
+    r.tcn_source,
+    r.tcn_value,
+    FIRST(title.value) AS title,
+    FIRST(author.value) AS author,
+    ARRAY_TO_STRING(ARRAY_ACCUM( DISTINCT publisher.value), ', ') AS publisher,
+    ARRAY_TO_STRING(ARRAY_ACCUM( DISTINCT SUBSTRING(pubdate.value FROM $$\d+$$) ), ', ') AS pubdate,
+    ARRAY_ACCUM( DISTINCT REPLACE(SUBSTRING(isbn.value FROM $$^\S+$$), '-', '') ) AS isbn,
+    ARRAY_ACCUM( DISTINCT REGEXP_REPLACE(issn.value, E'^\\S*(\\d{4})[-\\s](\\d{3,4}x?)', E'\\1 \\2') ) AS issn
+  FROM  biblio.record_entry r
+    LEFT JOIN metabib.full_rec title ON (r.id = title.record AND title.tag = '245' AND title.subfield = 'a')
+    LEFT JOIN metabib.full_rec author ON (r.id = author.record AND author.tag IN ('100','110','111') AND author.subfield = 'a')
+    LEFT JOIN metabib.full_rec publisher ON (r.id = publisher.record AND (publisher.tag = '260' OR (publisher.tag = '264' AND publisher.ind2 = '1')) AND publisher.subfield = 'b')
+    LEFT JOIN metabib.full_rec pubdate ON (r.id = pubdate.record AND (pubdate.tag = '260' OR (pubdate.tag = '264' AND pubdate.ind2 = '1')) AND pubdate.subfield = 'c')
+    LEFT JOIN metabib.full_rec isbn ON (r.id = isbn.record AND isbn.tag IN ('024', '020') AND isbn.subfield IN ('a','z'))
+    LEFT JOIN metabib.full_rec issn ON (r.id = issn.record AND issn.tag = '022' AND issn.subfield = 'a')
+  GROUP BY 1,2,3,4,5;
+
+-- Update reporter.materialized_simple_record with new 264-based values for publisher and pubdate
+DELETE FROM reporter.materialized_simple_record WHERE id IN (
+    SELECT DISTINCT record FROM metabib.full_rec WHERE tag = '264' AND subfield IN ('b', 'c')
+);
+
+INSERT INTO reporter.materialized_simple_record
+    SELECT DISTINCT rossr.* FROM reporter.old_super_simple_record rossr INNER JOIN metabib.full_rec mfr ON mfr.record = rossr.id
+        WHERE mfr.tag = '264' AND mfr.subfield IN ('b', 'c')
+;
+
+COMMIT;

commit 2fe0ef167d5018a6d858bfca46d98a7be773df41
Author: Mike Rylander <mrylander at gmail.com>
Date:   Fri Apr 19 16:14:13 2013 -0400

    Correct subfield format for authority lookup
    
    The Authority Control Set code expects the format of subfields
    that it will be used to build a MARC.Field object to be of the
    form: [[code,value],...]  This commit makes that true.
    
    Additionally, dojo.filter over a list of lists can cause the
    nested array set to be flattened.  So, instead, we loop directly.
    
    Signed-off-by: Mike Rylander <mrylander at gmail.com>

diff --git a/Open-ILS/web/js/dojo/openils/AuthorityControlSet.js b/Open-ILS/web/js/dojo/openils/AuthorityControlSet.js
index c6c6c00..adb9086 100644
--- a/Open-ILS/web/js/dojo/openils/AuthorityControlSet.js
+++ b/Open-ILS/web/js/dojo/openils/AuthorityControlSet.js
@@ -289,17 +289,22 @@ if(!dojo._hasResource["openils.AuthorityControlSet"]) {
             var b_field = this.bibFieldByTag(field.tag);
 
             if (b_field) { // construct an marc authority record
-                af = b_field.authority_field();
+                var af = b_field.authority_field();
+
+                var sflist = [];                
+                for (var i = 0; i < field.subfields.length; i++) {
+                    if (af.sf_list().indexOf(field.subfields[i][0]) > -1) {
+                        sflist.push(field.subfields[i]);
+                    }
+                }
+
                 var m = new MARC.Record ({rtype:'AUT'});
                 m.appendFields(
                     new MARC.Field ({
                         tag : af.tag(),
                         ind1: field.ind1,
                         ind2: field.ind2,
-                        subfields: [dojo.filter(
-                            field.subfields,
-                            function (sf) { return (af.sf_list().indexOf(sf[0]) > -1) }
-                        )]
+                        subfields: sflist
                     })
                 );
 
diff --git a/Open-ILS/xul/staff_client/server/cat/marcedit.js b/Open-ILS/xul/staff_client/server/cat/marcedit.js
index b3eb53a..614061f 100644
--- a/Open-ILS/xul/staff_client/server/cat/marcedit.js
+++ b/Open-ILS/xul/staff_client/server/cat/marcedit.js
@@ -1606,8 +1606,7 @@ function validateAuthority (button) {
             var sf_list = [];
             for (var j = 0; j < subfields.length; j++) {
                 var sf = subfields[j];
-                sf_list.push( sf.childNodes[1].value );
-                sf_list.push( sf.childNodes[2].value );
+                sf_list.push( [ sf.childNodes[1].value, sf.childNodes[2].value ] );
             }
 
             var matches = acs.findMatchingAuthorities(

commit c9de0c9670414827c3ef1bb1f2a09d5238f48644
Author: Bill Erickson <berick at esilibrary.com>
Date:   Thu May 16 09:11:50 2013 -0400

    Repair faulty MARC editor authority validation
    
    Repair how the JS inspects the results of
    open-ils.search.authority.simple_heading.from_xml.batch.atomic, which is
    used to look up matches for authority validation.  It returns a more
    complex structure in the brave new world of authority control sets.
    
    Signed-off-by: Bill Erickson <berick at esilibrary.com>
    Signed-off-by: Mike Rylander <mrylander at gmail.com>

diff --git a/Open-ILS/xul/staff_client/server/cat/marcedit.js b/Open-ILS/xul/staff_client/server/cat/marcedit.js
index 1fbf544..b3eb53a 100644
--- a/Open-ILS/xul/staff_client/server/cat/marcedit.js
+++ b/Open-ILS/xul/staff_client/server/cat/marcedit.js
@@ -1616,11 +1616,28 @@ function validateAuthority (button) {
                     'subfields' : sf_list
                 })
             );
+
+            // matches = [ { "$csetId" : [ ... ] } ]
+
+            var found = false;
+            if (matches[0]) { // probably set
+                for (var cset in matches[0]) {
+                    var arr = matches[0][cset];
+                    if (arr.length) {
+                        // protect against errant empty string values
+                        if (arr.length == 1 && arr[0] == '')
+                            continue;
+                        found = true;
+                        break;
+                    }
+                }
+            }
+
     
             // XXX If adt, etc should be validated separately from vxz, etc then move this up into the above for loop
             for (var j = 0; j < subfields.length; j++) {
                 var sf = subfields[j];
-                if (!matches.length) {
+                if (!found) {
                     dojo.removeClass(sf.childNodes[2], 'marcValidated');
                     dojo.addClass(sf.childNodes[2], 'marcUnvalidated');
                 } else {
@@ -1629,7 +1646,7 @@ function validateAuthority (button) {
                 }
             }
 
-            if (matches.length) done = true;
+            if (found) done = true;
         });
     }
 

commit e83061427ef1f017e69b13831d9d1cfe00f61bd7
Author: Dan Scott <dscott at laurentian.ca>
Date:   Tue Jan 29 11:04:33 2013 -0500

    Apply all 2.2 upgrades prior to running 2.3.0 upgrade
    
    If users are expected to run all of the 2.2 upgrade scripts, then let's
    make it easy for them. As PostgreSQL 9.1 does not include the \ir
    "include relative path" command, we have to pause at the beginning of
    the upgrade process to ensure that the user is running the script from
    the right directory.
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>
    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>

diff --git a/Open-ILS/src/sql/Pg/version-upgrade/2.2-2.3.0-upgrade-db.sql b/Open-ILS/src/sql/Pg/version-upgrade/2.2-2.3.0-upgrade-db.sql
index a6cfd9a..911b14d 100644
--- a/Open-ILS/src/sql/Pg/version-upgrade/2.2-2.3.0-upgrade-db.sql
+++ b/Open-ILS/src/sql/Pg/version-upgrade/2.2-2.3.0-upgrade-db.sql
@@ -2,6 +2,14 @@
 
 \set eg_version '''2.3.0'''
 
+\qecho **********************************************************************
+\qecho Your current working directory when you run this script *must* be
+\qecho Open-ILS/src/sql/Pg/version-upgrade/ or it will fail to find the point
+\qecho release upgrade scripts. Press <ENTER> to continue, or hit <CTRL-C> to
+\qecho prevent the upgrade from happening.
+\qecho **********************************************************************
+\prompt chance-to-quit
+
 \qecho The following statement might fail, and that is okay; we are
 \qecho ensuring that an upgrade that should have been applied during
 \qecho the 2.2 upgrade is actually applied now.
@@ -14,7 +22,18 @@ UPDATE config.org_unit_setting_type
     SET grp = 'acq'
     WHERE name LIKE 'acq%';
 
+\qecho Apply previous point release upgrades to ensure that all known fixes are
+\qecho in place. Failures here will generally indicate that the fixes were
+\qecho already applied.
+
+\i 2.2.0-2.2.1-upgrade-db.sql
+\i 2.2.1-2.2.2-upgrade-db.sql
+\i 2.2.2-2.2.3-upgrade-db.sql
+\i 2.2.3-2.2.4-upgrade-db.sql
+\i 2.2.4-2.2.5-upgrade-db.sql
+
 \qecho The real upgrade begins now.
+\set eg_version '''2.3.0'''
 
 BEGIN;
 INSERT INTO config.upgrade_log (version, applied_to) VALUES ('2.3.0', :eg_version);
@@ -910,7 +929,6 @@ BEGIN
 END;
 $func$ LANGUAGE plpgsql;
 
-
 -- Evergreen DB patch 0727.function.xml_pretty_print.sql
 --
 -- A simple pretty printer for XML.

commit b8f6ef82e6eb196b02c51e53e44420792770ff98
Author: Galen Charlton <gmc at esilibrary.com>
Date:   Tue May 14 15:33:54 2013 -0400

    LP#118066: fix searches that failed because punctuation was a token in query
    
    When building the text array literal to pass to evergreen.rel_bump,
    make sure that tokens that get {search_}normalize{d} away
    don't result in syntax errors.
    
    With this patch, searches like the following will work again:
    
    keyword:Take me to the river / Al Green and Mabon
    
    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>

diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm
index c202dac..4fcbe5e 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm
@@ -904,9 +904,9 @@ sub flatten {
 
                 if(scalar @bumps > 0 && scalar @{$node->only_positive_atoms} > 0) {
                     # Note: Previous rank function used search_normalize outright. Duplicating that here.
-                    $node_rank .= "\n" . ${spc} x 5 . "* evergreen.rel_bump(('{' || search_normalize(";
-                    $node_rank .= join(") || ',' || search_normalize(",map { $self->QueryParser->quote_phrase_value($_->content) } @{$node->only_positive_atoms});
-                    $node_rank .= ") || '}')::TEXT[], " . $node->table_alias . ".value, '{" . join(",", at bumps) . "}'::TEXT[], '{" . join(",", at bumpmults) . "}'::NUMERIC[])";
+                    $node_rank .= "\n" . ${spc} x 5 . "* evergreen.rel_bump(('{' || quote_literal(search_normalize(";
+                    $node_rank .= join(")) || ',' || quote_literal(search_normalize(",map { $self->QueryParser->quote_phrase_value($_->content) } @{$node->only_positive_atoms});
+                    $node_rank .= ")) || '}')::TEXT[], " . $node->table_alias . ".value, '{" . join(",", at bumps) . "}'::TEXT[], '{" . join(",", at bumpmults) . "}'::NUMERIC[])";
                 }
 
                 my $NOT = '';

commit 0bef90b0203feb0178b052b929c40a295b4752e2
Author: Ben Shum <bshum at biblio.org>
Date:   Mon May 13 14:19:06 2013 -0400

    LP1179614 - fix Export All Records action
    
    In the record buckets, the button for 'Export All Records' would work up
    to the point where you chose where to save the file. After clicking where
    to save, it would not show any saved files or prompts indicating it completed
    the export process.
    
    This fix changes the location of where to find the export tool and properly
    exports the bibs as the file format selected.
    
    Signed-off-by: Ben Shum <bshum at biblio.org>
    Signed-off-by: Galen Charlton <gmc at esilibrary.com>

diff --git a/Open-ILS/xul/staff_client/server/cat/record_buckets.js b/Open-ILS/xul/staff_client/server/cat/record_buckets.js
index 1f40446..393d55a 100644
--- a/Open-ILS/xul/staff_client/server/cat/record_buckets.js
+++ b/Open-ILS/xul/staff_client/server/cat/record_buckets.js
@@ -63,7 +63,7 @@ cat.record_buckets.export_records = function(obj, output_type) {
         var persist = Components.classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"]
             .createInstance(Components.interfaces.nsIWebBrowserPersist);
 
-        var proto_uri = 'https://' + window.location.hostname + '/exporter?format=' + output_type + '&ses=' + ses();
+        var proto_uri = 'oils://remote/exporter?format=' + output_type + '&ses=' + ses();
 
         dump('Record Export URI is ' + proto_uri + '&id=' + record_ids.join('&id=') + '\n');
 

commit 7b0ae793be6afb90af612c3ce386dfa6ed45a888
Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
Date:   Mon May 6 14:15:18 2013 -0400

    Serials: MFHD::get_compressed_holdings() can reach infinite loop
    
    Even controlled serials holdings involve the internal creation of MFHD
    fields, upon which caculations are performed for such purposes as the
    display of holdings summaries in the OPAC.
    
    There are too many ways that incorrect MFHD (or MFHD that our code just
    can't yet handle) can lead our MFHD routines to crash. We can't address
    all these possibilities in a single bug fix. But we can avoid this
    infinite loop.
    
    A subroutine within open-ils.serial (_summarize_contents()) relies on
    MFHD::get_compressed_holdings(). When the latter went into an infinite
    loop the result would be an open-il.serial drone process consuming CPU
    time indefinitely and, depending on the data that provoked the loop,
    potentially writing repeating messages to stderr indefinitely.
    
    End users will still see the item receiving fail in these cases, and be
    obliged to work around the issue as before until more robust
    holdings summarization code can be written, but at least the overall
    condition of the running Evergreen system won't be affected, and there
    will be better information in the error logs.
    
    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
    Signed-off-by: Dan Wells <dbw2 at calvin.edu>

diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Serial.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Serial.pm
index 19b14aa..6425257 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Serial.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Serial.pm
@@ -644,6 +644,9 @@ sub scoped_bib_holdings_summary {
     my %statement_blob;
     for my $type ( keys %type_blob ) {
         my ($mfhd,$list) = _summarize_contents(new_editor(), $type_blob{$type});
+
+        return {} if $U->event_code($mfhd); # _summarize_contents() failed, bad data?
+
         $statement_blob{$type} = $list;
     }
 
@@ -1496,6 +1499,7 @@ sub _prepare_unit {
     }
 
     my ($mfhd, $formatted_parts) = _summarize_contents($e, $issuances);
+    return $mfhd if $U->event_code($mfhd);
 
     # special case for single formatted_part (may have summarized version)
     if (@$formatted_parts == 1) {
@@ -1527,6 +1531,7 @@ sub _prepare_summaries {
     my ($e, $issuances, $sdist, $type) = @_;
 
     my ($mfhd, $formatted_parts) = _summarize_contents($e, $issuances, $sdist);
+    return $mfhd if $U->event_code($mfhd);
 
     my $search_method = "search_serial_${type}_summary";
     my $summary = $e->$search_method([{"distribution" => $sdist->id}]);
@@ -1812,7 +1817,6 @@ sub _build_unit {
     return $unit;
 }
 
-
 sub _summarize_contents {
     my $editor = shift;
     my $issuances = shift;
@@ -1891,11 +1895,24 @@ sub _summarize_contents {
 
     my @formatted_parts;
     my @scap_fields_ordered = $mfhd->field('85[345]');
+
     foreach my $scap_field (@scap_fields_ordered) { #TODO: use generic MFHD "summarize" method, once available
-       my @updated_holdings = $mfhd->get_compressed_holdings($scap_field);
-       foreach my $holding (@updated_holdings) {
-           push(@formatted_parts, $holding->format);
-       }
+        my @updated_holdings;
+        eval {
+            @updated_holdings = $mfhd->get_compressed_holdings($scap_field);
+        };
+        if ($@) {
+            my $msg = "get_compressed_holdings(): $@ ; using sdist ID #" .
+                ($sdist ? $sdist->id : "<NONE>") . " and " .
+                scalar(@$issuances) . " issuances, of which one has ID #" .
+                $issuances->[0]->id;
+
+            $msg =~ s/\n//gm;
+            $logger->error($msg);
+            return new OpenILS::Event("BAD_PARAMS", note => $msg);
+        }
+
+        push @formatted_parts, map { $_->format } @updated_holdings;
     }
 
     return ($mfhd, \@formatted_parts);
diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Utils/MFHD.pm b/Open-ILS/src/perlmods/lib/OpenILS/Utils/MFHD.pm
index 2bf94d4..32ea066 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Utils/MFHD.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Utils/MFHD.pm
@@ -404,11 +404,23 @@ sub get_compressed_holdings {
             last;
         } else {
             push(@comp_holdings, $curr_holding);
+
+            my $loop_count = 0;
+            (my $runner_dump = $runner->as_formatted) =~ s/\n\s+/*/gm; # logging
+
             while ($runner le $holding) {
-                # Here is where we used to get stuck in an infinite loop
-                # until the "Don't know how to deal with frequency" was
-                # elevated from a carp to a croak.
+                # Infinite loops used to happen here. As written today,
+                # ->increment() cannot be guaranteed to eventually falsify
+                # the condition ($runner le $holding) in certain cases.
+
                 $runner->increment;
+
+                if (++$loop_count >= 10000) {
+                    (my $holding_dump = $holding->as_formatted) =~ s/\n\s+/*/gm;
+
+                    croak "\$runner<$runner_dump> didn't catch up with " .
+                        "\$holding<$holding_dump> after 10000 increments";
+                }
             }
             $curr_holding = $holding->clone;
             $seqno++;

commit 81bcecf75cd44b8860a2cf20fe108f7a5a6233d0
Author: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
Date:   Mon May 6 14:13:13 2013 -0400

    Serials: Test method to identify holdings that lead to summarization bugs
    
    This adds a simple test method that allows testing of problem holdings.
    See the next commit.
    
    Signed-off-by: Lebbeous Fogle-Weekley <lebbeous at esilibrary.com>
    Signed-off-by: Remington Steed <rjs7 at calvin.edu>
    Signed-off-by: Dan Wells <dbw2 at calvin.edu>

diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Serial.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Serial.pm
index 377069d..19b14aa 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Serial.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Serial.pm
@@ -3643,4 +3643,35 @@ sub clone_subscription {
     return $result;
 }
 
+__PACKAGE__->register_method(
+    "method" => "summary_test",
+    "api_name" => "open-ils.serial.summary_test",
+    "stream" => 1,
+    "api_level" => 1,
+    "argc" => 3
+);
+
+# This crummy little test method allows quicker reproduction of certain
+# failures (e.g. at item receive time) of the holdings summarization code.
+# Pass it an authtoken, an array of issuance IDs, and a single sdist ID
+sub summary_test {
+    my ($self, $conn, $authtoken, $iss_id_list, $sdist_id) = @_;
+
+    my $e = new_editor(authtoken => $authtoken, xact => 1);
+    return $e->die_event unless $e->checkauth;
+    return $e->die_event unless $e->allowed("RECEIVE_SERIAL");
+
+    my @issuances;
+    foreach my $id (@$iss_id_list) {
+        my $iss = $e->retrieve_serial_issuance($id) or return $e->die_event;
+        push @issuances, $iss;
+    }
+
+    my $dist = $e->retrieve_serial_distribution($sdist_id) or return $e->die_event;
+
+    $conn->respond(_summarize_contents($e, \@issuances, $dist));
+    $e->rollback;
+    return;
+}
+
 1;

commit 2a6a2f82a8f0324ce8b16649e512d64e90d73d3a
Author: Galen Charlton <gmc at esilibrary.com>
Date:   Fri May 3 17:20:21 2013 -0400

    LP#1176206: improve deadlock handling in 2.3-2.4-supplemental.sh
    
    - make sure that it doesn't attempt to create more than one
      index at a time for a given table
    - if deadlocks occur (because of a PostgreSQL bug whose fix
      isn't slated for release until after April 2013), find
      and recreate the affected indexes.
    
    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/src/sql/Pg/version-upgrade/2.3-2.4-supplemental.sh b/Open-ILS/src/sql/Pg/version-upgrade/2.3-2.4-supplemental.sh
index 90a532b..a00f85b 100755
--- a/Open-ILS/src/sql/Pg/version-upgrade/2.3-2.4-supplemental.sh
+++ b/Open-ILS/src/sql/Pg/version-upgrade/2.3-2.4-supplemental.sh
@@ -19,17 +19,48 @@ echo "Starting update of combined field_entry values.  This will also take a whi
 psql -c "SELECT count(metabib.update_combined_index_vectors(id)) FROM biblio.record_entry WHERE NOT deleted;" &
 
 echo "Starting creation of indexes from 0782..."
+echo "There may be deadlock errors; if they happen, this script will"
+echo "rebuild the affected invalid indexes at the end."
 psql -c "CREATE INDEX CONCURRENTLY usr_activity_usr_idx on actor.usr_activity (usr);" &
 psql -c "CREATE INDEX CONCURRENTLY hold_request_open_idx on action.hold_request (id) where cancel_time IS NULL AND fulfillment_time IS NULL;" &
 psql -c "CREATE INDEX CONCURRENTLY cp_available_by_circ_lib_idx on asset.copy (circ_lib) where status IN (0,7);" &
-psql -c "CREATE INDEX CONCURRENTLY hold_request_current_copy_before_cap_idx on action.hold_request (current_copy) where capture_time IS NULL AND cancel_time IS NULL;" &
 psql -c "CREATE INDEX CONCURRENTLY edi_message_account_status_idx on acq.edi_message (account,status);" &
-psql -c "CREATE INDEX CONCURRENTLY edi_message_po_idx on acq.edi_message (purchase_order);" &
 psql -c "CREATE INDEX CONCURRENTLY atev_def_state on action_trigger.event (event_def,state);" &
 psql -c "CREATE INDEX CONCURRENTLY hold_transit_copy_hold_idx on action.hold_transit_copy (hold);" &
 
 wait
 
-echo "Combined field_entry values and index creation complete"
+echo "Starting creation of more indexes from 0782..."
+psql -c "CREATE INDEX CONCURRENTLY hold_request_current_copy_before_cap_idx on action.hold_request (current_copy) where capture_time IS NULL AND cancel_time IS NULL;" &
+psql -c "CREATE INDEX CONCURRENTLY edi_message_po_idx on acq.edi_message (purchase_order);" &
+
+wait
+
+echo "Parallel updates complete."
+echo "Creating any indexes that may not have been built due to a deadlock"
+echo "bug in PostgreSQL"
 date
 
+rebuildscript=`mktemp`
+psql -A -t -c "SELECT 'DROP INDEX ' || n.nspname || '.' || i.relname || ';' \
+FROM pg_index x \
+JOIN pg_class c ON c.oid = x.indrelid \
+JOIN pg_class i ON i.oid = x.indexrelid \
+LEFT JOIN pg_namespace n ON n.oid = c.relnamespace \
+WHERE c.relkind = 'r'::\"char\" AND i.relkind = 'i'::\"char\" \
+AND n.nspname IN ('action', 'action_trigger', 'actor', 'acq', 'asset') \
+AND NOT x.indisvalid;" >  $rebuildscript
+
+psql -A -t -c "SELECT pg_get_indexdef(i.oid) || ';' \
+FROM pg_index x \
+JOIN pg_class c ON c.oid = x.indrelid \
+JOIN pg_class i ON i.oid = x.indexrelid \
+LEFT JOIN pg_namespace n ON n.oid = c.relnamespace \
+WHERE c.relkind = 'r'::\"char\" AND i.relkind = 'i'::\"char\" \
+AND n.nspname IN ('action', 'action_trigger', 'actor', 'acq', 'asset') \
+AND NOT x.indisvalid;" >> $rebuildscript
+
+psql -a -f $rebuildscript
+
+echo "Combined field_entry values and index creation complete"
+date

commit 7a178391d7290f51eac70ada4f8804794e851fd1
Author: Mark Cooper <markchristophercooper at gmail.com>
Date:   Mon May 6 12:37:32 2013 -0700

    Exports are broken
    
    Proposed fix for lp1175816, tested with 2.3.2 / 2.4.0.
    
    Signed-off-by: Mark Cooper <markchristophercooper at gmail.com>
    Signed-off-by: Galen Charlton <gmc at esilibrary.com>

diff --git a/Open-ILS/src/perlmods/lib/OpenILS/WWW/Exporter.pm b/Open-ILS/src/perlmods/lib/OpenILS/WWW/Exporter.pm
index 373effd..b9fea03 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/WWW/Exporter.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/WWW/Exporter.pm
@@ -219,9 +219,9 @@ sub handler {
 			if ($holdings) {
 				$req->delete_field( $_ ) for ($req->field('852')); # remove any legacy 852s
 
-        			my $cn_list = [ grep { $_->deleted eq 'f' } @{ $bib->call_numbers } ];
+        			my $cn_list = $bib->call_numbers;
         			if ($cn_list && @$cn_list) {
-
+							$cn_list = [ grep { $_->deleted eq 'f' } @$cn_list ];
             				my $cp_list = [ grep { $_->deleted eq 'f' } map { @{ $_->copies } } @$cn_list ];
             				if ($cp_list && @$cp_list) {
 
diff --git a/Open-ILS/src/support-scripts/marc_export.in b/Open-ILS/src/support-scripts/marc_export.in
index 709c613..3de8397 100755
--- a/Open-ILS/src/support-scripts/marc_export.in
+++ b/Open-ILS/src/support-scripts/marc_export.in
@@ -383,9 +383,9 @@ sub add_bib_holdings {
     my $bib = shift;
     my $r = shift;
 
-    my $cn_list = [ grep { $_->deleted eq 'f' } @{ $bib->call_numbers } ];
+    my $cn_list = $bib->call_numbers;
     if ($cn_list && @$cn_list) {
-
+        $cn_list = [ grep { $_->deleted eq 'f' } @$cn_list ];
         $count{cn} += @$cn_list;
 
         my $cp_list = [ grep { $_->deleted eq 'f' } map { @{ $_->copies } } @$cn_list ];

commit 24babd5596ee39eb131d717195504eac74fbc808
Author: Art Rhyno <art632000 at yahoo.ca>
Date:   Fri May 24 11:24:53 2013 -0400

    Add support for CAS intro in tpac for rel_2_4_mergery
    
    These changes allow a CAS intro to be put in place before
    a patron is sent off to the CAS service from the tpac. CAS
    logins can be a jarring experience since the interface is
    controlled by the validating organization.
    
    Signed-off-by: Art Rhyno <art632000 at yahoo.ca>
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm b/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm
index 74c0700..992852b 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm
@@ -133,6 +133,9 @@ sub load {
     return $self->load_cache_clear if $path =~ m|opac/cache/clear|;
     return $self->load_temp_warn_post if $path =~ m|opac/temp_warn/post|;
     return $self->load_temp_warn if $path =~ m|opac/temp_warn|;
+    # added for CAS support - we probably want a place to explain why someone is being
+    # redirected to a third party site
+    return $self->load_cas_intro if $path =~ m|opac/cas_intro|;
 
     # ----------------------------------------------------------------
     #  Everything below here requires SSL
diff --git a/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Container.pm b/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Container.pm
index b61ac06..376a0b2 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Container.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Container.pm
@@ -245,4 +245,10 @@ sub load_temp_warn {
     return Apache2::Const::OK;
 }
 
+sub load_cas_intro {
+    my $self = shift;
+    $self->ctx->{'redirect_to'} = $self->cgi->param('redirect_to');
+    return Apache2::Const::OK;
+}
+
 1;
diff --git a/Open-ILS/src/templates/opac/cas_intro.tt2 b/Open-ILS/src/templates/opac/cas_intro.tt2
new file mode 100644
index 0000000..dd921ad
--- /dev/null
+++ b/Open-ILS/src/templates/opac/cas_intro.tt2
@@ -0,0 +1,38 @@
+[%  PROCESS "opac/parts/header.tt2";
+    PROCESS "opac/parts/misc_util.tt2";
+    WRAPPER "opac/parts/base.tt2";
+    INCLUDE "opac/parts/topnav.tt2";
+
+    cas_alert = l('You have selected CAS Authentication. This will use your campus userid (also known as login or user name).');
+    ctx.page_title = l("CAS Information") -%]
+    <div id="content-wrapper">
+        <div id="main-content">
+        <div style="height:20px;"></div>
+        <table cellpadding="0" cellspacing="0" border="0">
+            <tr>
+                <td valign="top" width="676" class="login_boxes left_brain">
+                    <table cellpadding="10" cellspacing="0" border="0"
+                        width="100%">
+                        <tr>
+                                <td colspan="2" style="padding-bottom: 10px;">
+                                <h1>[% cas_alert %]</h1>
+                                <br /><br />
+                            </td>
+                        </tr>
+                        <tr>
+                                <td colspan="2" style="padding-bottom: 10px;">
+            <a href="[% ctx.cas.url %]"
+                class="opac-button opac-button-header" id="home_myopac_link">
+                [% l('Continue to Your Account with Your CAS ID') %]
+            </a>
+                                <br /><br />
+                            </td>
+                        </tr>
+                    </table>
+                </td>
+            </tr>
+        </table>
+        <div style="height:20px;"></div>
+        </div>
+    </div>
+[% END %]
diff --git a/Open-ILS/src/templates/opac/parts/config.tt2 b/Open-ILS/src/templates/opac/parts/config.tt2
index 718083e..3f28cca 100644
--- a/Open-ILS/src/templates/opac/parts/config.tt2
+++ b/Open-ILS/src/templates/opac/parts/config.tt2
@@ -28,6 +28,14 @@ ctx.refworks.url = 'http://www.refworks.com';
 # ctx.refworks.url = 'http://librweb.laurentian.ca/login?url=http://refworks.scholarsportal.info';
 
 ##############################################################################
+# CAS support
+##############################################################################
+# Specify CAS URL for Login
+# ctx.cas.url = 'https://myorg.org/cas/login?service=https://mylibrary.org/eg/opac/login';
+# Specify CAS URL for Logout
+# ctx.cas.logout = 'https://myorg.org/cas/logout';
+
+##############################################################################
 # OpenURL resolution
 ##############################################################################
 # Evergreen provides the ability to point at an OpenURL resolver to find

commit d60ba0379e103579954eee8a940c0df64e7f0076
Merge: e3f4c3a 209edc8
Author: Dan Scott <dscott at laurentian.ca>
Date:   Wed May 8 10:51:00 2013 -0400

    Merge remote-tracking branch 'conifer/feature/tpac_show_details_config_2_4' into rel_2_4_mergery


commit 209edc8199677856f46bf87ee8f70b40dbf264a3
Author: Art Rhyno <art632000 at yahoo.ca>
Date:   Mon Aug 13 17:22:17 2012 -0400

    TPAC: Make "Show more details" in results optional
    
    Academic sites typically handle a lot of electronic content and want to
    bring most details about entries, such as availability, status, and
    URLs, on a results screen to the front.
    
    This adds a 'show_more_details.default' option in 'config.tt2' that can
    have the values 'true', 'false' and 'hide'.  The 'true' and 'false'
    values set the default for the button to more and less respectively, and
    'hide' suppresses the button from showing at all.
    
    Signed-off-by: Art Rhyno <art632000 at yahoo.ca>
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/src/templates/opac/parts/config.tt2 b/Open-ILS/src/templates/opac/parts/config.tt2
index c8e87ef..718083e 100644
--- a/Open-ILS/src/templates/opac/parts/config.tt2
+++ b/Open-ILS/src/templates/opac/parts/config.tt2
@@ -74,6 +74,12 @@ allow_phone_notifications = 'true';
 ##############################################################################
 # Misc. UI Settings
 ##############################################################################
+# Option for full details as a default, esp. impt. for e-content
+# that uses resolver plumbing. Valid values are 'true', 'false' and 'hide'.
+# Setting this to 'true' shows full details by default but allows the link
+# to appear for 'Show Fewer Details'. The 'hide' option shows full details
+# and also suppresses the link from displaying at all.
+show_more_details.default = 'false';
 
 ##############################################################################
 # Size of the jacket image to display on the record detail summary.
diff --git a/Open-ILS/src/templates/opac/parts/searchbar.tt2 b/Open-ILS/src/templates/opac/parts/searchbar.tt2
index 0359c83..70819e6 100644
--- a/Open-ILS/src/templates/opac/parts/searchbar.tt2
+++ b/Open-ILS/src/templates/opac/parts/searchbar.tt2
@@ -42,6 +42,9 @@
             INCLUDE build_org_selector arialabel=select_lib_label show_loc_groups=1
         -%]
     <span>
+    [%- IF (show_more_details.default == 'true' OR show_more_details.default == 'hide') AND !CGI.param('detail_record_view') %]
+        <input id="detail" type="hidden" name="detail_record_view" value="1"/>
+    [%- END %]
         <input id='search-submit-go' type="submit" value="[% l('Search') %]" alt="[% l('Search') %]" class="opac-button"
             onclick='setTimeout(function(){$("search-submit-spinner").className=""; $("search-submit-go").className="hidden"}, 2000)'/>
         <img id='search-submit-spinner' src='/opac/images/progressbar_green.gif' style='height:16px;width:16px;' class='hidden' alt=''/>
diff --git a/Open-ILS/src/templates/opac/results.tt2 b/Open-ILS/src/templates/opac/results.tt2
index d199ce9..60803ba 100644
--- a/Open-ILS/src/templates/opac/results.tt2
+++ b/Open-ILS/src/templates/opac/results.tt2
@@ -42,6 +42,8 @@
                     <label class="results_header_lbl">[% l('Sort by') %]
                     [% INCLUDE "opac/parts/filtersort.tt2" value=CGI.param('sort') submit_on_change=1 %]
                     </label>
+
+                    [%- IF show_more_details.default != 'hide' -%]
                     <div class="results_header_div"></div>
 
                     <div class='results_header_sel' id='simple-detail-view-links'>
@@ -50,6 +52,8 @@
                         <a href="[% mkurl('', {detail_record_view => 1}) %]">[% l('Show More Details') %]</a>
                         [% END %]
                     </div>
+                    [%- END -%]
+
                     <div class="results_header_div"></div>
 
                     <label class="results_header_lbl">

commit e3f4c3a32eee3765fc7b4fe7ff1e6e153939a9f6
Merge: c24986d 4514047
Author: Dan Scott <dscott at laurentian.ca>
Date:   Wed May 8 10:49:05 2013 -0400

    Merge remote-tracking branch 'conifer/feature/ldap_osul_2_4' into rel_2_4_mergery

diff --cc Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm
index 77b1543,4dc638f..74c0700
--- a/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm
@@@ -361,43 -359,11 +361,46 @@@ sub load_login 
      my $persist = $cgi->param('persist');
  
      # initial log form only
 +    my $ticket = $cgi->param('ticket');
 +    my $cas_redirect_to = $cgi->param('redirect_to');
 +    if ($cgi->cookie(COOKIE_URL_CAS)) {
 +       $cas_redirect_to = $cgi->cookie(COOKIE_URL_CAS);
 +    }
 +    my $cas_flag = '0';
 +
 +    # initial log form only
 +    if ($ticket) {
 +        # CAS does not have either username or password at this point, so we fudge these 
 +        # values for the other checks
 +        $username = '_CAS_';
 +        $password = '_CAS_';
 +
 +    }
 +
 +    my $login_page = sprintf('%s://%s%s/login',($self->ctx->{is_staff} ? 'oils' : 'https'), $self->ctx->{hostname}, $self->ctx->{opac_root});
 +
 +    # CAS does not handle complex URLs, so we put the URL in a cookie 
 +    if (!$cgi->cookie(COOKIE_URL_CAS) && $cas_redirect_to && !$username && !$password) {
 +           return $self->generic_redirect(
 +              "$login_page?redirect_to=$cas_redirect_to",
 +              [
 +                 # contains the service url for CAS
 +                 $cgi->cookie(
 +                    -name => COOKIE_URL_CAS,
 +                    -path => '/',
 +                    -secure => 0,
 +                    -value => $cas_redirect_to,
 +                    -expires => '+10m'
 +                 )
 +              ]
 +           );
 +    }
 +
      return Apache2::Const::OK unless $username and $password;
  
+     # Should we append an email hostname to the username?
+     my $ou_email_host = $cgi->param('ou_email_host') || '';
+ 
      my $auth_proxy_enabled = 0; # default false
      try { # if the service is not running, just let this fail silently
          $auth_proxy_enabled = $U->simplereq(

commit 4514047e94a62c535ec67d9f143546709515ee87
Author: Dan Scott <dscott at laurentian.ca>
Date:   Thu Aug 30 10:48:32 2012 -0400

    Add an ou_host_name parameter for TPAC login forms
    
    If set, and the incoming username does not already include an '@' symbol
    (a very simple attempt to detect if we're already dealing with an email
    address), then append '@' + the ou_host_name value to the username for
    authentication purposes.
    
    The rationale is that in a large consortium, you might want to enable
    users to log in with short usernames (like 'fred'), but you also want to
    avoid conflicts between short usernames at different organizational
    units. Thus, create the users with the email equivalent of their
    usernames, like 'fred at br1.example.com' and 'fred at br4.example.com', and
    let the templates for the TPAC in br1 and br4 contain a hidden input
    field to append the appropriate email hostname.
    
    Truth be told, this is probably most appropriate for a large consortium
    containing two or more academic institutions that hope to use LDAP
    authentication rather than native authentication, and therefore have
    LDAP CNs that map to email addresses of CN at hostname that can then be
    mapped to actor.usr.usrname (and actor.usr.email, of course).
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm b/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm
index 0838a29..4dc638f 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm
@@ -361,6 +361,9 @@ sub load_login {
     # initial log form only
     return Apache2::Const::OK unless $username and $password;
 
+    # Should we append an email hostname to the username?
+    my $ou_email_host = $cgi->param('ou_email_host') || '';
+
     my $auth_proxy_enabled = 0; # default false
     try { # if the service is not running, just let this fail silently
         $auth_proxy_enabled = $U->simplereq(
@@ -384,6 +387,12 @@ sub load_login {
     if ($bc_regex and ($username =~ /$bc_regex/)) {
         $args->{barcode} = $username;
     } else {
+        # do we need to append an email hostname?
+        if ($ou_email_host) {
+            # Assume they already passed in an email address
+            next if $username =~ m/\@/;
+            $username .= "\@$ou_email_host";
+        }
         $args->{username} = $username;
     }
 

commit 0fe64756f4b81f981e029f995632b8bf9d749c71
Author: Dan Scott <dscott at laurentian.ca>
Date:   Mon Aug 27 18:38:51 2012 -0400

    Very rough LDAP authentication enablement for OSUL
    
    Currently requires that the user enters their email address at the
    username prompt; we then just use the local-part of the email address to
    authenticate against the LDAP server.
    
    In the VirtualHost sections of Apache, we can use SetEnv to force the
    physical_loc to match the org unit ID(s) specified in opensrf.xml; for
    example:
    
    SetEnv physical_loc 103
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/AuthProxy/LDAP_Auth_OSUL.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/AuthProxy/LDAP_Auth_OSUL.pm
new file mode 100644
index 0000000..5bf2487
--- /dev/null
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/AuthProxy/LDAP_Auth_OSUL.pm
@@ -0,0 +1,82 @@
+package OpenILS::Application::AuthProxy::LDAP_Auth_OSUL;
+use strict;
+use warnings;
+use base 'OpenILS::Application::AuthProxy::AuthBase';
+use OpenILS::Event;
+use Net::LDAP;
+use OpenSRF::Utils::SettingsClient;
+use OpenSRF::Utils::Logger qw(:logger);
+
+# default config var (override in configuration xml)
+my $id_attr = 'uid';
+
+sub authenticate {
+    my ( $self, $args ) = @_;
+    my $username = $args->{'username'};
+
+    # Authenticate against LDAP based on the user portion of the email address
+    my $ldap_username = $username;
+    $ldap_username =~ s/\@.*$//;
+
+    my $password = $args->{'password'};
+
+    if (!$username) {
+        $logger->debug("User login failed: No username provided");
+        return OpenILS::Event->new( 'LOGIN_FAILED' );
+    }
+    if (!$password) {
+        $logger->debug("User login failed: No password provided");
+        return OpenILS::Event->new( 'LOGIN_FAILED' );
+    }
+
+    my $hostname_is_ldap = 0;
+    my $reached_ldap     = 0;
+    my $user_in_ldap     = 0;
+    my $login_succeeded  = 0;
+
+    my $hostname    = $self->{'hostname'};
+    my $basedn      = $self->{'basedn'};
+    my $authid      = $self->{'authid'};
+    my $authid_pass = $self->{'password'};
+    $id_attr        = $self->{'id_attr'} || $id_attr;
+
+    my $ldap;
+    if ( $ldap = Net::LDAP->new($hostname) ) {
+        $hostname_is_ldap = 1;
+        if ( $ldap->bind( $authid, password => $authid_pass )->code == 0 ) {
+            $reached_ldap = 1;
+            # verify username
+            if ( $ldap
+                ->search( base => $basedn, filter => "($id_attr=$ldap_username)" )
+                ->count != 0 ) {
+                $user_in_ldap = 1;
+
+                # verify password (bind check)
+                my $binddn = "$id_attr=$ldap_username,$basedn";
+                if ( $ldap->bind( $binddn, password => $password )
+                    ->code == 0 ) {
+                    $login_succeeded = 1;
+                }
+            }
+        }
+    }
+
+    if ( $login_succeeded ) {
+        return OpenILS::Event->new('SUCCESS');
+    } elsif ( !$hostname_is_ldap ) {
+        # TODO: custom failure events?
+        $logger->debug("User login failed: Incorrect LDAP hostname");
+        return OpenILS::Event->new( 'LOGIN_FAILED' );
+    } elsif ( !$reached_ldap ) {
+        $logger->debug("User login failed: The LDAP server is misconfigured or unavailable");
+        return OpenILS::Event->new( 'LOGIN_FAILED' );
+    } elsif ( !$user_in_ldap ) {
+        $logger->debug("User login failed: Username $ldap_username not in LDAP");
+        return OpenILS::Event->new( 'LOGIN_FAILED' );
+    } else {
+        $logger->debug("User login failed: Incorrect LDAP password");
+        return OpenILS::Event->new( 'LOGIN_FAILED' );
+    }
+}
+
+1;

commit c24986df015fdbe30b2d1d16569761287b0d43ef
Merge: e54d748 fa0e99d
Author: Dan Scott <dscott at laurentian.ca>
Date:   Wed May 8 10:46:24 2013 -0400

    Merge remote-tracking branch 'conifer/feature/hold_slip_format_due_date' into rel_2_4_mergery


commit e54d748e2b163132c08cd94a05f6434776f8b03f
Merge: f47243f b3e62fe
Author: Dan Scott <dscott at laurentian.ca>
Date:   Wed May 8 10:46:13 2013 -0400

    Merge remote-tracking branch 'conifer/feature/CAS_auth_dynamic_links_2_4' into rel_2_4_mergery


commit f47243f3099e67edb31c6053b30781326b1151d5
Merge: 51f1854 f1141e9
Author: Dan Scott <dscott at laurentian.ca>
Date:   Wed May 8 10:45:58 2013 -0400

    Merge remote-tracking branch 'conifer/bugfix/recall_not_more_than_loan_2_4' into rel_2_4_mergery


commit 51f18543c1a92a5195870e467c763be8ac9fd912
Merge: b52e949 5848a76
Author: Dan Scott <dscott at laurentian.ca>
Date:   Wed May 8 10:45:44 2013 -0400

    Merge remote-tracking branch 'conifer/feature/callno_tpac_template_2_4' into rel_2_4_mergery


commit b52e949dbd0db0545b7709fe1bb36612b02a786e
Merge: c8427c1 4e01dfb
Author: Dan Scott <dscott at laurentian.ca>
Date:   Wed May 8 10:44:46 2013 -0400

    Merge branch 'feature/barcode_generator_2_4' into rel_2_4_mergery


commit c8427c11756dea17355d60f05af36acb1b3ff2e9
Merge: f744a76 f2db9ba
Author: Dan Scott <dscott at laurentian.ca>
Date:   Wed May 8 10:44:36 2013 -0400

    Merge remote-tracking branch 'conifer/feature/patron-privacy_2_4' into rel_2_4_mergery


commit f744a7674c2b80ccbced6dd74ba9967abd22bd1d
Merge: be3976d bbee114
Author: Dan Scott <dscott at laurentian.ca>
Date:   Wed May 8 10:44:27 2013 -0400

    Merge branch 'feature/move_to_storage_2_4' into rel_2_4_mergery


commit bbee114ba7c50af8f9ba9db3dffdec307d0c6ad7
Author: Dan Scott <dscott at laurentian.ca>
Date:   Wed May 8 10:43:41 2013 -0400

    Add production "moveto" options
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/src/templates/cat/moveto/circ.tt2 b/Open-ILS/src/templates/cat/moveto/circ.tt2
new file mode 100644
index 0000000..814daca
--- /dev/null
+++ b/Open-ILS/src/templates/cat/moveto/circ.tt2
@@ -0,0 +1,30 @@
+[% ctx.page_title = 'Move item to Back Reference' %]
+[% WRAPPER base.tt2 %]
+<script src='[% ctx.media_prefix %]/js/ui/default/cat/moveto/circ.js'> </script>
+
+<style>
+    label { margin-left: 2em; }
+    .dijitTextBoxFocused, .dijitFocused { border:1px dashed #3e3e3e; color: #303030; font-weight:bold;}
+    .alert { color: red; font-weight: bold; }
+    #resultsDiv { font-size: larger; margin-top: 3em; margin-left: 2em; }
+    h1 { margin-left: 1em; font-weight: bold; }
+    #barcodeForm { margin-top: 2em; }
+
+</style>
+
+<h1>Move item to Circulation</h1>
+
+<form method="get" action="/eg/cat/moveto/circ">
+     <table id="barcodeForm">
+      <tr>
+        <td><label for="barcode" style="font-size: larger;">Barcode</label></td>
+        <td><input type="text" id="barcode" name="barcode" dojoType="dijit.form.TextBox" style="margin-left: 1em;"/></td>
+      </tr>
+     </table>
+</form>
+
+<div id="resultsDiv"></div>
+
+[% END %]
+
+
diff --git a/Open-ILS/src/templates/cat/storage/move_to_back_reference.tt2 b/Open-ILS/src/templates/cat/storage/move_to_back_reference.tt2
new file mode 100644
index 0000000..fe981c5
--- /dev/null
+++ b/Open-ILS/src/templates/cat/storage/move_to_back_reference.tt2
@@ -0,0 +1,30 @@
+[% ctx.page_title = 'Move item to Back Reference' %]
+[% WRAPPER base.tt2 %]
+<script src='[% ctx.media_prefix %]/js/ui/default/cat/storage/move_to_back_reference.js'> </script>
+
+<style>
+    label { margin-left: 2em; }
+    .dijitTextBoxFocused, .dijitFocused { border:1px dashed #3e3e3e; color: #303030; font-weight:bold;}
+    .alert { color: red; font-weight: bold; }
+    #resultsDiv { font-size: larger; margin-top: 3em; margin-left: 2em; }
+    h1 { margin-left: 1em; font-weight: bold; }
+    #barcodeForm { margin-top: 2em; }
+
+</style>
+
+<h1>Move item to Back Reference</h1>
+
+<form method="get" action="/eg/cat/storage/move_to_back_reference">
+     <table id="barcodeForm">
+      <tr>
+        <td><label for="barcode" style="font-size: larger;">Barcode</label></td>
+        <td><input type="text" id="barcode" name="barcode" dojoType="dijit.form.TextBox" style="margin-left: 1em;"/></td>
+      </tr>
+     </table>
+</form>
+
+<div id="resultsDiv"></div>
+
+[% END %]
+
+
diff --git a/Open-ILS/src/templates/cat/storage/movestrip.tt2 b/Open-ILS/src/templates/cat/storage/movestrip.tt2
new file mode 100644
index 0000000..50cf51f
--- /dev/null
+++ b/Open-ILS/src/templates/cat/storage/movestrip.tt2
@@ -0,0 +1,30 @@
+[% ctx.page_title = 'Move item to storage' %]
+[% WRAPPER base.tt2 %]
+<script src='[% ctx.media_prefix %]/js/ui/default/cat/storage/movestrip.js'> </script>
+
+<style>
+    label { margin-left: 2em; }
+    .dijitTextBoxFocused, .dijitFocused { border:1px dashed #3e3e3e; color: #303030; font-weight:bold;}
+    .alert { color: red; font-weight: bold; }
+    #resultsDiv { font-size: larger; margin-top: 3em; margin-left: 2em; }
+    h1 { margin-left: 1em; font-weight: bold; }
+    #barcodeForm { margin-top: 2em; }
+
+</style>
+
+<h1>Move item to storage</h1>
+
+<form method="get" action="/eg/cat/storage/movestrip">
+     <table id="barcodeForm">
+      <tr>
+        <td><label for="barcode" style="font-size: larger;">Barcode</label></td>
+        <td><input type="text" id="barcode" name="barcode" dojoType="dijit.form.TextBox" style="margin-left: 1em;"/></td>
+      </tr>
+     </table>
+</form>
+
+<div id="resultsDiv"></div>
+
+[% END %]
+
+
diff --git a/Open-ILS/web/js/ui/default/cat/moveto/circ.js b/Open-ILS/web/js/ui/default/cat/moveto/circ.js
new file mode 100644
index 0000000..969d8ad
--- /dev/null
+++ b/Open-ILS/web/js/ui/default/cat/moveto/circ.js
@@ -0,0 +1,89 @@
+dojo.require('fieldmapper.IDL');
+dojo.require('openils.PermaCrud');
+dojo.require('dojo.date');
+dojo.require('openils.CGI');
+dojo.require('openils.XUL');
+
+var pcrud;
+var pcrudReader;
+var staff;
+var copy;
+var volume;
+var record;
+var rmsr;
+var tbody;
+var cgi;
+
+if(!window.xulG) var xulG = null;
+
+function load() {
+    staff = new openils.User().user;
+    pcrud = new openils.PermaCrud();
+    pcrudReader = new openils.PermaCrud();
+    cgi = new openils.CGI();
+    var barcode = cgi.param('barcode');
+
+    if(xulG) {
+        if(xulG.ses) openils.User.authtoken = xulG.ses;
+        if(xulG.usr !== null) userId = xulG.usr
+        if(xulG.params) {
+            var parms = xulG.params;
+            if(parms.ses) 
+                openils.User.authtoken = parms.ses;
+            if(parms.usr !== null)
+                userId = parms.usr
+        }
+    }
+
+    dojo.byId("barcode").focus();
+    moveCopy(barcode);
+}
+
+function moveCopy(barcode) {
+    if (!barcode) {
+        // Just display the barcode entry form
+        return;
+    }
+/*
+    copy = fieldmapper.standardRequest(
+        ['open-ils.search', 'open-ils.search.asset.copy.find_by_barcode'],
+        {params: [barcode]}
+    );
+*/
+    /* Get rid of non-numeric barcode characters - probably need to configure the cheapo scanner */
+    barcode = barcode.replace(/[^0-9]/g, '');
+    copy = pcrud.search('acp', {"barcode":barcode});
+    // There can be only one copy
+    copy = copy[0];
+    if (!copy.location) {
+       dojo.place('<div class="alert">Barcode [' + barcode + '] was not found!</div>', 'resultsDiv', 'only');
+       return;
+    }
+    copy.location(142);
+    copy.ischanged(true);
+    pcrud.update(copy);
+
+    volume = pcrudReader.retrieve("acn", copy.call_number());
+    record = pcrudReader.retrieve("bre", volume.record());
+    dojo.place("<div class='barcode'>" + copy.barcode() + "</div>", 'resultsDiv', 'only');
+    dojo.place("<div class='call_number'>" + volume.label() + "</div>", 'resultsDiv', 'last');
+    dojo.place("<div style='display:none'>" + record.marc() + "</div>", dojo.body(), 'last');
+    dojo.place("<div class='title' id='titleDiv'></div>", 'resultsDiv', 'last');
+    dojo.query("datafield[tag='245'] subfield").forEach(function(node, index, arr) {
+        dojo.place("<span class='title'>" + node.innerHTML + " </span>", 'titleDiv', 'last');
+    });
+}
+
+function moveCopyRefresh() {
+    var usr = cgi.param('barcode');
+    var href = location.href.replace(/\?.*/, '');
+    href += ((usr) ? '?barcode=' + barcode : '');
+    location.href = href;
+}
+
+function moveCopyRefreshXUL(newuser) {
+    if (window.xulG && typeof window.xulG.on_save == 'function') 
+        window.xulG.on_save(newuser);
+}
+
+openils.Util.addOnLoad(load);
diff --git a/Open-ILS/web/js/ui/default/cat/storage/move_to_back_reference.js b/Open-ILS/web/js/ui/default/cat/storage/move_to_back_reference.js
new file mode 100644
index 0000000..f828148
--- /dev/null
+++ b/Open-ILS/web/js/ui/default/cat/storage/move_to_back_reference.js
@@ -0,0 +1,89 @@
+dojo.require('fieldmapper.IDL');
+dojo.require('openils.PermaCrud');
+dojo.require('dojo.date');
+dojo.require('openils.CGI');
+dojo.require('openils.XUL');
+
+var pcrud;
+var pcrudReader;
+var staff;
+var copy;
+var volume;
+var record;
+var rmsr;
+var tbody;
+var cgi;
+
+if(!window.xulG) var xulG = null;
+
+function load() {
+    staff = new openils.User().user;
+    pcrud = new openils.PermaCrud();
+    pcrudReader = new openils.PermaCrud();
+    cgi = new openils.CGI();
+    var barcode = cgi.param('barcode');
+
+    if(xulG) {
+        if(xulG.ses) openils.User.authtoken = xulG.ses;
+        if(xulG.usr !== null) userId = xulG.usr
+        if(xulG.params) {
+            var parms = xulG.params;
+            if(parms.ses) 
+                openils.User.authtoken = parms.ses;
+            if(parms.usr !== null)
+                userId = parms.usr
+        }
+    }
+
+    dojo.byId("barcode").focus();
+    moveCopy(barcode);
+}
+
+function moveCopy(barcode) {
+    if (!barcode) {
+        // Just display the barcode entry form
+        return;
+    }
+/*
+    copy = fieldmapper.standardRequest(
+        ['open-ils.search', 'open-ils.search.asset.copy.find_by_barcode'],
+        {params: [barcode]}
+    );
+*/
+    /* Get rid of non-numeric barcode characters - probably need to configure the cheapo scanner */
+    barcode = barcode.replace(/[^0-9]/g, '');
+    copy = pcrud.search('acp', {"barcode":barcode});
+    // There can be only one copy
+    copy = copy[0];
+    if (!copy.location) {
+       dojo.place('<div class="alert">Barcode [' + barcode + '] was not found!</div>', 'resultsDiv', 'only');
+       return;
+    }
+    copy.location(837);
+    copy.ischanged(true);
+    pcrud.update(copy);
+
+    volume = pcrudReader.retrieve("acn", copy.call_number());
+    record = pcrudReader.retrieve("bre", volume.record());
+    dojo.place("<div class='barcode'>" + copy.barcode() + "</div>", 'resultsDiv', 'only');
+    dojo.place("<div class='call_number'>" + volume.label() + "</div>", 'resultsDiv', 'last');
+    dojo.place("<div style='display:none'>" + record.marc() + "</div>", dojo.body(), 'last');
+    dojo.place("<div class='title' id='titleDiv'></div>", 'resultsDiv', 'last');
+    dojo.query("datafield[tag='245'] subfield").forEach(function(node, index, arr) {
+        dojo.place("<span class='title'>" + node.innerHTML + " </span>", 'titleDiv', 'last');
+    });
+}
+
+function moveCopyRefresh() {
+    var usr = cgi.param('barcode');
+    var href = location.href.replace(/\?.*/, '');
+    href += ((usr) ? '?barcode=' + barcode : '');
+    location.href = href;
+}
+
+function moveCopyRefreshXUL(newuser) {
+    if (window.xulG && typeof window.xulG.on_save == 'function') 
+        window.xulG.on_save(newuser);
+}
+
+openils.Util.addOnLoad(load);
diff --git a/Open-ILS/web/js/ui/default/cat/storage/movestrip.js b/Open-ILS/web/js/ui/default/cat/storage/movestrip.js
new file mode 100644
index 0000000..4f090f2
--- /dev/null
+++ b/Open-ILS/web/js/ui/default/cat/storage/movestrip.js
@@ -0,0 +1,90 @@
+dojo.require('fieldmapper.IDL');
+dojo.require('openils.PermaCrud');
+dojo.require('dojo.date');
+dojo.require('openils.CGI');
+dojo.require('openils.XUL');
+
+var pcrud;
+var pcrudReader;
+var staff;
+var copy;
+var volume;
+var record;
+var rmsr;
+var tbody;
+var cgi;
+
+if(!window.xulG) var xulG = null;
+
+function load() {
+    staff = new openils.User().user;
+    pcrud = new openils.PermaCrud();
+    pcrudReader = new openils.PermaCrud();
+    cgi = new openils.CGI();
+    var barcode = cgi.param('barcode');
+
+    if(xulG) {
+        if(xulG.ses) openils.User.authtoken = xulG.ses;
+        if(xulG.usr !== null) userId = xulG.usr
+        if(xulG.params) {
+            var parms = xulG.params;
+            if(parms.ses) 
+                openils.User.authtoken = parms.ses;
+            if(parms.usr !== null)
+                userId = parms.usr
+        }
+    }
+
+    dojo.byId("barcode").focus();
+    moveCopy(barcode);
+}
+
+function moveCopy(barcode) {
+    if (!barcode) {
+        // Just display the barcode entry form
+        return;
+    }
+/*
+    copy = fieldmapper.standardRequest(
+        ['open-ils.search', 'open-ils.search.asset.copy.find_by_barcode'],
+        {params: [barcode]}
+    );
+*/
+    /* Get rid of non-numeric barcode characters - probably need to configure the cheapo scanner */
+    barcode = barcode.replace(/[^0-9]/g, '');
+    alert(barcode);
+    copy = pcrud.search('acp', {"barcode":barcode});
+    // There can be only one copy
+    copy = copy[0];
+    if (!copy.location) {
+       dojo.place('<div class="alert">Barcode [' + barcode + '] was not found!</div>', 'resultsDiv', 'only');
+       return;
+    }
+    copy.location(152);
+    copy.ischanged(true);
+    pcrud.update(copy);
+
+    volume = pcrudReader.retrieve("acn", copy.call_number());
+    record = pcrudReader.retrieve("bre", volume.record());
+    dojo.place("<div class='barcode'>" + copy.barcode() + "</div>", 'resultsDiv', 'only');
+    dojo.place("<div class='call_number'>" + volume.label() + "</div>", 'resultsDiv', 'last');
+    dojo.place("<div style='display:none'>" + record.marc() + "</div>", dojo.body(), 'last');
+    dojo.place("<div class='title' id='titleDiv'></div>", 'resultsDiv', 'last');
+    dojo.query("datafield[tag='245'] subfield").forEach(function(node, index, arr) {
+        dojo.place("<span class='title'>" + node.innerHTML + " </span>", 'titleDiv', 'last');
+    });
+}
+
+function moveCopyRefresh() {
+    var usr = cgi.param('barcode');
+    var href = location.href.replace(/\?.*/, '');
+    href += ((usr) ? '?barcode=' + barcode : '');
+    location.href = href;
+}
+
+function moveCopyRefreshXUL(newuser) {
+    if (window.xulG && typeof window.xulG.on_save == 'function') 
+        window.xulG.on_save(newuser);
+}
+
+openils.Util.addOnLoad(load);

commit 2187cd60f703c38f95a8596b8ac431c29baa701d
Author: Dan Scott <dscott at laurentian.ca>
Date:   Mon Oct 1 13:54:34 2012 -0400

    Move the moveto to the new moveto template place
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/web/templates/default/cat/storage/move.tt2 b/Open-ILS/src/templates/cat/storage/move.tt2
similarity index 100%
rename from Open-ILS/web/templates/default/cat/storage/move.tt2
rename to Open-ILS/src/templates/cat/storage/move.tt2

commit 1ce94b3a77c165d8e1237f31892983bab820a1e3
Author: Dan Scott <dan at coffeecode.net>
Date:   Mon May 30 15:23:09 2011 -0400

    Add "Move to storage" quick UI for bulk location moves
    
    This simplistic interface accepts a barcode and immediately returns
    some bibliographic information if the barcode was found - and the
    item is moved immediately to the specified location. Goal was to
    minimize clicking, this pretty much requires just scan scan scan.
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/web/js/ui/default/cat/storage/move.js b/Open-ILS/web/js/ui/default/cat/storage/move.js
new file mode 100644
index 0000000..0b0681c
--- /dev/null
+++ b/Open-ILS/web/js/ui/default/cat/storage/move.js
@@ -0,0 +1,87 @@
+dojo.require('fieldmapper.IDL');
+dojo.require('openils.PermaCrud');
+dojo.require('dojo.date');
+dojo.require('openils.CGI');
+dojo.require('openils.XUL');
+
+var pcrud;
+var pcrudRead;
+var staff;
+var copy;
+var volume;
+var record;
+var rmsr;
+var tbody;
+var cgi;
+
+if(!window.xulG) var xulG = null;
+
+function load() {
+    staff = new openils.User().user;
+    pcrud = new openils.PermaCrud();
+    pcrudRead = new openils.PermaCrud();
+    cgi = new openils.CGI();
+    var barcode = cgi.param('barcode');
+
+    if(xulG) {
+        if(xulG.ses) openils.User.authtoken = xulG.ses;
+        if(xulG.usr !== null) userId = xulG.usr
+        if(xulG.params) {
+            var parms = xulG.params;
+            if(parms.ses)
+                openils.User.authtoken = parms.ses;
+            if(parms.usr !== null)
+                userId = parms.usr
+        }
+    }
+
+    dojo.byId("barcode").focus();
+    moveCopy(barcode);
+}
+
+function moveCopy(barcode) {
+    if (!barcode) {
+        // Just display the barcode entry form
+        return;
+    }
+
+    copy = pcrud.search('acp', {"barcode":barcode});
+    // There can be only one copy
+    copy = copy[0];
+    if (!copy.location) {
+       dojo.place('<div class="alert">Barcode [' + barcode + '] was not found!</div>', 'resultsDiv', 'only');
+       return;
+    }
+
+    copy.location(152);
+    copy.ischanged(1);
+    pcrud.update(copy);
+
+    volume = pcrudRead.retrieve("acn", copy.call_number());
+    record = pcrudRead.retrieve("bre", volume.record());
+
+    dojo.place("<div class='barcode'>" + copy.barcode() + "</div>", 'resultsDiv', 'only');
+    dojo.place("<div class='call_number'>" + volume.label() + "</div>", 'resultsDiv', 'last');
+    dojo.place("<div style='display:none'>" + record.marc() + "</div>", dojo.body(), 'last');
+
+    // Totally dumb title display. Oh well!
+    dojo.place("<div class='title' id='titleDiv'></div>", 'resultsDiv', 'last');
+    dojo.query("datafield[tag='245'] subfield").forEach(function(node, index, arr) {
+        dojo.place("<span class='title'>" + node.innerHTML + " </span>", 'titleDiv', 'last');
+    });
+}
+
+function moveCopyRefresh() {
+    var usr = cgi.param('barcode');
+    var href = location.href.replace(/\?.*/, '');
+    href += ((usr) ? '?barcode=' + barcode : '');
+    location.href = href;
+}
+
+function moveCopyRefreshXUL(newuser) {
+    if (window.xulG && typeof window.xulG.on_save == 'function')
+        window.xulG.on_save(newuser);
+}
+
+openils.Util.addOnLoad(load);
+                                                                                                                                                               1,1           Top
diff --git a/Open-ILS/web/templates/default/cat/storage/move.tt2 b/Open-ILS/web/templates/default/cat/storage/move.tt2
new file mode 100644
index 0000000..cfd17d2
--- /dev/null
+++ b/Open-ILS/web/templates/default/cat/storage/move.tt2
@@ -0,0 +1,27 @@
+[% ctx.page_title = 'Move item to storage' %]
+[% WRAPPER base.tt2 %]
+<script src='[% ctx.media_prefix %]/js/ui/default/cat/storage/move.js'> </script>
+
+<style>
+    label { margin-left: 2em; }
+    .dijitTextBoxFocused, .dijitFocused { border:1px dashed #3e3e3e; color: #303030; font-weight:bold;}
+    .alert { color: red; font-weight: bold; }
+    #resultsDiv { font-size: larger; margin-top: 3em; margin-left: 2em; }
+    h1 { margin-left: 1em; font-weight: bold; }
+    #barcodeForm { margin-top: 2em; }
+
+</style>
+
+<h1>Move item to storage</h1>
+<form method="get" action="/eg/cat/storage/move" id="barcodeForm">
+     <table style="margin-top: 2em;">
+      <tr>
+        <td><label for="barcode" style="font-size: larger;">Barcode</label></td>
+        <td><input type="text" id="barcode" name="barcode" dojoType="dijit.form.TextBox" style="margin-left: 1em;"/></td>
+      </tr>
+     </table>
+</form>
+
+<div id="resultsDiv"></div>
+
+[% END %]

commit be3976d4945198cb95f937c3a6b744e963b3c352
Merge: 83b5ff9 0649f95
Author: Dan Scott <dscott at laurentian.ca>
Date:   Wed May 8 10:24:39 2013 -0400

    Merge remote-tracking branch 'conifer/feature/marctemplates_2_4' into rel_2_4_mergery


commit 83b5ff94928afc3fad2a3fea2db397b2466afcc9
Merge: c71e0cf a5079e7
Author: Dan Scott <dscott at laurentian.ca>
Date:   Wed May 8 10:24:32 2013 -0400

    Merge remote-tracking branch 'conifer/feature/fts-polish-l_2_4' into rel_2_4_mergery


commit c71e0cf606c7dc676fdb9456e94a3c2c1bce9817
Merge: 7166448 949beda
Author: Dan Scott <dscott at laurentian.ca>
Date:   Wed May 8 10:23:54 2013 -0400

    Merge branch 'feature/circ_scripts_2_4' into rel_2_4_mergery


commit 949bedabac429524c43ba9b77da5da378c5d8b8b
Author: Dan Scott <dscott at laurentian.ca>
Date:   Mon Sep 24 14:03:18 2012 -0400

    MEDIACEN doesn't charge anything on AV-EQUIP items
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/src/javascript/backend/circ/circ_duration_MEDIACEN.js b/Open-ILS/src/javascript/backend/circ/circ_duration_MEDIACEN.js
deleted file mode 120000
index e54bfe1..0000000
--- a/Open-ILS/src/javascript/backend/circ/circ_duration_MEDIACEN.js
+++ /dev/null
@@ -1 +0,0 @@
-circ_duration_OSUL.js
\ No newline at end of file
diff --git a/Open-ILS/src/javascript/backend/circ/circ_duration_MEDIACEN.js b/Open-ILS/src/javascript/backend/circ/circ_duration_MEDIACEN.js
new file mode 100644
index 0000000..2b2d442
--- /dev/null
+++ b/Open-ILS/src/javascript/backend/circ/circ_duration_MEDIACEN.js
@@ -0,0 +1,70 @@
+/* grab the config from the config script */
+var config = getItemConfig();
+var itemForm    = (marcXMLDoc) ? extractFixedField(marcXMLDoc,'Form') : "";
+
+/* Set the defaults for books for most patron types */
+result.durationRule = '3_weeks_3_renew';
+result.recurringFinesRule = 'OSUL_daily';
+result.maxFine = 'OSUL_daily';
+
+if (patronProfile == 'Faculty' || 
+    patronProfile == 'Graduate') {
+	result.durationRule = '120_days_1_renew';
+}
+
+/* Distance education laptops */
+if (copy.circ_modifier == 'COMPUTER LONG') {
+        result.durationRule = 'OSUL_computer_long';
+        result.recurringFinesRule = 'OSUL_computer';
+        result.maxFine = 'overdue_equip_max';
+}
+
+/* Short term laptops */
+if (copy.circ_modifier == 'COMPUTER SHORT') {
+        result.durationRule = '4_hours_0_renew';
+        result.recurringFinesRule = 'OSUL_computer';
+        result.maxFine = 'overdue_equip_max';
+}
+
+/* Study room keys */
+if (copy.circ_modifier == 'KEYS') {
+        result.durationRule = '3_hours_1_renew';
+        result.recurringFinesRule = 'OSUL_hourly';
+	result.maxFine = 'OSUL_hourly';
+}
+
+/* Reserve items - let's use regular expressions to save some pain */
+res_day_re = /^RESERVE (\d+) DAY$/;
+res_hour_re = /^RESERVE (\d+) HOUR$/;
+res_day_match = res_day_re.exec(copy.circ_modifier);
+res_hour_match = res_hour_re.exec(copy.circ_modifier);
+if (res_day_match) {
+	result.durationRule = res_day_match[1] + '_days_0_renew';
+	result.recurringFinesRule = 'OSUL_reserves_daily';
+	result.maxFine = 'OSUL_reserves';
+} else if (res_hour_match) {
+	result.durationRule = res_hour_match[1] + '_hours_0_renew';
+	result.recurringFinesRule = 'OSUL_hourly';
+	result.maxFine = 'OSUL_reserves';
+}
+
+/* RACER books */
+if (copy.circ_modifier == 'PEB-LIVRE') {
+        result.durationRule = '14_days_0_renew';
+        result.recurringFinesRule = '1_dollar_per_day';
+	result.maxFine = 'INFINITY_AND_BEYOND';
+}
+
+/* VIDEO recordings */
+if (copy.circ_modifier == 'VIDEO') {
+        result.durationRule = '3_days_0_renew';
+        result.recurringFinesRule = '1_dollar_per_day';
+	result.maxFine = 'OSUL_reserves';
+}
+
+/* AV-EQUIP equipment */
+if (copy.circ_modifier == 'AV-EQUIP') {
+        result.durationRule = '3_days_0_renew';
+        result.recurringFinesRule = 'free';
+        result.maxFine = 'OSUL_reserves';
+}

commit 2300334a8f17576ca988de28ec1a6597440f9ab8
Author: Dan Scott <dscott at laurentian.ca>
Date:   Mon Sep 24 10:36:28 2012 -0400

    Add 3-day loan rule for AV-EQUIP for media centre
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/src/javascript/backend/circ/circ_duration_MEDIACEN.js b/Open-ILS/src/javascript/backend/circ/circ_duration_MEDIACEN.js
new file mode 120000
index 0000000..e54bfe1
--- /dev/null
+++ b/Open-ILS/src/javascript/backend/circ/circ_duration_MEDIACEN.js
@@ -0,0 +1 @@
+circ_duration_OSUL.js
\ No newline at end of file
diff --git a/Open-ILS/src/javascript/backend/circ/circ_duration_OSUL.js b/Open-ILS/src/javascript/backend/circ/circ_duration_OSUL.js
index 4e8d281..d115db1 100644
--- a/Open-ILS/src/javascript/backend/circ/circ_duration_OSUL.js
+++ b/Open-ILS/src/javascript/backend/circ/circ_duration_OSUL.js
@@ -61,3 +61,10 @@ if (copy.circ_modifier == 'VIDEO') {
         result.recurringFinesRule = '1_dollar_per_day';
 	result.maxFine = 'OSUL_reserves';
 }
+
+/* AV-EQUIP equipment */
+if (copy.circ_modifier == 'AV-EQUIP') {
+        result.durationRule = '3_days_0_renew';
+        result.recurringFinesRule = 'OSUL_reserves_daily';
+        result.maxFine = 'OSUL_reserves';
+}

commit 636dad18cc3501be8cb6f9735403ba1526ae64e1
Author: Dan Scott <dscott at laurentian.ca>
Date:   Tue Feb 14 10:46:24 2012 -0500

    Prevent renew if item already is targeted for a hold
    
    From http://biblio.laurentian.ca/tickets/conifer/wiki/devHolds
    apparently I missed this in moving our customizations from SVN (or it
    was only ever local?)
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/src/javascript/backend/circ/circ_permit_renew.js b/Open-ILS/src/javascript/backend/circ/circ_permit_renew.js
index 2eaac55..95db591 100644
--- a/Open-ILS/src/javascript/backend/circ/circ_permit_renew.js
+++ b/Open-ILS/src/javascript/backend/circ/circ_permit_renew.js
@@ -5,4 +5,14 @@ load_lib('circ/circ_lib.js');
 load_lib('JSON_v1.js');
 log_vars('circ_permit_renew');
 
+//from Jason Etheridge's suggestion on OPEN-ILS-GENERAL, Dec. 23, 2009
+log_info("permit_renew searching for potential holds for copy " + copy.barcode)
+var hold = copy.fetchBestHold();
+if( hold ) {
+    log_info("hold found for renewal item, checking hold->usr..");
+    if( hold && hold.usr != patron.id ) {
+        return result.events.push('COPY_NEEDED_FOR_HOLD');
+    }
+}
+
 } go();

commit 3eb0d8c60f6e681fde9f2ada10adcb0f694f06d8
Author: Dan Scott <dscott at laurentian.ca>
Date:   Fri Sep 23 16:40:38 2011 -0400

    OSBO: Accidental copying of the "DVD VIDEO" rule
    
    Meant to remove the "DVD" from the "DVD VIDEO" part of the circ modifier
    the second time around.
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/src/javascript/backend/circ/circ_duration_OSBO.js b/Open-ILS/src/javascript/backend/circ/circ_duration_OSBO.js
index 96929d2..186283f 100644
--- a/Open-ILS/src/javascript/backend/circ/circ_duration_OSBO.js
+++ b/Open-ILS/src/javascript/backend/circ/circ_duration_OSBO.js
@@ -25,7 +25,7 @@ if (copy.circ_modifier == 'CIRC SHORT') {
     result.durationRule = '1_day_1_renew';
 }
 
-if (copy.circ_modifier == 'DVD VIDEO') {
+if (copy.circ_modifier == 'VIDEO') {
     result.durationRule = '7_days_1_renew';
     result.recurringFinesRule = '1_dollar_per_day';
 }

commit 559e568eecb67f46d90694e28df46fa601757656
Author: Dan Scott <dscott at laurentian.ca>
Date:   Tue Sep 20 13:01:32 2011 -0400

    OSBO really did want $0.25/hour for all reserve periods
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/src/javascript/backend/circ/circ_duration_OSBO.js b/Open-ILS/src/javascript/backend/circ/circ_duration_OSBO.js
index 6225838..96929d2 100644
--- a/Open-ILS/src/javascript/backend/circ/circ_duration_OSBO.js
+++ b/Open-ILS/src/javascript/backend/circ/circ_duration_OSBO.js
@@ -47,7 +47,7 @@ res_day_match = res_day_re.exec(copy.circ_modifier);
 res_hour_match = res_hour_re.exec(copy.circ_modifier);
 if (res_day_match) {
     result.durationRule = res_day_match[1] + '_days_0_renew';
-    result.recurringFinesRule = '25_cent_per_day';
+    result.recurringFinesRule = '25_cent_per_hour';
 } else if (res_hour_match) {
     result.durationRule = res_hour_match[1] + '_hours_0_renew';
     result.recurringFinesRule = '25_cent_per_hour';

commit b161b58c0cad5ef3fcc92c6a084bbc50eee59502
Author: Dan Scott <dan at coffeecode.net>
Date:   Thu Sep 1 15:01:39 2011 -0400

    Add Reserve circ rules for Boreal
    
    Still need some clarification on how these rules are to be applied, but
    better to get the durations working right now and fix up the fines
    later.
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/src/javascript/backend/circ/circ_duration_OSBO.js b/Open-ILS/src/javascript/backend/circ/circ_duration_OSBO.js
index b1062cf..6225838 100644
--- a/Open-ILS/src/javascript/backend/circ/circ_duration_OSBO.js
+++ b/Open-ILS/src/javascript/backend/circ/circ_duration_OSBO.js
@@ -39,3 +39,18 @@ if (copy.circ_modifier == 'DVD VIDEO') {
     result.durationRule = '7_days_1_renew';
     result.recurringFinesRule = '1_dollar_per_day';
 }
+
+/* Reserve items - let's use regular expressions to save some pain */
+res_day_re = /^RESERVE (\d+) DAY$/;
+res_hour_re = /^RESERVE (\d+) HOUR$/;
+res_day_match = res_day_re.exec(copy.circ_modifier);
+res_hour_match = res_hour_re.exec(copy.circ_modifier);
+if (res_day_match) {
+    result.durationRule = res_day_match[1] + '_days_0_renew';
+    result.recurringFinesRule = '25_cent_per_day';
+} else if (res_hour_match) {
+    result.durationRule = res_hour_match[1] + '_hours_0_renew';
+    result.recurringFinesRule = '25_cent_per_hour';
+}
+
+

commit 1a19d6bf0a9b48d2ad3e03d1400d8c1d29368e33
Author: Dan Scott <dan at coffeecode.net>
Date:   Mon Aug 15 13:10:17 2011 -0400

    Add LEDL MISC to the list of allowed circ modifiers for Leddy
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/src/javascript/backend/circ/circ_permit_copy.js b/Open-ILS/src/javascript/backend/circ/circ_permit_copy.js
index ab5e44e..74c5dc9 100644
--- a/Open-ILS/src/javascript/backend/circ/circ_permit_copy.js
+++ b/Open-ILS/src/javascript/backend/circ/circ_permit_copy.js
@@ -55,7 +55,7 @@ if (copy.circ_lib.shortname == 'OWA') {
 	if (isValidPatron(patronProfile)) {
   
 		// permit circulations for the following circ modifiers to all patrons
-		var circ_allow_list = ['CIRC', 'CRC MEDIA', 'CRC SPEC', 'CRC TEXT', 'DOC', 'DVD VIDEO', 'ILL-BOOK', 'MEDIA', 'MFORM', 'REF', 'THESIS'];
+		var circ_allow_list = ['CIRC', 'CRC MEDIA', 'CRC SPEC', 'CRC TEXT', 'DOC', 'DVD VIDEO', 'ILL-BOOK', 'LEDL MISC', 'MEDIA', 'MFORM', 'REF', 'THESIS'];
 
 		// add permissions for patron groups who are not external borrowers
 		if (patronProfile == 'Faculty' || patronProfile == 'Graduate' || patronProfile == 'Undergraduate' || patronProfile == 'Staff members') {

commit ad6cf1c24d516f22ca8fb746e359846ac7779818
Author: Dan Scott <dan at coffeecode.net>
Date:   Mon Aug 15 13:08:55 2011 -0400

    Add ILL-BOOK to the list of allowed circ modifiers for Leddy
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/src/javascript/backend/circ/circ_permit_copy.js b/Open-ILS/src/javascript/backend/circ/circ_permit_copy.js
index 8f93442..ab5e44e 100644
--- a/Open-ILS/src/javascript/backend/circ/circ_permit_copy.js
+++ b/Open-ILS/src/javascript/backend/circ/circ_permit_copy.js
@@ -55,7 +55,7 @@ if (copy.circ_lib.shortname == 'OWA') {
 	if (isValidPatron(patronProfile)) {
   
 		// permit circulations for the following circ modifiers to all patrons
-		var circ_allow_list = ['CIRC', 'CRC MEDIA', 'CRC SPEC', 'CRC TEXT', 'DOC', 'DVD VIDEO', 'MEDIA', 'MFORM', 'REF', 'THESIS'];
+		var circ_allow_list = ['CIRC', 'CRC MEDIA', 'CRC SPEC', 'CRC TEXT', 'DOC', 'DVD VIDEO', 'ILL-BOOK', 'MEDIA', 'MFORM', 'REF', 'THESIS'];
 
 		// add permissions for patron groups who are not external borrowers
 		if (patronProfile == 'Faculty' || patronProfile == 'Graduate' || patronProfile == 'Undergraduate' || patronProfile == 'Staff members') {

commit 51b79fdb8bed153c69c6c519f00eee479e2846c2
Author: Dan Scott <dan at coffeecode.net>
Date:   Thu Aug 11 09:42:30 2011 -0400

    Add LEDL MISC 1 year 0 renew rule
    
    This had been working in production, but apparently never got
    checked into git?
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/src/javascript/backend/circ/circ_duration_OWA.js b/Open-ILS/src/javascript/backend/circ/circ_duration_OWA.js
index d3f589f..3b8e7d9 100644
--- a/Open-ILS/src/javascript/backend/circ/circ_duration_OWA.js
+++ b/Open-ILS/src/javascript/backend/circ/circ_duration_OWA.js
@@ -61,6 +61,9 @@ if (isValidPatron(patronProfile)) {
         case 'ILL-BOOK':
             result.durationRule = '3_weeks_0_renew';
             break;
+        case 'LEDL MISC':
+            result.durationRule = '1_year_0_renew';
+            break;
         case 'MEDIA':
             result.durationRule = 'OWA_' + profileFirst;
             break;

commit 692084858fc9cd7c1e25a830cdac84604279503a
Author: Dan Scott <dan at coffeecode.net>
Date:   Thu Jul 21 15:08:53 2011 -0400

    Add Boreal circulation rules
    
    Still need to add their limits based on user profile & item type
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/src/javascript/backend/circ/circ_duration_OSBO.js b/Open-ILS/src/javascript/backend/circ/circ_duration_OSBO.js
new file mode 100644
index 0000000..b1062cf
--- /dev/null
+++ b/Open-ILS/src/javascript/backend/circ/circ_duration_OSBO.js
@@ -0,0 +1,41 @@
+/* grab the config from the config script */
+var config = getItemConfig();
+var itemForm    = (marcXMLDoc) ? extractFixedField(marcXMLDoc,'Form') : "";
+
+/* Set the defaults for books for most patron types */
+result.durationRule = '21_days_1_renew';
+result.recurringFinesRule = '25_cent_per_day';
+result.maxFine = '10_dollars';
+
+if (copy.circ_modifier == 'AUDIO') {
+    result.durationRule = '7_days_1_renew';
+    result.recurringFinesRule = '1_dollar_per_day';
+}
+
+if (copy.circ_modifier == 'AV_EQUIP') {
+    result.durationRule = '1_day_1_renew';
+    result.recurringFinesRule = '1_dollar_per_day';
+}
+
+if (copy.circ_modifier == 'CD MUSIC') {
+    result.durationRule = '7_days_1_renew';
+}
+
+if (copy.circ_modifier == 'CIRC SHORT') {
+    result.durationRule = '1_day_1_renew';
+}
+
+if (copy.circ_modifier == 'DVD VIDEO') {
+    result.durationRule = '7_days_1_renew';
+    result.recurringFinesRule = '1_dollar_per_day';
+}
+
+if (copy.circ_modifier == 'SOFTWARE') {
+    result.durationRule = '7_days_1_renew';
+    result.recurringFinesRule = '1_dollar_per_day';
+}
+
+if (copy.circ_modifier == 'DVD VIDEO') {
+    result.durationRule = '7_days_1_renew';
+    result.recurringFinesRule = '1_dollar_per_day';
+}

commit e36b054d84bb057b56f16f221a85f20cb24a825b
Author: Dan Scott <dan at coffeecode.net>
Date:   Mon Jun 20 13:54:23 2011 -0400

    Add ILL-BOOK circ rule for OWA
    
    Per ticket #683:
    
    Loan period of 3 weeks
    NO RENEWALS
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/src/javascript/backend/circ/circ_duration_OWA.js b/Open-ILS/src/javascript/backend/circ/circ_duration_OWA.js
index 883e833..d3f589f 100644
--- a/Open-ILS/src/javascript/backend/circ/circ_duration_OWA.js
+++ b/Open-ILS/src/javascript/backend/circ/circ_duration_OWA.js
@@ -58,6 +58,9 @@ if (isValidPatron(patronProfile)) {
         case 'DVD VIDEO':
             result.durationRule = 'OWA_audiovisual';
             break;
+        case 'ILL-BOOK':
+            result.durationRule = '3_weeks_0_renew';
+            break;
         case 'MEDIA':
             result.durationRule = 'OWA_' + profileFirst;
             break;

commit 1c99d4858d451c41ed8b21b31d661c8cdb0d7f28
Author: Dan Scott <dan at coffeecode.net>
Date:   Sun May 29 22:18:04 2011 -0400

    Track Conifer JavaScript circulation rules
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/src/javascript/backend/circ/circ_duration.js b/Open-ILS/src/javascript/backend/circ/circ_duration.js
old mode 100644
new mode 100755
index 6f6a3d4..bfcd1f8
--- a/Open-ILS/src/javascript/backend/circ/circ_duration.js
+++ b/Open-ILS/src/javascript/backend/circ/circ_duration.js
@@ -4,10 +4,34 @@ load_lib('circ/circ_item_config.js');
 load_lib('JSON_v1.js');
 log_vars('circ_duration');
 
+/*
+var currentTime = new Date();
+var debugStamp = "circ" + (currentTime.getMonth() + 1) + "" +
+	"" + currentTime.getDate() + "" + currentTime.getFullYear() +
+	": ";
+*/
+
+
+//log_info(debugStamp + "copy location identified as " + copy.circ_lib.shortname);
+
+try {   
+	/* load circ rules for specific institutions based on the library that owns the copy */
+	var circ_duration_institution_file = 'circ/circ_duration_' + copy.circ_lib.shortname + '.js';
+	log_info('loading ' + circ_duration_institution_file);
+	load_lib(circ_duration_institution_file);
+
+	// log_error(circ_duration_institution_file);
+
+	/* if an institution specific script was loaded, then stop */
+	if (result.durationRule) return;
+} catch (e) {
+	// fall through to system-wide defaults
+	log_info("error loading " + e);
+}
 
 /* treat pre-cat copies like vanilla books */
 if( isTrue(isPrecat) ) {
-	log_info("pre-cat copy getting duration defaults...");
+	//log_info("pre-cat copy getting duration defaults...");
 	result.durationRule			= 'default';
 	result.recurringFinesRule	= 'default';
 	result.maxFine	   			= 'default'
@@ -26,24 +50,37 @@ var itemForm	= (marcXMLDoc) ? extractFixedField(marcXMLDoc,'Form') : "";
 	----------------------------------------------------------------------------- */
 if( config ) {
 
+	//log_info("config exists");
 	log_debug("circ_duration found a config for the copy");
 	result.durationRule			= config.durationRule;
 	result.recurringFinesRule	= config.recurringFinesRule;
 	result.maxFine			    = config.maxFine;
 
 } else {
+	//log_info("falling back to default");
 
 	result.durationRule = 'default';
 	result.recurringFinesRule = 'default';
 	result.maxFine = 'default';
 }
 
+if (patronProfile == 'Faculty') {
+	result.durationRule = '120_days_2_renew';
+}
+if (patronProfile == 'Graduate') {
+	result.durationRule = '120_days_2_renew';
+}
+if (patronProfile == 'Undergraduate') {
+	result.durationRule = '3_weeks_2_renew';
+}
+if (patronProfile == 'Staff members') {
+	result.durationRule = '3_weeks_2_renew';
+}
+if (patronProfile == 'Readers' || patronProfile == 'Alumni' || patronProfile == 'College Students' || patronProfile == 'High School Students') {
+	result.durationRule = '3_weeks_2_renew';
+}
 
 log_info('final duration results: ' + 
     result.durationRule + ' : ' + result.recurringFinesRule + ' : ' + result.maxFine );
 
 } go();
-
-
-
-
diff --git a/Open-ILS/src/javascript/backend/circ/circ_duration_CRC.js b/Open-ILS/src/javascript/backend/circ/circ_duration_CRC.js
new file mode 120000
index 0000000..e54bfe1
--- /dev/null
+++ b/Open-ILS/src/javascript/backend/circ/circ_duration_CRC.js
@@ -0,0 +1 @@
+circ_duration_OSUL.js
\ No newline at end of file
diff --git a/Open-ILS/src/javascript/backend/circ/circ_duration_HUNTINGTON.js b/Open-ILS/src/javascript/backend/circ/circ_duration_HUNTINGTON.js
new file mode 120000
index 0000000..e54bfe1
--- /dev/null
+++ b/Open-ILS/src/javascript/backend/circ/circ_duration_HUNTINGTON.js
@@ -0,0 +1 @@
+circ_duration_OSUL.js
\ No newline at end of file
diff --git a/Open-ILS/src/javascript/backend/circ/circ_duration_MRC.js b/Open-ILS/src/javascript/backend/circ/circ_duration_MRC.js
new file mode 120000
index 0000000..e54bfe1
--- /dev/null
+++ b/Open-ILS/src/javascript/backend/circ/circ_duration_MRC.js
@@ -0,0 +1 @@
+circ_duration_OSUL.js
\ No newline at end of file
diff --git a/Open-ILS/src/javascript/backend/circ/circ_duration_NOSME.js b/Open-ILS/src/javascript/backend/circ/circ_duration_NOSME.js
new file mode 100644
index 0000000..08b3272
--- /dev/null
+++ b/Open-ILS/src/javascript/backend/circ/circ_duration_NOSME.js
@@ -0,0 +1,16 @@
+/* grab the config from the config script */
+var config = getItemConfig();
+var itemForm    = (marcXMLDoc) ? extractFixedField(marcXMLDoc,'Form') : "";
+
+/* Set the defaults for books and equipment for most patron types */
+result.durationRule = '6_weeks_3_renew';
+result.recurringFinesRule = 'NOSM_daily';
+result.maxFine = 'NOSM_daily';
+
+if (copy.circ_modifier == 'RESERVE 4 HOUR') {
+        result.durationRule = '4_hours_3_renew';
+}
+
+if (copy.circ_modifier == 'RESERVE 1 DAY') {
+        result.durationRule = '1_day_3_renew';
+}
diff --git a/Open-ILS/src/javascript/backend/circ/circ_duration_NOSMW.js b/Open-ILS/src/javascript/backend/circ/circ_duration_NOSMW.js
new file mode 100644
index 0000000..08b3272
--- /dev/null
+++ b/Open-ILS/src/javascript/backend/circ/circ_duration_NOSMW.js
@@ -0,0 +1,16 @@
+/* grab the config from the config script */
+var config = getItemConfig();
+var itemForm    = (marcXMLDoc) ? extractFixedField(marcXMLDoc,'Form') : "";
+
+/* Set the defaults for books and equipment for most patron types */
+result.durationRule = '6_weeks_3_renew';
+result.recurringFinesRule = 'NOSM_daily';
+result.maxFine = 'NOSM_daily';
+
+if (copy.circ_modifier == 'RESERVE 4 HOUR') {
+        result.durationRule = '4_hours_3_renew';
+}
+
+if (copy.circ_modifier == 'RESERVE 1 DAY') {
+        result.durationRule = '1_day_3_renew';
+}
diff --git a/Open-ILS/src/javascript/backend/circ/circ_duration_OSM.js b/Open-ILS/src/javascript/backend/circ/circ_duration_OSM.js
new file mode 100644
index 0000000..08b3272
--- /dev/null
+++ b/Open-ILS/src/javascript/backend/circ/circ_duration_OSM.js
@@ -0,0 +1,16 @@
+/* grab the config from the config script */
+var config = getItemConfig();
+var itemForm    = (marcXMLDoc) ? extractFixedField(marcXMLDoc,'Form') : "";
+
+/* Set the defaults for books and equipment for most patron types */
+result.durationRule = '6_weeks_3_renew';
+result.recurringFinesRule = 'NOSM_daily';
+result.maxFine = 'NOSM_daily';
+
+if (copy.circ_modifier == 'RESERVE 4 HOUR') {
+        result.durationRule = '4_hours_3_renew';
+}
+
+if (copy.circ_modifier == 'RESERVE 1 DAY') {
+        result.durationRule = '1_day_3_renew';
+}
diff --git a/Open-ILS/src/javascript/backend/circ/circ_duration_OSTMA.js b/Open-ILS/src/javascript/backend/circ/circ_duration_OSTMA.js
new file mode 100644
index 0000000..7b9c26c
--- /dev/null
+++ b/Open-ILS/src/javascript/backend/circ/circ_duration_OSTMA.js
@@ -0,0 +1,64 @@
+/*
+var currentTime = new Date();
+var debugStamp = "circ_duraction_test" + (currentTime.getMonth() + 1) + "" +
+        "" + currentTime.getDate() + "" + currentTime.getFullYear() +
+        ": ";
+*/
+
+log_info("here for OSTMA");
+
+/* grab the config from the config script */
+var config = getItemConfig();
+var itemForm    = (marcXMLDoc) ? extractFixedField(marcXMLDoc,'Form') : "";
+
+
+/* Set the defaults for books for most patron types */
+result.durationRule = '3_weeks_2_renew';  			
+result.recurringFinesRule = '50_cent_per_day';
+result.maxFine = '10_dollars';
+
+
+/*Set the exceptions for regular books*/
+/* FACULTY */
+if (patronProfile == 'Faculty'){
+	result.durationRule = '120_days_0_renew';		
+}
+
+/*Set exceptions for other materials*/
+
+/* AV MATERIALS */
+if (copy.circ_modifier == 'AUDIO' ||
+    copy.circ_modifier == 'VIDEO' ||
+    copy.circ_modifer == 'DVD VIDEO' ||
+    copy.location.name == 'ALGO-AV' &&
+    patronProfile == 'Faculty'
+    
+   ){
+
+	result.durationRule = '14_days_0_renew';					
+	result.recurringFinesRule = '2_dollars_per_day';
+	result.maxFine = '25_dollars';	
+}
+
+/* RESERVES */
+/* Reserve items - let's use regular expressions to save some pain */
+res_day_re = /^RESERVE (\d+) DAY$/;
+res_hour_re = /^RESERVE (\d+) HOUR$/;
+res_day_match = res_day_re.exec(copy.circ_modifier);
+res_hour_match = res_hour_re.exec(copy.circ_modifier);
+if (res_day_match) {
+	result.durationRule = res_day_match[1] + '_days_0_renew';
+	result.recurringFinesRule = '2_dollars_per_day';
+	result.maxFine = '15_dollars';
+} else if (res_hour_match) {
+	result.durationRule = res_hour_match[1] + '_hours_0_renew';
+	result.recurringFinesRule = '50_cent_per_hour';
+	result.maxFine = '15_dollars';
+}
+
+
+
+
+
+
+
diff --git a/Open-ILS/src/javascript/backend/circ/circ_duration_OSUL.js b/Open-ILS/src/javascript/backend/circ/circ_duration_OSUL.js
new file mode 100644
index 0000000..4e8d281
--- /dev/null
+++ b/Open-ILS/src/javascript/backend/circ/circ_duration_OSUL.js
@@ -0,0 +1,63 @@
+/* grab the config from the config script */
+var config = getItemConfig();
+var itemForm    = (marcXMLDoc) ? extractFixedField(marcXMLDoc,'Form') : "";
+
+/* Set the defaults for books for most patron types */
+result.durationRule = '3_weeks_3_renew';
+result.recurringFinesRule = 'OSUL_daily';
+result.maxFine = 'OSUL_daily';
+
+if (patronProfile == 'Faculty' || 
+    patronProfile == 'Graduate') {
+	result.durationRule = '120_days_1_renew';
+}
+
+/* Distance education laptops */
+if (copy.circ_modifier == 'COMPUTER LONG') {
+        result.durationRule = 'OSUL_computer_long';
+        result.recurringFinesRule = 'OSUL_computer';
+        result.maxFine = 'overdue_equip_max';
+}
+
+/* Short term laptops */
+if (copy.circ_modifier == 'COMPUTER SHORT') {
+        result.durationRule = '4_hours_0_renew';
+        result.recurringFinesRule = 'OSUL_computer';
+        result.maxFine = 'overdue_equip_max';
+}
+
+/* Study room keys */
+if (copy.circ_modifier == 'KEYS') {
+        result.durationRule = '3_hours_1_renew';
+        result.recurringFinesRule = 'OSUL_hourly';
+	result.maxFine = 'OSUL_hourly';
+}
+
+/* Reserve items - let's use regular expressions to save some pain */
+res_day_re = /^RESERVE (\d+) DAY$/;
+res_hour_re = /^RESERVE (\d+) HOUR$/;
+res_day_match = res_day_re.exec(copy.circ_modifier);
+res_hour_match = res_hour_re.exec(copy.circ_modifier);
+if (res_day_match) {
+	result.durationRule = res_day_match[1] + '_days_0_renew';
+	result.recurringFinesRule = 'OSUL_reserves_daily';
+	result.maxFine = 'OSUL_reserves';
+} else if (res_hour_match) {
+	result.durationRule = res_hour_match[1] + '_hours_0_renew';
+	result.recurringFinesRule = 'OSUL_hourly';
+	result.maxFine = 'OSUL_reserves';
+}
+
+/* RACER books */
+if (copy.circ_modifier == 'PEB-LIVRE') {
+        result.durationRule = '14_days_0_renew';
+        result.recurringFinesRule = '1_dollar_per_day';
+	result.maxFine = 'INFINITY_AND_BEYOND';
+}
+
+/* VIDEO recordings */
+if (copy.circ_modifier == 'VIDEO') {
+        result.durationRule = '3_days_0_renew';
+        result.recurringFinesRule = '1_dollar_per_day';
+	result.maxFine = 'OSUL_reserves';
+}
diff --git a/Open-ILS/src/javascript/backend/circ/circ_duration_OWA.js b/Open-ILS/src/javascript/backend/circ/circ_duration_OWA.js
new file mode 100644
index 0000000..883e833
--- /dev/null
+++ b/Open-ILS/src/javascript/backend/circ/circ_duration_OWA.js
@@ -0,0 +1,99 @@
+// circ duration rules for Windsor Leddy (OWA)
+
+/* we use a date based identifier to pick up values in the log */
+/*
+var currentTime = new Date();
+var debugStamp = "circ" + (currentTime.getMonth() + 1) + "" +
+        "" + currentTime.getDate() + "" + currentTime.getFullYear() +
+        ": ";
+*/
+
+/* set item type defaults - if the either the patron group or the circ modifier
+   is missing or invalid, these settings will be used */
+
+// do these first two have any significance for us?
+result.SIPMediaType = '001';
+result.magneticMedia = 'f';
+
+/* if result.durationRule is not modified for a patron group, set default
+ * this value will be used for all circ overrides! */
+result.durationRule = 'non_circ';
+
+// for fines, set the most common value here
+result.recurringFinesRule = 'OWA_daily';
+result.maxFine = 'OWA_normal';
+
+/* adjust rules by patron group and circ modifier */
+
+log_info('patronProfile is ' + patronProfile + ' - modifier ' + copy.circ_modifier);
+
+if (isValidPatron(patronProfile)) {
+    var temp_array = patronProfile.split(" ");
+    var profileFirst = temp_array[0];
+    
+    switch(copy.circ_modifier) {
+        case 'CD MUSIC':
+            result.durationRule = 'OWA_audiovisual';
+            break;
+        case 'CIRC':
+            result.durationRule = 'OWA_' + profileFirst;
+            break;
+        case 'CIRC SHORT':
+            result.durationRule = 'OWA_short';
+            result.recurringFinesRule = 'OWA_daily_short';
+            result.maxFine = 'OWA_short';
+            break;
+        case 'CRC MEDIA':
+            result.durationRule = 'OWA_sevenday';
+            break;
+        case 'CRC SPEC':
+            result.durationRule = 'OWA_' + profileFirst;
+            break;
+        case 'CRC TEXT':
+            result.durationRule = 'OWA_' + profileFirst;
+            break;
+        case 'DOC':
+            result.durationRule = 'OWA_' + profileFirst;
+            break;
+        case 'DVD VIDEO':
+            result.durationRule = 'OWA_audiovisual';
+            break;
+        case 'MEDIA':
+            result.durationRule = 'OWA_' + profileFirst;
+            break;
+        case 'MFORM':
+            result.durationRule = 'OWA_' + profileFirst;
+            break;
+        case 'REF':
+            result.durationRule = 'OWA_sevenday';
+            break;
+        case 'RSV1':
+            result.durationRule = 'OWA_rsv_oneday';
+            result.recurringFinesRule = 'OWA_daily_rsv';
+            result.maxFine = 'OWA_rsv';
+            break;
+        case 'RSV2':
+            result.durationRule = 'OWA_rsv_twohour';
+            result.recurringFinesRule = 'OWA_hourly_rsv';
+            result.maxFine = 'OWA_rsv';
+            break;
+        case 'RSV3':
+            result.durationRule = 'OWA_rsv_threeday';
+            result.recurringFinesRule = 'OWA_daily_rsv';
+            result.maxFine = 'OWA_rsv';
+            break;
+        case 'RSV7':
+            result.durationRule = 'OWA_rsv_sevenday';
+            result.recurringFinesRule = 'OWA_daily_rsv';
+            result.maxFine = 'OWA_rsv';
+            break;
+        case 'SER':
+            result.durationRule = 'OWA_serials';
+            result.recurringFinesRule = 'OWA_daily_serials';
+            break;
+        case 'THESIS':
+            result.durationRule = 'OWA_' + profileFirst;
+            break;
+    }
+}
+log_info("circ0814 - results: " + result.durationRule);
diff --git a/Open-ILS/src/javascript/backend/circ/circ_duration_OWAL.js b/Open-ILS/src/javascript/backend/circ/circ_duration_OWAL.js
new file mode 100644
index 0000000..50a0d50
--- /dev/null
+++ b/Open-ILS/src/javascript/backend/circ/circ_duration_OWAL.js
@@ -0,0 +1,80 @@
+// circ duration rules for Windsor Law (OWAL)
+
+/* we use a date based identifier to pick up values in the log */
+/*
+var currentTime = new Date();
+var debugStamp = "circ" + (currentTime.getMonth() + 1) + "" +
+        "" + currentTime.getDate() + "" + currentTime.getFullYear() +
+        ": ";
+*/
+
+/* set item type defaults - if the either the patron group or the circ modifier
+ * is missing or invalid, these settings will be used */
+
+// do these first two have any significance for us?
+result.SIPMediaType = '001';
+result.magneticMedia = 'f';
+
+/* if result.durationRule is not modified for a patron group, set default
+ * this value will be used for all circ overrides! */
+result.durationRule = 'non_circ';
+
+// for fines, set the most common value here
+result.recurringFinesRule = 'OWAL_daily';
+result.maxFine = 'OWAL_normal';
+
+/* adjust rules by patron group and circ modifier */
+
+log_info('patronProfile is ' + patronProfile + ' - modifier ' + copy.circ_modifier);
+
+if (isValidPatron(patronProfile)) {
+    var temp_array = patronProfile.split(" ");
+    var profileFirst = temp_array[0];
+
+    if ((patronProfile == 'Readers' || patronProfile == 'Alumni' || patronProfile == 'College Students' || patronProfile == 'High School Students') && patron.home_ou.shortname != 'OWAL') {
+        // use override value - Non-Law Readers can borrow nothing
+    } else if ((patronProfile == 'Readers' || patronProfile == 'Alumni' || patronProfile == 'College Students' || patronProfile == 'High School Students') && copy.circ_modifier == 'LAW_MONO') {
+        result.durationRule = 'OWAL_' + profileFirst;  // Law Readers can only borrow LAW_MONO items
+    } else {
+        switch(copy.circ_modifier) {
+            case 'LAW MONO':
+                result.durationRule = 'OWAL_' + profileFirst;
+                break;
+            case 'LAW NOCIRC':
+                // use override value
+                break;
+            case 'LAW RES1D':
+                result.durationRule = 'OWAL_rsv_oneday';
+                result.recurringFinesRule = 'OWAL_hourly';
+                break;
+            case 'LAW RES3D':
+                result.durationRule = 'OWAL_rsv_threeday';
+                result.recurringFinesRule = 'OWAL_hourly';
+                break;
+            case 'LAW RES3H':
+                result.durationRule = 'OWAL_rsv_threehour';
+                result.recurringFinesRule = 'OWAL_hourly';
+                break;
+            case 'LAW RES5H':
+                result.durationRule = 'OWAL_rsv_fivehour';
+                result.recurringFinesRule = 'OWAL_hourly';
+                break;
+            case 'LAW SERIAL':
+                // Faculty exceptions handled below
+                break;
+        }
+    }
+    //exceptions for Faculty
+    if (patronProfile == "Faculty") {
+        if (copy.circ_modifier == 'LAW SERIAL') {
+            result.durationRule = 'OWAL_Faculty_serials';       // all Faculty can borrow serials
+        }
+        if (patron.home_ou.shortname == 'OWAL') {
+            result.recurringFinesRule = 'free';                // Law Faculty pay no fines
+            if (copy.circ_modifier.slice(0, 7) == 'LAW RES') { 
+                result.durationRule = 'OWAL_rsv_threeday';      // Law Faculty get all reserve items for three days
+            }
+        }
+    }
+}
+log_info("circ0814 - results: " + result.durationRule);
diff --git a/Open-ILS/src/javascript/backend/circ/circ_duration_SUDBURY.js b/Open-ILS/src/javascript/backend/circ/circ_duration_SUDBURY.js
new file mode 120000
index 0000000..e54bfe1
--- /dev/null
+++ b/Open-ILS/src/javascript/backend/circ/circ_duration_SUDBURY.js
@@ -0,0 +1 @@
+circ_duration_OSUL.js
\ No newline at end of file
diff --git a/Open-ILS/src/javascript/backend/circ/circ_groups.js b/Open-ILS/src/javascript/backend/circ/circ_groups.js
old mode 100644
new mode 100755
index 036d56e..93c78d4
--- a/Open-ILS/src/javascript/backend/circ/circ_groups.js
+++ b/Open-ILS/src/javascript/backend/circ/circ_groups.js
@@ -15,7 +15,56 @@ var GROUP_CONFIG = {
 	'Patron' : {
 		maxItemsOut         : 50,
 		fineThreshold       : 10,
-		overdueThreshold    : 10,
+		overdueThreshold    : 100,
 		maxHolds            : -1
 	},
+	'Faculty' : {
+		maxItemsOut         : 60,
+		fineThreshold       : 10,
+		overdueThreshold    : 100,
+		maxHolds            : -1
+	},
+	'Graduate' : {
+		maxItemsOut         : 60,
+		fineThreshold       : 10,
+		overdueThreshold    : 100,
+		maxHolds            : -1
+	},
+	'Undergraduate' : {
+		maxItemsOut         : 30,
+		fineThreshold       : 10,
+		overdueThreshold    : 100,
+		maxHolds            : -1
+	},
+	'Staff members' : {
+		maxItemsOut         : 30,
+		fineThreshold       : 10,
+		overdueThreshold    : 100,
+		maxHolds            : -1
+	},
+	'Readers' : {
+		maxItemsOut         : 15,
+		fineThreshold       : 10,
+		overdueThreshold    : 100,
+		maxHolds            : -1
+	},
+	'Alumni' : {
+		maxItemsOut         : 15,
+		fineThreshold       : 10,
+		overdueThreshold    : 100,
+		maxHolds            : -1
+	},
+	'College Students' : {
+		maxItemsOut         : 15,
+		fineThreshold       : 10,
+		overdueThreshold    : 100,
+		maxHolds            : -1
+	},
+	'High School Students' : {
+		maxItemsOut         : 15,
+		fineThreshold       : 10,
+		overdueThreshold    : 100,
+		maxHolds            : -1
+	},
+
 }
diff --git a/Open-ILS/src/javascript/backend/circ/circ_lib.js b/Open-ILS/src/javascript/backend/circ/circ_lib.js
index 64923ed..61b65d7 100644
--- a/Open-ILS/src/javascript/backend/circ/circ_lib.js
+++ b/Open-ILS/src/javascript/backend/circ/circ_lib.js
@@ -312,3 +312,15 @@ function debugGroupConfig(name, foundName, config) {
 }
 
 
+/* custom functions for Windsor libraries */
+
+function isValidPatron(patronProfile) {
+    var valid_patrons = ['Faculty', 'Graduate', 'Undergraduate', 'Staff members', 'Readers', 'Alumni', 'College Students', 'High School Students'];
+    for (var i = 0; i < valid_patrons.length; i++) {
+        if (valid_patrons[i] == patronProfile) {
+            return true;
+        }
+    }
+    return false;
+}
+
diff --git a/Open-ILS/src/javascript/backend/circ/circ_permit_copy.js b/Open-ILS/src/javascript/backend/circ/circ_permit_copy.js
index 053d9b7..8f93442 100644
--- a/Open-ILS/src/javascript/backend/circ/circ_permit_copy.js
+++ b/Open-ILS/src/javascript/backend/circ/circ_permit_copy.js
@@ -5,9 +5,143 @@ load_lib('circ/circ_lib.js');
 load_lib('JSON_v1.js');
 log_vars('circ_permit_copy');
 
+var lusys = ['LUSYS', 'CRC', 'HUNTINGTON', 'LDCR', 'MRC', 'OSUL', 'MEDIACEN', 'SUDBURY'];
+var hearstsys = ['HEARSTSYS', 'HEARST', 'KAP', 'TIMMINS'];
+var nosmsys = ['OSM', 'NOSME', 'NOSMW'];
+var winsys = ['OWA', 'OWAL'];
+var algsys = ['OSTMA']; /* looks silly but we do plan to add one or two branches during the winter term */
 
-if( ! isTrue(copy.circulate) || !isTrue(copy.location.circulate) ) 
+/* In theory, isOrgDescendent would work - but it isn't, for some reason */
+if (patron.home_ou.id != copy.circ_lib.id) {
+        /* Laurentian campus patrons can borrow from one another */
+        if (isOrgDescendent('LUSYS', patron.home_ou.id) && isOrgDescendent('LUSYS', copy.circ_lib.id)) {
+                // go in peace
+        } else if (isAMember(patron.home_ou.shortname, lusys) && (
+			isAMember(copy.circ_lib.shortname, lusys) || isAMember(copy.circ_lib.shortname, nosmsys) 
+		))
+	{
+                // No problemo
+        } else if (isOrgDescendent('HEARSTSYS', patron.home_ou.id) && isOrgDescendent('LUSYS', copy.circ_lib.id)) {
+                // go in peace
+        } else if (isAMember(patron.home_ou.shortname, hearstsys) && isAMember(copy.circ_lib.shortname, hearstsys)) {
+                // No problemo
+        } else if (isAMember(patron.home_ou.shortname, winsys) && isAMember(copy.circ_lib.shortname, winsys)) {
+                // No problemo
+        } else if (isOrgDescendent('OSM', patron.home_ou.id) && isOrgDescendent('OSM', copy.circ_lib.id)) {
+                // go in peace
+        } else if (isAMember(patron.home_ou.shortname, nosmsys) && (
+			isAMember(copy.circ_lib.shortname, lusys) || isAMember(copy.circ_lib.shortname, nosmsys) 
+		))
+	{
+                // No problemo
+        } else {
+                result.events.push('CIRC_EXCEEDS_COPY_RANGE');
+        }
+}
+
+if( ! isTrue(copy.circulate) || 
+	!isTrue(copy.location.circulate) ||
+	(copy.circ_lib.shortname == 'OSUL' && copy.circ_modifier == 'DEPOSIT') ||
+	(copy.circ_lib.shortname == 'OSUL' && copy.circ_modifier == 'DOCUMENTS') ||
+	(copy.circ_lib.shortname == 'OSUL' && copy.circ_modifier == 'PERIODICAL') ||
+	(copy.circ_lib.shortname == 'OSUL' && copy.circ_modifier == 'REFERENCE')
+) {
 	result.events.push('COPY_CIRC_NOT_ALLOWED');
+}
+
+// set permissions for Windsor Leddy
+if (copy.circ_lib.shortname == 'OWA') {
+
+	if (isValidPatron(patronProfile)) {
+  
+		// permit circulations for the following circ modifiers to all patrons
+		var circ_allow_list = ['CIRC', 'CRC MEDIA', 'CRC SPEC', 'CRC TEXT', 'DOC', 'DVD VIDEO', 'MEDIA', 'MFORM', 'REF', 'THESIS'];
+
+		// add permissions for patron groups who are not external borrowers
+		if (patronProfile == 'Faculty' || patronProfile == 'Graduate' || patronProfile == 'Undergraduate' || patronProfile == 'Staff members') {
+			circ_allow_list = circ_allow_list.concat('CIRC SHORT', 'RSV1', 'RSV2', 'RSV3', 'RSV7');
+		}
+
+		// faculty, grads, and staff can borrow serials
+		if (patronProfile == 'Faculty' || patronProfile == 'Graduate'|| patronProfile == 'Staff members') {
+			circ_allow_list = circ_allow_list.concat('SER');
+		}
+
+		// faculty and staff can also borrow music CDs
+		if (patronProfile == 'Faculty' || patronProfile == 'Staff members') {
+			circ_allow_list = circ_allow_list.concat('CD MUSIC');
+		}
+
+		if ( ! testCircAllow(circ_allow_list) ) {
+			result.events.push('COPY_CIRC_NOT_ALLOWED');
+		}
+
+	} else {
+		result.events.push('COPY_CIRC_NOT_ALLOWED'); // would prefer this to push a "Check Patron Profile" message
+	}
+} // end permissions for Windsor Leddy
+
+// set permissions for Windsor Law
+if (copy.circ_lib.shortname == 'OWAL') {
+
+	if (isValidPatron(patronProfile)) {
+
+		// only Law external borrowers can borrow Law items
+		if ((patronProfile == 'Readers' || patronProfile == 'Alumni' || patronProfile == 'College Students' || patronProfile == 'High School Students') && patron.home_ou.shortname != 'OWAL') {
+			result.events.push('COPY_CIRC_NOT_ALLOWED');
+		}
+
+		// permit circulations for the following circ modifiers to all patrons not excluded above
+		var circ_allow_list = ['LAW MONO'];
+
+		// add permissions for patron groups who are not external borrowers
+		if (patronProfile == 'Faculty' || patronProfile == 'Graduate' || patronProfile == 'Undergraduate' || patronProfile == 'Staff members') {
+			circ_allow_list = circ_allow_list.concat('LAW RES1D', 'LAW RES3D', 'LAW RES3H', 'LAW RES5H');
+		}
+
+		// faculty can borrow non-circulating items and serials
+		if (patronProfile == 'Faculty') {
+			circ_allow_list = circ_allow_list.concat('LAW NOCIRC', 'LAW SERIAL');
+		}
+
+		if ( ! testCircAllow(circ_allow_list) ) {
+			result.events.push('COPY_CIRC_NOT_ALLOWED');
+		}
+
+	} else {
+		result.events.push('COPY_CIRC_NOT_ALLOWED'); // would prefer this to push a "Check Patron Profile" message
+	}
+} // end permissions for Windsor Law
+
+/*******************************
+   PERMIT FOR ALGOMA
+********************************/
+
+if (copy.circ_lib.shortname == 'OSTMA') {
+
+	if (isValidPatron(patronProfile)) {
+
+		if (copy.location.name == 'ALGO-REF' ||
+		    copy.location.name == 'ALGO-PER' ||
+		    copy.location.name == 'ALGO-SHWK' ||	
+                    copy.location.name == 'ALGO-DOC' 
+		   )
+		{
+			result.events.push('COPY_CIRC_NOT_ALLOWED');
+		}
+        } 
+
+
+	if (patronProfile != 'Faculty' && copy.location.name == 'ALGO-AV') {
+		result.events.push('COPY_CIRC_NOT_ALLOWED');		
+	}
+
+}
+
+
+/*******************************
+   END -- PERMIT FOR ALGOMA
+********************************/
 
 
 if( ! isTrue(isRenewal) ) {
@@ -17,8 +151,25 @@ if( ! isTrue(isRenewal) ) {
 	} 
 }
 
+}
+
+function isAMember(shortname, group) {
+	for (var i = 0; i < group.length; i++) {
+		if (group[i] == shortname) {
+			return true;
+		}
+	}
+	return false;
+}
 
-	
-} go();
+function testCircAllow(circ_allow_list) {
+	for (var i = 0; i < circ_allow_list.length; i++) {
+		if (circ_allow_list[i] == copy.circ_modifier) {
+			return true;
+		}
+	}
+	return false;
+}
 
+go();
 
diff --git a/Open-ILS/src/javascript/backend/circ/circ_permit_patron.js b/Open-ILS/src/javascript/backend/circ/circ_permit_patron.js
old mode 100644
new mode 100755
index 9549688..1afc66e
--- a/Open-ILS/src/javascript/backend/circ/circ_permit_patron.js
+++ b/Open-ILS/src/javascript/backend/circ/circ_permit_patron.js
@@ -20,6 +20,25 @@ if( config ) {
             result.events.push('PATRON_EXCEEDS_CHECKOUT_COUNT');
         }
     }
+
+    limit = config.fineThreshold;
+    /* but Laurentian suspends loan privileges immediately */
+    if (copy.circ_lib == 103) {
+	limit = 0.01;
+    }
+    if (patronFines >= limit) {
+        result.events.push('PATRON_EXCEEDS_FINES');
+    }
+
+    limit = config.overdueThreshold;
+    /* but Laurentian suspends loan privileges immediately */
+    if (copy.circ_lib == 103) {
+	limit = 1;
+    }
+    if (patronOverdueCount >= limit) {
+        result.events.push('PATRON_EXCEEDS_OVERDUE_COUNT');
+    }
+
     
 } else {
 

commit 4e01dfb62a9b8f590123877ac47a1a1f654c4491
Author: Dan Scott <dscott at laurentian.ca>
Date:   Thu Jan 10 14:17:33 2013 -0500

    Generic patron barcode generation (OpenSRF and DB)
    
    Laurentian University needed the ability to generate barcodes as part of
    its LDAP integration work, and the first generation (so to speak) of the
    was specific to LU - including hard-coded prefixes and database
    functions that include the "lu" name.
    
    This commit makes the functionality much more generic and thus more
    likely to be able to be adopted by other institutions. The principle
    components are:
    
    Database functions:
    
    evergreen.actor_generate_barcode([prefix TEXT]) - returns a 14-digit
      barcode from the evergreen.actor_barcode_seq sequence with a prefix of
      'AUTOBC' or the specific prefix of up to 6 characters. If the
      resulting barcode is all digits, then the 14th character will be a
      mod10 check digit; otherwise the 14th digit will be '0'.
    
    evergreen.actor_update_barcode(usr_id INTEGER[, prefix TEXT]) -
      generates a new barcode for the specified user, with the optional
      barcode prefix.
    
    evergreen.mod10(barcode TEXT) - given a barcode, generates a mod10
      check digit and returns the barcode with the appended check digit
    
    OpenSRF method:
    
    open-ils.actor.generate_patron_barcode([usr_id INT[, prefix TEXT]]) -
      generates a new barcode for the patron
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm
index 6ab7a14..a5353f4 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm
@@ -4628,6 +4628,57 @@ sub mark_users_contact_invalid {
     );
 }
 
+__PACKAGE__->register_method(
+    method   => "generate_patron_barcode",
+    api_name => "open-ils.actor.generate_patron_barcode",
+    signature => {
+        desc => "Generates a new patron barcode. If a user ID is supplied," .
+                "that user's card will be updated to point at the new barcode." ,
+        params => [
+            {desc => 'Authentication token', type => 'string'},
+            {desc => 'User ID', type => 'number'},
+            {desc => 'prefix', type => 'string'},
+        ],
+        return => {desc => 'Generated barcode on success'}
+    }
+);
+
+# evergreen.actor_update_barcode(user_id[, prefix]) generates a barcode, creates
+# an actor.card object, and points actor.usr.card to the new actor.card.id;
+# prefix is an optional prefix for the barcode
+#
+# evergreen.actor_generate_barcode([prefix]) just generates a barcode, with
+# prefix as an optional prefix for the barcode
+sub generate_patron_barcode {
+
+    my( $self, $client, $auth, $user_id, $prefix ) = @_;
+
+    my $e = new_editor( authtoken=>$auth );
+    return $e->die_event unless $e->checkauth;
+
+    my $barcode;
+    if ($user_id) {
+        return $e->die_event unless $e->allowed('UPDATE_USER');
+        my $args = ['evergreen.actor_update_barcode', $user_id];
+        if ($prefix) {
+            push @$args, $prefix;
+        }
+        $barcode = $e->json_query(
+            {from => $args})->[0] 
+            or return $e->die_event;
+    } else {
+        my $args = ['evergreen.actor_generate_barcode'];
+        if ($prefix) {
+            push @$args, $prefix;
+        }
+        $barcode = $e->json_query(
+            {from => $args})->[0] 
+            or return $e->die_event;
+    }
+
+    return $barcode;
+}
+
 # Putting the following method in open-ils.actor is a bad fit, except in that
 # it serves an interface that lives under 'actor' in the templates directory,
 # and in that there's nowhere else obvious to put it (open-ils.trigger is
diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.generate_patron_barcodes.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.generate_patron_barcodes.sql
new file mode 100644
index 0000000..14544e7
--- /dev/null
+++ b/Open-ILS/src/sql/Pg/upgrade/XXXX.generate_patron_barcodes.sql
@@ -0,0 +1,87 @@
+-- Provides support for generating patron barcodes, with optional prefixes
+-- If all digits, then a mod10 check digit is calculated and appended
+CREATE SEQUENCE evergreen.actor_barcode_seq;
+
+CREATE OR REPLACE FUNCTION evergreen.mod10(barcode TEXT)
+RETURNS TEXT AS $$
+use strict; 
+use warnings; 
+ 
+my $barcode = shift; 
+my $total = 0; 
+my $position = 0; 
+foreach my $digit (split('', $barcode)) { 
+    $digit = sprintf('%d', $digit); 
+    $position++; 
+    if ($position % 2) { 
+        # Double it 
+        $digit *= 2; 
+        # If less than 10, add to the total 
+        if ($digit < 10) { 
+            $total += $digit; 
+        } else { 
+            $total += $digit - 9; 
+        } 
+    } else { 
+        $total += $digit; 
+    } 
+} 
+my $rem = $total % 10; 
+if ($rem) { 
+    return 10 - $rem; 
+} 
+return $rem;  
+$$ LANGUAGE plperlu;
+
+CREATE OR REPLACE FUNCTION evergreen.actor_generate_barcode(prefix TEXT DEFAULT 'AUTOBC')
+RETURNS TEXT AS $$
+DECLARE 
+    bc_gen TEXT; 
+    mod TEXT; 
+    bc_serial RECORD; 
+    bc_holder TEXT; 
+BEGIN 
+    LOOP 
+        SELECT lpad(NEXTVAL('evergreen.actor_barcode_seq')::text, 7, '0') AS bc INTO bc_serial; 
+        bc_gen := rpad(COALESCE(prefix, '0'), 6, '0') || bc_serial.bc::text; 
+        IF unnest(regexp_matches(bc_gen, '\D')) IS NOT NULL THEN
+            bc_gen := rpad(bc_gen, 14, '0');
+        ELSE
+            bc_gen := bc_gen || evergreen.mod10(bc_gen); 
+        END IF;
+ 
+        SELECT barcode INTO bc_holder FROM actor.card WHERE barcode = bc_gen; 
+        EXIT WHEN bc_holder IS NULL; 
+    END LOOP; 
+ 
+    RETURN bc_gen; 
+END;  
+$$ LANGUAGE plpgsql;
+
+CREATE OR REPLACE FUNCTION evergreen.actor_update_barcode(usr_id INT, prefix TEXT DEFAULT NULL)
+RETURNS TEXT AS $$
+DECLARE
+    bc_gen TEXT;
+    bc_holder TEXT;
+BEGIN
+
+    LOOP
+        IF prefix IS NULL THEN
+            bc_gen := evergreen.actor_generate_barcode();
+        ELSE
+            bc_gen := evergreen.actor_generate_barcode(prefix);
+        END IF;
+
+        SELECT barcode INTO bc_holder FROM actor.card WHERE barcode = bc_gen;
+        EXIT WHEN bc_holder IS NULL;
+    END LOOP;
+
+    INSERT INTO actor.card (usr, barcode) VALUES (usr_id, bc_gen);
+
+    UPDATE actor.usr
+        SET card = CURRVAL('actor.card_id_seq')
+        WHERE id = usr_id;
+
+    RETURN bc_gen;
+END;
+$$ LANGUAGE plpgsql;

commit 4455cf6dc29599ed0934ff1cf223ff09c6fed68c
Author: Dan Scott <dscott at laurentian.ca>
Date:   Wed Sep 14 16:02:14 2011 -0400

    Add and use a patron search that overrides opt-in invisibility
    
    Something like this is required for API calls that need to operate
    against a number of libraries in a given instance that are using opt-in;
    otherwise, attempts to search for users will fail and you may end up
    creating near-duplicates etc.
    
    The implementation adds an
    open-ils.actor.search.patron.advanced.opt_in_override method to
    open-ils.actor, which, if invoked, checks to see if the caller has the
    OPT_IN_OVERRIDE permission. If so, then the crazy_search ignores the
    normal opt-in limits and searches all pertinent users in the database.
    
    As a global permission, OPT_IN_OVERRIDE is a blunt instrument. Others
    might want to put together a more refined version that uses OU depths to
    define boundaries.
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>
    
    Conflicts:
    	Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm
    	Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/actor.pm

diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm
index d818454..6ab7a14 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm
@@ -1317,21 +1317,33 @@ __PACKAGE__->register_method(
     method   => "patron_adv_search",
     api_name => "open-ils.actor.patron.search.advanced"
 );
+__PACKAGE__->register_method(
+    method   => "patron_adv_search",
+    api_name => "open-ils.actor.patron.search.advanced.opt_in_override"
+);
 sub patron_adv_search {
 	my( $self, $client, $auth, $search_hash, 
         $search_limit, $search_sort, $include_inactive, $search_ou ) = @_;
 
+    my $ignore_opt_in = 0;
 	my $e = new_editor(authtoken=>$auth);
 	return $e->event unless $e->checkauth;
 	return $e->event unless $e->allowed('VIEW_USER');
 
+    # Override opt-in permissions
+    if ($self->api_name =~ /opt_in_override/) {
+        if ($e->allowed('OPT_IN_OVERRIDE')) {
+            $ignore_opt_in = 1;
+        }
+    }
+
 	# depth boundary outside of which patrons must opt-in, default to 0
 	my $opt_boundary = 0;
 	$opt_boundary = $U->ou_ancestor_setting_value($e->requestor->ws_ou,'org.patron_opt_boundary') if user_opt_in_enabled($self);
 
 	return $U->storagereq(
 		"open-ils.storage.actor.user.crazy_search", $search_hash, 
-            $search_limit, $search_sort, $include_inactive, $e->requestor->ws_ou, $search_ou, $opt_boundary);
+            $search_limit, $search_sort, $include_inactive, $e->requestor->ws_ou, $search_ou, $opt_boundary, $ignore_opt_in);
 }
 
 
diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/actor.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/actor.pm
index b0c9af2..ce28344 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/actor.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/actor.pm
@@ -642,6 +642,7 @@ sub patron_search {
 	my $ws_ou = shift;
 	my $search_org = shift || $ws_ou;
 	my $opt_boundary = shift || 0;
+	my $opt_in_override = shift;
 
     my $penalty_sort = 0;
 
@@ -762,7 +763,7 @@ sub patron_search {
 	my $descendants = "actor.org_unit_descendants($search_org)";
 
 	my $opt_in_where = '';
-	if (lc($strict_opt_in) eq 'true') {
+	if (lc($strict_opt_in) eq 'true' && (!$opt_in_override)) {
 		$opt_in_where = "AND (";
 		$opt_in_where .= "EXISTS (select id FROM $opt_in_table ";
 		$opt_in_where .= " WHERE org_unit in (select (actor.org_unit_ancestors($ws_ou)).id)";

commit 5848a767cdd69922f2495ebf0fa0367e8ff7f0db
Author: Dan Scott <dscott at laurentian.ca>
Date:   Tue Oct 9 12:21:10 2012 -0400

    Remove extraneous spaces from bib email template
    
    Various email servers refuse to send email that begins with blank lines,
    so use TT's [%- and -%] to eat up whitespace. Also, remove the extra
    linefeeds (_ "\n") as the linefeed is already generated by virtue of
    being on its own line.
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/src/sql/Pg/950.data.seed-values.sql b/Open-ILS/src/sql/Pg/950.data.seed-values.sql
index 6e482ad..05d5aae 100644
--- a/Open-ILS/src/sql/Pg/950.data.seed-values.sql
+++ b/Open-ILS/src/sql/Pg/950.data.seed-values.sql
@@ -8791,15 +8791,15 @@ INSERT INTO action_trigger.event_definition (
         NULL,
         '00:00:00',
 $$
-[%  SET user = target.0.owner; 
+[%-  SET user = target.0.owner; 
     SET print_limit = 500; #this is to limit the no. of copies, set to 0 for unlimited
-    SET tpac_host = ''; # tpac_host can be specfied directly %]
+    SET tpac_host = 'http://www.concat.ca'; # tpac_host can be specfied directly -%]
 To: [%- params.recipient_email || user.email %]
 From: [%- params.sender_email || default_sender %]
 Subject: Bibliographic Records
 
 [% FOR cbreb IN target %]
-[% FOR item IN cbreb.items;
+[%- FOR item IN cbreb.items;
     bre_id = item.target_biblio_record_entry;
 
     bibxml = helpers.unapi_bre(bre_id, {flesh => '{mra}'});
@@ -8871,42 +8871,41 @@ Subject: Bibliographic Records
         END;
     END;
 
-%]
+-%]
 
 [% loop.count %]/[% loop.size %]. Bib ID# [% bre_id %]
-[% IF tpac_host.length != 0 %]URL: [% tpac_host %]/eg/opac/record/[% bre_id _ "\n" %][% END %]
-[% IF isbn %]ISBN: [% isbn _ "\n" %][% END %]
-[% IF issn %]ISSN: [% issn _ "\n" %][% END %]
-[% IF upc  %]UPC:  [% upc _ "\n" %] [% END %]
+[%- IF tpac_host.length != 0 %]URL: [% tpac_host %]/eg/opac/record/[% bre_id _ "\n" %][% END %]
+[%- IF isbn %]ISBN: [% isbn %][% END %]
+[%- IF issn %]ISSN: [% issn %][% END %]
+[%- IF upc  %]UPC:  [% upc %] [% END %]
 Title: [% title %]
 Author: [% author %]
 Publication Info: [% publisher %] [% pubdate %]
 Item Type: [% item_type %]
 
-[% IF holdings.size > 0 %]
-   [% IF holdings.size > print_limit AND print_limit > 0 %]
+[%- IF holdings.size > 0 %]
+   [%- IF holdings.size > print_limit AND print_limit > 0 %]
       Showing [% print_limit %] of [% holdings.size %], use URL for full list of copies...
-   [% END %]
-   [% FOR holding IN holdings %]
-      Location: [% holding.library %] - [% holding.location _ "\n" %]
-      Call Number: [% holding.label _ "\n" %][% IF holding.part_label %][% holding.part_label _ "\n" %][% END %]
-      Status: [% holding.status _ "\n" %]
-   [% END %]
-[% END %]
-[% IF uris.size > 0 %]
-   [% FOR uri IN uris %]
-      URL: [% uri.href _ "\n" %]
-   [% END %]
-   [% IF uri.link.length > 0 %]
-         Label: [% uri.link _ "\n" %]
-   [% END %]
-   [% IF uri.note.length > 0 %]
-         Note: [% uri.note _ "\n" %]
+   [%- END %]
+   [%- FOR holding IN holdings %]
+      Location: [% holding.library %] - [% holding.location %]
+      Call Number: [% holding.label %][% IF holding.part_label %][% holding.part_label %][% END %]
+      Status: [% holding.status %]
    [% END %]
 [% END %]
-
-[% END %]
-[% END %]
+[%- IF uris.size > 0 %]
+   [%- FOR uri IN uris %]
+      URL: [% uri.href %]
+   [%- END %]
+   [%- IF uri.link.length > 0 %]
+         Label: [% uri.link %]
+   [%- END %]
+   [%- IF uri.note.length > 0 %]
+         Note: [% uri.note %]
+   [%- END %]
+[%- END %]
+[%- END %]
+[%- END %]
 $$
     )
     ,(

commit 239d3ba51c4a6733ddff1b8dc3c18347595289e7
Author: Art Rhyno <art632000 at yahoo.ca>
Date:   Sun Sep 30 22:58:52 2012 -0400

    Add line return to URL entry
    
    I missed this in the URL rendering but lines need a line return
    for the e-mail option.

diff --git a/Open-ILS/src/sql/Pg/950.data.seed-values.sql b/Open-ILS/src/sql/Pg/950.data.seed-values.sql
index a53f7de..6e482ad 100644
--- a/Open-ILS/src/sql/Pg/950.data.seed-values.sql
+++ b/Open-ILS/src/sql/Pg/950.data.seed-values.sql
@@ -8874,7 +8874,7 @@ Subject: Bibliographic Records
 %]
 
 [% loop.count %]/[% loop.size %]. Bib ID# [% bre_id %]
-[% IF tpac_host.length != 0 %]URL: [% tpac_host %]/eg/opac/record/[% bre_id %][% END %]
+[% IF tpac_host.length != 0 %]URL: [% tpac_host %]/eg/opac/record/[% bre_id _ "\n" %][% END %]
 [% IF isbn %]ISBN: [% isbn _ "\n" %][% END %]
 [% IF issn %]ISSN: [% issn _ "\n" %][% END %]
 [% IF upc  %]UPC:  [% upc _ "\n" %] [% END %]

commit 309e8bc3f9e27ca068169ac192b8c75431a320e9
Author: Art Rhyno <art632000 at yahoo.ca>
Date:   Sun Sep 30 22:50:09 2012 -0400

    Add option for host value in URLs
    
    The ability to link back to a bib record for print and e-mail displays
    from tpac is very useful, esp. for e-mail where there is a good chance
    that the mail system will make it an active link. It looks possible to
    wire in environmental variables with the template toolkit but that's
    probably as complicated as it is to modify the template directly.

diff --git a/Open-ILS/src/sql/Pg/950.data.seed-values.sql b/Open-ILS/src/sql/Pg/950.data.seed-values.sql
index e4266a3..a53f7de 100644
--- a/Open-ILS/src/sql/Pg/950.data.seed-values.sql
+++ b/Open-ILS/src/sql/Pg/950.data.seed-values.sql
@@ -8791,8 +8791,9 @@ INSERT INTO action_trigger.event_definition (
         NULL,
         '00:00:00',
 $$
-[%- SET user = target.0.owner; 
-    SET print_limit = 500; #this is to limit the no. of copies, set to 0 for unlimited %]
+[%  SET user = target.0.owner; 
+    SET print_limit = 500; #this is to limit the no. of copies, set to 0 for unlimited
+    SET tpac_host = ''; # tpac_host can be specfied directly %]
 To: [%- params.recipient_email || user.email %]
 From: [%- params.sender_email || default_sender %]
 Subject: Bibliographic Records
@@ -8872,11 +8873,11 @@ Subject: Bibliographic Records
 
 %]
 
-[% loop.count %]/[% loop.size %].  Bib ID# [% bre_id %]
-URL: [% params.hostname %]/eg/opac/record/[% bre_id %]
-[% IF isbn %]ISBN: [% isbn _ "\n" %][% END -%]
-[% IF issn %]ISSN: [% issn _ "\n" %][% END -%]
-[% IF upc  %]UPC:  [% upc _ "\n" %] [% END -%]
+[% loop.count %]/[% loop.size %]. Bib ID# [% bre_id %]
+[% IF tpac_host.length != 0 %]URL: [% tpac_host %]/eg/opac/record/[% bre_id %][% END %]
+[% IF isbn %]ISBN: [% isbn _ "\n" %][% END %]
+[% IF issn %]ISSN: [% issn _ "\n" %][% END %]
+[% IF upc  %]UPC:  [% upc _ "\n" %] [% END %]
 Title: [% title %]
 Author: [% author %]
 Publication Info: [% publisher %] [% pubdate %]
@@ -8888,7 +8889,7 @@ Item Type: [% item_type %]
    [% END %]
    [% FOR holding IN holdings %]
       Location: [% holding.library %] - [% holding.location _ "\n" %]
-      Call Number: [% holding.label _ "\n" %][% IF holding.part_label %][% holding.part_label _ "\n" %][% END -%]
+      Call Number: [% holding.label _ "\n" %][% IF holding.part_label %][% holding.part_label _ "\n" %][% END %]
       Status: [% holding.status _ "\n" %]
    [% END %]
 [% END %]
@@ -8896,6 +8897,12 @@ Item Type: [% item_type %]
    [% FOR uri IN uris %]
       URL: [% uri.href _ "\n" %]
    [% END %]
+   [% IF uri.link.length > 0 %]
+         Label: [% uri.link _ "\n" %]
+   [% END %]
+   [% IF uri.note.length > 0 %]
+         Note: [% uri.note _ "\n" %]
+   [% END %]
 [% END %]
 
 [% END %]
@@ -8919,7 +8926,10 @@ $$
 <div>
     <style> li { padding: 8px; margin 5px; }</style>
     <ol>
-    [% SET print_limit = 500; #this is to limit the no. of copies, set to 0 for unlimited %]
+
+    [% SET tpac_host = ''; # tpac_host can be specfied directly
+       SET print_limit = 500; #this is to limit the no. of copies, set to 0 for unlimited %]
+
     [% FOR cbreb IN target %]
     [% FOR item IN cbreb.items;
         bre_id = item.target_biblio_record_entry;
@@ -8993,6 +9003,9 @@ $$
 
         <li>
             Bib ID# [% bre_id %] [% IF isbn %]ISBN: [% isbn | html %]<br/>[% END -%] [% IF issn %]ISSN: [% issn | html %]<br/>[% END -%] <br />
+            [% IF tpac_host.length != 0 %]
+               URL: [% tpac_host %]/eg/opac/record/[% bre_id %]<br/>
+            [% END %]
             Title: [% title %]<br />
             Author: [% author %]<br />
             Publication Info: [% publisher %] [% pubdate %]<br/>
@@ -9019,7 +9032,7 @@ $$
                [% FOR uri IN uris %]
                   <li>URL: [% uri.href | html %]<br/>
                   [% IF uri.link.length > 0 %]
-                     Label: [% uri.href | html %]<br />
+                     Label: [% uri.link | html %]<br />
                   [% END %]
                   [% IF uri.note.length > 0 %]
                      Note: [% uri.note | html %]<br />

commit 075d3400a1923986d08519819e4db87b8c807436
Author: Art Rhyno <art632000 at yahoo.ca>
Date:   Wed Sep 26 22:34:48 2012 -0400

    Add call number and location info to TPAC e-mail and print option
    
    I haven't figured out how to get the hostname properly, I am guessing
    it needs to be passed as a parameter somehow. I also need to test
    URIs but this is a start.

diff --git a/Open-ILS/src/sql/Pg/950.data.seed-values.sql b/Open-ILS/src/sql/Pg/950.data.seed-values.sql
index a8ddf6a..e4266a3 100644
--- a/Open-ILS/src/sql/Pg/950.data.seed-values.sql
+++ b/Open-ILS/src/sql/Pg/950.data.seed-values.sql
@@ -8791,7 +8791,8 @@ INSERT INTO action_trigger.event_definition (
         NULL,
         '00:00:00',
 $$
-[%- SET user = target.0.owner -%]
+[%- SET user = target.0.owner; 
+    SET print_limit = 500; #this is to limit the no. of copies, set to 0 for unlimited %]
 To: [%- params.recipient_email || user.email %]
 From: [%- params.sender_email || default_sender %]
 Subject: Bibliographic Records
@@ -8801,6 +8802,8 @@ Subject: Bibliographic Records
     bre_id = item.target_biblio_record_entry;
 
     bibxml = helpers.unapi_bre(bre_id, {flesh => '{mra}'});
+    holdingsxml = helpers.unapi_bre(bre_id, {flesh => '{holdings_xml,acp}'});
+
     FOR part IN bibxml.findnodes('//*[@tag="245"]/*[@code="a" or @code="b"]');
         title = title _ part.textContent;
     END;
@@ -8812,9 +8815,65 @@ Subject: Bibliographic Records
     isbn = bibxml.findnodes('//*[@tag="020"]/*[@code="a"]').textContent;
     issn = bibxml.findnodes('//*[@tag="022"]/*[@code="a"]').textContent;
     upc = bibxml.findnodes('//*[@tag="024"]/*[@code="a"]').textContent;
+
+    uris = [];
+    holdings = [];
+    part_label='';
+    FOR volume IN holdingsxml.findnodes('//*[local-name()="volumes"]/*[local-name()="volume"]');
+        # Check volume visibility - could push this into XPath
+        vol.label = volume.getAttribute('label');
+
+        # Prepend prefix, if any
+        prefix = volume.findnodes('./*[local-name()="call_number_prefix"][@ident!="-1"]');
+        IF prefix.getAttribute('label') != '';
+           vol.label = prefix.getAttribute('label') _ " " _ vol.label;
+        END;
+
+        # Append prefix, if any
+        suffix = volume.findnodes('./*[local-name()="call_number_suffix"][@ident!="-1"]');
+        IF suffix.getAttribute('label') != '';
+           vol.label = vol.label _ " " _ suffix.getAttribute('label');
+        END;
+        IF vol.label == '##URI##';
+           FOR uri IN volume.findnodes('./*[local-name()="uris"]/*[local-name()="uri"]');
+               res = {};
+               res.href = uri.getAttribute('href');
+               res.link = uri.getAttribute('label');
+               res.note = uri.getAttribute('use_restriction');
+               uris.push(res);
+           END;
+           NEXT;
+        ELSE;
+           copies = volume.findnodes('./*[local-name()="copies"]/*[local-name()="copy"]');
+           FOR copy IN copies;
+               parts = copy.findnodes('./*[local-name()="monograph_parts"]/*[local-name()="monograph_part"]');
+               FOREACH part IN parts;
+                       part_label = part.getAttribute('label');
+                       LAST IF part_label != '';
+               END;
+
+               NEXT IF (copy.getAttribute('deleted') == 'true' OR copy.getAttribute('opac_visible') == 'false');
+               loc = copy.findnodes('./*[local-name()="location"]');
+               circlib = copy.findnodes('./*[local-name()="circlib"]');
+               status = copy.findnodes('./*[local-name()="status"]');
+               holding = {
+                    label => vol.label,
+                    part_label => part_label,
+                    library => circlib.textContent,
+                    location => loc.textContent,
+                    status => status.textContent
+                    barcode => copy.getAttribute('barcode')
+               };
+               holdings.push(holding);
+               part_label = '';
+           END;
+        END;
+    END;
+
 %]
 
-[% loop.count %]/[% loop.size %].  Bib ID# [% bre_id %] 
+[% loop.count %]/[% loop.size %].  Bib ID# [% bre_id %]
+URL: [% params.hostname %]/eg/opac/record/[% bre_id %]
 [% IF isbn %]ISBN: [% isbn _ "\n" %][% END -%]
 [% IF issn %]ISSN: [% issn _ "\n" %][% END -%]
 [% IF upc  %]UPC:  [% upc _ "\n" %] [% END -%]
@@ -8823,6 +8882,22 @@ Author: [% author %]
 Publication Info: [% publisher %] [% pubdate %]
 Item Type: [% item_type %]
 
+[% IF holdings.size > 0 %]
+   [% IF holdings.size > print_limit AND print_limit > 0 %]
+      Showing [% print_limit %] of [% holdings.size %], use URL for full list of copies...
+   [% END %]
+   [% FOR holding IN holdings %]
+      Location: [% holding.library %] - [% holding.location _ "\n" %]
+      Call Number: [% holding.label _ "\n" %][% IF holding.part_label %][% holding.part_label _ "\n" %][% END -%]
+      Status: [% holding.status _ "\n" %]
+   [% END %]
+[% END %]
+[% IF uris.size > 0 %]
+   [% FOR uri IN uris %]
+      URL: [% uri.href _ "\n" %]
+   [% END %]
+[% END %]
+
 [% END %]
 [% END %]
 $$
@@ -8844,11 +8919,13 @@ $$
 <div>
     <style> li { padding: 8px; margin 5px; }</style>
     <ol>
+    [% SET print_limit = 500; #this is to limit the no. of copies, set to 0 for unlimited %]
     [% FOR cbreb IN target %]
     [% FOR item IN cbreb.items;
         bre_id = item.target_biblio_record_entry;
 
         bibxml = helpers.unapi_bre(bre_id, {flesh => '{mra}'});
+        holdingsxml = helpers.unapi_bre(bre_id, {flesh => '{holdings_xml,acp}'});
         FOR part IN bibxml.findnodes('//*[@tag="245"]/*[@code="a" or @code="b"]');
             title = title _ part.textContent;
         END;
@@ -8858,14 +8935,99 @@ $$
         publisher = bibxml.findnodes('//*[@tag="260"]/*[@code="b"]').textContent;
         pubdate = bibxml.findnodes('//*[@tag="260"]/*[@code="c"]').textContent;
         isbn = bibxml.findnodes('//*[@tag="020"]/*[@code="a"]').textContent;
+        issn = bibxml.findnodes('//*[@tag="022"]/*[@code="a"]').textContent;
+
+        uris = [];
+        holdings = [];
+        part_label='';
+        FOR volume IN holdingsxml.findnodes('//*[local-name()="volumes"]/*[local-name()="volume"]');
+            vol.label = volume.getAttribute('label');
+
+            prefix = volume.findnodes('./*[local-name()="call_number_prefix"][@ident!="-1"]');
+            IF prefix.getAttribute('label') != '';
+                vol.label = prefix.getAttribute('label') _ " " _ vol.label;
+            END;
+
+            # Append prefix, if any
+            suffix = volume.findnodes('./*[local-name()="call_number_suffix"][@ident!="-1"]');
+            IF suffix.getAttribute('label') != '';
+                vol.label = vol.label _ " " _ suffix.getAttribute('label');
+            END;
+            IF vol.label == '##URI##';
+                FOR uri IN volume.findnodes('./*[local-name()="uris"]/*[local-name()="uri"]');
+                    res = {};
+                    res.href = uri.getAttribute('href');
+                    res.link = uri.getAttribute('label');
+                    res.note = uri.getAttribute('use_restriction');
+                    uris.push(res);
+                END;
+                NEXT;
+            ELSE;
+                copies = volume.findnodes('./*[local-name()="copies"]/*[local-name()="copy"]');
+                FOR copy IN copies;
+                    parts = copy.findnodes('./*[local-name()="monograph_parts"]/*[local-name()="monograph_part"]');
+                    FOREACH part IN parts;
+                        part_label = part.getAttribute('label');
+                        LAST IF part_label != '';
+                    END;
+
+                    NEXT IF (copy.getAttribute('deleted') == 'true' OR copy.getAttribute('opac_visible') == 'false');
+                    loc = copy.findnodes('./*[local-name()="location"]');
+                    circlib = copy.findnodes('./*[local-name()="circlib"]');
+                    status = copy.findnodes('./*[local-name()="status"]');
+                    holding = {
+                        label => vol.label,
+                        part_label => part_label,
+                        library => circlib.textContent,
+                        location => loc.textContent,
+                        status => status.textContent
+                        barcode => copy.getAttribute('barcode')
+                    };
+                    holdings.push(holding);
+                    part_label = '';
+                END;
+            END;
+        END;
+
         %]
 
         <li>
-            Bib ID# [% bre_id %] ISBN: [% isbn %]<br />
+            Bib ID# [% bre_id %] [% IF isbn %]ISBN: [% isbn | html %]<br/>[% END -%] [% IF issn %]ISSN: [% issn | html %]<br/>[% END -%] <br />
             Title: [% title %]<br />
             Author: [% author %]<br />
             Publication Info: [% publisher %] [% pubdate %]<br/>
-            Item Type: [% item_type %]
+            Item Type: [% item_type %]<br/>
+            
+            [% IF upc  %]UPC:  [% upc  | html %]<br/>[% END -%]
+            [% IF holdings.size > 0 %]
+               [% IF holdings.size > print_limit AND print_limit > 0 %]
+                  Showing <strong>[% print_limit %] of [% holdings.size %]</strong>...<br />
+               [% END %]
+
+               <ul>
+               [% FOR holding IN holdings %]
+                  [% IF loop.count() > print_limit; LAST; END %]
+                  <li>Location: [% holding.library | html %] - [% holding.location | html %]<br/>
+                  Barcode: [% holding.barcode | html %]<br/>
+                  Call Number: [% holding.label | html %][% holding.part_label | html %] <br/>
+                  Status: [% holding.status | html %]</li>
+               [% END %]
+               </ul>
+            [% END %]
+            [% IF uris.size > 0 %]
+               <ul>
+               [% FOR uri IN uris %]
+                  <li>URL: [% uri.href | html %]<br/>
+                  [% IF uri.link.length > 0 %]
+                     Label: [% uri.href | html %]<br />
+                  [% END %]
+                  [% IF uri.note.length > 0 %]
+                     Note: [% uri.note | html %]<br />
+                  [% END %]
+                  </li>
+               [% END %]
+               </ul>
+            [% END %]
         </li>
     [% END %]
     [% END %]

commit fa0e99d4743c10d95c9174c3fae24c0709e79fe3
Author: Art Rhyno <art632000 at yahoo.ca>
Date:   Tue Feb 12 11:25:08 2013 -0500

    Make Date Addition for Hold Receipt Configurable on Client
    
    As per Dan Scott's suggestion, this changes the print_win.js
    function for formatting the holds date receipt to allow
    the number of days to be specified with the "add_days" attribute.
    
    Signed-off-by: Art Rhyno <art632000 at yahoo.ca>

diff --git a/Open-ILS/xul/staff_client/chrome/content/util/print_win.js b/Open-ILS/xul/staff_client/chrome/content/util/print_win.js
index 8faadf1..035692b 100644
--- a/Open-ILS/xul/staff_client/chrome/content/util/print_win.js
+++ b/Open-ILS/xul/staff_client/chrome/content/util/print_win.js
@@ -9,7 +9,7 @@ function print_init(type) {
     if (typeof print_custom == "function") {
         print_custom(type);
     } else {
-        print_do_hold_dates(5);
+        print_do_hold_dates();
         print_do_sums();
         print_check_alt();
         print_check_noprint();
@@ -169,22 +169,26 @@ function print_do_sums() {
  * Use example:
  * <!-- blah blah -->
  * <!-- Probably as line_item entries: -->
- * <span hold_date="hold">Due Date: 5 days from Now</span>
+ * <span hold_date="today" add_days="5">Due Date: 5 days from Now</span>
  */
-function print_do_hold_dates(daysToAdd) {
-    var holdDate = new Date();
-    holdDate.setDate(holdDate.getDate() + daysToAdd); 
-    var d = holdDate.getDate();
-    var m = holdDate.getMonth()+1;
-    var y = holdDate.getFullYear();
-
-    var holdDue = 'Due Date: ' + y +'-'+ (m<=9?'0'+m:m) +'-'+ (d<=9?'0'+d:d);
+function print_do_hold_dates() {
     var spans = document.getElementsByTagName('span');
     if(!spans) return;
     for (var i = 0; i < spans.length; i++) {
-        var dateset = spans[i].getAttribute("hold_date");
-        if(dateset) {
-            spans[i].textContent = holdDue;
+        var hold_date = spans[i].getAttribute("hold_date");
+        var add_days = spans[i].getAttribute("add_days");
+        if(hold_date && add_days) {
+            var daysToAdd = parseInt(add_days);
+            if (daysToAdd > 0 && daysToAdd < 365) {
+                var holdDate = new Date();
+                holdDate.setDate(holdDate.getDate() + daysToAdd);
+                var d = holdDate.getDate();
+                var m = holdDate.getMonth()+1;
+                var y = holdDate.getFullYear();
+
+                var holdDue = 'Due Date: ' + y +'-'+ (m<=9?'0'+m:m) +'-'+ (d<=9?'0'+d:d);
+                spans[i].textContent = holdDue;
+             }//if daysToAdd
         }//if
     }//for
 }

commit ca7b388c0d9749158e0e01cc3e39416b39e22bf1
Author: Art Rhyno <art632000 at yahoo.ca>
Date:   Wed Jan 30 08:34:24 2013 -0500

    Hold Slip Formatting for Windsor
    
    The Leddy Library used some custom javascript for adding a due date
    to the Hold Slip in a previous version of Evergreen. This uses the
    far cleaner print_win.js setup to bring this back.
    
    Signed-off-by: Art Rhyno <art632000 at yahoo.ca>

diff --git a/Open-ILS/xul/staff_client/chrome/content/util/print_win.js b/Open-ILS/xul/staff_client/chrome/content/util/print_win.js
index 76f53f5..8faadf1 100644
--- a/Open-ILS/xul/staff_client/chrome/content/util/print_win.js
+++ b/Open-ILS/xul/staff_client/chrome/content/util/print_win.js
@@ -9,6 +9,7 @@ function print_init(type) {
     if (typeof print_custom == "function") {
         print_custom(type);
     } else {
+        print_do_hold_dates(5);
         print_do_sums();
         print_check_alt();
         print_check_noprint();
@@ -163,3 +164,27 @@ function print_do_sums() {
         }
     }
 }
+
+/* Hold Date Formating for Leddy
+ * Use example:
+ * <!-- blah blah -->
+ * <!-- Probably as line_item entries: -->
+ * <span hold_date="hold">Due Date: 5 days from Now</span>
+ */
+function print_do_hold_dates(daysToAdd) {
+    var holdDate = new Date();
+    holdDate.setDate(holdDate.getDate() + daysToAdd); 
+    var d = holdDate.getDate();
+    var m = holdDate.getMonth()+1;
+    var y = holdDate.getFullYear();
+
+    var holdDue = 'Due Date: ' + y +'-'+ (m<=9?'0'+m:m) +'-'+ (d<=9?'0'+d:d);
+    var spans = document.getElementsByTagName('span');
+    if(!spans) return;
+    for (var i = 0; i < spans.length; i++) {
+        var dateset = spans[i].getAttribute("hold_date");
+        if(dateset) {
+            spans[i].textContent = holdDue;
+        }//if
+    }//for
+}

commit b3e62feaad82600b262bcbc750f3b40f5a7bf2c9
Author: Art Rhyno <art632000 at yahoo.ca>
Date:   Fri Mar 8 07:55:06 2013 -0500

    Fix CAS to handle dynamic auth links
    
    CAS uses a "service" URL to redirect a user back to where an application wants
    them to go if authentication is passed. This works well for simple URLs but
    becomes problematic for complex URLs, which can get mangled or, worse,
    truncated. This doesn't seem to be unique to Windsor's implmentation of CAS.
    
    I tried a few tricks to encode the URLs in strange ways to get the same
    URL back from CAS, but I think a better approach is to stuff the URL into
    a cookie, and invoke when the request comes back from CAS. Any other approach
    seems to result in horrid URLs and there is always the chance that some
    character will break the scheme.
    
    One flaw in my approach is that if a TPAC user selects "email" or "place hold"
    and invokes the logon screen, the cookie gets set for the "redirect" URL. If,
    for some reason, a user decides to do another search and chooses to log in to
    their account from a different screen, the CAS URL can be invoked. This
    would only happen for CAS, and the cookie itself is only set for 10
    minutes, so I don't think this is a major concession. I also try to
    invalidate the cookie wherever it is possible to know that the authentication
    has not been invoked.
    
    The assumption is that there is a CAS link added to the login form (login/form.tt2),
    for example:
    
     <a href="[% ctx.cas.url %]"
        class="opac-button opac-button-header" id="home_myopac_link_uwin">
        [% l('Log in to Your Account (UWind ID)') %]
     </a>
    
    I had become so used to testing CAS by logging in first, that I totally missed
    the links that support authentication at the time of need, e.g. the "email"
    or "place hold" links that are displayed prior to authentication. Hopefully,
    this branch will address what is probably a common scenario.
    
    Signed-off-by: Art Rhyno <art632000 at yahoo.ca>
    
    Conflicts:
    	Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm

diff --git a/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm b/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm
index 0838a29..77b1543 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm
@@ -28,6 +28,8 @@ my $U = 'OpenILS::Application::AppUtils';
 
 use constant COOKIE_SES => 'ses';
 use constant COOKIE_LOGGEDIN => 'eg_loggedin';
+use constant COOKIE_LOGGEDIN_CAS => 'eg_CAS';
+use constant COOKIE_URL_CAS => 'eg_CAS_URL';
 use constant COOKIE_PHYSICAL_LOC => 'eg_physical_loc';
 use constant COOKIE_SSS_EXPAND => 'eg_sss_expand';
 
@@ -359,6 +361,41 @@ sub load_login {
     my $persist = $cgi->param('persist');
 
     # initial log form only
+    my $ticket = $cgi->param('ticket');
+    my $cas_redirect_to = $cgi->param('redirect_to');
+    if ($cgi->cookie(COOKIE_URL_CAS)) {
+       $cas_redirect_to = $cgi->cookie(COOKIE_URL_CAS);
+    }
+    my $cas_flag = '0';
+
+    # initial log form only
+    if ($ticket) {
+        # CAS does not have either username or password at this point, so we fudge these 
+        # values for the other checks
+        $username = '_CAS_';
+        $password = '_CAS_';
+
+    }
+
+    my $login_page = sprintf('%s://%s%s/login',($self->ctx->{is_staff} ? 'oils' : 'https'), $self->ctx->{hostname}, $self->ctx->{opac_root});
+
+    # CAS does not handle complex URLs, so we put the URL in a cookie 
+    if (!$cgi->cookie(COOKIE_URL_CAS) && $cas_redirect_to && !$username && !$password) {
+           return $self->generic_redirect(
+              "$login_page?redirect_to=$cas_redirect_to",
+              [
+                 # contains the service url for CAS
+                 $cgi->cookie(
+                    -name => COOKIE_URL_CAS,
+                    -path => '/',
+                    -secure => 0,
+                    -value => $cas_redirect_to,
+                    -expires => '+10m'
+                 )
+              ]
+           );
+    }
+
     return Apache2::Const::OK unless $username and $password;
 
     my $auth_proxy_enabled = 0; # default false
@@ -397,6 +434,13 @@ sub load_login {
             'open-ils.auth', 'open-ils.auth.authenticate.complete', $args);
     } else {
         $args->{password} = $password;
+        if ($ticket) {
+            $args->{ticket} = $ticket;
+            $cas_flag = '1';
+        } else {
+            # zap CAS redirect if not CAS request
+            $cas_redirect_to = undef;
+        } 
         $response = $U->simplereq(
             'open-ils.auth_proxy',
             'open-ils.auth_proxy.login', $args);
@@ -418,6 +462,7 @@ sub load_login {
     my $login_cookie_expires = ($persist) ? CORE::time + $response->{payload}->{authtime} : undef;
 
     return $self->generic_redirect(
+        $cas_redirect_to ||
         $cgi->param('redirect_to') || $acct,
         [
             # contains the actual auth token and should be sent only over https
@@ -436,6 +481,22 @@ sub load_login {
                 -secure => 0,
                 -value => '1',
                 -expires => $login_cookie_expires
+            ),
+            # invalidate CAS url since it is only needed at point of authentication
+            # if it is used, have it go to login page
+            $cgi->cookie(
+                -name => COOKIE_URL_CAS,
+                -path => '/',
+                -value => $login_page,
+                -expires => '-1h'
+            ),
+            # contains only a hint that we are using CAS
+            $cgi->cookie(
+                -name => COOKIE_LOGGEDIN_CAS,
+                -path => '/',
+                -secure => 0,
+                -value => $cas_flag,
+                -expires => $login_cookie_expires
             )
         ]
     );
@@ -448,6 +509,9 @@ sub load_logout {
     my $self = shift;
     my $redirect_to = shift || $self->cgi->param('redirect_to');
 
+    my $login_page = sprintf('%s://%s%s/login',($self->ctx->{is_staff} ? 'oils' : 'https'), 
+       $self->ctx->{hostname}, $self->ctx->{opac_root});
+
     # If the user was adding anyting to an anonymous cache 
     # while logged in, go ahead and clear it out.
     $self->clear_anon_cache;
@@ -467,6 +531,18 @@ sub load_logout {
                 -path => '/',
                 -value => '',
                 -expires => '-1h'
+            ),
+            $self->cgi->cookie(
+                -name => COOKIE_URL_CAS,
+                -path => '/',
+                -value => $login_page,
+                -expires => '-1h'
+            ),
+            $self->cgi->cookie(
+                -name => COOKIE_LOGGEDIN_CAS,
+                -path => '/',
+                -value => '',
+                -expires => '-1h'
             )
         ]
     );

commit f1141e96f1ba9136659e5cabcb605c1c82c16f74
Author: Art Rhyno <art632000 at yahoo.ca>
Date:   Sat Sep 22 00:46:20 2012 -0400

    Check to see if existing loan date is less than recall date
    
    It seems possible that a recall can be issued that actually extends
    the loan period for an item with semester or other generous loan
    periods. This adds a check for the current loan period and uses it
    if the calculated threshold date is later.
    
    Signed-off-by: Art Rhyno <art632000 at yahoo.ca>
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/action.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/action.pm
index ed5c4ad..20ed65f 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/action.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/action.pm
@@ -1862,6 +1862,11 @@ sub process_recall {
             $return_date = $threshold_date;
         }
 
+        # Ensure that new loan period is not longer than original due date, if it is, stick with original date
+        if (DateTime->compare(DateTime::Format::ISO8601->parse_datetime($circ->due_date),DateTime::Format::ISO8601->parse_datetime($return_date)) == -1) {
+           $return_date = $circ->due_date;
+        };
+
         my $update_fields = {
             due_date => $return_date,
             renewal_remaining => 0,

commit f2db9ba5948f485e109059b403b3717df1e522cd
Author: Dan Scott <dan at coffeecode.net>
Date:   Mon May 30 13:14:29 2011 -0400

    Remove display of patron birthdate, internet access level, etc
    
    These fields in the staff client are either not applicable or
    potentially privacy-invasive or both. If the data somehow does
    get into the system, we don't want it to show up on the staff
    client anyway - and we don't want annoying warnings about unset
    dates of birth, etc.
    
    This is the hardcore way of doing things, we really should make
    it yet another configuration setting. Oh well.
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/xul/staff_client/server/patron/summary.js b/Open-ILS/xul/staff_client/server/patron/summary.js
index e560b64..4772133 100644
--- a/Open-ILS/xul/staff_client/server/patron/summary.js
+++ b/Open-ILS/xul/staff_client/server/patron/summary.js
@@ -246,14 +246,7 @@ patron.summary.prototype = {
                     'patron_net_access' : [
                         ['render'],
                         function(e) {
-                            return function() { 
-                                util.widgets.set_text(e,
-                                    patronStrings.getString('staff.patron.summary.patron_net_access') + 
-                                    ' ' + obj.OpenILS.data.hash.cnal[
-                                        obj.patron.net_access_level()
-                                    ].name()
-                                );
-                            };
+                            // not applicable to Conifer
                         }
                     ],
                     'patron_credit' : [
@@ -606,46 +599,7 @@ patron.summary.prototype = {
                     'patron_date_of_birth' : [
                         ['render'],
                         function(e) {
-                            return function() { 
-                                var hide_value = e.getAttribute('hide_value');
-                                if ( obscure_dob && hide_value == 'true' ) {
-                                    e.setAttribute( 'hidden_value',
-                                        obj.patron.dob() ?
-                                        util.date.formatted_date( obj.patron.dob(), '%{localized_date}' ) :
-                                        patronStrings.getString('staff.patron.field.unset') 
-                                    );
-                                    util.widgets.set_text(e,
-                                        patronStrings.getString('staff.patron.field.hidden') 
-                                    );
-                                } else {
-                                    util.widgets.set_text(e,
-                                        obj.patron.dob() ?
-                                        util.date.formatted_date( obj.patron.dob(), '%{localized_date}' ) :
-                                        patronStrings.getString('staff.patron.field.unset') 
-                                    );
-                                    e.setAttribute( 'hidden_value',
-                                        patronStrings.getString('staff.patron.field.hidden') 
-                                    );
-                                }
-                                var x = document.getElementById('PatronSummaryContact_date_of_birth_label');
-                                if (x) {
-                                    var click_to_hide_dob = x.getAttribute('click_to_hide_dob');
-                                    if (!obscure_dob || click_to_hide_dob != 'true') {
-                                        removeCSSClass(x,'click_link');
-                                    } 
-                                    if (obscure_dob && click_to_hide_dob == 'true') {
-                                        addCSSClass(x,'click_link');
-                                        x.onclick = function() {
-                                            hide_value = e.getAttribute('hide_value');
-                                            e.setAttribute('hide_value', hide_value == 'true' ? 'false' : 'true'); 
-                                            var value = util.widgets.get_text(e);
-                                            var hidden_value = e.getAttribute('hidden_value');
-                                            util.widgets.set_text(e,hidden_value);
-                                            e.setAttribute('hidden_value',value);
-                                        }
-                                    }
-                                }
-                            };
+                            // not applicable to Conifer
                         }
                     ],
                     'patron_day_phone' : [
diff --git a/Open-ILS/xul/staff_client/server/patron/summary_overlay.xul b/Open-ILS/xul/staff_client/server/patron/summary_overlay.xul
index 4a39089..71c9d58 100644
--- a/Open-ILS/xul/staff_client/server/patron/summary_overlay.xul
+++ b/Open-ILS/xul/staff_client/server/patron/summary_overlay.xul
@@ -41,9 +41,6 @@
         <row id="pdsgr5">
             <description id="patron_library" class="copyable homelib value"/>
         </row>
-        <row id="pdsgr5a">
-            <description id="patron_net_access" class="copyable net_access value"/>
-        </row>
         <row id="pdsgr5aab">
             <description id="patron_account_create_date" class="copyable create_date value"/>
         </row>
@@ -162,10 +159,6 @@
             <label id="PatronSummaryContact_hold_alias_label" class="copyable text_left" value="&staff.patron_display.hold_alias.label;"/>
             <description id="patron_hold_alias" class="copyable hold_alias value" />
         </row>
-        <row id="pdsgr3">
-            <label id="PatronSummaryContact_date_of_birth_label" click_to_hide_dob="true" class="copyable text_left dob label click_link" value="&staff.patron_display.date_of_birth.label;"/>
-            <description id="patron_date_of_birth" class="copyable dob value" hide_value="true" oils_persist="hide_value"/>
-        </row>
         <row id="pdsgr4"><label id="pdsgr4l" value=" "/></row>
     </rows>
 </grid>
diff --git a/Open-ILS/xul/staff_client/server/patron/util.js b/Open-ILS/xul/staff_client/server/patron/util.js
index ce41bd6..7bc7e87 100644
--- a/Open-ILS/xul/staff_client/server/patron/util.js
+++ b/Open-ILS/xul/staff_client/server/patron/util.js
@@ -786,8 +786,6 @@ patron.util.set_penalty_css = function(patron) {
             addCSSClass(document.documentElement,'PATRON_INACTIVE');
         }
 
-        try { addCSSClass(document.documentElement,'PATRON_NET_ACCESS_' + patron.net_access_level()); } catch(E) {}
-
         var now = new Date();
         now = now.getTime()/1000;
 
@@ -800,40 +798,6 @@ patron.util.set_penalty_css = function(patron) {
 
         if (expire < now) addCSSClass(document.documentElement,'PATRON_EXPIRED');
 
-        if (patron.dob()) {
-            var age_parts = patron.dob().substr(0,10).split('-');
-            age_parts[1] = age_parts[1] - 1;
-
-            var born = new Date();
-            born.setFullYear(age_parts[0], age_parts[1], age_parts[2]);
-            born = born.getTime()/1000
-
-            var patron_age = now - born;
-            var years_old = Number(patron_age / TIME.year);
-
-            addCSSClass(document.documentElement,'PATRON_AGE_IS_' + years_old);
-
-            if ( years_old >= 65 ) addCSSClass(document.documentElement,'PATRON_AGE_GE_65');
-            if ( years_old < 65 )  addCSSClass(document.documentElement,'PATRON_AGE_LT_65');
-        
-            if ( years_old >= 24 ) addCSSClass(document.documentElement,'PATRON_AGE_GE_24');
-            if ( years_old < 24 )  addCSSClass(document.documentElement,'PATRON_AGE_LT_24');
-            
-            if ( years_old >= 21 ) addCSSClass(document.documentElement,'PATRON_AGE_GE_21');
-            if ( years_old < 21 )  addCSSClass(document.documentElement,'PATRON_AGE_LT_21');
-        
-            if ( years_old >= 18 ) addCSSClass(document.documentElement,'PATRON_AGE_GE_18');
-            if ( years_old < 18 )  addCSSClass(document.documentElement,'PATRON_AGE_LT_18');
-        
-            if ( years_old >= 13 ) addCSSClass(document.documentElement,'PATRON_AGE_GE_13');
-            if ( years_old < 13 )  addCSSClass(document.documentElement,'PATRON_AGE_LT_13');
-        } else {
-            addCSSClass(document.documentElement,'PATRON_HAS_INVALID_DOB');
-        }
-
-        if ( get_bool( patron.juvenile() ) ) addCSSClass(document.documentElement,'PATRON_JUVENILE');
-        else removeCSSClass(document.documentElement,'PATRON_JUVENILE');
-
         if (patron.mailing_address() && typeof patron.mailing_address() == 'object') {
             if (!get_bool(patron.mailing_address().valid())) {
                 addCSSClass(document.documentElement,'PATRON_HAS_INVALID_ADDRESS');

commit 0649f955998eef15cc3ef7e90d35b7a5f8a30317
Author: Dan Scott <dscott at laurentian.ca>
Date:   Tue Mar 26 14:53:32 2013 -0400

    Add Media Centre MARC template
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/examples/opensrf.xml.example b/Open-ILS/examples/opensrf.xml.example
index fe1aebb..e37a2ca 100644
--- a/Open-ILS/examples/opensrf.xml.example
+++ b/Open-ILS/examples/opensrf.xml.example
@@ -652,6 +652,7 @@ vim:et:ts=4:sw=4:
                          <K_audio>/openils/var/templates/marc/k_audio.xml</K_audio>
                          <K_book>/openils/var/templates/marc/k_book.xml</K_book>
                          <K_video>/openils/var/templates/marc/k_video.xml</K_video>
+                         <MediaCentre>/openils/var/templates/marc/mediacentre.xml</MediaCentre>
                          <OSUL_Journal>/openils/var/templates/marc/OSUL_Journal.xml</OSUL_Journal>
                          <OWA_Book>/openils/var/templates/marc/OWA_Book.xml</OWA_Book>
                          <OWA_Computer_file>/openils/var/templates/marc/OWA_Computer file.xml</OWA_Computer_file>
diff --git a/Open-ILS/src/templates/marc/mediacentre.xml b/Open-ILS/src/templates/marc/mediacentre.xml
new file mode 100644
index 0000000..6caa70b
--- /dev/null
+++ b/Open-ILS/src/templates/marc/mediacentre.xml
@@ -0,0 +1,9 @@
+<record xmlns="http://www.loc.gov/MARC21/slim">
+<leader>00881npm a2200193   4500</leader>
+<controlfield tag="001"> </controlfield>
+<controlfield tag="005">19970610140737.0</controlfield>
+<controlfield tag="008">                                        </controlfield>
+<datafield tag="100" ind1="1" ind2=" "><subfield code="a">Manufacturer (Search by author)</subfield></datafield>
+<datafield tag="245" ind1="1" ind2="0"><subfield code="a">Projector / Camera / Computer / VHS Player (Search by title)</subfield><subfield code="b">Model number (Search by title)</subfield></datafield>
+<datafield tag="260" ind1=" " ind2=" "><subfield code="c">Year purchased (Sort by publication date)</subfield></datafield>
+</record>

commit fd655dead3365eb3d73c6011277d2f2097f311bb
Author: Dan Scott <dscott at laurentian.ca>
Date:   Wed Sep 5 11:46:28 2012 -0400

    Flag the UTF8 encoding for MARC templates
    
    The UTF8 encoding is flagged by LDR09 being 'a'. If this is not set, it
    greatly confuses Evergreen, which tries to convert what it thinks are
    MARC8 characters to UTF8 before saving the record.
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/src/templates/marc/OSUL_Journal.xml b/Open-ILS/src/templates/marc/OSUL_Journal.xml
index 4eb7610..107a742 100644
--- a/Open-ILS/src/templates/marc/OSUL_Journal.xml
+++ b/Open-ILS/src/templates/marc/OSUL_Journal.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <record xmlns="http://www.loc.gov/MARC21/slim">
-  <leader>00620nas  22      a 4500</leader>
+  <leader>00620nas a22      a 4500</leader>
   <controlfield tag="008">070101d           a          000 0 eng d</controlfield>
   <datafield tag="022" ind1="" ind2="">
     <subfield code="a"></subfield>
diff --git a/Open-ILS/src/templates/marc/OWA_Book.xml b/Open-ILS/src/templates/marc/OWA_Book.xml
index 39931a6..eba629d 100644
--- a/Open-ILS/src/templates/marc/OWA_Book.xml
+++ b/Open-ILS/src/templates/marc/OWA_Book.xml
@@ -22,7 +22,7 @@
   Marked Up: June 12, 2009 (Project Conifer)
 -->
 <record xmlns="http://www.loc.gov/MARC21/slim">
-  <leader>00620nam  22      a 4500</leader>
+  <leader>00620nam a22      a 4500</leader>
   <controlfield tag="008">070101s           a          000 0 eng d</controlfield>
   <datafield tag="020" ind1="" ind2="">
     <subfield code="a"></subfield>
diff --git a/Open-ILS/src/templates/marc/OWA_Computer file.xml b/Open-ILS/src/templates/marc/OWA_Computer file.xml
index 5357559..e714892 100644
--- a/Open-ILS/src/templates/marc/OWA_Computer file.xml	
+++ b/Open-ILS/src/templates/marc/OWA_Computer file.xml	
@@ -7,7 +7,7 @@
   Marked Up: June 12, 2009 (Project Conifer)
 -->
 <record xmlns="http://www.loc.gov/MARC21/slim">
-  <leader>00620nmi  22      a 4500</leader>
+  <leader>00620nmi a22      a 4500</leader>
   <controlfield tag="007">co bgu   muuuu</controlfield>
   <controlfield tag="008">070101s                   u        eng d</controlfield>
   <datafield tag="020" ind1="" ind2="">
diff --git a/Open-ILS/src/templates/marc/OWA_Ebook.xml b/Open-ILS/src/templates/marc/OWA_Ebook.xml
index e4f8047..978bc14 100644
--- a/Open-ILS/src/templates/marc/OWA_Ebook.xml
+++ b/Open-ILS/src/templates/marc/OWA_Ebook.xml
@@ -13,7 +13,7 @@
   Marked Up: June 12, 2009 (Project Conifer)
 -->
 <record xmlns="http://www.loc.gov/MARC21/slim">
-  <leader>00620nam  22      a 4500</leader>
+  <leader>00620nam a22      a 4500</leader>
   <controlfield tag="006">m         d       </controlfield>
   <controlfield tag="007">cr  czummmmuuuu</controlfield>
   <controlfield tag="008">070101s           a    sb    000 0 eng d</controlfield>
diff --git a/Open-ILS/src/templates/marc/OWA_Journal.xml b/Open-ILS/src/templates/marc/OWA_Journal.xml
index 8178023..8d0d7eb 100644
--- a/Open-ILS/src/templates/marc/OWA_Journal.xml
+++ b/Open-ILS/src/templates/marc/OWA_Journal.xml
@@ -15,7 +15,7 @@
   Marked Up: June 12, 2009 (Project Conifer)
 -->
 <record xmlns="http://www.loc.gov/MARC21/slim">
-  <leader>00620nas  22      a 4500</leader>
+  <leader>00620nas a22      a 4500</leader>
   <controlfield tag="008">070101d           a          000 0 eng d</controlfield>
   <datafield tag="022" ind1="" ind2="">
     <subfield code="a"></subfield>
diff --git a/Open-ILS/src/templates/marc/OWA_Kits, realia.xml b/Open-ILS/src/templates/marc/OWA_Kits, realia.xml
index de5b644..41d5962 100644
--- a/Open-ILS/src/templates/marc/OWA_Kits, realia.xml	
+++ b/Open-ILS/src/templates/marc/OWA_Kits, realia.xml	
@@ -7,7 +7,7 @@
   Marked Up: June 12, 2009 (Project Conifer)
 -->
 <record xmlns="http://www.loc.gov/MARC21/slim">
-  <leader>00620nom  22      a 4500</leader>
+  <leader>00620nom a22      a 4500</leader>
   <controlfield tag="008">070101s           a          000 0 eng d</controlfield>
   <datafield tag="020" ind1="" ind2="">
     <subfield code="a"></subfield>
@@ -64,4 +64,4 @@
   <datafield tag="830" ind1="" ind2="0">
     <subfield code="a"></subfield>
   </datafield>
-</record>
\ No newline at end of file
+</record>
diff --git a/Open-ILS/src/templates/marc/OWA_Maps.xml b/Open-ILS/src/templates/marc/OWA_Maps.xml
index 9ab5579..a9edaa8 100644
--- a/Open-ILS/src/templates/marc/OWA_Maps.xml
+++ b/Open-ILS/src/templates/marc/OWA_Maps.xml
@@ -6,7 +6,7 @@
   Marked Up: June 12, 2009 (Project Conifer)
 -->
 <record xmlns="http://www.loc.gov/MARC21/slim">
-  <leader>00620nem  22      a 4500</leader>
+  <leader>00620nem a22      a 4500</leader>
   <controlfield tag="007">aj cpnan</controlfield>
   <controlfield tag="008">070101s                  a     0   eng d</controlfield>
   <datafield tag="020" ind1="" ind2="">
@@ -62,4 +62,4 @@
   <datafield tag="830" ind1="" ind2="0">
     <subfield code="a"></subfield>
   </datafield>
-</record>
\ No newline at end of file
+</record>
diff --git a/Open-ILS/src/templates/marc/OWA_Microform.xml b/Open-ILS/src/templates/marc/OWA_Microform.xml
index 796c0ea..7904fd0 100644
--- a/Open-ILS/src/templates/marc/OWA_Microform.xml
+++ b/Open-ILS/src/templates/marc/OWA_Microform.xml
@@ -7,7 +7,7 @@
     3.  090 is the in-house call number
   Marked Up: June 12, 2009 (Project Conifer)-->
 <record xmlns="http://www.loc.gov/MARC21/slim">
-  <leader>00620nap  22      a 4500</leader>
+  <leader>00620nap a22      a 4500</leader>
   <controlfield tag="007">he uub   buba</controlfield>
   <controlfield tag="008">070101s                      000 0 eng d</controlfield>
   <datafield tag="020" ind1="" ind2="">
@@ -78,4 +78,4 @@
   <datafield tag="830" ind1="" ind2="0">
     <subfield code="a"></subfield>
   </datafield>
-</record>
\ No newline at end of file
+</record>
diff --git a/Open-ILS/src/templates/marc/OWA_Music scores.xml b/Open-ILS/src/templates/marc/OWA_Music scores.xml
index 92cf790..48777fe 100644
--- a/Open-ILS/src/templates/marc/OWA_Music scores.xml	
+++ b/Open-ILS/src/templates/marc/OWA_Music scores.xml	
@@ -8,7 +8,7 @@
   Marked Up: June 12, 2009 (Project Conifer)
 -->
 <record xmlns="http://www.loc.gov/MARC21/slim">
-  <leader>00620ncm  22      a 4500</leader>
+  <leader>00620ncm a22      a 4500</leader>
   <controlfield tag="008">070101s           uuan rs     n  u eng d</controlfield>
   <datafield tag="020" ind1="" ind2="">
     <subfield code="a"></subfield>
@@ -81,4 +81,4 @@
   <datafield tag="830" ind1="" ind2="0">
     <subfield code="a"></subfield>
   </datafield>
-</record>
\ No newline at end of file
+</record>
diff --git a/Open-ILS/src/templates/marc/OWA_Sound recordings_CD.xml b/Open-ILS/src/templates/marc/OWA_Sound recordings_CD.xml
index e826d7f..4532865 100644
--- a/Open-ILS/src/templates/marc/OWA_Sound recordings_CD.xml	
+++ b/Open-ILS/src/templates/marc/OWA_Sound recordings_CD.xml	
@@ -7,7 +7,7 @@
     3.  007, for non-musical sound recording change Leader "j" to "i". 
   Marked Up: June 12, 2009 (Project Conifer)-->
 <record xmlns="http://www.loc.gov/MARC21/slim">
-  <leader>00620njm  22      a 4500</leader>
+  <leader>00620njm a22      a 4500</leader>
   <controlfield tag="007">sd  sngnnmmned</controlfield>
   <controlfield tag="008">070101s                          zueng d</controlfield>
   <datafield tag="020" ind1="" ind2="">
@@ -80,4 +80,4 @@
   <datafield tag="830" ind1="" ind2="0">
     <subfield code="a"></subfield>
   </datafield>
-</record>
\ No newline at end of file
+</record>
diff --git a/Open-ILS/src/templates/marc/OWA_Thesis--other.xml b/Open-ILS/src/templates/marc/OWA_Thesis--other.xml
index 3d54bca..7771369 100644
--- a/Open-ILS/src/templates/marc/OWA_Thesis--other.xml
+++ b/Open-ILS/src/templates/marc/OWA_Thesis--other.xml
@@ -8,7 +8,7 @@
   Marked Up: June 12, 2009 (Project Conifer)
 -->
 <record xmlns="http://www.loc.gov/MARC21/slim">
-  <leader>00620nam  22      a 4500</leader>
+  <leader>00620nam a22      a 4500</leader>
   <controlfield tag="008">070101s           a     b    000 0 eng d</controlfield>
   <datafield tag="020" ind1="" ind2="">
     <subfield code="a"></subfield>
@@ -76,4 +76,4 @@
   <datafield tag="830" ind1="" ind2="0">
     <subfield code="a">Canadian theses.</subfield>
   </datafield>
-</record>
\ No newline at end of file
+</record>
diff --git a/Open-ILS/src/templates/marc/OWA_Video recordings VHS.xml b/Open-ILS/src/templates/marc/OWA_Video recordings VHS.xml
index 0454b9a..9fc5286 100644
--- a/Open-ILS/src/templates/marc/OWA_Video recordings VHS.xml	
+++ b/Open-ILS/src/templates/marc/OWA_Video recordings VHS.xml	
@@ -7,7 +7,7 @@
     3.  007 for VHS, change "specific materials designation" to "f"; change "videorecording format" to "b"; change "medium for sound" to "h".  
   Marked Up: June 12, 2009 (Project Conifer)-->
 <record xmlns="http://www.loc.gov/MARC21/slim">
-  <leader>00620njm  22      a 4500</leader>
+  <leader>00620njm a22      a 4500</leader>
   <controlfield tag="007">vd cbahuu</controlfield>
   <controlfield tag="008">070101s                          vueng d</controlfield>
   <datafield tag="020" ind1="" ind2="">
@@ -84,4 +84,4 @@
   <datafield tag="830" ind1="" ind2="0">
     <subfield code="a"></subfield>
   </datafield>
-</record>
\ No newline at end of file
+</record>
diff --git a/Open-ILS/src/templates/marc/OWA_Videorecording_DVD.xml b/Open-ILS/src/templates/marc/OWA_Videorecording_DVD.xml
index 9467494..5d1ad3a 100644
--- a/Open-ILS/src/templates/marc/OWA_Videorecording_DVD.xml
+++ b/Open-ILS/src/templates/marc/OWA_Videorecording_DVD.xml
@@ -7,7 +7,7 @@
     3.  007 for VHS, change "specific materials designation" to "d"; change "videorecording format" to "v"; change "medium for sound" to "i".  
   Marked Up: June 12, 2009 (Project Conifer)-->
 <record xmlns="http://www.loc.gov/MARC21/slim">
-  <leader>00620ngm  22      a 4500</leader>
+  <leader>00620ngm a22      a 4500</leader>
   <controlfield tag="007">vd cvaiuu</controlfield>
   <controlfield tag="008">070101p                          vueng d</controlfield>
   <datafield tag="020" ind1="" ind2="">
@@ -92,4 +92,4 @@
   <datafield tag="830" ind1="" ind2="0">
     <subfield code="a"></subfield>
   </datafield>
-</record>
\ No newline at end of file
+</record>
diff --git a/Open-ILS/src/templates/marc/OWA_ZPR_Book.xml b/Open-ILS/src/templates/marc/OWA_ZPR_Book.xml
index a182ff5..baed2e7 100644
--- a/Open-ILS/src/templates/marc/OWA_ZPR_Book.xml
+++ b/Open-ILS/src/templates/marc/OWA_ZPR_Book.xml
@@ -10,7 +10,7 @@
   Marked Up: June 30, 2009 (Project Conifer)
 -->
 <record xmlns="http://www.loc.gov/MARC21/slim">
-  <leader>00620nam  22      a 4500</leader>
+  <leader>00620nam a22      a 4500</leader>
   <controlfield tag="008">070101s           a          000 0 eng d</controlfield>
   <datafield tag="040" ind1="" ind2="">
     <subfield code="a">CaOWA</subfield>
@@ -53,4 +53,4 @@
   <datafield tag="700" ind1="1" ind2="">
     <subfield code="a"></subfield>
   </datafield>
-</record>
\ No newline at end of file
+</record>
diff --git a/Open-ILS/src/templates/marc/OWA_ZPR_Journal.xml b/Open-ILS/src/templates/marc/OWA_ZPR_Journal.xml
index 95aae86..e487b35 100644
--- a/Open-ILS/src/templates/marc/OWA_ZPR_Journal.xml
+++ b/Open-ILS/src/templates/marc/OWA_ZPR_Journal.xml
@@ -7,7 +7,7 @@
   Marked Up: June 30, 2009 (Project Conifer)
 -->
 <record xmlns="http://www.loc.gov/MARC21/slim">
-  <leader>00620nas  22      a 4500</leader>
+  <leader>00620nas a22      a 4500</leader>
   <controlfield tag="008">070101d           a          000 0 eng d</controlfield>
   <datafield tag="040" ind1="" ind2="">
     <subfield code="a">CaOWA</subfield>
@@ -48,4 +48,4 @@
   <datafield tag="700" ind1="2" ind2="">
     <subfield code="a"></subfield>
   </datafield>
-</record>
\ No newline at end of file
+</record>
diff --git a/Open-ILS/src/templates/marc/OWA_ZPR_Music scores.xml b/Open-ILS/src/templates/marc/OWA_ZPR_Music scores.xml
index ed2c0b6..7cc061a 100644
--- a/Open-ILS/src/templates/marc/OWA_ZPR_Music scores.xml	
+++ b/Open-ILS/src/templates/marc/OWA_ZPR_Music scores.xml	
@@ -7,7 +7,7 @@
   Marked Up: June 30, 2009 (Project Conifer)
 -->
 <record xmlns="http://www.loc.gov/MARC21/slim">
-  <leader>00620ncm  22      a 4500</leader>
+  <leader>00620ncm a22      a 4500</leader>
   <controlfield tag="008">070101s           uuan rs     n  u eng d</controlfield>
   <datafield tag="040" ind1="" ind2="">
     <subfield code="a">CaOWA</subfield>
@@ -48,4 +48,4 @@
   <datafield tag="700" ind1="1" ind2="">
     <subfield code="a"></subfield>
   </datafield>
-</record>
\ No newline at end of file
+</record>
diff --git a/Open-ILS/src/templates/marc/OWA_ZPR_Sound recordings_CD.xml b/Open-ILS/src/templates/marc/OWA_ZPR_Sound recordings_CD.xml
index 319dfab..a514ff9 100644
--- a/Open-ILS/src/templates/marc/OWA_ZPR_Sound recordings_CD.xml	
+++ b/Open-ILS/src/templates/marc/OWA_ZPR_Sound recordings_CD.xml	
@@ -6,7 +6,7 @@
     
   Marked Up: June 30, 2009 (Project Conifer)-->
 <record xmlns="http://www.loc.gov/MARC21/slim">
-  <leader>00620njm  22      a 4500</leader>
+  <leader>00620njm a22      a 4500</leader>
   <controlfield tag="007">sd  sngnnmmned</controlfield>
   <controlfield tag="008">070101s                          zueng d</controlfield>
   <datafield tag="040" ind1="" ind2="">
@@ -38,4 +38,4 @@
   <datafield tag="700" ind1="1" ind2="">
     <subfield code="a"></subfield>
   </datafield>
-</record>
\ No newline at end of file
+</record>
diff --git a/Open-ILS/src/templates/marc/OWA_ZPR_Videorecording_DVD.xml b/Open-ILS/src/templates/marc/OWA_ZPR_Videorecording_DVD.xml
index f1a20ef..eedba8c 100644
--- a/Open-ILS/src/templates/marc/OWA_ZPR_Videorecording_DVD.xml
+++ b/Open-ILS/src/templates/marc/OWA_ZPR_Videorecording_DVD.xml
@@ -5,7 +5,7 @@
      1. This template is for reserves of video recordings (DVD)
   Marked Up: June 30, 2009 (Project Conifer)-->
 <record xmlns="http://www.loc.gov/MARC21/slim">
-  <leader>00620ngm  22      a 4500</leader>
+  <leader>00620ngm a22      a 4500</leader>
   <controlfield tag="007">vd cvaiuu</controlfield>
   <controlfield tag="008">070101s                          vueng d</controlfield>
   <datafield tag="040" ind1="" ind2="">
@@ -43,4 +43,4 @@
   <datafield tag="700" ind1="1" ind2="">
     <subfield code="a"></subfield>
   </datafield>
-</record>
\ No newline at end of file
+</record>
diff --git a/Open-ILS/src/templates/marc/OWA_ZPR_Videorecordings VHS.xml b/Open-ILS/src/templates/marc/OWA_ZPR_Videorecordings VHS.xml
index 71c18ba..ae2b28c 100644
--- a/Open-ILS/src/templates/marc/OWA_ZPR_Videorecordings VHS.xml	
+++ b/Open-ILS/src/templates/marc/OWA_ZPR_Videorecordings VHS.xml	
@@ -5,7 +5,7 @@
        1. This template is for reserves of Video recordings (VHS)
   Marked Up: June 30, 2009 (Project Conifer)-->
 <record xmlns="http://www.loc.gov/MARC21/slim">
-  <leader>00620njm  22      a 4500</leader>
+  <leader>00620njm a22      a 4500</leader>
   <controlfield tag="007">vd cbahuu</controlfield>
   <controlfield tag="008">070101s                          vueng d</controlfield>
   <datafield tag="040" ind1="" ind2="">
@@ -43,4 +43,4 @@
   <datafield tag="700" ind1="1" ind2="">
     <subfield code="a"></subfield>
   </datafield>
-</record>
\ No newline at end of file
+</record>

commit 15022b798c1c532e8292a258d9dd69c2a98779d5
Author: Dan Scott <dan at coffeecode.net>
Date:   Sun May 29 23:29:38 2011 -0400

    Add Conifer's custom MARC templates
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/examples/opensrf.xml.example b/Open-ILS/examples/opensrf.xml.example
index 658ced1..fe1aebb 100644
--- a/Open-ILS/examples/opensrf.xml.example
+++ b/Open-ILS/examples/opensrf.xml.example
@@ -649,7 +649,29 @@ vim:et:ts=4:sw=4:
                 </unix_config>
                 <app_settings>
                     <marctemplates>
-                        <K_book>LOCALSTATEDIR/templates/marc/k_book.xml</K_book>
+                         <K_audio>/openils/var/templates/marc/k_audio.xml</K_audio>
+                         <K_book>/openils/var/templates/marc/k_book.xml</K_book>
+                         <K_video>/openils/var/templates/marc/k_video.xml</K_video>
+                         <OSUL_Journal>/openils/var/templates/marc/OSUL_Journal.xml</OSUL_Journal>
+                         <OWA_Book>/openils/var/templates/marc/OWA_Book.xml</OWA_Book>
+                         <OWA_Computer_file>/openils/var/templates/marc/OWA_Computer file.xml</OWA_Computer_file>
+                         <OWA_Ebook>/openils/var/templates/marc/OWA_Ebook.xml</OWA_Ebook>
+                         <OWA_Ejournal>/openils/var/templates/marc/OWA_Ejournal.xml</OWA_Ejournal>
+                         <OWA_Journal>/openils/var/templates/marc/OWA_Journal.xml</OWA_Journal>
+                         <OWA_Kits_realia>/openils/var/templates/marc/OWA_Kits, realia.xml</OWA_Kits_realia>
+                         <OWA_Maps>/openils/var/templates/marc/OWA_Maps.xml</OWA_Maps>
+                         <OWA_Microform>/openils/var/templates/marc/OWA_Microform.xml</OWA_Microform>
+                         <OWA_Music_scores>/openils/var/templates/marc/OWA_Music scores.xml</OWA_Music_scores>
+                         <OWA_Sound_recordings_CD>/openils/var/templates/marc/OWA_Sound recordings_CD.xml</OWA_Sound_recordings_CD>
+                         <OWA_Thesis_other>/openils/var/templates/marc/OWA_Thesis--other.xml</OWA_Thesis_other>
+                         <OWA_Videorecording_DVD>/openils/var/templates/marc/OWA_Videorecording_DVD.xml</OWA_Videorecording_DVD>
+                         <OWA_Video_recordings_VHS>/openils/var/templates/marc/OWA_Video recordings VHS.xml</OWA_Video_recordings_VHS>
+                         <OWA_ZPR_Book>/openils/var/templates/marc/OWA_ZPR_Book.xml</OWA_ZPR_Book>
+                         <OWA_ZPR_Journal>/openils/var/templates/marc/OWA_ZPR_Journal.xml</OWA_ZPR_Journal>
+                         <OWA_ZPR_Music_scores>/openils/var/templates/marc/OWA_ZPR_Music scores.xml</OWA_ZPR_Music_scores>
+                         <OWA_ZPR_Sound_recordings_CD>/openils/var/templates/marc/OWA_ZPR_Sound recordings_CD.xml</OWA_ZPR_Sound_recordings_CD>
+                         <OWA_ZPR_Videorecording_DVD>/openils/var/templates/marc/OWA_ZPR_Videorecording_DVD.xml</OWA_ZPR_Videorecording_DVD>
+                         <OWA_ZPR_Videorecordings_VHS>/openils/var/templates/marc/OWA_ZPR_Videorecordings VHS.xml</OWA_ZPR_Videorecordings_VHS>
                     </marctemplates>
                 </app_settings>
             </open-ils.cat>
diff --git a/Open-ILS/src/templates/marc/OSUL_Journal.xml b/Open-ILS/src/templates/marc/OSUL_Journal.xml
new file mode 100644
index 0000000..4eb7610
--- /dev/null
+++ b/Open-ILS/src/templates/marc/OSUL_Journal.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8"?>
+<record xmlns="http://www.loc.gov/MARC21/slim">
+  <leader>00620nas  22      a 4500</leader>
+  <controlfield tag="008">070101d           a          000 0 eng d</controlfield>
+  <datafield tag="022" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="040" ind1="" ind2="">
+    <subfield code="a">CaOSUL</subfield>
+  </datafield>
+  <datafield tag="041" ind1="0" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="060" ind1="1" ind2="4">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="222" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+    <subfield code="b"></subfield>
+  </datafield>
+  <datafield tag="245" ind1="0" ind2="0">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="246" ind1="1" ind2="1">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="260" ind1="" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">,</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="300" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="310" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="321" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="362" ind1="0" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="500" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="530" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="546" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="580" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="650" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+    <subfield code="v">Periodicals</subfield>
+  </datafield>
+  <datafield tag="650" ind1="1" ind2="2">
+    <subfield code="a"></subfield>
+    <subfield code="v">Periodicals</subfield>
+  </datafield>
+  <datafield tag="710" ind1="2" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="780" ind1="0" ind2="0">
+    <subfield code="t"></subfield>
+  </datafield>
+  <datafield tag="785" ind1="0" ind2="0">
+    <subfield code="t"></subfield>
+  </datafield>
+  <datafield tag="787" ind1="0" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+</record>
diff --git a/Open-ILS/src/templates/marc/OWA_Book.xml b/Open-ILS/src/templates/marc/OWA_Book.xml
new file mode 100644
index 0000000..39931a6
--- /dev/null
+++ b/Open-ILS/src/templates/marc/OWA_Book.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Template for Bibliographical records - - Monograph records
+  Author: Shuzhen Zhao, University of Windsor
+    1.  This template is for original cataloguing of books
+    2.  LAC code for University of Windsor is: CaOWA
+    3.  The University of Windsor Library uses LCSH and 
+        Canadian Subject Headings for 6XX fields
+    4.  Most new series titles use 490 field, two uses for 
+        440 are requested:
+          a.  Create 440 when series title with volume/sequential 
+              designation accompanies
+          b.  Create 440 for "in house" series title and authority 
+              records when requested to catalogue and class 
+              together for new series title
+    5.  The University of Windsor Library's monograph records 
+        (print version) allows us to add the URL for the 
+        electronic version; if the book is available in both 
+        formats. 530 field is requested
+
+    
+  Marked Up: June 12, 2009 (Project Conifer)
+-->
+<record xmlns="http://www.loc.gov/MARC21/slim">
+  <leader>00620nam  22      a 4500</leader>
+  <controlfield tag="008">070101s           a          000 0 eng d</controlfield>
+  <datafield tag="020" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="040" ind1="" ind2="">
+    <subfield code="a">CaOWA</subfield>
+  </datafield>
+  <datafield tag="090" ind1="" ind2="">
+    <subfield code="a"></subfield>
+    <subfield code="b"></subfield>
+  </datafield>
+  <datafield tag="100" ind1="1" ind2="">
+    <subfield code="a">,</subfield>
+    <subfield code="d"></subfield>
+  </datafield>
+  <datafield tag="245" ind1="1" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">/</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="250" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="260" ind1="" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">,</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="300" ind1="" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">;</subfield>
+    <subfield code="c">cm.</subfield>
+  </datafield>
+  <datafield tag="440" ind1="" ind2="0">
+    <subfield code="a">,</subfield>
+    <subfield code="x">;</subfield>
+    <subfield code="v"></subfield>
+  </datafield>
+  <datafield tag="490" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="500" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="504" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="505" ind1="0" ind2="0">
+    <subfield code="g">. </subfield>
+    <subfield code="t">.--</subfield>
+  </datafield>
+  <datafield tag="600" ind1="1" ind2="0">
+    <subfield code="a">,</subfield>
+    <subfield code="d"></subfield>
+  </datafield>
+  <datafield tag="650" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+    <subfield code="x"></subfield>
+  </datafield>
+  <datafield tag="651" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+    <subfield code="x"></subfield>
+  </datafield>
+  <datafield tag="700" ind1="1" ind2="">
+    <subfield code="a">,</subfield>
+    <subfield code="d"></subfield>
+  </datafield>
+  <datafield tag="710" ind1="2" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="830" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+  </datafield>
+</record>
diff --git a/Open-ILS/src/templates/marc/OWA_Computer file.xml b/Open-ILS/src/templates/marc/OWA_Computer file.xml
new file mode 100644
index 0000000..5357559
--- /dev/null
+++ b/Open-ILS/src/templates/marc/OWA_Computer file.xml	
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Template for Bibliographical records - - Computer file
+  Author: Shuzhen Zhao, University of Windsor
+    1.  090 uses LC call number   
+    
+  Marked Up: June 12, 2009 (Project Conifer)
+-->
+<record xmlns="http://www.loc.gov/MARC21/slim">
+  <leader>00620nmi  22      a 4500</leader>
+  <controlfield tag="007">co bgu   muuuu</controlfield>
+  <controlfield tag="008">070101s                   u        eng d</controlfield>
+  <datafield tag="020" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="040" ind1="" ind2="">
+    <subfield code="a">CaOWA</subfield>
+  </datafield>
+  <datafield tag="090" ind1="" ind2="">
+    <subfield code="a"></subfield>
+    <subfield code="b"></subfield>
+  </datafield>
+  <datafield tag="100" ind1="1" ind2="">
+    <subfield code="a">,</subfield>
+    <subfield code="d"></subfield>
+  </datafield>
+  <datafield tag="245" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+    <subfield code="h">[electronic resource] :</subfield>
+    <subfield code="b">/</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="260" ind1="" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">,</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="300" ind1="" ind2="">
+    <subfield code="a">1 computer optical disc :</subfield>
+    <subfield code="b">digital ;</subfield>
+    <subfield code="c">3 1/2 in.</subfield>
+  </datafield>
+  <datafield tag="490" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="500" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="520" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="538" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="650" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+    <subfield code="x"></subfield>
+  </datafield>
+  <datafield tag="700" ind1="1" ind2="">
+    <subfield code="a">,</subfield>
+    <subfield code="d"></subfield>
+  </datafield>
+  <datafield tag="710" ind1="2" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="830" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+  </datafield>
+</record>
diff --git a/Open-ILS/src/templates/marc/OWA_Ebook.xml b/Open-ILS/src/templates/marc/OWA_Ebook.xml
new file mode 100644
index 0000000..e4f8047
--- /dev/null
+++ b/Open-ILS/src/templates/marc/OWA_Ebook.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Template for Electronic resources: e-books
+  Author: Shuzhen Zhao, University of Windsor
+    1.  The University of Windsor Library only catalogues 
+        e-book for ordering individually, if the MARC record 
+        is not available
+    2.  No 050, 060, and 090, only "099  $aOnline" has been used 
+        for a call number. University of Windsor Library will 
+        keep the 050 and 060 fields if they come with the 
+        supplier's MARC records   
+
+  Marked Up: June 12, 2009 (Project Conifer)
+-->
+<record xmlns="http://www.loc.gov/MARC21/slim">
+  <leader>00620nam  22      a 4500</leader>
+  <controlfield tag="006">m         d       </controlfield>
+  <controlfield tag="007">cr  czummmmuuuu</controlfield>
+  <controlfield tag="008">070101s           a    sb    000 0 eng d</controlfield>
+  <datafield tag="020" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="040" ind1="" ind2="">
+    <subfield code="a">CaOWA</subfield>
+  </datafield>
+  <datafield tag="099" ind1="" ind2="">
+    <subfield code="a">Online</subfield>
+  </datafield>
+  <datafield tag="100" ind1="1" ind2="">
+    <subfield code="a">,</subfield>
+    <subfield code="d"></subfield>
+  </datafield>
+  <datafield tag="245" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+    <subfield code="h">[electronic resource] :</subfield>
+    <subfield code="b">/</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="260" ind1="" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">,</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="300" ind1="" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">;</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="490" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="440" ind1="" ind2="0">
+    <subfield code="a">,</subfield>
+    <subfield code="x">;</subfield>
+    <subfield code="v"></subfield>
+  </datafield>
+  <datafield tag="500" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="504" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="505" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="530" ind1="" ind2="">
+    <subfield code="a">Also available in print.</subfield>
+  </datafield>
+  <datafield tag="538" ind1="" ind2="">
+    <subfield code="a">Mode of access: Internet.</subfield>
+  </datafield>
+  <datafield tag="600" ind1="1" ind2="0">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="650" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="650" ind1="" ind2="5">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="651" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="700" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="710" ind1="2" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="830" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="856" ind1="4" ind2="0">
+    <subfield code="u"></subfield>
+    <subfield code="z">To view this electronic resource click here.</subfield>
+    <subfield code="9">OWA</subfield>
+  </datafield>
+</record>
diff --git a/Open-ILS/src/templates/marc/OWA_Ejournal.xml b/Open-ILS/src/templates/marc/OWA_Ejournal.xml
new file mode 100644
index 0000000..0f1ef28
--- /dev/null
+++ b/Open-ILS/src/templates/marc/OWA_Ejournal.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Template for Electronic resources: e-journals
+  Author: Shuzhen Zhao, University of Windsor
+  1.  Most of e-journals original cataloguing in The University 
+      of Windsor Library is for journal titles such as electronic 
+      format from the Canadian government (documents) and e-journals
+
+  Marked Up: May 6, 2009 (Project Conifer)
+-->
+<record xmlns="http://www.loc.gov/MARC21/slim">
+  <!--
+    leader and 008 come from k book example, see:
+    http://svn.open-ils.org/trac/ILS/browser/trunk/Open-ILS/src/templates/marc/k book.xml
+  -->
+  <leader>00620nas a2200205Ka 4500</leader>
+  <controlfield tag="006">m                d   </controlfield>
+  <controlfield tag="007">cr</controlfield>
+  <controlfield tag="008">070101s                            eng d</controlfield>
+  <datafield tag="022" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="040" ind1="" ind2="">
+    <subfield code="a">CaOWA</subfield>
+  </datafield>
+  <datafield tag="099" ind1="" ind2="">
+    <subfield code="a">Online</subfield>
+  </datafield>
+  <datafield tag="110" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="222" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="245" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+    <subfield code="h">[electronic resource] :</subfield>
+    <subfield code="b">/</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="260" ind1="" ind2="">
+    <subfield code="a"></subfield>
+    <subfield code="b">,</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="310" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="320" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="362" ind1="0" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="500" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="538" ind1="" ind2="">
+    <subfield code="a">Mode of access: Internet.</subfield>
+  </datafield>
+  <datafield tag="650" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="650" ind1="" ind2="5">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="651" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="710" ind1="2" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="780" ind1="0" ind2="0">
+    <subfield code="t"></subfield>
+  </datafield>
+  <datafield tag="785" ind1="0" ind2="0">
+    <subfield code="t"></subfield>
+  </datafield>
+  <datafield tag="856" ind1="4" ind2="0">
+    <subfield code="u"></subfield>
+    <subfield code="z">To view this electronic resource click here.</subfield>
+    <subfield code="9">OWA</subfield>
+  </datafield>
+</record>
diff --git a/Open-ILS/src/templates/marc/OWA_Journal.xml b/Open-ILS/src/templates/marc/OWA_Journal.xml
new file mode 100644
index 0000000..8178023
--- /dev/null
+++ b/Open-ILS/src/templates/marc/OWA_Journal.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Template for bibliographic record - - Periodicals
+  Author: Shuzhen Zhao, University of Windsor
+    1.  This template is for original cataloguing of 
+        periodicals
+    2.  The University of Windsor Library's periodical records 
+        (print version) allows us to add the URL for the 
+        electronic version, if the book is available in both 
+        formats. 530 field is requested
+    3.  The University of Windsor Library uses LCSH for 6XX fields
+    4.	Original cataloguing for periodicals in 
+        University of Windsor is most likely for title changes   
+
+  Marked Up: June 12, 2009 (Project Conifer)
+-->
+<record xmlns="http://www.loc.gov/MARC21/slim">
+  <leader>00620nas  22      a 4500</leader>
+  <controlfield tag="008">070101d           a          000 0 eng d</controlfield>
+  <datafield tag="022" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="040" ind1="" ind2="">
+    <subfield code="a">CaOWA</subfield>
+  </datafield>
+  <datafield tag="090" ind1="" ind2="">
+    <subfield code="a"></subfield>
+    <subfield code="b"></subfield>
+  </datafield>
+  <datafield tag="110" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="222" ind1="1" ind2="0">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="245" ind1="1" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">/</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="260" ind1="" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">,</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="300" ind1="" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">;</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="310" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="321" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="326" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="504" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="505" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="530" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="650" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="650" ind1="" ind2="5">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="651" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="710" ind1="2" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="780" ind1="0" ind2="0">
+    <subfield code="t"></subfield>
+  </datafield>
+  <datafield tag="785" ind1="0" ind2="0">
+    <subfield code="t"></subfield>
+  </datafield>
+</record>
diff --git a/Open-ILS/src/templates/marc/OWA_Kits, realia.xml b/Open-ILS/src/templates/marc/OWA_Kits, realia.xml
new file mode 100644
index 0000000..de5b644
--- /dev/null
+++ b/Open-ILS/src/templates/marc/OWA_Kits, realia.xml	
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Template for Bibliographical records - - Kits, realia
+  Author: Shuzhen Zhao, University of Windsor
+    1.  090 is in-house call number  
+    
+  Marked Up: June 12, 2009 (Project Conifer)
+-->
+<record xmlns="http://www.loc.gov/MARC21/slim">
+  <leader>00620nom  22      a 4500</leader>
+  <controlfield tag="008">070101s           a          000 0 eng d</controlfield>
+  <datafield tag="020" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="040" ind1="" ind2="">
+    <subfield code="a">CaOWA</subfield>
+  </datafield>
+  <datafield tag="090" ind1="" ind2="">
+    <subfield code="a">Kit</subfield>
+  </datafield>
+  <datafield tag="100" ind1="1" ind2="">
+    <subfield code="a">,</subfield>
+    <subfield code="d"></subfield>
+  </datafield>
+  <datafield tag="245" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+    <subfield code="h">[Kit]:</subfield>
+    <subfield code="b">/</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="260" ind1="" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">,</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="300" ind1="" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">;</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="490" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="500" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="520" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="538" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="650" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+    <subfield code="x"></subfield>
+  </datafield>
+  <datafield tag="700" ind1="1" ind2="">
+    <subfield code="a">,</subfield>
+    <subfield code="d"></subfield>
+  </datafield>
+  <datafield tag="710" ind1="2" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="830" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+  </datafield>
+</record>
\ No newline at end of file
diff --git a/Open-ILS/src/templates/marc/OWA_Maps.xml b/Open-ILS/src/templates/marc/OWA_Maps.xml
new file mode 100644
index 0000000..9ab5579
--- /dev/null
+++ b/Open-ILS/src/templates/marc/OWA_Maps.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Template for Bibliographical records - - Maps
+  Author: Shuzhen Zhao, University of Windsor
+      1. 007 for specific mateiral designation, change "d" to "j" for Atlas
+  Marked Up: June 12, 2009 (Project Conifer)
+-->
+<record xmlns="http://www.loc.gov/MARC21/slim">
+  <leader>00620nem  22      a 4500</leader>
+  <controlfield tag="007">aj cpnan</controlfield>
+  <controlfield tag="008">070101s                  a     0   eng d</controlfield>
+  <datafield tag="020" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="040" ind1="" ind2="">
+    <subfield code="a">CaOWA</subfield>
+  </datafield>
+  <datafield tag="090" ind1="" ind2="">
+    <subfield code="a"></subfield>
+    <subfield code="b"></subfield>
+  </datafield>
+  <datafield tag="245" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+    <subfield code="h">[Cartographic material] :</subfield>
+    <subfield code="b">/</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="255" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="260" ind1="" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">,</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="300" ind1="" ind2="">
+    <subfield code="a">1 map :</subfield>
+    <subfield code="b">col. ;</subfield>
+    <subfield code="c">XX x XX cm., folded to XX x XX cm., in plastic case XX x XX cm.</subfield>
+  </datafield>
+  <datafield tag="490" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="500" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="650" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+    <subfield code="x"></subfield>
+  </datafield>
+  <datafield tag="651" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+    <subfield code="x"></subfield>
+  </datafield>
+  <datafield tag="700" ind1="1" ind2="">
+    <subfield code="a">,</subfield>
+    <subfield code="d"></subfield>
+  </datafield>
+  <datafield tag="710" ind1="2" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="830" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+  </datafield>
+</record>
\ No newline at end of file
diff --git a/Open-ILS/src/templates/marc/OWA_Microform.xml b/Open-ILS/src/templates/marc/OWA_Microform.xml
new file mode 100644
index 0000000..796c0ea
--- /dev/null
+++ b/Open-ILS/src/templates/marc/OWA_Microform.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Template for Bibliographical records - - Microform
+  Author: Shuzhen Zhao, University of Windsor
+    1.  007 field is requested for Microform. Change the "Specific material designation" code to "b", "c" or "d" microfilms.    
+    2.  008 "Form of item", microfilm, change "b" to "a".
+    3.  090 is the in-house call number
+  Marked Up: June 12, 2009 (Project Conifer)-->
+<record xmlns="http://www.loc.gov/MARC21/slim">
+  <leader>00620nap  22      a 4500</leader>
+  <controlfield tag="007">he uub   buba</controlfield>
+  <controlfield tag="008">070101s                      000 0 eng d</controlfield>
+  <datafield tag="020" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="028" ind1="" ind2="">
+    <subfield code="a"></subfield>
+    <subfield code="b"></subfield>
+  </datafield>
+  <datafield tag="040" ind1="" ind2="">
+    <subfield code="a">CaOWA</subfield>
+  </datafield>
+  <datafield tag="090" ind1="" ind2="">
+    <subfield code="a"></subfield>
+    <subfield code="b"></subfield>
+  </datafield>
+  <datafield tag="100" ind1="1" ind2="">
+    <subfield code="a">,</subfield>
+    <subfield code="d"></subfield>
+  </datafield>
+  <datafield tag="245" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+    <subfield code="h">[Microfiche] /</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="250" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="260" ind1="" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">,</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="300" ind1="" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">;</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="490" ind1="1" ind2="">
+    <subfield code="a">,</subfield>
+    <subfield code="x">;</subfield>
+    <subfield code="v"></subfield>
+  </datafield>
+  <datafield tag="500" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="504" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="505" ind1="0" ind2="0">
+    <subfield code="g">.</subfield>
+    <subfield code="t">/</subfield>
+    <subfield code="r">.--</subfield>
+  </datafield>
+  <datafield tag="600" ind1="1" ind2="0">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="650" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="700" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="710" ind1="2" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="830" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+  </datafield>
+</record>
\ No newline at end of file
diff --git a/Open-ILS/src/templates/marc/OWA_Music scores.xml b/Open-ILS/src/templates/marc/OWA_Music scores.xml
new file mode 100644
index 0000000..92cf790
--- /dev/null
+++ b/Open-ILS/src/templates/marc/OWA_Music scores.xml	
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Template for Bibliographical records - - Music scores
+  Author: Shuzhen Zhao, University of Windsor
+    1.  The University of Windsor uses 50500 for conents: number, title, and statement of responsibility in the book. 
+   
+
+  Marked Up: June 12, 2009 (Project Conifer)
+-->
+<record xmlns="http://www.loc.gov/MARC21/slim">
+  <leader>00620ncm  22      a 4500</leader>
+  <controlfield tag="008">070101s           uuan rs     n  u eng d</controlfield>
+  <datafield tag="020" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="040" ind1="" ind2="">
+    <subfield code="a">CaOWA</subfield>
+  </datafield>
+  <datafield tag="090" ind1="" ind2="">
+    <subfield code="a"></subfield>
+    <subfield code="b"></subfield>
+  </datafield>
+  <datafield tag="100" ind1="1" ind2="">
+    <subfield code="a">,</subfield>
+    <subfield code="d"></subfield>
+  </datafield>
+  <datafield tag="240" ind1="" ind2="">
+    <subfield code="a">,</subfield>
+    <subfield code="m">,</subfield>
+    <subfield code="n">,</subfield>
+    <subfield code="r"></subfield>
+  </datafield>
+  <datafield tag="245" ind1="1" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">/</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="250" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="260" ind1="" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">,</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="300" ind1="" ind2="">
+    <subfield code="a">1 score (p.) ;</subfield>
+    <subfield code="c">cm. +</subfield>
+    <subfield code="a">parts ;</subfield>
+    <subfield code="c">cm.</subfield>
+  </datafield>
+  <datafield tag="490" ind1="1" ind2="">
+    <subfield code="a">,</subfield>
+    <subfield code="x">;</subfield>
+    <subfield code="v"></subfield>
+  </datafield>
+  <datafield tag="500" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="504" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="505" ind1="0" ind2="0">
+    <subfield code="g">.</subfield>
+    <subfield code="t">/</subfield>
+    <subfield code="r">.--</subfield>
+  </datafield>
+  <datafield tag="600" ind1="1" ind2="0">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="650" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="700" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="710" ind1="2" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="830" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+  </datafield>
+</record>
\ No newline at end of file
diff --git a/Open-ILS/src/templates/marc/OWA_Sound recordings_CD.xml b/Open-ILS/src/templates/marc/OWA_Sound recordings_CD.xml
new file mode 100644
index 0000000..e826d7f
--- /dev/null
+++ b/Open-ILS/src/templates/marc/OWA_Sound recordings_CD.xml	
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Template for Bibliographical records - - Sound recordings 
+  Author: Shuzhen Zhao, University of Windsor
+    1.  The University of Windsor uses 50500 for contents: number, title, and statement of responsibility in the disc.  
+    2.  090 is the in-house call munber.
+    3.  007, for non-musical sound recording change Leader "j" to "i". 
+  Marked Up: June 12, 2009 (Project Conifer)-->
+<record xmlns="http://www.loc.gov/MARC21/slim">
+  <leader>00620njm  22      a 4500</leader>
+  <controlfield tag="007">sd  sngnnmmned</controlfield>
+  <controlfield tag="008">070101s                          zueng d</controlfield>
+  <datafield tag="020" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="040" ind1="" ind2="">
+    <subfield code="a">CaOWA</subfield>
+  </datafield>
+  <datafield tag="090" ind1="" ind2="">
+    <subfield code="a"></subfield>
+    <subfield code="b"></subfield>
+  </datafield>
+  <datafield tag="100" ind1="1" ind2="">
+    <subfield code="a">,</subfield>
+    <subfield code="d"></subfield>
+  </datafield>
+  <datafield tag="240" ind1="" ind2="">
+    <subfield code="a">,</subfield>
+    <subfield code="m">,</subfield>
+    <subfield code="n">,</subfield>
+    <subfield code="r"></subfield>
+  </datafield>
+  <datafield tag="245" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+    <subfield code="h">[sound recording] /</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="250" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="260" ind1="" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">,</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="300" ind1="" ind2="">
+    <subfield code="a">1 sound disc (min.) :</subfield>
+    <subfield code="b">digital, stereo. ;</subfield>
+    <subfield code="c">4 3/4 in.</subfield>
+  </datafield>
+  <datafield tag="490" ind1="1" ind2="">
+    <subfield code="a">,</subfield>
+    <subfield code="x">;</subfield>
+    <subfield code="v"></subfield>
+  </datafield>
+  <datafield tag="500" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="504" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="505" ind1="0" ind2="0">
+    <subfield code="g">.</subfield>
+    <subfield code="t">/</subfield>
+    <subfield code="r">.--</subfield>
+  </datafield>
+  <datafield tag="600" ind1="1" ind2="0">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="650" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="700" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="710" ind1="2" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="830" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+  </datafield>
+</record>
\ No newline at end of file
diff --git a/Open-ILS/src/templates/marc/OWA_Thesis--other.xml b/Open-ILS/src/templates/marc/OWA_Thesis--other.xml
new file mode 100644
index 0000000..3d54bca
--- /dev/null
+++ b/Open-ILS/src/templates/marc/OWA_Thesis--other.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Template for Bibliographical records - - Thesis and dissertations from other universities/publishers
+  Author: Shuzhen Zhao, University of Windsor
+    1.  The University of Windsor Library made several "in house series" using 440 and 490 + 830, for Canadian and american theses.
+    2.  Thesis and dissertations are catalogued as "Full Level" monographs. 
+       
+  Marked Up: June 12, 2009 (Project Conifer)
+-->
+<record xmlns="http://www.loc.gov/MARC21/slim">
+  <leader>00620nam  22      a 4500</leader>
+  <controlfield tag="008">070101s           a     b    000 0 eng d</controlfield>
+  <datafield tag="020" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="040" ind1="" ind2="">
+    <subfield code="a">CaOWA</subfield>
+  </datafield>
+  <datafield tag="090" ind1="" ind2="">
+    <subfield code="a"></subfield>
+    <subfield code="b"></subfield>
+  </datafield>
+  <datafield tag="100" ind1="1" ind2="">
+    <subfield code="a">,</subfield>
+    <subfield code="d"></subfield>
+  </datafield>
+  <datafield tag="245" ind1="1" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">/</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="260" ind1="" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">,</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="300" ind1="" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">;</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="490" ind1="" ind2="0">
+    <subfield code="a">,</subfield>
+    <subfield code="x">;</subfield>
+    <subfield code="v"></subfield>
+  </datafield>
+  <datafield tag="500" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="502" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="504" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="533" ind1="" ind2="">
+    <subfield code="a">Photocopy.</subfield>
+    <subfield code="b">:</subfield>
+    <subfield code="c">,</subfield>
+    <subfield code="d"></subfield>
+  </datafield>
+  <datafield tag="650" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+    <subfield code="x"></subfield>
+  </datafield>
+  <datafield tag="651" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+    <subfield code="x"></subfield>
+  </datafield>
+  <datafield tag="700" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="710" ind1="2" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="830" ind1="" ind2="0">
+    <subfield code="a">Canadian theses.</subfield>
+  </datafield>
+</record>
\ No newline at end of file
diff --git a/Open-ILS/src/templates/marc/OWA_Video recordings VHS.xml b/Open-ILS/src/templates/marc/OWA_Video recordings VHS.xml
new file mode 100644
index 0000000..0454b9a
--- /dev/null
+++ b/Open-ILS/src/templates/marc/OWA_Video recordings VHS.xml	
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Template for Bibliographical records - - Videorecordings (VHS)
+  Author: Shuzhen Zhao, University of Windsor
+    1.  007 field is requested for videorecordings.  
+    2.  090 is the in-house call munber.
+    3.  007 for VHS, change "specific materials designation" to "f"; change "videorecording format" to "b"; change "medium for sound" to "h".  
+  Marked Up: June 12, 2009 (Project Conifer)-->
+<record xmlns="http://www.loc.gov/MARC21/slim">
+  <leader>00620njm  22      a 4500</leader>
+  <controlfield tag="007">vd cbahuu</controlfield>
+  <controlfield tag="008">070101s                          vueng d</controlfield>
+  <datafield tag="020" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="028" ind1="" ind2="">
+    <subfield code="a"></subfield>
+    <subfield code="b"></subfield>
+  </datafield>
+  <datafield tag="040" ind1="" ind2="">
+    <subfield code="a">CaOWA</subfield>
+  </datafield>
+  <datafield tag="090" ind1="" ind2="">
+    <subfield code="a"></subfield>
+    <subfield code="b"></subfield>
+  </datafield>
+  <datafield tag="100" ind1="1" ind2="">
+    <subfield code="a">,</subfield>
+    <subfield code="d"></subfield>
+  </datafield>
+  <datafield tag="240" ind1="" ind2="">
+    <subfield code="a">,</subfield>
+    <subfield code="m">,</subfield>
+    <subfield code="n">,</subfield>
+    <subfield code="r"></subfield>
+  </datafield>
+  <datafield tag="245" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+    <subfield code="h">[videorecording] /</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="250" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="260" ind1="" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">,</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="300" ind1="" ind2="">
+    <subfield code="a">1 videocassette (VHS)(min.) :</subfield>
+    <subfield code="b">sd., col, ;</subfield>
+    <subfield code="c">1/2 in.</subfield>
+  </datafield>
+  <datafield tag="490" ind1="1" ind2="">
+    <subfield code="a">,</subfield>
+    <subfield code="x">;</subfield>
+    <subfield code="v"></subfield>
+  </datafield>
+  <datafield tag="500" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="504" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="505" ind1="0" ind2="0">
+    <subfield code="g">.</subfield>
+    <subfield code="t">/</subfield>
+    <subfield code="r">.--</subfield>
+  </datafield>
+  <datafield tag="600" ind1="1" ind2="0">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="650" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="700" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="710" ind1="2" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="830" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+  </datafield>
+</record>
\ No newline at end of file
diff --git a/Open-ILS/src/templates/marc/OWA_Videorecording_DVD.xml b/Open-ILS/src/templates/marc/OWA_Videorecording_DVD.xml
new file mode 100644
index 0000000..9467494
--- /dev/null
+++ b/Open-ILS/src/templates/marc/OWA_Videorecording_DVD.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Template for Bibliographical records - - Video Recordings: (DVD)
+  Author: Shuzhen Zhao, University of Windsor
+    1.  The University of Windsor uses 50500 for contents.  
+    2.  090 is the in-house call munber.
+    3.  007 for VHS, change "specific materials designation" to "d"; change "videorecording format" to "v"; change "medium for sound" to "i".  
+  Marked Up: June 12, 2009 (Project Conifer)-->
+<record xmlns="http://www.loc.gov/MARC21/slim">
+  <leader>00620ngm  22      a 4500</leader>
+  <controlfield tag="007">vd cvaiuu</controlfield>
+  <controlfield tag="008">070101p                          vueng d</controlfield>
+  <datafield tag="020" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="040" ind1="" ind2="">
+    <subfield code="a">CaOWA</subfield>
+  </datafield>
+  <datafield tag="090" ind1="" ind2="">
+    <subfield code="a"></subfield>
+    <subfield code="b"></subfield>
+  </datafield>
+  <datafield tag="100" ind1="1" ind2="">
+    <subfield code="a">,</subfield>
+    <subfield code="d"></subfield>
+  </datafield>
+  <datafield tag="240" ind1="" ind2="">
+    <subfield code="a">,</subfield>
+    <subfield code="m">,</subfield>
+    <subfield code="n">,</subfield>
+    <subfield code="r"></subfield>
+  </datafield>
+  <datafield tag="245" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+    <subfield code="h">[videorecording] /</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="250" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="260" ind1="" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">,</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="300" ind1="" ind2="">
+    <subfield code="a">1 videodisc (min.) :</subfield>
+    <subfield code="b">sd., col. ;</subfield>
+    <subfield code="c">4 3/4 in.</subfield>
+  </datafield>
+  <datafield tag="490" ind1="1" ind2="">
+    <subfield code="a">,</subfield>
+    <subfield code="x">;</subfield>
+    <subfield code="v"></subfield>
+  </datafield>
+  <datafield tag="500" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="504" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="505" ind1="0" ind2="0">
+    <subfield code="g">.</subfield>
+    <subfield code="t">/</subfield>
+    <subfield code="r">.--</subfield>
+  </datafield>
+  <datafield tag="508" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="511" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="538" ind1="" ind2="">
+    <subfield code="a">.--</subfield>
+  </datafield>
+  <datafield tag="520" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="600" ind1="1" ind2="0">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="650" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="700" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="710" ind1="2" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="830" ind1="" ind2="0">
+    <subfield code="a"></subfield>
+  </datafield>
+</record>
\ No newline at end of file
diff --git a/Open-ILS/src/templates/marc/OWA_ZPR_Book.xml b/Open-ILS/src/templates/marc/OWA_ZPR_Book.xml
new file mode 100644
index 0000000..a182ff5
--- /dev/null
+++ b/Open-ILS/src/templates/marc/OWA_ZPR_Book.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Template for Bibliographical records - - Monograph records
+  Author: Kare Bonasso and Shuzhen Zhao, University of Windsor
+    1.  This template is for reserves of books
+    2.  LAC code for University of Windsor is: CaOWA
+    3.  090 is ZPR call number for reserves; 092 is a course number
+   
+    
+  Marked Up: June 30, 2009 (Project Conifer)
+-->
+<record xmlns="http://www.loc.gov/MARC21/slim">
+  <leader>00620nam  22      a 4500</leader>
+  <controlfield tag="008">070101s           a          000 0 eng d</controlfield>
+  <datafield tag="040" ind1="" ind2="">
+    <subfield code="a">CaOWA</subfield>
+  </datafield>
+  <datafield tag="090" ind1="" ind2="">
+    <subfield code="a"></subfield>
+    <subfield code="b"></subfield>
+  </datafield>
+  <datafield tag="092" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="100" ind1="1" ind2="">
+    <subfield code="a">,</subfield>
+    <subfield code="d"></subfield>
+  </datafield>
+  <datafield tag="245" ind1="1" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">/</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="250" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="260" ind1="" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">,</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="300" ind1="" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">;</subfield>
+    <subfield code="c">cm.</subfield>
+  </datafield>
+  <datafield tag="490" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="500" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="700" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+</record>
\ No newline at end of file
diff --git a/Open-ILS/src/templates/marc/OWA_ZPR_Journal.xml b/Open-ILS/src/templates/marc/OWA_ZPR_Journal.xml
new file mode 100644
index 0000000..95aae86
--- /dev/null
+++ b/Open-ILS/src/templates/marc/OWA_ZPR_Journal.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Template for bibliographic record - - Periodicals
+  Author: Karen Bonasso, Shuzhen Zhao, University of Windsor
+       This template is for reserves of preiodicals
+
+  Marked Up: June 30, 2009 (Project Conifer)
+-->
+<record xmlns="http://www.loc.gov/MARC21/slim">
+  <leader>00620nas  22      a 4500</leader>
+  <controlfield tag="008">070101d           a          000 0 eng d</controlfield>
+  <datafield tag="040" ind1="" ind2="">
+    <subfield code="a">CaOWA</subfield>
+  </datafield>
+  <datafield tag="090" ind1="" ind2="">
+    <subfield code="a"></subfield>
+    <subfield code="b"></subfield>
+  </datafield>
+  <datafield tag="092" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="100" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="245" ind1="1" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">/</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="260" ind1="" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">,</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="300" ind1="" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">;</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="490" ind1="0" ind2="">
+    <subfield code="a"></subfield>
+    <subfield code="b">;</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="500" ind1="0" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="700" ind1="2" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+</record>
\ No newline at end of file
diff --git a/Open-ILS/src/templates/marc/OWA_ZPR_Music scores.xml b/Open-ILS/src/templates/marc/OWA_ZPR_Music scores.xml
new file mode 100644
index 0000000..ed2c0b6
--- /dev/null
+++ b/Open-ILS/src/templates/marc/OWA_ZPR_Music scores.xml	
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Template for Bibliographical records - - Music scores
+  Author: Karen Bonasson, Shuzhen Zhao, University of Windsor
+    1.  This template is for reserves of music scores
+   
+  Marked Up: June 30, 2009 (Project Conifer)
+-->
+<record xmlns="http://www.loc.gov/MARC21/slim">
+  <leader>00620ncm  22      a 4500</leader>
+  <controlfield tag="008">070101s           uuan rs     n  u eng d</controlfield>
+  <datafield tag="040" ind1="" ind2="">
+    <subfield code="a">CaOWA</subfield>
+  </datafield>
+  <datafield tag="090" ind1="" ind2="">
+    <subfield code="a"></subfield>
+    <subfield code="b"></subfield>
+  </datafield>
+  <datafield tag="092" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="100" ind1="1" ind2="">
+    <subfield code="a">,</subfield>
+    <subfield code="d"></subfield>
+  </datafield>
+  <datafield tag="245" ind1="1" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">/</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="250" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="260" ind1="" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">,</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="300" ind1="" ind2="">
+    <subfield code="a">1 score (p.) ;</subfield>
+    <subfield code="c">cm. +</subfield>
+    <subfield code="a">parts ;</subfield>
+    <subfield code="c">cm.</subfield>
+  </datafield>
+  <datafield tag="500" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="700" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+</record>
\ No newline at end of file
diff --git a/Open-ILS/src/templates/marc/OWA_ZPR_Sound recordings_CD.xml b/Open-ILS/src/templates/marc/OWA_ZPR_Sound recordings_CD.xml
new file mode 100644
index 0000000..319dfab
--- /dev/null
+++ b/Open-ILS/src/templates/marc/OWA_ZPR_Sound recordings_CD.xml	
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Template for Bibliographical records - - Sound recordings 
+  Author: Karen Bonasso, Shuzhen Zhao, University of Windsor
+      1. This template is for reserves of sound recordings
+    
+  Marked Up: June 30, 2009 (Project Conifer)-->
+<record xmlns="http://www.loc.gov/MARC21/slim">
+  <leader>00620njm  22      a 4500</leader>
+  <controlfield tag="007">sd  sngnnmmned</controlfield>
+  <controlfield tag="008">070101s                          zueng d</controlfield>
+  <datafield tag="040" ind1="" ind2="">
+    <subfield code="a">CaOWA</subfield>
+  </datafield>
+  <datafield tag="090" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="092" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="100" ind1="1" ind2="">
+    <subfield code="a">,</subfield>
+    <subfield code="d"></subfield>
+  </datafield>
+  <datafield tag="245" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+    <subfield code="h">[sound recording] /</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="300" ind1="" ind2="">
+    <subfield code="a">1 sound disc (min.) :</subfield>
+    <subfield code="b">digital, stereo. ;</subfield>
+    <subfield code="c">4 3/4 in.</subfield>
+  </datafield>
+  <datafield tag="500" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="700" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+</record>
\ No newline at end of file
diff --git a/Open-ILS/src/templates/marc/OWA_ZPR_Videorecording_DVD.xml b/Open-ILS/src/templates/marc/OWA_ZPR_Videorecording_DVD.xml
new file mode 100644
index 0000000..f1a20ef
--- /dev/null
+++ b/Open-ILS/src/templates/marc/OWA_ZPR_Videorecording_DVD.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Template for Bibliographical records - - Video Recordings: (DVD)
+  Author: Karen Bonasso, Shuzhen Zhao, University of Windsor
+     1. This template is for reserves of video recordings (DVD)
+  Marked Up: June 30, 2009 (Project Conifer)-->
+<record xmlns="http://www.loc.gov/MARC21/slim">
+  <leader>00620ngm  22      a 4500</leader>
+  <controlfield tag="007">vd cvaiuu</controlfield>
+  <controlfield tag="008">070101s                          vueng d</controlfield>
+  <datafield tag="040" ind1="" ind2="">
+    <subfield code="a">CaOWA</subfield>
+  </datafield>
+  <datafield tag="090" ind1="" ind2="">
+    <subfield code="a"></subfield>
+    <subfield code="b"></subfield>
+  </datafield>
+  <datafield tag="092" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="100" ind1="1" ind2="">
+    <subfield code="a">,</subfield>
+    <subfield code="d"></subfield>
+  </datafield>
+  <datafield tag="245" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+    <subfield code="h">[videorecording] /</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="260" ind1="" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">,</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="300" ind1="" ind2="">
+    <subfield code="a">1 videodisc (min.) :</subfield>
+    <subfield code="b">sd., col. ;</subfield>
+    <subfield code="c">4 3/4 in.</subfield>
+  </datafield>
+  <datafield tag="500" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="700" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+</record>
\ No newline at end of file
diff --git a/Open-ILS/src/templates/marc/OWA_ZPR_Videorecordings VHS.xml b/Open-ILS/src/templates/marc/OWA_ZPR_Videorecordings VHS.xml
new file mode 100644
index 0000000..71c18ba
--- /dev/null
+++ b/Open-ILS/src/templates/marc/OWA_ZPR_Videorecordings VHS.xml	
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Template for Bibliographical records - - Video recordings (VHS)
+  Author: Karen Bonasso, Shuzhen Zhao, University of Windsor
+       1. This template is for reserves of Video recordings (VHS)
+  Marked Up: June 30, 2009 (Project Conifer)-->
+<record xmlns="http://www.loc.gov/MARC21/slim">
+  <leader>00620njm  22      a 4500</leader>
+  <controlfield tag="007">vd cbahuu</controlfield>
+  <controlfield tag="008">070101s                          vueng d</controlfield>
+  <datafield tag="040" ind1="" ind2="">
+    <subfield code="a">CaOWA</subfield>
+  </datafield>
+  <datafield tag="090" ind1="" ind2="">
+    <subfield code="a"></subfield>
+    <subfield code="b"></subfield>
+  </datafield>
+  <datafield tag="092" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="100" ind1="1" ind2="">
+    <subfield code="a">,</subfield>
+    <subfield code="d"></subfield>
+  </datafield>
+  <datafield tag="245" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+    <subfield code="h">[videorecording] /</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="260" ind1="" ind2="">
+    <subfield code="a">:</subfield>
+    <subfield code="b">,</subfield>
+    <subfield code="c"></subfield>
+  </datafield>
+  <datafield tag="300" ind1="" ind2="">
+    <subfield code="a">1 videocassette (VHS)(min.) :</subfield>
+    <subfield code="b">sd., col, ;</subfield>
+    <subfield code="c">1/2 in.</subfield>
+  </datafield>
+  <datafield tag="500" ind1="" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+  <datafield tag="700" ind1="1" ind2="">
+    <subfield code="a"></subfield>
+  </datafield>
+</record>
\ No newline at end of file

commit a5079e748b85a35617e285ca23c45aeed2d62afc
Author: Dan Scott <dan at coffeecode.net>
Date:   Sun May 29 23:36:44 2011 -0400

    Treat a Polish l as an ASCII l in full-text search
    
    Is this code path even hit these days? Would have expected
    naco_normalize to be poking around here if that was the case...
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/fts.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/fts.pm
index 2857e2a..a07196b 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/fts.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/fts.pm
@@ -24,6 +24,9 @@
 		$term =~ s/(\pM+)//gos;
 		$term =~ s/(\b\.\b)//gos;
 
+		$term =~ s/\x{142}/l/sgo; # Convert Polish l (lowercase)
+		$term =~ s/\x{141}/l/sgo; # Convert Polish l (uppercase)
+
 		# hack to normalize ratio-like strings
 		while ($term =~ /\b\d{1}:[, ]?\d+(?:[ ,]\d+[^:])+/o) {
 			$term = $` . join ('', split(/[, ]/, $&)) . $';

commit 7166448dba7eafa6cfe629e47f937b5b42e2ec90
Author: Dan Scott <dscott at laurentian.ca>
Date:   Tue May 1 11:43:38 2012 -0400

    Restore the "Local Administration" link to the splash page
    
    From Local Admin we can get to Library Hours, and thence satisfaction.
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/xul/staff_client/server/index.xhtml b/Open-ILS/xul/staff_client/server/index.xhtml
index fafe2a1..69c7baf 100644
--- a/Open-ILS/xul/staff_client/server/index.xhtml
+++ b/Open-ILS/xul/staff_client/server/index.xhtml
@@ -128,7 +128,10 @@
                                 xulG.set_tab(loc, params, {}); 
                 }
                 function local_admin(newtab) {
-                        var loc = urls.XUL_REMOTE_BROWSER + '?url=' + window.escape(urls.XUL_LOCAL_ADMIN + '?ses=' + window.escape(ses()) + '&session=' + window.escape(ses())); 
+                        // var loc = urls.XUL_REMOTE_BROWSER + '?url=' + window.escape(urls.XUL_LOCAL_ADMIN + '?ses=' + window.escape(ses()) + '&session=' + window.escape(ses())); 
+                        // Crude hack - but works, whereas the previous does not
+                        var loc = '/xul/server/admin' + '?ses=' + window.escape(ses()) + '&session=' + window.escape(ses());
+
                         var params = {'tab_name':'Local Administration', 'browser' : true };
                         var content_params = { 'no_xulG' : false, 'show_nav_buttons' : true, 'show_print_button' : true };
                         
@@ -537,6 +540,15 @@
               "#" onclick=
               "try { receipt_editor(false); } catch(E) { alert(E); }; return false;">&staff.client.portal.receipts;</a></td>
             </tr>
+            <tr>
+              <td height="50"></td>
+
+              <td><img class="newtabimg" src="skin/media/images/portal/newtab2.PNG" alt="Open in a new tab"
+              onclick="try { local_admin(); } catch(E) { alert(E); }" /> <a href=
+              "#" onclick=
+              "try { local_admin(); } catch(E) { alert(E); }; return false;">Local administration</a></td>
+            </tr>
+
           </table>
         </div>
       </td>

commit e25147c2aa494dced52e0b6456cdba9177846620
Author: Dan Scott <dscott at laurentian.ca>
Date:   Tue May 1 10:50:17 2012 -0400

    Robin's interface for managing library hours
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/xul/staff_client/server/admin/hours.xhtml b/Open-ILS/xul/staff_client/server/admin/hours.xhtml
new file mode 100644
index 0000000..4891bc6
--- /dev/null
+++ b/Open-ILS/xul/staff_client/server/admin/hours.xhtml
@@ -0,0 +1,208 @@
+<?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>Hours of Operation</title>
+
+<!-- STYLES - note this contains a reference to tundra.css which is the basis of the dijit widgets -->
+<link type='text/css' rel='stylesheet' href='admin.css'/>
+
+<!-- Include required scripts for basic OpenSRF-over-HTTP -->
+<script type='text/javascript' src='/opac/common/js/opensrf.js'></script>     
+<script type='text/javascript' src='/opac/common/js/opensrf_xhr.js'></script> 
+<script type='text/javascript' src='/opac/common/js/JSON_v1.js'></script>     
+<script type='text/javascript' src='/opac/common/js/md5.js'></script>  
+
+<!-- Includes required to try and retrieve the org unit name -->       
+<!-- script type='text/javascript' src='/opac/common/js/org_utils.js'></script --> 
+<!-- script type='text/javascript' src='/opac/common/js/<!--#echo var="locale"-->/OrgTree.js'></script --> 
+<!-- script language='javascript' src='adminlib.js'> </script -->
+
+<!-- Dojo / digit libs -->
+<script type='text/javascript' src='/js/dojo/dojo/dojo.js' djConfig='parseOnLoad: true, isDebug:false'></script>
+<script type="text/javascript" src="js/dojotoolkit/dojo/dojo.js" djConfig="parseOnLoad:true, isDebug:true"></script>
+
+<!-- DEBUG -->
+<!--script type='text/javascript' src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'></script -->
+
+
+<script type='text/javascript'>
+
+dojo.require('dojo.cookie');
+dojo.require('openils.User');
+dojo.require('openils.PermaCrud');
+dojo.require('dijit.form.Button');
+dojo.require('dijit.form.Form');
+dojo.require("dijit.form.TimeTextBox");
+
+var myToken;
+var myOuid;
+
+function initPage(){
+
+    myToken = dojo.cookie('ses');    //need to catch if this goes wrong
+    var user = new openils.User({authtoken:myToken});
+    myOuid =  user.user.ws_ou();
+
+    var f = new dijit.form.Form({id:"formHours"}, "formHours");
+    var oConstraints = {timePattern: "HH:mm:ss", clickableIncrement: "T00:15:00", visibleIncrement: "T00:15:00", visibleRange: "T01:00:00"};
+
+
+    var oDow_0_open = new dijit.form.TimeTextBox({id:"dow_0_open", constraints: oConstraints}, "dow_0_open");
+
+    var oDow_0_close = new dijit.form.TimeTextBox({id:"dow_0_close", constraints: oConstraints}, "dow_0_close");
+
+    var oDow_1_open = new dijit.form.TimeTextBox({id:"dow_1_open", constraints: oConstraints}, "dow_1_open");
+    var oDow_1_close = new dijit.form.TimeTextBox({id:"dow_1_close", constraints: oConstraints}, "dow_1_close");
+
+    var oDow_2_open = new dijit.form.TimeTextBox({id:"dow_2_open", constraints: oConstraints}, "dow_2_open");
+    var oDow_2_close = new dijit.form.TimeTextBox({id:"dow_2_close", constraints: oConstraints}, "dow_2_close");
+
+    var oDow_3_open = new dijit.form.TimeTextBox({id:"dow_3_open", constraints: oConstraints}, "dow_3_open");
+    var oDow_3_close = new dijit.form.TimeTextBox({id:"dow_3_close", constraints: oConstraints}, "dow_3_close");
+
+    var oDow_4_open = new dijit.form.TimeTextBox({id:"dow_4_open", constraints: oConstraints}, "dow_4_open");
+    var oDow_4_close = new dijit.form.TimeTextBox({id:"dow_4_close", constraints: oConstraints}, "dow_4_close");
+
+    var oDow_5_open = new dijit.form.TimeTextBox({id:"dow_5_open", constraints: oConstraints}, "dow_5_open");
+    var oDow_5_close = new dijit.form.TimeTextBox({id:"dow_5_close", constraints: oConstraints}, "dow_5_close");
+
+    var oDow_6_open = new dijit.form.TimeTextBox({id:"dow_6_open", constraints: oConstraints}, "dow_6_open");
+    var oDow_6_close = new dijit.form.TimeTextBox({id:"dow_6_close", constraints: oConstraints}, "dow_6_close");
+    
+    var oButton = new dijit.form.Button({id:"submit", 
+                                        label:"submit",
+                                        onClick:function(){
+                                            setHours("update");
+                                        }},
+                                        "submit");
+
+    document.getElementById("title_tag").innerHTML = "<h2>Hours of operation for: " + myOuid + "</h2>";    
+
+    setHours("display"); 
+}
+
+ 
+function setHours(action){
+
+    var pcrud =  new openils.PermaCrud({"authtoken":myToken});
+    var myHours = pcrud.retrieve("aouhoo", myOuid);
+
+    if (myHours == null){
+        var default_hours = new aouhoo();
+        default_hours.id(myOuid);
+        pcrud.create(default_hours);
+        myHours = pcrud.retrieve("aouhoo", myOuid);
+}
+
+
+    if (myHours.id() != myOuid) {
+        document.getElementById("status_tag").innerHTML = "<b>You are trying to edit the hours of a branch you don't work at.</b>";
+        return;
+    }
+
+    switch(action){
+        case 'display':
+            dojo.query("input[id^='dow']").forEach(
+                function (item) {
+                    item.value = myHours[item.id](); 
+                }
+            );
+        break;
+
+        case 'update':
+            dojo.query("input[id^='dow']").forEach(
+                function (item) {
+                    myHours[item.id](item.value);
+                }
+            ); 
+
+            pcrud.update(myHours);
+            document.getElementById("status_tag").innerHTML = "<b>Update Sucessful</b>"; //should check sucess first, don't know how though
+        break;
+    }
+    
+
+}
+
+
+dojo.addOnLoad(initPage);
+
+
+</script>
+
+
+</head>
+<body class='tundra'>
+<div id='title_tag'></div>
+<div id='status_tag'></div>
+<div id='divHours' name='divHours'>
+    <form name='formHours' id='formHours'>
+    <table border='0'>
+        <tr>       
+            <td></td>
+            <td>From:</td>
+            <td></td>
+            <td>To:</td>
+       </tr>
+       <tr>
+            <td>Sunday</td>
+            <td><input id='dow_0_open'></input></td>
+            <td></td>
+            <td><input id='dow_0_close'></input></td>
+       </tr>
+       <tr>
+            <td>Monday</td>
+            <td><input id='dow_1_open'></input></td>
+            <td></td>
+            <td><input id='dow_1_close'></input></td>
+        </tr>
+        <tr> 
+            <td>Tuesday</td>
+            <td><input id='dow_2_open'></input></td>
+            <td></td>
+            <td><input id='dow_2_close'></input></td> 
+        </tr>
+        <tr>
+            <td>Wednesday</td>
+            <td><input id='dow_3_open'></input></td>
+            <td></td>
+            <td><input id='dow_3_close'></input></td>
+        </tr>
+        <tr>
+            <td>Thursday</td>
+            <td><input id='dow_4_open'></input></td>
+            <td></td>
+            <td><input id='dow_4_close'></input></td>
+        </tr>
+        <tr> 
+            <td>Friday</td>
+            <td><input id='dow_5_open'></input></td>
+            <td></td>
+            <td><input id='dow_5_close'></input></td>
+        </tr>
+        <tr>
+            <td>Saturday</td>
+            <td><input id='dow_6_open'></input></td>
+            <td></td>
+            <td><input id='dow_6_close'></input></td>
+        </tr>
+        <tr>
+            <td></td>
+            <td><button id='submit' name='abutton'></button></td>
+        </tr>
+    </table>
+    </form> 
+</div>
+
+
+
+</body>
+</html>
diff --git a/Open-ILS/xul/staff_client/server/admin/index.xhtml b/Open-ILS/xul/staff_client/server/admin/index.xhtml
index ea4a3f1..35d8dc1 100644
--- a/Open-ILS/xul/staff_client/server/admin/index.xhtml
+++ b/Open-ILS/xul/staff_client/server/admin/index.xhtml
@@ -65,6 +65,10 @@
                             <div style='padding: 8px;'>
                                 <a href='javascript:_l("copy_locations.xhtml");'>&staff.server.admin.index.copy_locations;</a>
                             </div>
+
+                            <div style='padding: 8px;'>
+                                <a href='javascript:_l("hours.xhtml");'>Hours</a>
+                            </div>
                             <div style='padding: 8px;'>
                                 <a href='javascript:_l("org_unit_settings.xhtml");'>&staff.server.admin.index.library_settings;</a>
                             </div>

-----------------------------------------------------------------------


hooks/post-receive
-- 
Evergreen ILS


More information about the open-ils-commits mailing list