--- /dev/null
+package OpenILS::WWW::EGCatLoader;
+use strict; use warnings;
+use Apache2::Const -compile => qw(OK FORBIDDEN HTTP_INTERNAL_SERVER_ERROR);
+use OpenSRF::Utils::Logger qw/$logger/;
+use OpenSRF::Utils::JSON;
+use OpenSRF::Utils qw/:datetime/;
+use OpenILS::Utils::Fieldmapper;
+use OpenILS::Application::AppUtils;
+use OpenILS::Utils::CStoreEditor qw/:funcs/;
+use OpenILS::Event;
+use Data::Dumper;
+use LWP::UserAgent;
+use DateTime;
+use Digest::MD5 qw(md5_hex);
+$Data::Dumper::Indent = 0;
+my $U = 'OpenILS::Application::AppUtils';
+
+my @api_fields = (
+ {name => 'vendor_username', required => 1},
+ {name => 'vendor_password', required => 1},
+ {name => 'first_given_name', class => 'au', required => 1},
+ {name => 'second_given_name', class => 'au'},
+ {name => 'family_name', class => 'au', required => 1},
+ {name => 'suffix', class => 'au'},
+ {name => 'email', class => 'au', required => 1},
+ {name => 'passwd', class => 'au', required => 1},
+ {name => 'day_phone', class => 'au', required => 0},
+ {name => 'dob', class => 'au', required => 1},
+ {name => 'home_ou', class => 'au', required => 1},
+ {name => 'ident_type', class => 'au', required => 0},
+ {name => 'ident_value', class => 'au', required => 0},
+ {name => 'guardian',
+ class => 'au',
+ notes => "AKA parent/guardian",
+ required_if => 'Patron is less than 18 years old'
+ },
+ {name => 'pref_first_given_name', class => 'au'},
+ {name => 'pref_second_given_name', class => 'au'},
+ {name => 'pref_family_name', class => 'au'},
+ {name => 'pref_suffix', class => 'au'},
+ {name => 'physical_street1', class => 'aua', required => 1},
+ {name => 'physical_street1_name'},
+ {name => 'physical_street2', class => 'aua'},
+ {name => 'physical_city', class => 'aua', required => 1},
+ {name => 'physical_post_code', class => 'aua', required => 1},
+ {name => 'physical_county', class => 'aua', required => 1},
+ {name => 'physical_state', class => 'aua', required => 1},
+ {name => 'physical_country', class => 'aua', required => 1},
+ {name => 'mailing_street1', class => 'aua', required => 1},
+ {name => 'mailing_street1_name'},
+ {name => 'mailing_street2', class => 'aua'},
+ {name => 'mailing_city', class => 'aua', required => 1},
+ {name => 'mailing_post_code', class => 'aua', required => 1},
+ {name => 'mailing_county', class => 'aua', required => 1},
+ {name => 'mailing_state', class => 'aua', required => 1},
+ {name => 'mailing_country', class => 'aua', required => 1},
+ {name => 'voter_registration', class => 'asvr', required => 0},
+ {name => 'in_house_registration', required => 0},
+ {name => 'newsletter', required => 0},
+);
+
+
+sub load_ecard_form {
+ my $self = shift;
+ my $path = shift; # Give us the path to determine the language
+ my $ctx = $self->ctx;
+ my $cgi = $self->cgi;
+
+ my $ctx_org = $ctx->{physical_loc} || $self->_get_search_lib();
+ $ctx->{ecard} = {};
+ $ctx->{ecard}->{enabled} = $U->is_true($U->ou_ancestor_setting_value(
+ $ctx_org, 'opac.ecard_registration_enabled'
+ ));
+ $ctx->{ecard}->{quipu_id} = $U->ou_ancestor_setting_value(
+ $ctx_org, 'lib.ecard_quipu_id'
+ ) || 0;
+
+ # Determine the language code from the path
+ $ctx->{ecard}->{lang} = 'en'; # English is default
+ if ($path =~ m|opac/ecard/form_([a-z]{2})|) {
+ $ctx->{ecard}->{lang} = $1;
+ }
+
+ return Apache2::Const::OK;
+}
+
+# TODO: wrap the following in a check for a library setting as to whether or not
+# to require emailed verification
+
+## Random 6-character alpha-numeric code that avoids look-alike characters
+## https://ux.stackexchange.com/questions/53341/are-there-any-letters-numbers-that-should-be-avoided-in-an-id
+## Also exclude vowels to avoid creating any real (potentially offensive) words.
+#my @code_chars = ('C','D','F','H','J'..'N','P','R','T','V','W','X','3','4','7','9');
+#sub generate_verify_code {
+# my $string = '';
+# $string .= $code_chars[rand @code_chars] for 1..6;
+# return $string;
+#}
+#
+#
+## only if we're verifying the card via email
+#sub load_ecard_verify {
+# my $self = shift;
+# my $cgi = $self->cgi;
+# $self->collect_header_footer;
+#
+# # Loading the form.
+# return Apache2::Const::OK if $cgi->request_method eq 'GET';
+#
+# #$self->verify_ecard;
+# return Apache2::Const::OK;
+#}
+#
+#sub verify_ecard {
+# my $self = shift;
+# my $cgi = $self->cgi;
+# my $ctx = $self->ctx;
+# $self->log_params;
+#
+# my $verify_code = $ctx->{verify_code} = $cgi->param('verification_code');
+# my $barcode = $ctx->{barcode} = $cgi->param('barcode');
+#
+# $ctx->{verify_failed} = 1;
+#
+# my $e = new_editor();
+#
+# my $au = $e->search_actor_user({
+# profile => $PROVISIONAL_ECARD_GRP,
+# ident_type => $ECARD_VERIFY_IDENT,
+# ident_value => $verify_code
+# })->[0];
+#
+# if (!$au) {
+# $logger->warn(
+# "ECARD: No provisional ecard found with code $verify_code");
+# sleep 2; # Mitigate brute-force attacks
+# return;
+# }
+#
+# my $card = $e->search_actor_card({
+# usr => $au->id,
+# barcode => $barcode
+# })->[0];
+#
+# if (!$card) {
+# $logger->warn("ECARD: Failed to match verify code ".
+# "($verify_code) with provided barcode ($barcode)");
+# sleep 2; # Mitigate brute-force attacks
+# return;
+# }
+#
+# # Verification looks good. Update the account.
+#
+# my $grp = new_editor()->retrieve_permission_grp_tree($FULL_ECARD_GRP);
+#
+# $au->profile($grp->id);
+# $au->expire_date(
+# DateTime->now(time_zone => 'local')->add(
+# seconds => interval_to_seconds($grp->perm_interval))->iso8601()
+# );
+#
+# $e->xact_begin;
+#
+# unless ($e->update_actor_user($au)) {
+# $logger->error("ECARD update failed for $barcode: " . $e->die_event);
+# return;
+# }
+#
+# $e->commit;
+# $logger->info("ECARD: Update to full ecard succeeded for $barcode");
+#
+# $ctx->{verify_success} = 1;
+# $ctx->{verify_failed} = 0;
+#
+# return;
+#}
+
+
+sub log_params {
+ my $self = shift;
+ my $cgi = $self->cgi;
+ my @params = $cgi->param;
+
+ my $msg = '';
+ for my $p (@params) {
+ next if $p =~ /pass/;
+ $msg .= "|" if $msg;
+ $msg .= "$p=".$cgi->param($p);
+ }
+
+ $logger->info("ECARD: Submit params: $msg");
+}
+
+sub handle_testmode_api {
+ my $self = shift;
+ my $ctx = $self->ctx;
+
+ # Strip data we don't want to publish.
+ my @doc_fields;
+ for my $field_info (@api_fields) {
+ my $doc_info = {};
+ for my $info_key (keys %$field_info) {
+ $doc_info->{$info_key} = $field_info->{$info_key}
+ unless $info_key eq 'class';
+ }
+ push(@doc_fields, $doc_info);
+ }
+
+ $ctx->{response}->{messages} = [fields => \@doc_fields];
+ $ctx->{response}->{status} = 'API_OK';
+ return $self->compile_response;
+}
+
+sub handle_datamode_api {
+ my $self = shift;
+ my $datamode = shift;
+ my $ctx = $self->ctx;
+
+ if ($datamode =~ /org_units/) {
+ my $orgs = new_editor()->search_actor_org_unit({opac_visible => 't'});
+ my $list = [
+ map {
+ {name => $_->name, id => $_->id, parent_ou => $_->parent_ou}
+ } @$orgs
+ ];
+ $ctx->{response}->{messages} = [org_units => $list];
+ }
+
+ $ctx->{response}->{status} = 'DATA_OK';
+ return $self->compile_response;
+}
+
+sub load_ecard_submit {
+ my $self = shift;
+ my $ctx = $self->ctx;
+ my $cgi = $self->cgi;
+
+ $self->log_params;
+
+ my $testmode = $cgi->param('testmode') || '';
+ my $datamode = $cgi->param('datamode') || '';
+
+ my $e = $ctx->{editor} = new_editor();
+ $ctx->{response} = {messages => []};
+
+ if ($testmode eq 'CONNECT') {
+ $ctx->{response}->{status} = 'CONNECT_OK';
+ return $self->compile_response;
+ }
+
+ return Apache2::Const::FORBIDDEN unless
+ $cgi->request_method eq 'POST' &&
+ $self->verify_vendor_host &&
+ $self->login_vendor;
+
+ if ($testmode eq 'AUTH') {
+ # If we got this far, the caller is authorized.
+ $ctx->{response}->{status} = 'AUTH_OK';
+ return $self->compile_response;
+ }
+
+ return $self->handle_testmode_api if $testmode eq 'API';
+ return $self->handle_datamode_api($datamode) if $datamode;
+
+ return $self->compile_response unless $self->make_user;
+ return $self->compile_response unless $self->add_addresses;
+ return $self->compile_response unless $self->add_stat_cats;
+ return $self->compile_response unless $self->check_dupes;
+ return $self->compile_response unless $self->add_card;
+ # Add survey responses commented out because it is not universal.
+ # We should come up with a way to configure it before uncommenting
+ # it globally.
+ #return $self->compile_response unless $self->add_survey_responses;
+ return $self->compile_response unless $self->save_user;
+ return $self->compile_response unless $self->add_usr_settings;
+ return $self->compile_response if $ctx->{response}->{status};
+
+ # The code below does nothing in a stock Evergreen installation.
+ # It is included in case a site wishes to set up action trigger
+ # events to do some additional verification or notification for
+ # patrons who have signed up for an eCard.
+ $U->create_events_for_hook(
+ 'au.create.ecard', $ctx->{user}, $ctx->{user}->home_ou);
+
+ $ctx->{response}->{status} = 'OK';
+ $ctx->{response}->{barcode} = $ctx->{user}->card->barcode;
+ $ctx->{response}->{expiration_date} = substr($ctx->{user}->expire_date, 0, 10);
+
+ return $self->compile_response;
+}
+
+# E-card vendor is not a regular account. They must have an entry in
+# the password table with password type ecard_vendor.
+sub login_vendor {
+ my $self = shift;
+ my $username = $self->cgi->param('vendor_username');
+ my $password = $self->cgi->param('vendor_password');
+ my $home_ou = $self->cgi->param('home_ou');
+
+ my $e = new_editor();
+ my $vendor = $e->search_actor_user({usrname => $username})->[0];
+ return 0 unless $vendor;
+
+ return unless $U->verify_user_password(
+ $e, $vendor->id, $password, 'ecard_vendor');
+
+ # Auth checks out OK. Manually create an authtoken
+ my %admin_settings = $U->ou_ancestor_setting_batch_insecure(
+ $home_ou,
+ [
+ 'lib.ecard_admin_usrname',
+ 'lib.ecard_admin_org_unit'
+ ]
+ );
+ my $admin_usr = $e->search_actor_user({usrname => $admin_settings{'lib.ecard_admin_usrname'}->{'value'}})->[0]
+ || $vendor;
+ my $admin_org = $admin_settings{'lib.ecard_admin_org_unit'}->{'value'} || 1;
+ my $auth = $U->simplereq(
+ 'open-ils.auth_internal',
+ 'open-ils.auth_internal.session.create',
+ {user_id => $admin_usr->id(), org_unit => $admin_org, login_type => 'temp'}
+ );
+
+ return unless $auth && $auth->{textcode} eq 'SUCCESS';
+
+ $self->ctx->{authtoken} = $auth->{payload}->{authtoken};
+
+ return 1;
+}
+
+sub verify_vendor_host {
+ my $self = shift;
+ # TODO
+ # Confirm calling host matches AOUS ecard.vendor.host
+ # NOTE: we may not have that information inside the firewall.
+ return 1;
+}
+
+
+sub compile_response {
+ my $self = shift;
+ my $ctx = $self->ctx;
+ $self->apache->content_type("application/json; charset=utf-8");
+ $ctx->{response} = OpenSRF::Utils::JSON->perl2JSON($ctx->{response});
+ $logger->info("ECARD responding with " . $ctx->{response});
+ return Apache2::Const::OK;
+}
+
+my %keep_case = (usrname => 1, passwd => 1, email => 1);
+sub upperclense {
+ my $self = shift;
+ my $field = shift;
+ my $value = shift;
+ $value = uc($value) unless $keep_case{$field};
+ $value = lc($value) if $field eq 'email'; # force it
+ $value =~ s/(^\s*|\s*$)//g;
+ return $value;
+}
+
+# Create actor.usr perl object and populate column data
+sub make_user {
+ my $self = shift;
+ my $ctx = $self->ctx;
+ my $cgi = $self->cgi;
+
+ my $au = Fieldmapper::actor::user->new;
+
+ $au->isnew(1);
+ $au->net_access_level(1); # Filtered
+ my $home_ou = $cgi->param('home_ou');
+
+ my $perm_grp = $U->ou_ancestor_setting_value(
+ $home_ou,
+ 'lib.ecard_patron_profile'
+ );
+
+ $au->profile($perm_grp);
+ my $grp = new_editor()->retrieve_permission_grp_tree($perm_grp);
+
+ $au->expire_date(
+ DateTime->now(time_zone => 'local')->add(
+ seconds => interval_to_seconds($grp->perm_interval))->iso8601()
+ );
+
+ for my $field_info (@api_fields) {
+ my $field = $field_info->{name};
+ next unless $field_info->{class} eq 'au';
+
+ my $val = $cgi->param($field);
+
+ $au->juvenile(1) if $field eq 'guardian' && $val;
+ $au->day_phone(undef) if $field eq 'day_phone' && $val eq '--';
+
+ if ($field_info->{required} && !$val) {
+ my $msg = "Value required for field: '$field'";
+ $ctx->{response}->{status} = 'INVALID_PARAMS';
+ push(@{$ctx->{response}->{messages}}, $msg);
+ $logger->error("ECARD $msg");
+ }
+
+ $self->verify_dob($val) if $field eq 'dob' && $val;
+ $au->$field($val);
+ }
+
+ # CW MARS: Force ident_type to 1.
+ $au->ident_type(1);
+
+ return undef if $ctx->{response}->{status};
+ return $ctx->{user} = $au;
+}
+
+sub add_card {
+ my $self = shift;
+ my $ctx = $self->ctx;
+ my $cgi = $self->cgi;
+ my $user = $ctx->{user};
+ my $home_ou = $cgi->param('home_ou');
+
+ my %settings = $U->ou_ancestor_setting_batch_insecure(
+ $home_ou,
+ [
+ 'lib.ecard_barcode_prefix',
+ 'lib.ecard_barcode_length',
+ 'lib.ecard_barcode_calculate_checkdigit'
+ ]
+ );
+ my $prefix = $settings{'lib.ecard_barcode_prefix'}->{'value'}
+ || 'AUTO';
+ my $length = $settings{'lib.card_barcode_length'}->{'value'}
+ || 14;
+ my $cd = $settings{'lib.ecard_barcode_calculate_checkdigit'}->{'value'}
+ || 0;
+
+ my $barcode = $U->generate_barcode(
+ $prefix,
+ $length,
+ $U->is_true($cd),
+ 'actor.auto_barcode_ecard_seq'
+ );
+
+ $logger->info("ECARD using generated barcode: $barcode");
+
+ my $card = Fieldmapper::actor::card->new;
+ $card->id(-1);
+ $card->isnew(1);
+ $card->usr($user->id);
+ $card->barcode($barcode);
+
+ # username defaults to barcode
+ $user->usrname($barcode);
+ $user->card($card);
+ $user->cards([$card]);
+
+ return 1;
+}
+
+# Returns 1 on success, undef on error.
+sub verify_dob {
+ my $self = shift;
+ my $dob = shift;
+ my $ctx = $self->ctx;
+ my $cgi = $self->cgi;
+
+ my @parts = split(/-/, $dob);
+ my $dob_date;
+
+ eval { # avoid dying on funky dates
+ $dob_date = DateTime->new(
+ year => $parts[0], month => $parts[1], day => $parts[2]);
+ };
+
+ if (!$dob_date || $dob_date > DateTime->now) {
+ my $msg = "Invalid dob: '$dob'";
+ $ctx->{response}->{status} = 'INVALID_PARAMS';
+ push(@{$ctx->{response}->{messages}}, $msg);
+ $logger->error("ECARD $msg");
+ return undef;
+ }
+
+ # Check if guardian required for underage patrons.
+ # TODO: Add our own setting for this.
+ my $guardian_required = $U->ou_ancestor_setting_value(
+ $cgi->param('home_ou'),
+ 'ui.patron.edit.guardian_required_for_juv'
+ );
+
+ my $comp_date = DateTime->now;
+ $comp_date->set_hour(0);
+ $comp_date->set_minute(0);
+ $comp_date->set_second(0);
+ # The juvenile age should be configurable.
+ $comp_date->subtract(years => 18); # juv age
+
+ if ($U->is_true($guardian_required)
+ && $dob_date > $comp_date
+ && !$cgi->param('guardian')) {
+
+ my $msg = "Parent/Guardian (guardian) is required for patrons ".
+ "under 18 years of age. dob=$dob";
+ $ctx->{response}->{status} = 'INVALID_PARAMS';
+ push(@{$ctx->{response}->{messages}}, $msg);
+ $logger->error("ECARD $msg");
+ return undef;
+ }
+
+ return 1;
+}
+
+# returns true if the addresses contain all of the same values.
+sub addrs_match {
+ my ($self, $addr1, $addr2) = @_;
+ for my $field ($addr1->real_fields) {
+ return 0 if ($addr1->$field() || '') ne ($addr2->$field() || '');
+ }
+ return 1;
+}
+
+
+sub add_addresses {
+ my $self = shift;
+ my $cgi = $self->cgi;
+ my $ctx = $self->ctx;
+ my $e = $ctx->{editor};
+ my $user = $ctx->{user};
+
+ my $physical_addr = Fieldmapper::actor::user_address->new;
+ $physical_addr->isnew(1);
+ $physical_addr->usr($user->id);
+ $physical_addr->address_type('PHYSICAL');
+ $physical_addr->within_city_limits('f');
+
+ my $mailing_addr = Fieldmapper::actor::user_address->new;
+ $mailing_addr->isnew(1);
+ $mailing_addr->usr($user->id);
+ $mailing_addr->address_type('MAILING');
+ $mailing_addr->within_city_limits('f');
+
+ # Use as both billing and mailing via virtual ID.
+ $physical_addr->id(-1);
+ $mailing_addr->id(-2);
+ $user->billing_address(-1);
+ $user->mailing_address(-2);
+
+ # Confirm we have values for all of the required fields.
+ # Apply values to our in-progress address object.
+ for my $field_info (@api_fields) {
+ my $field = $field_info->{name};
+ next unless $field =~ /physical|mailing/;
+ next if $field =~ /street1_/;
+
+ my $val = $cgi->param($field);
+
+ if ($field_info->{required} && !$val) {
+ my $msg = "Value required for field: '$field'";
+ $ctx->{response}->{status} = 'INVALID_PARAMS';
+ push(@{$ctx->{response}->{messages}}, $msg);
+ $logger->error("ECARD $msg");
+ }
+
+ if ($field =~ /physical/) {
+ (my $col_field = $field) =~ s/physical_//g;
+ $physical_addr->$col_field($val);
+ } else {
+ (my $col_field = $field) =~ s/mailing_//g;
+ $mailing_addr->$col_field($val);
+ }
+
+ }
+
+ # exit if there were any errors above.
+ return undef if $ctx->{response}->{status};
+
+ $user->billing_address($physical_addr);
+ $user->mailing_address($mailing_addr);
+ $user->addresses([$physical_addr, $mailing_addr]);
+
+ return 1;
+}
+
+# TODO: The code in add_usr_settings is totally arbitrary and should
+# be modified to look up settings in the database.
+sub add_usr_settings {
+ my $self = shift;
+ my $cgi = $self->cgi;
+ my $ctx = $self->ctx;
+ my $user = $ctx->{user};
+ my %settings = (
+ 'opac.hold_notify' => 'email'
+ );
+
+ $U->simplereq(
+ 'open-ils.actor',
+ 'open-ils.actor.patron.settings.update',
+ $self->ctx->{authtoken}, $user->id, \%settings);
+
+ return 1;
+}
+
+# TODO: This implementation of add_survey_responses is PINES-specific.
+# KCLS does something else. The line that calls this subroutine is
+# commented out above. This should be modified to look up settings in
+# the database.
+sub add_survey_responses {
+ my $self = shift;
+ my $cgi = $self->cgi;
+ my $user = $self->ctx->{user};
+ my $answer = $cgi->param('voter_registration');
+
+ my $survey_response = Fieldmapper::action::survey_response->new;
+ $survey_response->id(-1);
+ $survey_response->isnew(1);
+ $survey_response->survey(1); # voter registration survey
+ $survey_response->question(1);
+ $survey_response->answer($answer);
+
+ $user->survey_responses([$survey_response]);
+ return 1;
+}
+
+# TODO: this is CW MARS-specific, but maybe we can make it something
+# generic for adding stat cats to the patron
+
+sub add_stat_cats {
+ my $self = shift;
+ my $cgi = $self->cgi;
+ my $user = $self->ctx->{user};
+
+ my $newsletter = $cgi->param('newsletter');
+ my $map = Fieldmapper::actor::stat_cat_entry_user_map->new;
+ $map->isnew(1);
+ $map->stat_cat(28);
+ $map->stat_cat_entry($newsletter ? 'Yes' : 'No');
+
+ $user->stat_cat_entries([$map]);
+ return 1;
+}
+
+# Returns true if no dupes found, false if dupes are found.
+sub check_dupes {
+ my $self = shift;
+ my $ctx = $self->ctx;
+ my $user = $ctx->{user};
+ my $addr = $user->addresses->[0];
+ my $e = new_editor();
+
+ #TODO: This list of fields should be configurable so that code
+ #changes are not required for different sites with different
+ #criteria.
+ my @dupe_patron_fields =
+ qw/first_given_name family_name dob/;
+
+ my $search = {
+ first_given_name => {value => $user->first_given_name, group => 0},
+ family_name => {value => $user->family_name, group => 0},
+ dob => {value => substr($user->dob, 0, 4), group => 0} # birth year
+ };
+
+ my $root_org = $e->search_actor_org_unit({parent_ou => undef})->[0];
+
+ my $ids = $U->storagereq(
+ "open-ils.storage.actor.user.crazy_search",
+ $search,
+ 1000, # search limit
+ undef, # sort
+ 1, # include inactive
+ $root_org->id, # ws_ou
+ $root_org->id # search_ou
+ );
+
+ return 1 if @$ids == 0;
+
+ $logger->info("ECARD found potential duplicate patrons: @$ids");
+
+ if (my $streetname = $self->cgi->param('physical_street1_name')) {
+ # We found matching patrons. Perform a secondary check on the
+ # address street name only.
+
+ $logger->info("ECARD secondary search on street name: $streetname");
+
+ my $addr_ids = $e->search_actor_user_address(
+ { usr => $ids,
+ street1 => {'~*' => "(^| )$streetname( |\$)"}
+ }, {idlist => 1}
+ );
+
+ if (@$addr_ids) {
+ # we don't really care what patrons match at this point,
+ # only whether a match is found.
+ $ids = [1];
+ $logger->info("ECARD secondary address check match(es) ".
+ "found on address(es) @$addr_ids");
+
+ } else {
+ $ids = [];
+ $logger->info(
+ "ECARD secondary address check found no matches");
+ }
+
+ } else {
+ $ids = [];
+ # unclear if this is a possibility -- err on the side of allowing
+ # the registration.
+ $logger->info("ECARD found possible patron match but skipping ".
+ "secondary street name check -- no street name was provided");
+ }
+
+ return 1 if @$ids == 0;
+
+ $ctx->{response}->{status} = 'DUPLICATE';
+ $ctx->{response}->{messages} = ['first_given_name',
+ 'family_name', 'dob_year', 'billing_street1_name'];
+ return undef;
+}
+
+
+sub save_user {
+ my $self = shift;
+ my $ctx = $self->ctx;
+ my $cgi = $self->cgi;
+ my $user = $ctx->{user};
+
+ my $resp = $U->simplereq(
+ 'open-ils.actor',
+ 'open-ils.actor.patron.update',
+ $self->ctx->{authtoken}, $user
+ );
+
+ $resp = {textcode => 'UNKNOWN_ERROR'} unless $resp;
+
+ if ($U->is_event($resp)) {
+
+ my $msg = "Error creating user account: " . $resp->{textcode};
+ $logger->error("ECARD: $msg");
+
+ $ctx->{response}->{status} = 'CREATE_ERR';
+ $ctx->{response}->{messages} = [{msg => $msg, pid => $$}];
+
+ return 0;
+ }
+
+ $ctx->{user} = $resp;
+ return 1;
+}
+
+1;
+
--- /dev/null
+BEGIN;
+
+SELECT evergreen.upgrade_deps_block_check('1280', :eg_version);
+
+UPDATE config.org_unit_setting_type
+ SET description = $$How long to wait before allowing opportunistic capture of holds with a pickup library other than the context item's circulating library$$ -- ' vim
+ WHERE name = 'circ.hold_stalling.soft';
+
+INSERT into config.org_unit_setting_type
+( name, grp, label, description, datatype, fm_class ) VALUES
+( 'circ.pickup_hold_stalling.soft',
+ 'holds',
+ 'Pickup Library Soft stalling interval',
+ 'When set for the pickup library, this specifies that for holds with a request time age smaller than this interval only items scanned at the pickup library can be opportunistically captured. Example "5 days". This setting takes precedence over "Soft stalling interval" (circ.hold_stalling.soft) when the interval is in force.',
+ 'interval',
+ null
+);
+
+INSERT into config.org_unit_setting_type
+( name, grp, label, description, datatype, fm_class ) VALUES
+( 'circ.pickup_hold_stalling.hard',
+ 'holds',
+ 'Pickup Library Hard stalling interval',
+ 'When set for the pickup library, this specifies that no items with a calculated proximity greater than 0 from the pickup library can be directly targeted for this time period if there are local available copies. Example "3 days".',
+ 'interval',
+ null
+);
+
+COMMIT;
+
--- /dev/null
+-- Upgrade script for 3.7.2 to 3.7.3.
+\set eg_version '''3.7.3'''
+BEGIN;
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('3.7.3', :eg_version);
+
+SELECT evergreen.upgrade_deps_block_check('1309', :eg_version);
+
+ALTER TABLE asset.course_module_term
+ DROP CONSTRAINT course_module_term_name_key;
+
+ALTER TABLE asset.course_module_term
+ ADD CONSTRAINT cmt_once_per_owning_lib UNIQUE (owning_lib, name);
+
+
+SELECT evergreen.upgrade_deps_block_check('1325', :eg_version);
+
+UPDATE config.xml_transform SET xslt=$XSLT$<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0" xmlns:mads="http://www.loc.gov/mads/v2"
+ xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:marc="http://www.loc.gov/MARC21/slim"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="marc">
+ <xsl:output method="xml" indent="yes" encoding="UTF-8"/>
+ <xsl:strip-space elements="*"/>
+
+ <xsl:variable name="ascii">
+ <xsl:text> !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~</xsl:text>
+ </xsl:variable>
+
+ <xsl:variable name="latin1">
+ <xsl:text> ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ</xsl:text>
+ </xsl:variable>
+ <!-- Characters that usually don't need to be escaped -->
+ <xsl:variable name="safe">
+ <xsl:text>!'()*-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~</xsl:text>
+ </xsl:variable>
+
+ <xsl:variable name="hex">0123456789ABCDEF</xsl:variable>
+
+
+ <xsl:template name="datafield">
+ <xsl:param name="tag"/>
+ <xsl:param name="ind1">
+ <xsl:text> </xsl:text>
+ </xsl:param>
+ <xsl:param name="ind2">
+ <xsl:text> </xsl:text>
+ </xsl:param>
+ <xsl:param name="subfields"/>
+ <xsl:element name="marc:datafield">
+ <xsl:attribute name="tag">
+ <xsl:value-of select="$tag"/>
+ </xsl:attribute>
+ <xsl:attribute name="ind1">
+ <xsl:value-of select="$ind1"/>
+ </xsl:attribute>
+ <xsl:attribute name="ind2">
+ <xsl:value-of select="$ind2"/>
+ </xsl:attribute>
+ <xsl:copy-of select="$subfields"/>
+ </xsl:element>
+ </xsl:template>
+
+ <xsl:template name="subfieldSelect">
+ <xsl:param name="codes">abcdefghijklmnopqrstuvwxyz</xsl:param>
+ <xsl:param name="delimeter">
+ <xsl:text> </xsl:text>
+ </xsl:param>
+ <xsl:variable name="str">
+ <xsl:for-each select="marc:subfield">
+ <xsl:if test="contains($codes, @code)">
+ <xsl:value-of select="text()"/>
+ <xsl:value-of select="$delimeter"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:variable>
+ <xsl:value-of select="substring($str,1,string-length($str)-string-length($delimeter))"/>
+ </xsl:template>
+
+ <xsl:template name="buildSpaces">
+ <xsl:param name="spaces"/>
+ <xsl:param name="char">
+ <xsl:text> </xsl:text>
+ </xsl:param>
+ <xsl:if test="$spaces>0">
+ <xsl:value-of select="$char"/>
+ <xsl:call-template name="buildSpaces">
+ <xsl:with-param name="spaces" select="$spaces - 1"/>
+ <xsl:with-param name="char" select="$char"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="chopPunctuation">
+ <xsl:param name="chopString"/>
+ <xsl:param name="punctuation">
+ <xsl:text>.:,;/ </xsl:text>
+ </xsl:param>
+ <xsl:variable name="length" select="string-length($chopString)"/>
+ <xsl:choose>
+ <xsl:when test="$length=0"/>
+ <xsl:when test="contains($punctuation, substring($chopString,$length,1))">
+ <xsl:call-template name="chopPunctuation">
+ <xsl:with-param name="chopString" select="substring($chopString,1,$length - 1)"/>
+ <xsl:with-param name="punctuation" select="$punctuation"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="not($chopString)"/>
+ <xsl:otherwise>
+ <xsl:value-of select="$chopString"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="chopPunctuationFront">
+ <xsl:param name="chopString"/>
+ <xsl:variable name="length" select="string-length($chopString)"/>
+ <xsl:choose>
+ <xsl:when test="$length=0"/>
+ <xsl:when test="contains('.:,;/[ ', substring($chopString,1,1))">
+ <xsl:call-template name="chopPunctuationFront">
+ <xsl:with-param name="chopString" select="substring($chopString,2,$length - 1)"
+ />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="not($chopString)"/>
+ <xsl:otherwise>
+ <xsl:value-of select="$chopString"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="chopPunctuationBack">
+ <xsl:param name="chopString"/>
+ <xsl:param name="punctuation">
+ <xsl:text>.:,;/] </xsl:text>
+ </xsl:param>
+ <xsl:variable name="length" select="string-length($chopString)"/>
+ <xsl:choose>
+ <xsl:when test="$length=0"/>
+ <xsl:when test="contains($punctuation, substring($chopString,$length,1))">
+ <xsl:call-template name="chopPunctuation">
+ <xsl:with-param name="chopString" select="substring($chopString,1,$length - 1)"/>
+ <xsl:with-param name="punctuation" select="$punctuation"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="not($chopString)"/>
+ <xsl:otherwise>
+ <xsl:value-of select="$chopString"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- nate added 12/14/2007 for lccn.loc.gov: url encode ampersand, etc. -->
+ <xsl:template name="url-encode">
+
+ <xsl:param name="str"/>
+
+ <xsl:if test="$str">
+ <xsl:variable name="first-char" select="substring($str,1,1)"/>
+ <xsl:choose>
+ <xsl:when test="contains($safe,$first-char)">
+ <xsl:value-of select="$first-char"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="codepoint">
+ <xsl:choose>
+ <xsl:when test="contains($ascii,$first-char)">
+ <xsl:value-of
+ select="string-length(substring-before($ascii,$first-char)) + 32"
+ />
+ </xsl:when>
+ <xsl:when test="contains($latin1,$first-char)">
+ <xsl:value-of
+ select="string-length(substring-before($latin1,$first-char)) + 160"/>
+ <!-- was 160 -->
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="no">Warning: string contains a character
+ that is out of range! Substituting "?".</xsl:message>
+ <xsl:text>63</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="hex-digit1"
+ select="substring($hex,floor($codepoint div 16) + 1,1)"/>
+ <xsl:variable name="hex-digit2" select="substring($hex,$codepoint mod 16 + 1,1)"/>
+ <!-- <xsl:value-of select="concat('%',$hex-digit2)"/> -->
+ <xsl:value-of select="concat('%',$hex-digit1,$hex-digit2)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:if test="string-length($str) > 1">
+ <xsl:call-template name="url-encode">
+ <xsl:with-param name="str" select="substring($str,2)"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+ </xsl:template>
+
+
+<!--
+2.15 reversed genre and setAuthority template order under relatedTypeAttribute tmee 11/13/2018
+2.14 Fixed bug in mads:geographic attributes syntax ws 05/04/2016
+2.13 fixed repeating <geographic> tmee 01/31/2014
+2.12 added $2 authority for <classification> tmee 09/18/2012
+2.11 added delimiters between <classification> subfields tmee 09/18/2012
+2.10 fixed type="other" and type="otherType" for mads:related tmee 09/16/2011
+2.09 fixed professionTerm and genreTerm empty tag error tmee 09/16/2011
+2.08 fixed marc:subfield @code='i' matching error tmee 09/16/2011
+2.07 fixed 555 duplication error tmee 08/10/2011
+2.06 fixed topic subfield error tmee 08/10/2011
+2.05 fixed title subfield error tmee 06/20/2011
+2.04 fixed geographicSubdivision mapping for authority element tmee 06/16/2011
+2.03 added classification for 053, 055, 060, 065, 070, 080, 082, 083, 086, 087 tmee 06/03/2011
+2.02 added descriptionStandard for 008/10 tmee 04/27/2011
+2.01 added extensions for 046, 336, 370, 374, 375, 376 tmee 04/08/2011
+2.00 redefined imported MODS elements in version 1.0 to MADS elements in version 2.0 tmee 02/08/2011
+1.08 added 372 subfields $a $s $t for <fieldOfActivity> tmee 06/24/2010
+1.07 removed role/roleTerm 100, 110, 111, 400, 410, 411, 500, 510, 511, 700, 710, 711 tmee 06/24/2010
+1.06 added strip-space tmee 06/24/2010
+1.05 added subfield $a for 130, 430, 530 tmee 06/21/2010
+1.04 fixed 550 z omission ntra 08/11/2008
+1.03 removed duplication of 550 $a text tmee 11/01/2006
+1.02 fixed namespace references between mads and mods ntra 10/06/2006
+1.01 revised rgue/jrad 11/29/05
+1.00 adapted from MARC21Slim2MODS3.xsl ntra 07/06/05
+-->
+
+ <!-- authority attribute defaults to 'naf' if not set using this authority parameter, for <authority> descriptors: name, titleInfo, geographic -->
+ <xsl:param name="authority"/>
+ <xsl:variable name="auth">
+ <xsl:choose>
+ <xsl:when test="$authority">
+ <xsl:value-of select="$authority"/>
+ </xsl:when>
+ <xsl:otherwise>naf</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="controlField008" select="marc:controlfield[@tag='008']"/>
+ <xsl:variable name="controlField008-06"
+ select="substring(descendant-or-self::marc:controlfield[@tag=008],7,1)"/>
+ <xsl:variable name="controlField008-11"
+ select="substring(descendant-or-self::marc:controlfield[@tag=008],12,1)"/>
+ <xsl:variable name="controlField008-14"
+ select="substring(descendant-or-self::marc:controlfield[@tag=008],15,1)"/>
+ <xsl:template match="/">
+ <xsl:choose>
+ <xsl:when test="descendant-or-self::marc:collection">
+ <mads:madsCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.loc.gov/mads/v2 http://www.loc.gov/standards/mads/v2/mads-2-0.xsd">
+ <xsl:for-each select="descendant-or-self::marc:collection/marc:record">
+ <mads:mads version="2.0">
+ <xsl:call-template name="marcRecord"/>
+ </mads:mads>
+ </xsl:for-each>
+ </mads:madsCollection>
+ </xsl:when>
+ <xsl:otherwise>
+ <mads:mads version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.loc.gov/mads/v2 http://www.loc.gov/standards/mads/mads-2-0.xsd">
+ <xsl:for-each select="descendant-or-self::marc:record">
+ <xsl:call-template name="marcRecord"/>
+ </xsl:for-each>
+ </mads:mads>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="marcRecord">
+ <mads:authority>
+ <!-- 2.04 -->
+ <xsl:choose>
+ <xsl:when test="$controlField008-06='d'">
+ <xsl:attribute name="geographicSubdivision">
+ <xsl:text>direct</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="$controlField008-06='i'">
+ <xsl:attribute name="geographicSubdivision">
+ <xsl:text>indirect</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="$controlField008-06='n'">
+ <xsl:attribute name="geographicSubdivision">
+ <xsl:text>not applicable</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates select="marc:datafield[100 <= @tag and @tag < 200]"/>
+ </mads:authority>
+
+ <!-- related -->
+ <xsl:apply-templates
+ select="marc:datafield[500 <= @tag and @tag <= 585]|marc:datafield[700 <= @tag and @tag <= 785]"/>
+
+ <!-- variant -->
+ <xsl:apply-templates select="marc:datafield[400 <= @tag and @tag <= 485]"/>
+
+ <!-- notes -->
+ <xsl:apply-templates select="marc:datafield[667 <= @tag and @tag <= 688]"/>
+
+ <!-- url -->
+ <xsl:apply-templates select="marc:datafield[@tag=856]"/>
+ <xsl:apply-templates select="marc:datafield[@tag=010]"/>
+ <xsl:apply-templates select="marc:datafield[@tag=024]"/>
+ <xsl:apply-templates select="marc:datafield[@tag=372]"/>
+
+ <!-- classification -->
+ <xsl:apply-templates select="marc:datafield[@tag=053]"/>
+ <xsl:apply-templates select="marc:datafield[@tag=055]"/>
+ <xsl:apply-templates select="marc:datafield[@tag=060]"/>
+ <xsl:apply-templates select="marc:datafield[@tag=065]"/>
+ <xsl:apply-templates select="marc:datafield[@tag=070]"/>
+ <xsl:apply-templates select="marc:datafield[@tag=080]"/>
+ <xsl:apply-templates select="marc:datafield[@tag=082]"/>
+ <xsl:apply-templates select="marc:datafield[@tag=083]"/>
+ <xsl:apply-templates select="marc:datafield[@tag=086]"/>
+ <xsl:apply-templates select="marc:datafield[@tag=087]"/>
+
+ <!-- affiliation-->
+ <xsl:for-each select="marc:datafield[@tag=373]">
+ <mads:affiliation>
+ <mads:position>
+ <xsl:value-of select="marc:subfield[@code='a']"/>
+ </mads:position>
+ <mads:dateValid point="start">
+ <xsl:value-of select="marc:subfield[@code='s']"/>
+ </mads:dateValid>
+ <mads:dateValid point="end">
+ <xsl:value-of select="marc:subfield[@code='t']"/>
+ </mads:dateValid>
+ </mads:affiliation>
+ </xsl:for-each>
+ <xsl:for-each select="marc:datafield[@tag=371]">
+ <mads:affiliation>
+ <mads:address>
+ <mads:street>
+ <xsl:value-of select="marc:subfield[@code='a']"/>
+ </mads:street>
+ <mads:city>
+ <xsl:value-of select="marc:subfield[@code='b']"/>
+ </mads:city>
+ <mads:state>
+ <xsl:value-of select="marc:subfield[@code='c']"/>
+ </mads:state>
+ <mads:country>
+ <xsl:value-of select="marc:subfield[@code='d']"/>
+ </mads:country>
+ <mads:postcode>
+ <xsl:value-of select="marc:subfield[@code='e']"/>
+ </mads:postcode>
+ </mads:address>
+ <mads:email>
+ <xsl:value-of select="marc:subfield[@code='m']"/>
+ </mads:email>
+ </mads:affiliation>
+ </xsl:for-each>
+
+ <!-- extension-->
+ <xsl:for-each select="marc:datafield[@tag=336]">
+ <mads:extension>
+ <mads:contentType>
+ <mads:contentType type="text">
+ <xsl:value-of select="marc:subfield[@code='a']"/>
+ </mads:contentType>
+ <mads:contentType type="code">
+ <xsl:value-of select="marc:subfield[@code='b']"/>
+ </mads:contentType>
+ </mads:contentType>
+ </mads:extension>
+ </xsl:for-each>
+
+ <xsl:for-each select="marc:datafield[@tag=374]">
+ <mads:extension>
+ <mads:profession>
+ <xsl:choose>
+ <xsl:when test="marc:subfield[@code='a']">
+ <mads:professionTerm>
+ <xsl:value-of select="marc:subfield[@code='a']"/>
+ </mads:professionTerm>
+ </xsl:when>
+ <xsl:when test="marc:subfield[@code='s']">
+ <mads:dateValid point="start">
+ <xsl:value-of select="marc:subfield[@code='s']"/>
+ </mads:dateValid>
+ </xsl:when>
+ <xsl:when test="marc:subfield[@code='t']">
+ <mads:dateValid point="end">
+ <xsl:value-of select="marc:subfield[@code='t']"/>
+ </mads:dateValid>
+ </xsl:when>
+ </xsl:choose>
+ </mads:profession>
+ </mads:extension>
+ </xsl:for-each>
+
+ <xsl:for-each select="marc:datafield[@tag=375]">
+ <mads:extension>
+ <mads:gender>
+ <xsl:choose>
+ <xsl:when test="marc:subfield[@code='a']">
+ <mads:genderTerm>
+ <xsl:value-of select="marc:subfield[@code='a']"/>
+ </mads:genderTerm>
+ </xsl:when>
+ <xsl:when test="marc:subfield[@code='s']">
+ <mads:dateValid point="start">
+ <xsl:value-of select="marc:subfield[@code='s']"/>
+ </mads:dateValid>
+ </xsl:when>
+ <xsl:when test="marc:subfield[@code='t']">
+ <mads:dateValid point="end">
+ <xsl:value-of select="marc:subfield[@code='t']"/>
+ </mads:dateValid>
+ </xsl:when>
+ </xsl:choose>
+ </mads:gender>
+ </mads:extension>
+ </xsl:for-each>
+
+ <xsl:for-each select="marc:datafield[@tag=376]">
+ <mads:extension>
+ <mads:familyInformation>
+ <mads:typeOfFamily>
+ <xsl:value-of select="marc:subfield[@code='a']"/>
+ </mads:typeOfFamily>
+ <mads:nameOfProminentMember>
+ <xsl:value-of select="marc:subfield[@code='b']"/>
+ </mads:nameOfProminentMember>
+ <mads:hereditaryTitle>
+ <xsl:value-of select="marc:subfield[@code='c']"/>
+ </mads:hereditaryTitle>
+ <mads:dateValid point="start">
+ <xsl:value-of select="marc:subfield[@code='s']"/>
+ </mads:dateValid>
+ <mads:dateValid point="end">
+ <xsl:value-of select="marc:subfield[@code='t']"/>
+ </mads:dateValid>
+ </mads:familyInformation>
+ </mads:extension>
+ </xsl:for-each>
+
+ <mads:recordInfo>
+ <mads:recordOrigin>Converted from MARCXML to MADS version 2.0 (Revision 2.13)</mads:recordOrigin>
+ <!-- <xsl:apply-templates select="marc:datafield[@tag=024]"/> -->
+
+ <xsl:apply-templates select="marc:datafield[@tag=040]/marc:subfield[@code='a']"/>
+ <xsl:apply-templates select="marc:controlfield[@tag=005]"/>
+ <xsl:apply-templates select="marc:controlfield[@tag=001]"/>
+ <xsl:apply-templates select="marc:datafield[@tag=040]/marc:subfield[@code='b']"/>
+ <xsl:apply-templates select="marc:datafield[@tag=040]/marc:subfield[@code='e']"/>
+ <xsl:for-each select="marc:controlfield[@tag=008]">
+ <xsl:if test="substring(.,11,1)='a'">
+ <mads:descriptionStandard>
+ <xsl:text>earlier rules</xsl:text>
+ </mads:descriptionStandard>
+ </xsl:if>
+ <xsl:if test="substring(.,11,1)='b'">
+ <mads:descriptionStandard>
+ <xsl:text>aacr1</xsl:text>
+ </mads:descriptionStandard>
+ </xsl:if>
+ <xsl:if test="substring(.,11,1)='c'">
+ <mads:descriptionStandard>
+ <xsl:text>aacr2</xsl:text>
+ </mads:descriptionStandard>
+ </xsl:if>
+ <xsl:if test="substring(.,11,1)='d'">
+ <mads:descriptionStandard>
+ <xsl:text>aacr2 compatible</xsl:text>
+ </mads:descriptionStandard>
+ </xsl:if>
+ <xsl:if test="substring(.,11,1)='z'">
+ <mads:descriptionStandard>
+ <xsl:text>other rules</xsl:text>
+ </mads:descriptionStandard>
+ </xsl:if>
+ </xsl:for-each>
+ </mads:recordInfo>
+ </xsl:template>
+
+ <!-- start of secondary templates -->
+
+ <!-- ======== xlink ======== -->
+
+ <!-- <xsl:template name="uri">
+ <xsl:for-each select="marc:subfield[@code='0']">
+ <xsl:attribute name="xlink:href">
+ <xsl:value-of select="."/>
+ </xsl:attribute>
+ </xsl:for-each>
+ </xsl:template>
+ -->
+ <xsl:template match="marc:subfield[@code='i']">
+ <xsl:attribute name="otherType">
+ <xsl:value-of select="."/>
+ </xsl:attribute>
+ </xsl:template>
+
+ <!-- No role/roleTerm mapped in MADS 06/24/2010
+ <xsl:template name="role">
+ <xsl:for-each select="marc:subfield[@code='e']">
+ <mads:role>
+ <mads:roleTerm type="text">
+ <xsl:value-of select="."/>
+ </mads:roleTerm>
+ </mads:role>
+ </xsl:for-each>
+ </xsl:template>
+-->
+
+ <xsl:template name="part">
+ <xsl:variable name="partNumber">
+ <xsl:call-template name="specialSubfieldSelect">
+ <xsl:with-param name="axis">n</xsl:with-param>
+ <xsl:with-param name="anyCodes">n</xsl:with-param>
+ <xsl:with-param name="afterCodes">fghkdlmor</xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="partName">
+ <xsl:call-template name="specialSubfieldSelect">
+ <xsl:with-param name="axis">p</xsl:with-param>
+ <xsl:with-param name="anyCodes">p</xsl:with-param>
+ <xsl:with-param name="afterCodes">fghkdlmor</xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:if test="string-length(normalize-space($partNumber))">
+ <mads:partNumber>
+ <xsl:call-template name="chopPunctuation">
+ <xsl:with-param name="chopString" select="$partNumber"/>
+ </xsl:call-template>
+ </mads:partNumber>
+ </xsl:if>
+ <xsl:if test="string-length(normalize-space($partName))">
+ <mads:partName>
+ <xsl:call-template name="chopPunctuation">
+ <xsl:with-param name="chopString" select="$partName"/>
+ </xsl:call-template>
+ </mads:partName>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="nameABCDN">
+ <xsl:for-each select="marc:subfield[@code='a']">
+ <mads:namePart>
+ <xsl:call-template name="chopPunctuation">
+ <xsl:with-param name="chopString" select="."/>
+ </xsl:call-template>
+ </mads:namePart>
+ </xsl:for-each>
+ <xsl:for-each select="marc:subfield[@code='b']">
+ <mads:namePart>
+ <xsl:value-of select="."/>
+ </mads:namePart>
+ </xsl:for-each>
+ <xsl:if
+ test="marc:subfield[@code='c'] or marc:subfield[@code='d'] or marc:subfield[@code='n']">
+ <mads:namePart>
+ <xsl:call-template name="subfieldSelect">
+ <xsl:with-param name="codes">cdn</xsl:with-param>
+ </xsl:call-template>
+ </mads:namePart>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="nameABCDQ">
+ <mads:namePart>
+ <xsl:call-template name="chopPunctuation">
+ <xsl:with-param name="chopString">
+ <xsl:call-template name="subfieldSelect">
+ <xsl:with-param name="codes">aq</xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </mads:namePart>
+ <xsl:call-template name="termsOfAddress"/>
+ <xsl:call-template name="nameDate"/>
+ </xsl:template>
+
+ <xsl:template name="nameACDENQ">
+ <mads:namePart>
+ <xsl:call-template name="subfieldSelect">
+ <xsl:with-param name="codes">acdenq</xsl:with-param>
+ </xsl:call-template>
+ </mads:namePart>
+ </xsl:template>
+
+ <xsl:template name="nameDate">
+ <xsl:for-each select="marc:subfield[@code='d']">
+ <mads:namePart type="date">
+ <xsl:call-template name="chopPunctuation">
+ <xsl:with-param name="chopString" select="."/>
+ </xsl:call-template>
+ </mads:namePart>
+ </xsl:for-each>
+ </xsl:template>
+
+ <xsl:template name="specialSubfieldSelect">
+ <xsl:param name="anyCodes"/>
+ <xsl:param name="axis"/>
+ <xsl:param name="beforeCodes"/>
+ <xsl:param name="afterCodes"/>
+ <xsl:variable name="str">
+ <xsl:for-each select="marc:subfield">
+ <xsl:if
+ test="contains($anyCodes, @code) or (contains($beforeCodes,@code) and following-sibling::marc:subfield[@code=$axis]) or (contains($afterCodes,@code) and preceding-sibling::marc:subfield[@code=$axis])">
+ <xsl:value-of select="text()"/>
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:variable>
+ <xsl:value-of select="substring($str,1,string-length($str)-1)"/>
+ </xsl:template>
+
+ <xsl:template name="termsOfAddress">
+ <xsl:if test="marc:subfield[@code='b' or @code='c']">
+ <mads:namePart type="termsOfAddress">
+ <xsl:call-template name="chopPunctuation">
+ <xsl:with-param name="chopString">
+ <xsl:call-template name="subfieldSelect">
+ <xsl:with-param name="codes">bc</xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </mads:namePart>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="displayLabel">
+ <xsl:if test="marc:subfield[@code='z']">
+ <xsl:attribute name="displayLabel">
+ <xsl:value-of select="marc:subfield[@code='z']"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="marc:subfield[@code='3']">
+ <xsl:attribute name="displayLabel">
+ <xsl:value-of select="marc:subfield[@code='3']"/>
+ </xsl:attribute>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="isInvalid">
+ <xsl:if test="@code='z'">
+ <xsl:attribute name="invalid">yes</xsl:attribute>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="sub2Attribute">
+ <!-- 024 -->
+ <xsl:if test="../marc:subfield[@code='2']">
+ <xsl:attribute name="type">
+ <xsl:value-of select="../marc:subfield[@code='2']"/>
+ </xsl:attribute>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match="marc:controlfield[@tag=001]">
+ <mads:recordIdentifier>
+ <xsl:if test="../marc:controlfield[@tag=003]">
+ <xsl:attribute name="source">
+ <xsl:value-of select="../marc:controlfield[@tag=003]"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:value-of select="."/>
+ </mads:recordIdentifier>
+ </xsl:template>
+
+ <xsl:template match="marc:controlfield[@tag=005]">
+ <mads:recordChangeDate encoding="iso8601">
+ <xsl:value-of select="."/>
+ </mads:recordChangeDate>
+ </xsl:template>
+
+ <xsl:template match="marc:controlfield[@tag=008]">
+ <mads:recordCreationDate encoding="marc">
+ <xsl:value-of select="substring(.,1,6)"/>
+ </mads:recordCreationDate>
+ </xsl:template>
+
+ <xsl:template match="marc:datafield[@tag=010]">
+ <xsl:for-each select="marc:subfield">
+ <mads:identifier type="lccn">
+ <xsl:call-template name="isInvalid"/>
+ <xsl:value-of select="."/>
+ </mads:identifier>
+ </xsl:for-each>
+ </xsl:template>
+
+ <xsl:template match="marc:datafield[@tag=024]">
+ <xsl:for-each select="marc:subfield[not(@code=2)]">
+ <mads:identifier>
+ <xsl:call-template name="isInvalid"/>
+ <xsl:call-template name="sub2Attribute"/>
+ <xsl:value-of select="."/>
+ </mads:identifier>
+ </xsl:for-each>
+ </xsl:template>
+
+ <!-- ========== 372 ========== -->
+ <xsl:template match="marc:datafield[@tag=372]">
+ <mads:fieldOfActivity>
+ <xsl:call-template name="subfieldSelect">
+ <xsl:with-param name="codes">a</xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>-</xsl:text>
+ <xsl:call-template name="subfieldSelect">
+ <xsl:with-param name="codes">st</xsl:with-param>
+ </xsl:call-template>
+ </mads:fieldOfActivity>
+ </xsl:template>
+
+
+ <!-- ========== 040 ========== -->
+ <xsl:template match="marc:datafield[@tag=040]/marc:subfield[@code='a']">
+ <mads:recordContentSource authority="marcorg">
+ <xsl:value-of select="."/>
+ </mads:recordContentSource>
+ </xsl:template>
+
+ <xsl:template match="marc:datafield[@tag=040]/marc:subfield[@code='b']">
+ <mads:languageOfCataloging>
+ <mads:languageTerm authority="iso639-2b" type="code">
+ <xsl:value-of select="."/>
+ </mads:languageTerm>
+ </mads:languageOfCataloging>
+ </xsl:template>
+
+ <xsl:template match="marc:datafield[@tag=040]/marc:subfield[@code='e']">
+ <mads:descriptionStandard>
+ <xsl:value-of select="."/>
+ </mads:descriptionStandard>
+ </xsl:template>
+
+ <!-- ========== classification 2.03 ========== -->
+
+ <xsl:template match="marc:datafield[@tag=053]">
+ <mads:classification>
+ <xsl:call-template name="subfieldSelect">
+ <xsl:with-param name="codes">abcdxyz</xsl:with-param>
+ <xsl:with-param name="delimeter">-</xsl:with-param>
+ </xsl:call-template>
+ </mads:classification>
+ </xsl:template>
+
+ <xsl:template match="marc:datafield[@tag=055]">
+ <mads:classification>
+ <xsl:call-template name="subfieldSelect">
+ <xsl:with-param name="codes">abcdxyz</xsl:with-param>
+ <xsl:with-param name="delimeter">-</xsl:with-param>
+ </xsl:call-template>
+ </mads:classification>
+ </xsl:template>
+
+ <xsl:template match="marc:datafield[@tag=060]">
+ <mads:classification>
+ <xsl:call-template name="subfieldSelect">
+ <xsl:with-param name="codes">abcdxyz</xsl:with-param>
+ <xsl:with-param name="delimeter">-</xsl:with-param>
+ </xsl:call-template>
+ </mads:classification>
+ </xsl:template>
+ <xsl:template match="marc:datafield[@tag=065]">
+ <mads:classification>
+ <xsl:attribute name="authority">
+ <xsl:value-of select="marc:subfield[@code='2']"/>
+ </xsl:attribute>
+ <xsl:call-template name="subfieldSelect">
+ <xsl:with-param name="codes">abcdxyz</xsl:with-param>
+ <xsl:with-param name="delimeter">-</xsl:with-param>
+ </xsl:call-template>
+ </mads:classification>
+ </xsl:template>
+ <xsl:template match="marc:datafield[@tag=070]">
+ <mads:classification>
+ <xsl:call-template name="subfieldSelect">
+ <xsl:with-param name="codes">abcdxyz5</xsl:with-param>
+ <xsl:with-param name="delimeter">-</xsl:with-param>
+ </xsl:call-template>
+ </mads:classification>
+ </xsl:template>
+ <xsl:template match="marc:datafield[@tag=080]">
+ <mads:classification>
+ <xsl:attribute name="authority">
+ <xsl:value-of select="marc:subfield[@code='2']"/>
+ </xsl:attribute>
+ <xsl:call-template name="subfieldSelect">
+ <xsl:with-param name="codes">abcdxyz5</xsl:with-param>
+ <xsl:with-param name="delimeter">-</xsl:with-param>
+ </xsl:call-template>
+ </mads:classification>
+ </xsl:template>
+ <xsl:template match="marc:datafield[@tag=082]">
+ <mads:classification>
+ <xsl:attribute name="authority">
+ <xsl:value-of select="marc:subfield[@code='2']"/>
+ </xsl:attribute>
+ <xsl:call-template name="subfieldSelect">
+ <xsl:with-param name="codes">abcdxyz5</xsl:with-param>
+ <xsl:with-param name="delimeter">-</xsl:with-param>
+ </xsl:call-template>
+ </mads:classification>
+ </xsl:template>
+ <xsl:template match="marc:datafield[@tag=083]">
+ <mads:classification>
+ <xsl:attribute name="authority">
+ <xsl:value-of select="marc:subfield[@code='2']"/>
+ </xsl:attribute>
+ <xsl:call-template name="subfieldSelect">
+ <xsl:with-param name="codes">abcdxyz5</xsl:with-param>
+ <xsl:with-param name="delimeter">-</xsl:with-param>
+ </xsl:call-template>
+ </mads:classification>
+ </xsl:template>
+ <xsl:template match="marc:datafield[@tag=086]">
+ <mads:classification>
+ <xsl:attribute name="authority">
+ <xsl:value-of select="marc:subfield[@code='2']"/>
+ </xsl:attribute>
+ <xsl:call-template name="subfieldSelect">
+ <xsl:with-param name="codes">abcdxyz5</xsl:with-param>
+ <xsl:with-param name="delimeter">-</xsl:with-param>
+ </xsl:call-template>
+ </mads:classification>
+ </xsl:template>
+ <xsl:template match="marc:datafield[@tag=087]">
+ <mads:classification>
+ <xsl:attribute name="authority">
+ <xsl:value-of select="marc:subfield[@code='2']"/>
+ </xsl:attribute>
+ <xsl:call-template name="subfieldSelect">
+ <xsl:with-param name="codes">abcdxyz5</xsl:with-param>
+ <xsl:with-param name="delimeter">-</xsl:with-param>
+ </xsl:call-template>
+ </mads:classification>
+ </xsl:template>
+
+
+ <!-- ========== names ========== -->
+ <xsl:template match="marc:datafield[@tag=100]">
+ <mads:name type="personal">
+ <xsl:call-template name="setAuthority"/>
+ <xsl:call-template name="nameABCDQ"/>
+ </mads:name>
+ <xsl:apply-templates select="*[marc:subfield[not(contains('abcdeq',@code))]]"/>
+ <xsl:call-template name="title"/>
+ <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+ </xsl:template>
+
+ <xsl:template match="marc:datafield[@tag=110]">
+ <mads:name type="corporate">
+ <xsl:call-template name="setAuthority"/>
+ <xsl:call-template name="nameABCDN"/>
+ </mads:name>
+ <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+ </xsl:template>
+
+ <xsl:template match="marc:datafield[@tag=111]">
+ <mads:name type="conference">
+ <xsl:call-template name="setAuthority"/>
+ <xsl:call-template name="nameACDENQ"/>
+ </mads:name>
+ <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+ </xsl:template>
+
+ <xsl:template match="marc:datafield[@tag=400]">
+ <mads:variant>
+ <xsl:call-template name="variantTypeAttribute"/>
+ <mads:name type="personal">
+ <xsl:call-template name="nameABCDQ"/>
+ </mads:name>
+ <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+ <xsl:call-template name="title"/>
+ </mads:variant>
+ </xsl:template>
+
+ <xsl:template match="marc:datafield[@tag=410]">
+ <mads:variant>
+ <xsl:call-template name="variantTypeAttribute"/>
+ <mads:name type="corporate">
+ <xsl:call-template name="nameABCDN"/>
+ </mads:name>
+ <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+ </mads:variant>
+ </xsl:template>
+
+ <xsl:template match="marc:datafield[@tag=411]">
+ <mads:variant>
+ <xsl:call-template name="variantTypeAttribute"/>
+ <mads:name type="conference">
+ <xsl:call-template name="nameACDENQ"/>
+ </mads:name>
+ <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+ </mads:variant>
+ </xsl:template>
+
+ <xsl:template match="marc:datafield[@tag=500]|marc:datafield[@tag=700]">
+ <mads:related>
+ <xsl:call-template name="relatedTypeAttribute"/>
+ <!-- <xsl:call-template name="uri"/> -->
+ <mads:name type="personal">
+ <xsl:call-template name="setAuthority"/>
+ <xsl:call-template name="nameABCDQ"/>
+ </mads:name>
+ <xsl:call-template name="title"/>
+ <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+ </mads:related>
+ </xsl:template>
+
+ <xsl:template match="marc:datafield[@tag=510]|marc:datafield[@tag=710]">
+ <mads:related>
+ <xsl:call-template name="relatedTypeAttribute"/>
+ <!-- <xsl:call-template name="uri"/> -->
+ <mads:name type="corporate">
+ <xsl:call-template name="setAuthority"/>
+ <xsl:call-template name="nameABCDN"/>
+ </mads:name>
+ <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+ </mads:related>
+ </xsl:template>
+
+ <xsl:template match="marc:datafield[@tag=511]|marc:datafield[@tag=711]">
+ <mads:related>
+ <xsl:call-template name="relatedTypeAttribute"/>
+ <!-- <xsl:call-template name="uri"/> -->
+ <mads:name type="conference">
+ <xsl:call-template name="setAuthority"/>
+ <xsl:call-template name="nameACDENQ"/>
+ </mads:name>
+ <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+ </mads:related>
+ </xsl:template>
+
+ <!-- ========== titles ========== -->
+ <xsl:template match="marc:datafield[@tag=130]">
+ <xsl:call-template name="uniform-title"/>
+ <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+ </xsl:template>
+
+ <xsl:template match="marc:datafield[@tag=430]">
+ <mads:variant>
+ <xsl:call-template name="variantTypeAttribute"/>
+ <xsl:call-template name="uniform-title"/>
+ <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+ </mads:variant>
+ </xsl:template>
+
+ <xsl:template match="marc:datafield[@tag=530]|marc:datafield[@tag=730]">
+ <mads:related>
+ <xsl:call-template name="relatedTypeAttribute"/>
+ <xsl:call-template name="uniform-title"/>
+ <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+ </mads:related>
+ </xsl:template>
+
+ <xsl:template name="title">
+ <xsl:variable name="hasTitle">
+ <xsl:for-each select="marc:subfield">
+ <xsl:if test="(contains('tfghklmors',@code) )">
+ <xsl:value-of select="@code"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:variable>
+ <xsl:if test="string-length($hasTitle) > 0 ">
+ <mads:titleInfo>
+ <xsl:call-template name="setAuthority"/>
+ <mads:title>
+ <xsl:variable name="str">
+ <xsl:for-each select="marc:subfield">
+ <xsl:if test="(contains('atfghklmors',@code) )">
+ <xsl:value-of select="text()"/>
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:variable>
+ <xsl:call-template name="chopPunctuation">
+ <xsl:with-param name="chopString">
+ <xsl:value-of select="substring($str,1,string-length($str)-1)"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </mads:title>
+ <xsl:call-template name="part"/>
+ <!-- <xsl:call-template name="uri"/> -->
+ </mads:titleInfo>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="uniform-title">
+ <xsl:variable name="hasTitle">
+ <xsl:for-each select="marc:subfield">
+ <xsl:if test="(contains('atfghklmors',@code) )">
+ <xsl:value-of select="@code"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:variable>
+ <xsl:if test="string-length($hasTitle) > 0 ">
+ <mads:titleInfo>
+ <xsl:call-template name="setAuthority"/>
+ <mads:title>
+ <xsl:variable name="str">
+ <xsl:for-each select="marc:subfield">
+ <xsl:if test="(contains('adfghklmors',@code) )">
+ <xsl:value-of select="text()"/>
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:variable>
+ <xsl:call-template name="chopPunctuation">
+ <xsl:with-param name="chopString">
+ <xsl:value-of select="substring($str,1,string-length($str)-1)"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </mads:title>
+ <xsl:call-template name="part"/>
+ <!-- <xsl:call-template name="uri"/> -->
+ </mads:titleInfo>
+ </xsl:if>
+ </xsl:template>
+
+
+ <!-- ========== topics ========== -->
+ <xsl:template match="marc:subfield[@code='x']">
+ <mads:topic>
+ <xsl:call-template name="chopPunctuation">
+ <xsl:with-param name="chopString">
+ <xsl:value-of select="."/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </mads:topic>
+ </xsl:template>
+
+ <!-- 2.06 fix -->
+ <xsl:template
+ match="marc:datafield[@tag=150][marc:subfield[@code='a' or @code='b']]|marc:datafield[@tag=180][marc:subfield[@code='x']]">
+ <xsl:call-template name="topic"/>
+ <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+ </xsl:template>
+ <xsl:template
+ match="marc:datafield[@tag=450][marc:subfield[@code='a' or @code='b']]|marc:datafield[@tag=480][marc:subfield[@code='x']]">
+ <mads:variant>
+ <xsl:call-template name="variantTypeAttribute"/>
+ <xsl:call-template name="topic"/>
+ </mads:variant>
+ </xsl:template>
+ <xsl:template
+ match="marc:datafield[@tag=550 or @tag=750][marc:subfield[@code='a' or @code='b']]">
+ <mads:related>
+ <xsl:call-template name="relatedTypeAttribute"/>
+ <!-- <xsl:call-template name="uri"/> -->
+ <xsl:call-template name="topic"/>
+ <xsl:apply-templates select="marc:subfield[@code='z']"/>
+ </mads:related>
+ </xsl:template>
+ <xsl:template name="topic">
+ <mads:topic>
+ <xsl:call-template name="setAuthority"/>
+ <!-- tmee2006 dedupe 550a
+ <xsl:if test="@tag=550 or @tag=750">
+ <xsl:call-template name="subfieldSelect">
+ <xsl:with-param name="codes">ab</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ -->
+ <xsl:choose>
+ <xsl:when test="@tag=180 or @tag=480 or @tag=580 or @tag=780">
+ <xsl:call-template name="chopPunctuation">
+ <xsl:with-param name="chopString">
+ <xsl:apply-templates select="marc:subfield[@code='x']"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+ <xsl:call-template name="chopPunctuation">
+ <xsl:with-param name="chopString">
+ <xsl:choose>
+ <xsl:when test="@tag=180 or @tag=480 or @tag=580 or @tag=780">
+ <xsl:apply-templates select="marc:subfield[@code='x']"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="subfieldSelect">
+ <xsl:with-param name="codes">ab</xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </mads:topic>
+ </xsl:template>
+
+ <!-- ========= temporals ========== -->
+ <xsl:template match="marc:subfield[@code='y']">
+ <mads:temporal>
+ <xsl:call-template name="chopPunctuation">
+ <xsl:with-param name="chopString">
+ <xsl:value-of select="."/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </mads:temporal>
+ </xsl:template>
+ <xsl:template
+ match="marc:datafield[@tag=148][marc:subfield[@code='a']]|marc:datafield[@tag=182 ][marc:subfield[@code='y']]">
+ <xsl:call-template name="temporal"/>
+ </xsl:template>
+ <xsl:template
+ match="marc:datafield[@tag=448][marc:subfield[@code='a']]|marc:datafield[@tag=482][marc:subfield[@code='y']]">
+ <mads:variant>
+ <xsl:call-template name="variantTypeAttribute"/>
+ <xsl:call-template name="temporal"/>
+ </mads:variant>
+ </xsl:template>
+ <xsl:template
+ match="marc:datafield[@tag=548 or @tag=748][marc:subfield[@code='a']]|marc:datafield[@tag=582 or @tag=782][marc:subfield[@code='y']]">
+ <mads:related>
+ <xsl:call-template name="relatedTypeAttribute"/>
+ <!-- <xsl:call-template name="uri"/> -->
+ <xsl:call-template name="temporal"/>
+ </mads:related>
+ </xsl:template>
+ <xsl:template name="temporal">
+ <mads:temporal>
+ <xsl:call-template name="setAuthority"/>
+ <xsl:if test="@tag=548 or @tag=748">
+ <xsl:value-of select="marc:subfield[@code='a']"/>
+ </xsl:if>
+ <xsl:call-template name="chopPunctuation">
+ <xsl:with-param name="chopString">
+ <xsl:choose>
+ <xsl:when test="@tag=182 or @tag=482 or @tag=582 or @tag=782">
+ <xsl:apply-templates select="marc:subfield[@code='y']"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="marc:subfield[@code='a']"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </mads:temporal>
+ <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+ </xsl:template>
+
+ <!-- ========== genre ========== -->
+ <xsl:template match="marc:subfield[@code='v']">
+ <mads:genre>
+ <xsl:call-template name="chopPunctuation">
+ <xsl:with-param name="chopString">
+ <xsl:value-of select="."/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </mads:genre>
+ </xsl:template>
+ <xsl:template
+ match="marc:datafield[@tag=155][marc:subfield[@code='a']]|marc:datafield[@tag=185][marc:subfield[@code='v']]">
+ <xsl:call-template name="genre"/>
+ </xsl:template>
+ <xsl:template
+ match="marc:datafield[@tag=455][marc:subfield[@code='a']]|marc:datafield[@tag=485 ][marc:subfield[@code='v']]">
+ <mads:variant>
+ <xsl:call-template name="variantTypeAttribute"/>
+ <xsl:call-template name="genre"/>
+ </mads:variant>
+ </xsl:template>
+ <!--
+ <xsl:template match="marc:datafield[@tag=555]">
+ <mads:related>
+ <xsl:call-template name="relatedTypeAttribute"/>
+ <xsl:call-template name="uri"/>
+ <xsl:call-template name="genre"/>
+ </mads:related>
+ </xsl:template>
+ -->
+ <xsl:template
+ match="marc:datafield[@tag=555 or @tag=755][marc:subfield[@code='a']]|marc:datafield[@tag=585][marc:subfield[@code='v']]">
+ <mads:related>
+ <xsl:call-template name="relatedTypeAttribute"/>
+ <xsl:call-template name="genre"/>
+ </mads:related>
+ </xsl:template>
+ <xsl:template name="genre">
+ <mads:genre>
+ <xsl:if test="@tag=555">
+ <xsl:value-of select="marc:subfield[@code='a']"/>
+ </xsl:if>
+ <xsl:call-template name="setAuthority"/>
+ <xsl:call-template name="chopPunctuation">
+ <xsl:with-param name="chopString">
+ <xsl:choose>
+ <!-- 2.07 fix -->
+ <xsl:when test="@tag='555'"/>
+ <xsl:when test="@tag=185 or @tag=485 or @tag=585">
+ <xsl:apply-templates select="marc:subfield[@code='v']"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="marc:subfield[@code='a']"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </mads:genre>
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <!-- ========= geographic ========== -->
+ <xsl:template match="marc:subfield[@code='z']">
+ <mads:geographic>
+ <xsl:call-template name="chopPunctuation">
+ <xsl:with-param name="chopString">
+ <xsl:value-of select="."/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </mads:geographic>
+ </xsl:template>
+ <xsl:template name="geographic">
+ <mads:geographic>
+ <!-- 2.14 -->
+ <xsl:call-template name="setAuthority"/>
+ <!-- 2.13 -->
+ <xsl:if test="@tag=151 or @tag=551">
+ <xsl:value-of select="marc:subfield[@code='a']"/>
+ </xsl:if>
+ <xsl:call-template name="chopPunctuation">
+ <xsl:with-param name="chopString">
+ <xsl:if test="@tag=181 or @tag=481 or @tag=581">
+ <xsl:apply-templates select="marc:subfield[@code='z']"/>
+ </xsl:if>
+ <!-- 2.13
+ <xsl:choose>
+ <xsl:when test="@tag=181 or @tag=481 or @tag=581">
+ <xsl:apply-templates select="marc:subfield[@code='z']"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:value-of select="marc:subfield[@code='a']"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ -->
+ </xsl:with-param>
+ </xsl:call-template>
+ </mads:geographic>
+ <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+ </xsl:template>
+ <xsl:template
+ match="marc:datafield[@tag=151][marc:subfield[@code='a']]|marc:datafield[@tag=181][marc:subfield[@code='z']]">
+ <xsl:call-template name="geographic"/>
+ </xsl:template>
+ <xsl:template
+ match="marc:datafield[@tag=451][marc:subfield[@code='a']]|marc:datafield[@tag=481][marc:subfield[@code='z']]">
+ <mads:variant>
+ <xsl:call-template name="variantTypeAttribute"/>
+ <xsl:call-template name="geographic"/>
+ </mads:variant>
+ </xsl:template>
+ <xsl:template
+ match="marc:datafield[@tag=551]|marc:datafield[@tag=581][marc:subfield[@code='z']]">
+ <mads:related>
+ <xsl:call-template name="relatedTypeAttribute"/>
+ <!-- <xsl:call-template name="uri"/> -->
+ <xsl:call-template name="geographic"/>
+ </mads:related>
+ </xsl:template>
+ <xsl:template match="marc:datafield[@tag=580]">
+ <mads:related>
+ <xsl:call-template name="relatedTypeAttribute"/>
+ <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+ </mads:related>
+ </xsl:template>
+ <xsl:template
+ match="marc:datafield[@tag=751][marc:subfield[@code='z']]|marc:datafield[@tag=781][marc:subfield[@code='z']]">
+ <mads:related>
+ <xsl:call-template name="relatedTypeAttribute"/>
+ <xsl:call-template name="geographic"/>
+ </mads:related>
+ </xsl:template>
+ <xsl:template match="marc:datafield[@tag=755]">
+ <mads:related>
+ <xsl:call-template name="relatedTypeAttribute"/>
+ <xsl:call-template name="setAuthority"/>
+ <xsl:call-template name="genre"/>
+ <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+ </mads:related>
+ </xsl:template>
+ <xsl:template match="marc:datafield[@tag=780]">
+ <mads:related>
+ <xsl:call-template name="relatedTypeAttribute"/>
+ <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+ </mads:related>
+ </xsl:template>
+ <xsl:template match="marc:datafield[@tag=785]">
+ <mads:related>
+ <xsl:call-template name="relatedTypeAttribute"/>
+ <xsl:apply-templates select="marc:subfield[@code!='i']"/>
+ </mads:related>
+ </xsl:template>
+
+ <!-- ========== notes ========== -->
+ <xsl:template match="marc:datafield[667 <= @tag and @tag <= 688]">
+ <mads:note>
+ <xsl:choose>
+ <xsl:when test="@tag=667">
+ <xsl:attribute name="type">nonpublic</xsl:attribute>
+ </xsl:when>
+ <xsl:when test="@tag=670">
+ <xsl:attribute name="type">source</xsl:attribute>
+ </xsl:when>
+ <xsl:when test="@tag=675">
+ <xsl:attribute name="type">notFound</xsl:attribute>
+ </xsl:when>
+ <xsl:when test="@tag=678">
+ <xsl:attribute name="type">history</xsl:attribute>
+ </xsl:when>
+ <xsl:when test="@tag=681">
+ <xsl:attribute name="type">subject example</xsl:attribute>
+ </xsl:when>
+ <xsl:when test="@tag=682">
+ <xsl:attribute name="type">deleted heading information</xsl:attribute>
+ </xsl:when>
+ <xsl:when test="@tag=688">
+ <xsl:attribute name="type">application history</xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+ <xsl:call-template name="chopPunctuation">
+ <xsl:with-param name="chopString">
+ <xsl:choose>
+ <xsl:when test="@tag=667 or @tag=675">
+ <xsl:value-of select="marc:subfield[@code='a']"/>
+ </xsl:when>
+ <xsl:when test="@tag=670 or @tag=678">
+ <xsl:call-template name="subfieldSelect">
+ <xsl:with-param name="codes">ab</xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="680 <= @tag and @tag <=688">
+ <xsl:call-template name="subfieldSelect">
+ <xsl:with-param name="codes">ai</xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </mads:note>
+ </xsl:template>
+
+ <!-- ========== url ========== -->
+ <xsl:template match="marc:datafield[@tag=856][marc:subfield[@code='u']]">
+ <mads:url>
+ <xsl:if test="marc:subfield[@code='z' or @code='3']">
+ <xsl:attribute name="displayLabel">
+ <xsl:call-template name="subfieldSelect">
+ <xsl:with-param name="codes">z3</xsl:with-param>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:value-of select="marc:subfield[@code='u']"/>
+ </mads:url>
+ </xsl:template>
+
+ <xsl:template name="relatedTypeAttribute">
+ <xsl:choose>
+ <xsl:when
+ test="@tag=500 or @tag=510 or @tag=511 or @tag=548 or @tag=550 or @tag=551 or @tag=555 or @tag=580 or @tag=581 or @tag=582 or @tag=585">
+ <xsl:if test="substring(marc:subfield[@code='w'],1,1)='a'">
+ <xsl:attribute name="type">earlier</xsl:attribute>
+ </xsl:if>
+ <xsl:if test="substring(marc:subfield[@code='w'],1,1)='b'">
+ <xsl:attribute name="type">later</xsl:attribute>
+ </xsl:if>
+ <xsl:if test="substring(marc:subfield[@code='w'],1,1)='t'">
+ <xsl:attribute name="type">parentOrg</xsl:attribute>
+ </xsl:if>
+ <xsl:if test="substring(marc:subfield[@code='w'],1,1)='g'">
+ <xsl:attribute name="type">broader</xsl:attribute>
+ </xsl:if>
+ <xsl:if test="substring(marc:subfield[@code='w'],1,1)='h'">
+ <xsl:attribute name="type">narrower</xsl:attribute>
+ </xsl:if>
+ <xsl:if test="substring(marc:subfield[@code='w'],1,1)='r'">
+ <xsl:attribute name="type">other</xsl:attribute>
+ </xsl:if>
+ <xsl:if test="contains('fin|', substring(marc:subfield[@code='w'],1,1))">
+ <xsl:attribute name="type">other</xsl:attribute>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="@tag=530 or @tag=730">
+ <xsl:attribute name="type">other</xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- 7xx -->
+ <xsl:attribute name="type">equivalent</xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates select="marc:subfield[@code='i']"/>
+ </xsl:template>
+
+
+
+ <xsl:template name="variantTypeAttribute">
+ <xsl:choose>
+ <xsl:when
+ test="@tag=400 or @tag=410 or @tag=411 or @tag=451 or @tag=455 or @tag=480 or @tag=481 or @tag=482 or @tag=485">
+ <xsl:if test="substring(marc:subfield[@code='w'],1,1)='d'">
+ <xsl:attribute name="type">acronym</xsl:attribute>
+ </xsl:if>
+ <xsl:if test="substring(marc:subfield[@code='w'],1,1)='n'">
+ <xsl:attribute name="type">other</xsl:attribute>
+ </xsl:if>
+ <xsl:if test="contains('fit', substring(marc:subfield[@code='w'],1,1))">
+ <xsl:attribute name="type">other</xsl:attribute>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- 430 -->
+ <xsl:attribute name="type">other</xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates select="marc:subfield[@code='i']"/>
+ </xsl:template>
+
+ <xsl:template name="setAuthority">
+ <xsl:choose>
+ <!-- can be called from the datafield or subfield level, so "..//@tag" means
+ the tag can be at the subfield's parent level or at the datafields own level -->
+
+ <xsl:when
+ test="ancestor-or-self::marc:datafield/@tag=100 and (@ind1=0 or @ind1=1) and $controlField008-11='a' and $controlField008-14='a'">
+ <xsl:attribute name="authority">
+ <xsl:text>naf</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="ancestor-or-self::marc:datafield/@tag=100 and (@ind1=0 or @ind1=1) and $controlField008-11='a' and $controlField008-14='b'">
+ <xsl:attribute name="authority">
+ <xsl:text>lcsh</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="ancestor-or-self::marc:datafield/@tag=100 and (@ind1=0 or @ind1=1) and $controlField008-11='k'">
+ <xsl:attribute name="authority">
+ <xsl:text>lacnaf</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="ancestor-or-self::marc:datafield/@tag=100 and @ind1=3 and $controlField008-11='a' and $controlField008-14='b'">
+ <xsl:attribute name="authority">
+ <xsl:text>lcsh</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="ancestor-or-self::marc:datafield/@tag=100 and @ind1=3 and $controlField008-11='k' and $controlField008-14='b'">
+ <xsl:attribute name="authority">cash</xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="ancestor-or-self::marc:datafield/@tag=110 and $controlField008-11='a' and $controlField008-14='a'">
+ <xsl:attribute name="authority">naf</xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="ancestor-or-self::marc:datafield/@tag=110 and $controlField008-11='a' and $controlField008-14='b'">
+ <xsl:attribute name="authority">lcsh</xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="ancestor-or-self::marc:datafield/@tag=110 and $controlField008-11='k' and $controlField008-14='a'">
+ <xsl:attribute name="authority">
+ <xsl:text>lacnaf</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="ancestor-or-self::marc:datafield/@tag=110 and $controlField008-11='k' and $controlField008-14='b'">
+ <xsl:attribute name="authority">
+ <xsl:text>cash</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="100 <= ancestor-or-self::marc:datafield/@tag and ancestor-or-self::marc:datafield/@tag <= 155 and $controlField008-11='b'">
+ <xsl:attribute name="authority">
+ <xsl:text>lcshcl</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="(ancestor-or-self::marc:datafield/@tag=100 or ancestor-or-self::marc:datafield/@tag=110 or ancestor-or-self::marc:datafield/@tag=111 or ancestor-or-self::marc:datafield/@tag=130 or ancestor-or-self::marc:datafield/@tag=151) and $controlField008-11='c'">
+ <xsl:attribute name="authority">
+ <xsl:text>nlmnaf</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="(ancestor-or-self::marc:datafield/@tag=100 or ancestor-or-self::marc:datafield/@tag=110 or ancestor-or-self::marc:datafield/@tag=111 or ancestor-or-self::marc:datafield/@tag=130 or ancestor-or-self::marc:datafield/@tag=151) and $controlField008-11='d'">
+ <xsl:attribute name="authority">
+ <xsl:text>nalnaf</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="100 <= ancestor-or-self::marc:datafield/@tag and ancestor-or-self::marc:datafield/@tag <= 155 and $controlField008-11='r'">
+ <xsl:attribute name="authority">
+ <xsl:text>aat</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="100 <= ancestor-or-self::marc:datafield/@tag and ancestor-or-self::marc:datafield/@tag <= 155 and $controlField008-11='s'">
+ <xsl:attribute name="authority">sears</xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="100 <= ancestor-or-self::marc:datafield/@tag and ancestor-or-self::marc:datafield/@tag <= 155 and $controlField008-11='v'">
+ <xsl:attribute name="authority">rvm</xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="100 <= ancestor-or-self::marc:datafield/@tag and ancestor-or-self::marc:datafield/@tag <= 155 and $controlField008-11='z'">
+ <xsl:attribute name="authority">
+ <xsl:value-of
+ select="../marc:datafield[ancestor-or-self::marc:datafield/@tag=040]/marc:subfield[@code='f']"
+ />
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="(ancestor-or-self::marc:datafield/@tag=111 or ancestor-or-self::marc:datafield/@tag=130) and $controlField008-11='a' and $controlField008-14='a'">
+ <xsl:attribute name="authority">
+ <xsl:text>naf</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="(ancestor-or-self::marc:datafield/@tag=111 or ancestor-or-self::marc:datafield/@tag=130) and $controlField008-11='a' and $controlField008-14='b'">
+ <xsl:attribute name="authority">
+ <xsl:text>lcsh</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="(ancestor-or-self::marc:datafield/@tag=111 or ancestor-or-self::marc:datafield/@tag=130) and $controlField008-11='k' ">
+ <xsl:attribute name="authority">
+ <xsl:text>lacnaf</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="(ancestor-or-self::marc:datafield/@tag=148 or ancestor-or-self::marc:datafield/@tag=150 or ancestor-or-self::marc:datafield/@tag=155) and $controlField008-11='a' ">
+ <xsl:attribute name="authority">
+ <xsl:text>lcsh</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="(ancestor-or-self::marc:datafield/@tag=148 or ancestor-or-self::marc:datafield/@tag=150 or ancestor-or-self::marc:datafield/@tag=155) and $controlField008-11='a' ">
+ <xsl:attribute name="authority">
+ <xsl:text>lcsh</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="(ancestor-or-self::marc:datafield/@tag=148 or ancestor-or-self::marc:datafield/@tag=150 or ancestor-or-self::marc:datafield/@tag=155) and $controlField008-11='c' ">
+ <xsl:attribute name="authority">
+ <xsl:text>mesh</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="(ancestor-or-self::marc:datafield/@tag=148 or ancestor-or-self::marc:datafield/@tag=150 or ancestor-or-self::marc:datafield/@tag=155) and $controlField008-11='d' ">
+ <xsl:attribute name="authority">
+ <xsl:text>nal</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="(ancestor-or-self::marc:datafield/@tag=148 or ancestor-or-self::marc:datafield/@tag=150 or ancestor-or-self::marc:datafield/@tag=155) and $controlField008-11='k' ">
+ <xsl:attribute name="authority">
+ <xsl:text>cash</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="ancestor-or-self::marc:datafield/@tag=151 and $controlField008-11='a' and $controlField008-14='a'">
+ <xsl:attribute name="authority">
+ <xsl:text>naf</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="ancestor-or-self::marc:datafield/@tag=151 and $controlField008-11='a' and $controlField008-14='b'">
+ <xsl:attribute name="authority">lcsh</xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="ancestor-or-self::marc:datafield/@tag=151 and $controlField008-11='k' and $controlField008-14='a'">
+ <xsl:attribute name="authority">lacnaf</xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="ancestor-or-self::marc:datafield/@tag=151 and $controlField008-11='k' and $controlField008-14='b'">
+ <xsl:attribute name="authority">cash</xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="(..//ancestor-or-self::marc:datafield/@tag=180 or ..//ancestor-or-self::marc:datafield/@tag=181 or ..//ancestor-or-self::marc:datafield/@tag=182 or ..//ancestor-or-self::marc:datafield/@tag=185) and $controlField008-11='a'">
+ <xsl:attribute name="authority">lcsh</xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="ancestor-or-self::marc:datafield/@tag=700 and (@ind1='0' or @ind1='1') and @ind2='0'">
+ <xsl:attribute name="authority">naf</xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="ancestor-or-self::marc:datafield/@tag=700 and (@ind1='0' or @ind1='1') and @ind2='5'">
+ <xsl:attribute name="authority">lacnaf</xsl:attribute>
+ </xsl:when>
+ <xsl:when test="ancestor-or-self::marc:datafield/@tag=700 and @ind1='3' and @ind2='0'">
+ <xsl:attribute name="authority">lcsh</xsl:attribute>
+ </xsl:when>
+ <xsl:when test="ancestor-or-self::marc:datafield/@tag=700 and @ind1='3' and @ind2='5'">
+ <xsl:attribute name="authority">cash</xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="(700 <= ancestor-or-self::marc:datafield/@tag and ancestor-or-self::marc:datafield/@tag <= 755 ) and @ind2='1'">
+ <xsl:attribute name="authority">lcshcl</xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="(ancestor-or-self::marc:datafield/@tag=700 or ancestor-or-self::marc:datafield/@tag=710 or ancestor-or-self::marc:datafield/@tag=711 or ancestor-or-self::marc:datafield/@tag=730 or ancestor-or-self::marc:datafield/@tag=751) and @ind2='2'">
+ <xsl:attribute name="authority">nlmnaf</xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="(ancestor-or-self::marc:datafield/@tag=700 or ancestor-or-self::marc:datafield/@tag=710 or ancestor-or-self::marc:datafield/@tag=711 or ancestor-or-self::marc:datafield/@tag=730 or ancestor-or-self::marc:datafield/@tag=751) and @ind2='3'">
+ <xsl:attribute name="authority">nalnaf</xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="(700 <= ancestor-or-self::marc:datafield/@tag and ancestor-or-self::marc:datafield/@tag <= 755 ) and @ind2='6'">
+ <xsl:attribute name="authority">rvm</xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="(700 <= ancestor-or-self::marc:datafield/@tag and ancestor-or-self::marc:datafield/@tag <= 755 ) and @ind2='7'">
+ <xsl:attribute name="authority">
+ <xsl:value-of select="marc:subfield[@code='2']"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="(ancestor-or-self::marc:datafield/@tag=710 or ancestor-or-self::marc:datafield/@tag=711 or ancestor-or-self::marc:datafield/@tag=730 or ancestor-or-self::marc:datafield/@tag=751) and @ind2='5'">
+ <xsl:attribute name="authority">lacnaf</xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="(ancestor-or-self::marc:datafield/@tag=710 or ancestor-or-self::marc:datafield/@tag=711 or ancestor-or-self::marc:datafield/@tag=730 or ancestor-or-self::marc:datafield/@tag=751) and @ind2='0'">
+ <xsl:attribute name="authority">naf</xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="(ancestor-or-self::marc:datafield/@tag=748 or ancestor-or-self::marc:datafield/@tag=750 or ancestor-or-self::marc:datafield/@tag=755) and @ind2='0'">
+ <xsl:attribute name="authority">lcsh</xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="(ancestor-or-self::marc:datafield/@tag=748 or ancestor-or-self::marc:datafield/@tag=750 or ancestor-or-self::marc:datafield/@tag=755) and @ind2='2'">
+ <xsl:attribute name="authority">mesh</xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="(ancestor-or-self::marc:datafield/@tag=748 or ancestor-or-self::marc:datafield/@tag=750 or ancestor-or-self::marc:datafield/@tag=755) and @ind2='3'">
+ <xsl:attribute name="authority">nal</xsl:attribute>
+ </xsl:when>
+ <xsl:when
+ test="(ancestor-or-self::marc:datafield/@tag=748 or ancestor-or-self::marc:datafield/@tag=750 or ancestor-or-self::marc:datafield/@tag=755) and @ind2='5'">
+ <xsl:attribute name="authority">cash</xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+ <xsl:template match="*"/>
+</xsl:stylesheet>$XSLT$ WHERE name = 'mads21';
+
+COMMIT;
+
+-- Append this to the 3.7.3 db upgrade script.
+
+UPDATE config.global_flag
+SET value = '3.0'
+WHERE name = 'search.max_popularity_importance_multiplier';
+
+UPDATE rating.badge
+SET weight = 2, percentile = 96
+WHERE id = 1;
+
+UPDATE rating.badge
+SET weight = 3, percentile = 98, recalc_interval = '7 days'::INTERVAl
+WHERE id = 2;
--- /dev/null
+<record>
+ <leader>00309nrm a22001457a 4500</leader>
+ <controlfield tag="008">180101s xxu 000 eng d</controlfield>
+ <datafield tag="245" ind1="0" ind2="0">
+ <subfield code="a">Library of things: Audiovisual.</subfield>
+ </datafield>
+ <datafield tag="500" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="500" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="505" ind1="0" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a">Audio-visual equipment.</subfield>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a">Home electronics.</subfield>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="830" ind1="" ind2="0">
+ <subfield code="a">Library of things.</subfield>
+ </datafield>
+ </record>
\ No newline at end of file
--- /dev/null
+<record>
+ <leader>00309nrm a22001457a 4500</leader>
+ <controlfield tag="008">180101s xxu 000 eng d</controlfield>
+ <datafield tag="245" ind1="0" ind2="0">
+ <subfield code="a">Library of things: Board games.</subfield>
+ </datafield>
+ <datafield tag="500" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="500" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="505" ind1="0" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a">Board games.</subfield>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a">Games.</subfield>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="830" ind1="" ind2="0">
+ <subfield code="a">Library of things.</subfield>
+ </datafield>
+ </record>
\ No newline at end of file
--- /dev/null
+<record>
+ <leader>00309nrm a22001457a 4500</leader>
+ <controlfield tag="008">180101s xxu 000 eng d</controlfield>
+ <datafield tag="245" ind1="0" ind2="0">
+ <subfield code="a">Library of things collection.</subfield>
+ </datafield>
+ <datafield tag="500" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="500" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="505" ind1="0" ind2="">
+ <subfield code="a">Contents:</subfield>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="830" ind1="" ind2="0">
+ <subfield code="a">Library of things.</subfield>
+ </datafield>
+ </record>
\ No newline at end of file
--- /dev/null
+<record>
+ <leader>00309nrm a22001457a 4500</leader>
+ <controlfield tag="008">180101s xxu 000 eng d</controlfield>
+ <datafield tag="245" ind1="0" ind2="0">
+ <subfield code="a">Library of things: Home and assistive.</subfield>
+ </datafield>
+ <datafield tag="500" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="500" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="505" ind1="0" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a">Kitchen utensils.</subfield>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a">Garden tools.</subfield>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a">Home electronics.</subfield>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a">Home economics.</subfield>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="830" ind1="" ind2="0">
+ <subfield code="a">Library of things.</subfield>
+ </datafield>
+ </record>
\ No newline at end of file
--- /dev/null
+<record>
+ <leader>00309nrm a22001457a 4500</leader>
+ <controlfield tag="008">180101s xxu 000 eng d</controlfield>
+ <datafield tag="245" ind1="0" ind2="0">
+ <subfield code="a">Library of things: Recreation and crafts.</subfield>
+ </datafield>
+ <datafield tag="500" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="500" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="505" ind1="0" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a">Recreation.</subfield>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a">Handicraft.</subfield>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a">Games.</subfield>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="830" ind1="" ind2="0">
+ <subfield code="a">Library of things.</subfield>
+ </datafield>
+ </record>
\ No newline at end of file
--- /dev/null
+<record>
+ <leader>00309nrm a22001457a 4500</leader>
+ <controlfield tag="008">180101s xxu 000 eng d</controlfield>
+ <datafield tag="245" ind1="0" ind2="0">
+ <subfield code="a">Library of things: Science and technology.</subfield>
+ </datafield>
+ <datafield tag="500" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="500" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="505" ind1="0" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a">Household electronics.</subfield>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="830" ind1="" ind2="0">
+ <subfield code="a">Library of things.</subfield>
+ </datafield>
+ </record>
\ No newline at end of file
--- /dev/null
+<record>
+<leader>00309nkm a2200145Ka 4500</leader>
+<controlfield tag="007">kf co</controlfield>
+<controlfield tag="008"> s xxunnn cnzxx d</controlfield>
+<datafield tag="100" ind1="1" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="245" ind1="" ind2="">
+<subfield code="a"/>
+<subfield code="h">[art reproduction].</subfield>
+</datafield>
+<datafield tag="260" ind1="" ind2="">
+<subfield code="a"/>
+<subfield code="b"/>
+<subfield code="c"/>
+</datafield>
+<datafield tag="300" ind1="" ind2="">
+<subfield code="a">1 art print :</subfield>
+<subfield code="b">color ;</subfield>
+<subfield code="c"> -- x -- cm.</subfield>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="650" ind1="" ind2="0">
+<subfield code="a"/>
+</datafield>
+<datafield tag="651" ind1="" ind2="0">
+<subfield code="a"/>
+</datafield>
+<datafield tag="710" ind1="2" ind2="">
+<subfield code="a"/>
+</datafield>
+</record>
\ No newline at end of file
--- /dev/null
+<record>
+<leader>00309ngm a22001457a 4500</leader>
+<controlfield tag="007">vd csaizq</controlfield>
+<controlfield tag="008"> v eng d</controlfield>
+<datafield tag="020" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="024" ind1="1" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="028" ind1="0" ind2="2">
+<subfield code="a"/>
+</datafield>
+<datafield tag="245" ind1="0" ind2="0">
+<subfield code="a"/>
+<subfield code="h">[videorecording]</subfield>
+</datafield>
+<datafield tag="250" ind1="" ind2="">
+<subfield code="a">Blu-ray version.</subfield>
+</datafield>
+<datafield tag="260" ind1="" ind2="">
+<subfield code="a"> : </subfield>
+<subfield code="b"> , </subfield>
+<subfield code="c"/>
+</datafield>
+<datafield tag="300" ind1="" ind2="">
+<subfield code="a">1 videodisc (Blu-ray) (min.) :</subfield>
+<subfield code="b">sd., col. ;</subfield>
+<subfield code="c">4 3/4 in.</subfield>
+</datafield>
+<datafield tag="538" ind1="" ind2="">
+<subfield code="a">Blu-ray disc, plays only on Blu-ray disc player, will not play on standard DVD players.</subfield>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="700" ind1="1" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="700" ind1="1" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="700" ind1="1" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="740" ind1="0" ind2="2">
+<subfield code="a"/>
+</datafield>
+</record>
\ No newline at end of file
--- /dev/null
+<record>
+ <leader>00309nrm a22001457a 4500</leader>
+ <controlfield tag="008">120919s xxunnn gneng d</controlfield>
+ <datafield tag="245" ind1="0" ind2="0">
+ <subfield code="a"> </subfield>
+ <subfield code="h">[game]</subfield>
+ </datafield>
+ <datafield tag="300" ind1="" ind2="">
+ <subfield code="a">Board games.</subfield>
+ </datafield>
+ <datafield tag="505" ind1="0" ind2="">
+ <subfield code="a">Games:</subfield>
+ </datafield>
+ <datafield tag="500" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="500" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a">Board games.</subfield>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a">Games.</subfield>
+ </datafield>
+ </record>
\ No newline at end of file
--- /dev/null
+<record>
+ <leader>00309nrm a22001457a 4500</leader>
+ <controlfield tag="008">120919s xxunnn gneng d</controlfield>
+ <datafield tag="020" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="024" ind1="1" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="245" ind1="0" ind2="0">
+ <subfield code="a"/>
+ <subfield code="h">[game]</subfield>
+ </datafield>
+ <datafield tag="260" ind1="" ind2="">
+ <subfield code="a"/>
+ <subfield code="b"/>
+ <subfield code="c"/>
+ </datafield>
+ <datafield tag="300" ind1="" ind2="">
+ <subfield code="a">1 board game ( ) :</subfield>
+ <subfield code="b"/>
+ <subfield code="c">in box __ cm. x __ cm. x __ cm.</subfield>
+ </datafield>
+ <datafield tag="521" ind1="1" ind2="">
+ <subfield code="a">For ages:</subfield>
+ </datafield>
+ <datafield tag="500" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="500" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a">Board games.</subfield>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a">Games.</subfield>
+ </datafield>
+ </record>
\ No newline at end of file
--- /dev/null
+<record>
+ <leader>00309nam a22001457a 4500</leader>
+ <controlfield tag="008">120919s xxu f 000 eng d</controlfield>
+ <datafield tag="020" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="100" ind1="1" ind2="">
+ <subfield code="a"/>
+ <subfield code="d"/>
+ </datafield>
+ <datafield tag="245" ind1="1" ind2="0">
+ <subfield code="a"/>
+ <subfield code="h">[braille]</subfield>
+ <subfield code="b"/>
+ <subfield code="c"/>
+ </datafield>
+ <datafield tag="250" ind1="" ind2="">
+ <subfield code="a">Braille edition.</subfield>
+ </datafield>
+ <datafield tag="260" ind1="" ind2="">
+ <subfield code="a"/>
+ <subfield code="b"/>
+ <subfield code="c"/>
+ </datafield>
+ <datafield tag="300" ind1="" ind2="">
+ <subfield code="a"> pages of braille ;</subfield>
+ <subfield code="c"> cm.</subfield>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a"/>
+ <subfield code="v"/>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a">Braille books.</subfield>
+ </datafield>
+ <datafield tag="700" ind1="1" ind2="">
+ <subfield code="a"/>
+ </datafield>
+</record>
\ No newline at end of file
--- /dev/null
+<record>
+ <leader>01149cim a2200265Ka 4500</leader>
+ <controlfield tag="007">sd fungnn---uu</controlfield>
+ <controlfield tag="008"> s eng d</controlfield>
+ <datafield tag="020" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="024" ind1="1" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="028" ind1="4" ind2="2">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="100" ind1="1" ind2="">
+ <subfield code="a"/>
+ <subfield code="d"/>
+ </datafield>
+ <datafield tag="245" ind1="1" ind2="">
+ <subfield code="a"/>
+ <subfield code="h">[sound recording]</subfield>
+ <subfield code="b"/>
+ <subfield code="c"/>
+ </datafield>
+ <datafield tag="260" ind1="" ind2="">
+ <subfield code="a"/>
+ <subfield code="b"/>
+ <subfield code="c"/>
+ </datafield>
+ <datafield tag="300" ind1="" ind2="">
+ <subfield code="a">sound discs :</subfield>
+ <subfield code="b">digital ;</subfield>
+ <subfield code="c">4 3/4 in.</subfield>
+ </datafield>
+ <datafield tag="511" ind1="" ind2="">
+ <subfield code="a">Narrated by</subfield>
+ </datafield>
+ <datafield tag="500" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="700" ind1="1" ind2="">
+ <subfield code="a"/>
+ </datafield>
+</record>
\ No newline at end of file
--- /dev/null
+<record>
+<leader>01149cjm a2200265Ka 4500</leader>
+<controlfield tag="007">sd fungnn---uu</controlfield>
+<controlfield tag="008"> s eng d</controlfield>
+<datafield tag="020" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="024" ind1="1" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="028" ind1="4" ind2="2">
+<subfield code="a"/>
+</datafield>
+<datafield tag="100" ind1="1" ind2="">
+<subfield code="a"/>
+<subfield code="d"/>
+</datafield>
+<datafield tag="245" ind1="1" ind2="">
+<subfield code="a"/>
+<subfield code="h">[sound recording] /</subfield>
+<subfield code="c"/>
+</datafield>
+<datafield tag="260" ind1="" ind2="">
+<subfield code="a"> : </subfield>
+<subfield code="b"> ,</subfield>
+<subfield code="c"/>
+</datafield>
+<datafield tag="300" ind1="" ind2="">
+<subfield code="a">1 sound disc :</subfield>
+<subfield code="b">digital ;</subfield>
+<subfield code="c">4 3/4 in.</subfield>
+</datafield>
+<datafield tag="505" ind1="0" ind2="">
+<subfield code="a">Contents:</subfield>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="650" ind1="" ind2="0">
+<subfield code="a"/>
+</datafield>
+<datafield tag="700" ind1="1" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="700" ind1="1" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="740" ind1="0" ind2="2">
+<subfield code="a"/>
+</datafield>
+</record>
\ No newline at end of file
--- /dev/null
+<record>
+<leader>00309ngm a22001457a 4500</leader>
+<controlfield tag="007">vd cvaizq</controlfield>
+<controlfield tag="008"> v eng d</controlfield>
+<datafield tag="020" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="024" ind1="1" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="028" ind1="0" ind2="2">
+<subfield code="a"/>
+<subfield code="b"/>
+</datafield>
+<datafield tag="245" ind1="0" ind2="0">
+<subfield code="a"/>
+<subfield code="h">[videorecording]</subfield>
+<subfield code="b"/>
+<subfield code="c"/>
+</datafield>
+<datafield tag="250" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="260" ind1="" ind2="">
+<subfield code="a"/>
+<subfield code="b"/>
+<subfield code="c"/>
+</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="538" ind1="" ind2="">
+<subfield code="a">DVD.</subfield>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="650" ind1="" ind2="0">
+<subfield code="a"/>
+</datafield>
+<datafield tag="700" ind1="1" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="700" ind1="1" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="700" ind1="1" ind2="">
+<subfield code="a"/>
+</datafield>
+</record>
\ No newline at end of file
--- /dev/null
+<record>
+<leader>01149cam a2200265Ka 4500</leader>
+<controlfield tag="008"> s eng d</controlfield>
+<datafield tag="245" ind1="0" ind2="0">
+<subfield code="a"/>
+<subfield code="h">[electronic reader]</subfield>
+</datafield>
+<datafield tag="300" ind1="" ind2="">
+<subfield code="a">1 e-reader +</subfield>
+<subfield code="e"/>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="505" ind1="0" ind2="">
+<subfield code="a">Contents:</subfield>
+</datafield>
+<datafield tag="650" ind1="" ind2="0">
+<subfield code="a">Electronic books.</subfield>
+</datafield>
+<datafield tag="650" ind1="" ind2="0">
+<subfield code="a">Electronic book readers.</subfield>
+</datafield>
+<datafield tag="700" ind1="1" ind2="2">
+<subfield code="a"/>
+<subfield code="t"/>
+</datafield>
+<datafield tag="700" ind1="1" ind2="2">
+<subfield code="a"/>
+<subfield code="t"/>
+</datafield>
+<datafield tag="700" ind1="1" ind2="2">
+<subfield code="a"/>
+<subfield code="t"/>
+</datafield>
+<datafield tag="700" ind1="1" ind2="2">
+<subfield code="a"/>
+<subfield code="t"/>
+</datafield>
+<datafield tag="700" ind1="1" ind2="2">
+<subfield code="a"/>
+<subfield code="t"/>
+</datafield>
+<datafield tag="700" ind1="1" ind2="2">
+<subfield code="a"/>
+<subfield code="t"/>
+</datafield>
+<datafield tag="700" ind1="1" ind2="2">
+<subfield code="a"/>
+<subfield code="t"/>
+</datafield>
+<datafield tag="700" ind1="1" ind2="2">
+<subfield code="a"/>
+<subfield code="t"/>
+</datafield>
+<datafield tag="700" ind1="1" ind2="2">
+<subfield code="a"/>
+<subfield code="t"/>
+</datafield>
+<datafield tag="700" ind1="1" ind2="2">
+<subfield code="a"/>
+<subfield code="t"/>
+</datafield>
+<datafield tag="700" ind1="1" ind2="2">
+<subfield code="a"/>
+<subfield code="t"/>
+</datafield>
+<datafield tag="700" ind1="1" ind2="2">
+<subfield code="a"/>
+<subfield code="t"/>
+</datafield>
+</record>
\ No newline at end of file
--- /dev/null
+<record>
+<leader>01149cam a2200265Ka 4500</leader>
+<controlfield tag="008"> s eng d</controlfield>
+<datafield tag="245" ind1="0" ind2="0">
+<subfield code="a"/>
+<subfield code="h">[electronic reader]</subfield>
+</datafield>
+<datafield tag="300" ind1="" ind2="">
+<subfield code="a">1 e-reader +</subfield>
+<subfield code="e"/>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="650" ind1="" ind2="0">
+<subfield code="a">Electronic book readers.</subfield>
+</datafield>
+<datafield tag="740" ind1="0" ind2="">
+<subfield code="a"/>
+</datafield>
+</record>
\ No newline at end of file
--- /dev/null
+<record>
+ <leader>00309nrm a22001457a 4500</leader>
+ <controlfield tag="008">120919s xxu 000 eng d</controlfield>
+ <datafield tag="245" ind1="0" ind2="0">
+ <subfield code="a"> </subfield>
+ <subfield code="h">[equipment]</subfield>
+ </datafield>
+ <datafield tag="300" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="500" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="500" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="500" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a">Circulating audiovisual equipment.</subfield>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a"/>
+ </datafield>
+ </record>
\ No newline at end of file
--- /dev/null
+<record>
+<leader>01149cam a2200265Ka 4500</leader>
+<controlfield tag="008"> s eng d</controlfield>
+<datafield tag="245" ind1="0" ind2="0">
+<subfield code="a"/>
+<subfield code="h">[electronic reader]</subfield>
+</datafield>
+<datafield tag="300" ind1="" ind2="">
+<subfield code="a">1 e-reader +</subfield>
+<subfield code="e"/>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="650" ind1="" ind2="0">
+<subfield code="a">Electronic book readers.</subfield>
+</datafield>
+<datafield tag="740" ind1="0" ind2="">
+<subfield code="a"/>
+</datafield>
+</record>
\ No newline at end of file
--- /dev/null
+<record>
+<leader>01149com a2200265Ka 4500</leader>
+<controlfield tag="008">120919s xxu 000 eng d</controlfield>
+<datafield tag="245" ind1="0" ind2="0">
+<subfield code="a"/>
+<subfield code="h">[kit]</subfield>
+</datafield>
+<datafield tag="300" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="505" ind1="0" ind2="">
+<subfield code="a">Contents:</subfield>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="650" ind1="" ind2="0">
+<subfield code="a"/>
+</datafield>
+<datafield tag="650" ind1="" ind2="0">
+<subfield code="a"/>
+</datafield>
+<datafield tag="740" ind1="0" ind2="2">
+<subfield code="a"/>
+</datafield>
+<datafield tag="740" ind1="0" ind2="2">
+<subfield code="a"/>
+</datafield>
+<datafield tag="740" ind1="0" ind2="2">
+<subfield code="a"/>
+</datafield>
+<datafield tag="740" ind1="0" ind2="2">
+<subfield code="a"/>
+</datafield>
+<datafield tag="740" ind1="0" ind2="2">
+<subfield code="a"/>
+</datafield>
+</record>
\ No newline at end of file
--- /dev/null
+<record>
+ <leader>00309nam a22001457a 4500</leader>
+ <controlfield tag="008">120919s xxu d 000 eng d</controlfield>
+ <datafield tag="020" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="100" ind1="1" ind2="">
+ <subfield code="a"/>
+ <subfield code="d"/>
+ </datafield>
+ <datafield tag="245" ind1="1" ind2="0">
+ <subfield code="a"> : </subfield>
+ <subfield code="b"> / </subfield>
+ <subfield code="c"/>
+ </datafield>
+ <datafield tag="250" ind1="" ind2="">
+ <subfield code="a">Large print ed.</subfield>
+ </datafield>
+ <datafield tag="260" ind1="" ind2="">
+ <subfield code="a"> : </subfield>
+ <subfield code="b"> , </subfield>
+ <subfield code="c"/>
+ </datafield>
+ <datafield tag="300" ind1="" ind2="">
+ <subfield code="a"> p. (large print) ;</subfield>
+ <subfield code="c"> cm.</subfield>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a"/>
+ <subfield code="v"/>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a">Large type books.</subfield>
+ </datafield>
+ <datafield tag="700" ind1="1" ind2="">
+ <subfield code="a"/>
+ </datafield>
+</record>
\ No newline at end of file
--- /dev/null
+<record>
+<leader>00309nem a2200145Ka 4500</leader>
+<controlfield tag="007">aj aanun</controlfield>
+<controlfield tag="008"> s xxu a eng d</controlfield>
+<datafield tag="020" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="024" ind1="0" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="245" ind1="0" ind2="0">
+<subfield code="a"/>
+<subfield code="h">[map].</subfield>
+</datafield>
+<datafield tag="260" ind1="" ind2="">
+<subfield code="a"/>
+<subfield code="b"/>
+<subfield code="c"/>
+</datafield>
+<datafield tag="300" ind1="" ind2="">
+<subfield code="a">1 map :</subfield>
+<subfield code="b">col. ;</subfield>
+<subfield code="c">on sheet -- x -- cm., folded to -- x -- cm.</subfield>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a">Scale: </subfield>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="651" ind1="" ind2="0">
+<subfield code="a"/>
+<subfield code="x">Maps.</subfield>
+</datafield>
+<datafield tag="651" ind1="" ind2="0">
+<subfield code='a'/>
+<subfield code="x">Maps.</subfield>
+</datafield>
+<datafield tag="700" ind1="1" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="710" ind1="2" ind2="">
+<subfield code="a"/>
+</datafield>
+</record>
\ No newline at end of file
--- /dev/null
+<record>
+ <leader>01149cim a22002657a 4500</leader>
+ <controlfield tag="007">sd fungnn---ed</controlfield>
+ <controlfield tag="008">170101s xxunnnn n eng d</controlfield>
+ <datafield tag="020" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="024" ind1="1" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="028" ind1="4" ind2="2">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="100" ind1="1" ind2="">
+ <subfield code="a"/>
+ <subfield code="d"/>
+ </datafield>
+ <datafield tag="245" ind1="1" ind2="">
+ <subfield code="a"/>
+ <subfield code="h">[sound recording]</subfield>
+ <subfield code="b"/>
+ <subfield code="c"/>
+ </datafield>
+ <datafield tag="250" ind1="" ind2="">
+ <subfield code="a">MP3 version.</subfield>
+ </datafield>
+ <datafield tag="260" ind1="" ind2="">
+ <subfield code="a"/>
+ <subfield code="b"/>
+ <subfield code="c"/>
+ </datafield>
+ <datafield tag="300" ind1="" ind2="">
+ <subfield code="a">sound disc :</subfield>
+ <subfield code="b">MP3 audio,digital ;</subfield>
+ <subfield code="c">4 3/4 in.</subfield>
+ </datafield>
+ <datafield tag="538" ind1="" ind2="">
+ <subfield code="a">System requirements: CD/MP3 player or PC computer with MP3-capable software.</subfield>
+ </datafield>
+ <datafield tag="511" ind1="" ind2="">
+ <subfield code="a">Narrated by</subfield>
+ </datafield>
+ <datafield tag="500" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="700" ind1="1" ind2="">
+ <subfield code="a"/>
+ </datafield>
+</record>
\ No newline at end of file
--- /dev/null
+<record>
+<leader>00309nam a22001457a 4500</leader>
+<controlfield tag="008">120919s xxu 000 eng d</controlfield>
+<datafield tag="245" ind1="0" ind2="0">
+<subfield code="a">Museum pass for</subfield>
+</datafield>
+<datafield tag="246" ind1="3" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a">Address:</subfield>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a">Tel:</subfield>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a">Hours:</subfield>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a">Admits:</subfield>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="650" ind1="" ind2="0">
+<subfield code="a">Museum passes.</subfield>
+</datafield>
+<datafield tag="650" ind1="" ind2="0">
+<subfield code="a"/>
+</datafield>
+</record>
\ No newline at end of file
--- /dev/null
+<record>
+<leader>01149cjm a2200265Ka 4500</leader>
+<controlfield tag="007">sd bumenn---uu</controlfield>
+<controlfield tag="008"> s eng d</controlfield>
+<datafield tag="020" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="024" ind1="1" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="028" ind1="4" ind2="2">
+<subfield code="a"/>
+</datafield>
+<datafield tag="100" ind1="1" ind2="">
+<subfield code="a"/>
+<subfield code="d"/>
+</datafield>
+<datafield tag="245" ind1="1" ind2="">
+<subfield code="a"/>
+<subfield code="h">[sound recording] </subfield>
+<subfield code="c"/>
+</datafield>
+<datafield tag="260" ind1="" ind2="">
+<subfield code="a"> : </subfield>
+<subfield code="b"> ,</subfield>
+<subfield code="c"/>
+</datafield>
+<datafield tag="300" ind1="" ind2="">
+<subfield code="a">1 sound disc :</subfield>
+<subfield code="b">analog, 33 1/3 rpm ;</subfield>
+<subfield code="c">12 in.</subfield>
+</datafield>
+<datafield tag="505" ind1="0" ind2="">
+<subfield code="a">Contents:</subfield>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="650" ind1="" ind2="0">
+<subfield code="a"/>
+</datafield>
+<datafield tag="700" ind1="1" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="700" ind1="1" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="740" ind1="0" ind2="2">
+<subfield code="a"/>
+</datafield>
+</record>
\ No newline at end of file
--- /dev/null
+<record>
+<leader>01149cim a2200265Ka 4500</leader>
+<controlfield tag="007">sd bumenn---uu</controlfield>
+<controlfield tag="008">170101s xxunnnn n eng d</controlfield>
+<datafield tag="020" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="024" ind1="1" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="028" ind1="4" ind2="2">
+<subfield code="a"/>
+</datafield>
+<datafield tag="100" ind1="1" ind2="">
+<subfield code="a"/>
+<subfield code="d"/>
+</datafield>
+<datafield tag="245" ind1="1" ind2="">
+<subfield code="a"/>
+<subfield code="h">[sound recording] </subfield>
+<subfield code="c"/>
+</datafield>
+<datafield tag="260" ind1="" ind2="">
+<subfield code="a"> : </subfield>
+<subfield code="b"> ,</subfield>
+<subfield code="c"/>
+</datafield>
+<datafield tag="300" ind1="" ind2="">
+<subfield code="a">1 sound disc ;</subfield>
+<subfield code="b">analog, 33 1/3 rpm ;</subfield>
+<subfield code="c">12 in.</subfield>
+</datafield>
+<datafield tag="505" ind1="0" ind2="">
+<subfield code="a">Contents:</subfield>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="650" ind1="" ind2="0">
+<subfield code="a"/>
+</datafield>
+<datafield tag="700" ind1="1" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="700" ind1="1" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="740" ind1="0" ind2="2">
+<subfield code="a"/>
+</datafield>
+</record>
\ No newline at end of file
--- /dev/null
+<record>
+<leader>00309nkm a2200145Ka 4500</leader>
+<controlfield tag="007">kh bo</controlfield>
+<controlfield tag="008"> s maunnn o ineng d</controlfield>
+<datafield tag="245" ind1="0" ind2="0">
+<subfield code="a"/>
+<subfield code="h">[electronic resource].</subfield>
+</datafield>
+<datafield tag="260" ind1="" ind2="">
+<subfield code="c"/>
+</datafield>
+<datafield tag="300" ind1="" ind2="">
+<subfield code="a">1 photograph :</subfield>
+<subfield code="b">black and white ;</subfield>
+<subfield code="c"> -- x -- cm.</subfield>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="650" ind1="" ind2="0">
+<subfield code="a"/>
+</datafield>
+<datafield tag="651" ind1="" ind2="0">
+<subfield code="a"/>
+</datafield>
+<datafield tag="700" ind1="1" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="710" ind1="2" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="856" ind1="4" ind2="2">
+<subfield code="z">View online</subfield>
+<subfield code="u"/>
+</datafield>
+</record>
\ No newline at end of file
--- /dev/null
+<record>
+<leader>00309nkm a2200145Ka 4500</leader>
+<controlfield tag="007">kh bo</controlfield>
+<controlfield tag="008"> s maunnn o ineng d</controlfield>
+<datafield tag="100" ind1="1" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="245" ind1="" ind2="">
+<subfield code="a"/>
+<subfield code="h">[electronic resource].</subfield>
+</datafield>
+<datafield tag="260" ind1="" ind2="">
+<subfield code="c"/>
+</datafield>
+<datafield tag="300" ind1="" ind2="">
+<subfield code="a">1 photograph :</subfield>
+<subfield code="b">black and white ;</subfield>
+<subfield code="c"> -- x -- cm.</subfield>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="650" ind1="" ind2="0">
+<subfield code="a"/>
+</datafield>
+<datafield tag="651" ind1="" ind2="0">
+<subfield code="a"/>
+</datafield>
+<datafield tag="700" ind1="1" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="710" ind1="2" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="856" ind1="4" ind2="2">
+<subfield code="9">CWMARS</subfield>
+<subfield code="z">View online</subfield>
+<subfield code="u"/>
+</datafield>
+</record>
\ No newline at end of file
--- /dev/null
+<record>
+ <leader>01149cim a22002657a 4500</leader>
+ <controlfield tag="007">sz zunznn---uu</controlfield>
+ <controlfield tag="008">170101s xxunnnn q n eng d</controlfield>
+ <datafield tag="020" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="024" ind1="1" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="028" ind1="4" ind2="2">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="100" ind1="1" ind2="">
+ <subfield code="a"/>
+ <subfield code="d"/>
+ </datafield>
+ <datafield tag="245" ind1="1" ind2="">
+ <subfield code="a"/>
+ <subfield code="h">[electronic resource]</subfield>
+ <subfield code="b"/>
+ <subfield code="c"/>
+ </datafield>
+ <datafield tag="260" ind1="" ind2="">
+ <subfield code="a">Solon, Ohio :</subfield>
+ <subfield code="b">Findaway World,</subfield>
+ <subfield code="c"/>
+ </datafield>
+ <datafield tag="300" ind1="" ind2="">
+ <subfield code="a">1 sound media player :</subfield>
+ <subfield code="b">digital ;</subfield>
+ <subfield code="c">3 3/8 by 2 1/8 in.</subfield>
+ </datafield>
+ <datafield tag="511" ind1="" ind2="">
+ <subfield code="a">Narrated by</subfield>
+ </datafield>
+ <datafield tag="500" ind1="" ind2="">
+ <subfield code="a">Issued on Playaway, a dedicated audio media player.</subfield>
+ </datafield>
+ <datafield tag="500" ind1="" ind2="">
+ <subfield code="a">In container (21 x 13 x 3 cm.) with earphones, AAA battery and lanyard.</subfield>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="700" ind1="1" ind2="">
+ <subfield code="a"/>
+ </datafield>
+</record>
\ No newline at end of file
--- /dev/null
+<record>
+ <leader>00309nrm a22001457a 4500</leader>
+ <controlfield tag="008">120919s xxunnn gneng d</controlfield>
+ <datafield tag="245" ind1="0" ind2="0">
+ <subfield code="a"> </subfield>
+ <subfield code="h">[game]</subfield>
+ </datafield>
+ <datafield tag="260" ind1="" ind2="">
+ <subfield code="a"> :</subfield>
+ <subfield code="b"/>
+ <subfield code="c"/>
+ </datafield>
+ <datafield tag="300" ind1="" ind2="">
+ <subfield code="a">1 puzzle ( pieces)</subfield>
+ <subfield code="b">cardboard, col. ;</subfield>
+ <subfield code="c">__ x __ cm.</subfield>
+ </datafield>
+ <datafield tag="521" ind1="" ind2="">
+ <subfield code="a">For ages</subfield>
+ </datafield>
+ <datafield tag="500" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="500" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a">Children's jigsaw puzzles.</subfield>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a">Puzzles.</subfield>
+ </datafield>
+ </record>
\ No newline at end of file
--- /dev/null
+<record>
+ <leader>00309nrm a22001457a 4500</leader>
+ <controlfield tag="008">120919s xxunnn gneng d</controlfield>
+ <datafield tag="245" ind1="0" ind2="0">
+ <subfield code="a"> </subfield>
+ <subfield code="h">[game]</subfield>
+ </datafield>
+ <datafield tag="300" ind1="" ind2="">
+ <subfield code="a">Jigsaw puzzles.</subfield>
+ </datafield>
+ <datafield tag="505" ind1="0" ind2="">
+ <subfield code="a">Puzzles:</subfield>
+ </datafield>
+ <datafield tag="500" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="500" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a">Jigsaw puzzles.</subfield>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a">Puzzles.</subfield>
+ </datafield>
+ </record>
\ No newline at end of file
--- /dev/null
+<record>
+ <leader>00309nas a22001457a 4500</leader>
+ <controlfield tag="008"> cuuuu9999xxuuu 0 a0eng d</controlfield>
+ <datafield tag="022" ind2="" ind1="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="222" ind2="" ind1="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="245" ind1="0" ind2="0">
+ <subfield code="a"/>
+ <subfield code="b"> </subfield>
+ </datafield>
+ <datafield tag="260" ind1="" ind2="">
+ <subfield code="a"/>
+ <subfield code="b"/>
+ <subfield code="c"/>
+ </datafield>
+ <datafield tag="300" ind2="" ind1="">
+ <subfield code="a"> v. ; </subfield>
+ <subfield code="c"> cm.</subfield>
+ </datafield>
+ <datafield tag="310" ind2="" ind1="">
+ <subfield code="a"/>
+ </datafield>
+<datafield tag="362" ind2="" ind1="">
+<subfield code="a"/>
+</datafield>
+ <datafield tag="500" ind2="" ind1="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a"/>
+ <subfield code="v">Periodicals.</subfield>
+ </datafield>
+ <datafield tag="710" ind1="2" ind2="">
+ <subfield code="a"/>
+ </datafield>
+</record>
\ No newline at end of file
--- /dev/null
+<record>
+ <leader>00309nas a22001457a 4500</leader>
+ <controlfield tag="008"> cuuuu9999xxuuu a 0 a0eng d</controlfield>
+ <datafield tag="022" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="222" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="245" ind1="0" ind2="0">
+ <subfield code="a"/>
+<subfield code="h">[microfilm]</subfield>
+ <subfield code="b"> </subfield>
+ </datafield>
+ <datafield tag="250" ind1="" ind2="">
+ <subfield code="a">Microfilm version.</subfield>
+ </datafield>
+ <datafield tag="260" ind1="" ind2="">
+ <subfield code="a"/>
+ <subfield code="b"/>
+ <subfield code="c"/>
+ </datafield>
+ <datafield tag="300" ind1="" ind2="">
+ <subfield code="a">volumes :</subfield>
+ <subfield code="b">illustrations ;</subfield>
+ <subfield code="c"> cm.</subfield>
+ </datafield>
+ <datafield tag="310" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+<datafield tag="362" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+ <datafield tag="500" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="533" ind1="" ind2="">
+ <subfield code="a">Microfilm.</subfield>
+ <subfield code="b"/>
+ <subfield code="c"/>
+ <subfield code="d"/>
+ <subfield code="e">microfilm reels ; 35 mm.</subfield>
+</datafield>
+ <datafield tag="651" ind1="" ind2="0">
+ <subfield code="a"/>
+ <subfield code="v">Newspapers.</subfield>
+ </datafield>
+ <datafield tag="710" ind1="2" ind2="">
+ <subfield code="a"/>
+ </datafield>
+</record>
\ No newline at end of file
--- /dev/null
+<record>
+ <leader>00309nrm a22001457a 4500</leader>
+ <controlfield tag="008">170101s xxunnn j wneng d</controlfield>
+ <datafield tag="024" ind1="1" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="245" ind1="0" ind2="0">
+ <subfield code="a"> </subfield>
+ <subfield code="h">[toy]</subfield>
+ </datafield>
+ <datafield tag="260" ind1="" ind2="">
+ <subfield code="a"/>
+ <subfield code="b"/>
+ <subfield code="c"/>
+ </datafield>
+ <datafield tag="300" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="500" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="500" ind1="" ind2="">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a"/>
+ </datafield>
+ <datafield tag="650" ind1="" ind2="0">
+ <subfield code="a">Toys.</subfield>
+ </datafield>
+ </record>
\ No newline at end of file
--- /dev/null
+<record>
+<leader>00309nmm a2200145Ka 4500</leader>
+<controlfield tag="007">cb cza</controlfield>
+<controlfield tag="008"> s2014 eng d</controlfield>
+<datafield tag="020" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="024" ind1="1" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="028" ind1="4" ind2="2">
+<subfield code="a"/>
+<subfield code="b"/>
+</datafield>
+<datafield tag="245" ind1="0" ind2="0">
+<subfield code="a"/>
+<subfield code="h">[video game]</subfield>
+<subfield code="b"/>
+</datafield>
+<datafield tag="250" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="260" ind1="" ind2="">
+<subfield code="a"/>
+<subfield code="b"/>
+<subfield code="c"/>
+</datafield>
+<datafield tag="300" ind1="" ind2="">
+<subfield code="a">1 video game cartridge :</subfield>
+<subfield code="b">sd., col.</subfield>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="500" ind1="" ind2="">
+<subfield code="a"/>
+</datafield>
+<datafield tag="650" ind1="1" ind2="0">
+<subfield code="a">Video games.</subfield>
+</datafield>
+</record>
\ No newline at end of file
--- /dev/null
+[%- PROCESS "opac/parts/header.tt2";
+ PROCESS "opac/parts/org_selector.tt2";
+ WRAPPER "opac/parts/base.tt2";
+ INCLUDE "opac/parts/topnav.tt2";
+ ctx.page_title = l("Get a CW MARS eCard");
+ ctx_org = ctx.physical_loc || ctx.search_ou || ctx.aou_tree.id;
+%]
+<div id="content-wrapper">
+<div id="main-content-register"
+ style="margin: auto; width: 65%;">
+<h2>[% ctx.page_title %]</h2>
+[% IF ctx.ecard.enabled && ctx.ecard.quipu_id %]
+<div id="ecard-intro">
+<!-- The following script tags can be placed in the library's <head> or <body> tag -->
+<script src="https://ecard-us2.quipugroup.net/js/eCARDEmbed.js"></script>
+<script>loadQGeCARD([% ctx.ecard.quipu_id %])</script>
+
+[% INCLUDE "opac/ecard/lang.tt2" %]
+
+<p>An eCard is a CW MARS library card that you can register for online to access electronic materials, such as ebooks, audiobooks, magazines, and databases.</p>
+
+<p>The eCard is for patrons who do not already have a CW MARS library card and may be upgraded to a physical library card with borrowing privileges by visiting your local library. For more information about the eCard, <a href="https://www.cwmars.org/help/general-faq#h.tsmz4ldtjggv" target="_blank" rel="noopener">read our FAQ</a>.</p>
+
+<p>You are eligible to apply for a CW MARS eCard, if you...</p>
+<ul>
+<li>live in a Massachusetts town with a <a href="https://www.cwmars.org/memberlibraries" target="_blank" rel="noopener">CW MARS member library</a>,</li>
+<li>are age 13 or older,</li>
+<li>and do not currently have a library card from a <a href="https://www.cwmars.org/memberlibraries" target="_blank" rel="noopener">CW MARS member library</a>.</li>
+</ul>
+
+<p>Contact your local library if you are not eligible to register online or to renew an expired card.</p>
+
+<p>Funding for electronic content is provided by <a href="https://www.cwmars.org/memberlibraries" target="_blank" rel="noopener">CW MARS member libraries</a>, and the <a href="https://mblc.state.ma.us/" target="_blank" rel="noopener">Massachusetts Board of Library Commissioners</a> with funding from the <a href="https://www.imls.gov/" target="_blank" rel="noopener">Institute of Museum and Library Services</a> and the Commonwealth of Massachusetts.</p>
+
+</div>
+<!-- The following <div> tag should be placed on the web page where the library would like the registration form to display -->
+<div id="eCARD" data-language="en" data-branchid="[% ctx_org %]"></div>
+[% ELSE %]
+<p>
+[% l('Electronic card registration is not enabled for this library.') %]
+</p>
+[% END #IF %]
+</div>
+</div>
+[% END #WRAPPER %]
--- /dev/null
+[%- PROCESS "opac/parts/header.tt2";
+ PROCESS "opac/parts/org_selector.tt2";
+ WRAPPER "opac/parts/base.tt2";
+ INCLUDE "opac/parts/topnav.tt2";
+ ctx.page_title = l("Get a CW MARS eCard");
+ ctx_org = ctx.physical_loc || ctx.search_ou || ctx.aou_tree.id;
+%]
+<div id="content-wrapper">
+<div id="main-content-register"
+ style="margin: auto; width: 65%;">
+<h2>Obtenga una tarjeta electrónica CW MARS</h2>
+[% IF ctx.ecard.enabled && ctx.ecard.quipu_id %]
+<div id="ecard-intro">
+<!-- The following script tags can be placed in the library's <head> or <body> tag -->
+<script src="https://ecard-us2.quipugroup.net/js/eCARDEmbed.js"></script>
+<script>loadQGeCARD([% ctx.ecard.quipu_id %])</script>
+
+[% INCLUDE "opac/ecard/lang.tt2" %]
+
+<p>Una tarjeta electrónica es una tarjeta de biblioteca de la red CW MARS en la que puede registrarse en línea para acceder a materiales electrónicos, como libros electrónicos, audiolibros, revistas y bases de datos.</p>
+
+<p>La tarjeta electrónica es para usuarios que aún no tienen una tarjeta de biblioteca de la red CW MARS y pueden actualizarse a una tarjeta de biblioteca física con privilegios de préstamo visitando su biblioteca local. Para obtener más información sobre la tarjeta electrónica, lea nuestras preguntas frecuentes.</p>
+
+<p>Usted es elegible para solicitar una tarjeta electrónica CW MARS, si ...</p>
+<ul>
+<li>vive en una ciudad de Massachusetts con una biblioteca miembro de la red CW MARS,</li>
+<li>tiene 13 años o más,</li>
+<li>y actualmente no tiene una tarjeta de biblioteca de una biblioteca miembro de la red CW MARS.</li>
+</ul>
+
+<p>Comuníquese con su biblioteca local si no es elegible para registrarse en línea o para renovar una tarjeta vencida.</p>
+
+<p>Los fondos para el contenido electrónico son proporcionados por las bibliotecas miembro de la red CW MARS y la Junta de Comisionados de Bibliotecas de Massachusetts con fondos del Instituto de Servicios de Museos y Bibliotecas y el Commonwealth of Massachusetts.</p>
+
+</div>
+<!-- The following <div> tag should be placed on the web page where the library would like the registration form to display -->
+<div id="eCARD" data-language="es" data-branchid="[% ctx_org %]"></div>
+[% ELSE %]
+<p>
+[% l('Electronic card registration is not enabled for this library.') %]
+</p>
+[% END #IF %]
+</div>
+</div>
+[% END #WRAPPER %]
--- /dev/null
+[%- PROCESS "opac/parts/header.tt2";
+ PROCESS "opac/parts/org_selector.tt2";
+ WRAPPER "opac/parts/base.tt2";
+ INCLUDE "opac/parts/topnav.tt2";
+ ctx.page_title = l("Get a CW MARS eCard");
+ ctx_org = ctx.physical_loc || ctx.search_ou || ctx.aou_tree.id;
+%]
+<div id="content-wrapper">
+<div id="main-content-register"
+ style="margin: auto; width: 65%;">
+<h2>Obtenez une eCarte de CW MARS</h2>
+[% IF ctx.ecard.enabled && ctx.ecard.quipu_id %]
+<div id="ecard-intro">
+<!-- The following script tags can be placed in the library's <head> or <body> tag -->
+<script src="https://ecard-us2.quipugroup.net/js/eCARDEmbed.js"></script>
+<script>loadQGeCARD([% ctx.ecard.quipu_id %])</script>
+
+[% INCLUDE "opac/ecard/lang.tt2" %]
+
+<p>Une carte électronique (eCarte) est une carte de bibliothèque de CW MARS à laquelle vous pouvez vous inscrire en ligne pour accéder à des documents électroniques, tels que des livres électroniques, des livres audio, des magazines et des bases de données.</p>
+
+<p>La carte électronique (ecarte) est destinée aux usagers qui n'ont pas encore de carte de bibliothèque CW MARS. Cette carte peut être convertie a une carte de bibliothèque physique avec des privilèges d'emprunt en visitant votre bibliothèque locale. Pour plus d'informations sur la carte électronique, lisez notre FAQ.</p>
+
+<p>Vous pouvez demander une carte électronique CW MARS si vous...</p>
+<ul>
+<li>vivez dans une ville de Massachusetts avec une bibliothèque membre de CW MARS,</li>
+<li>avez 13 ans ou plus,</li>
+<li>et n'avez pas actuellement de carte de bibliothèque d'une bibliothèque membre de CW MARS.</li>
+</ul>
+
+<p>Contactez votre bibliothèque locale si vous n'êtes pas éligible à vous inscrire en ligne ou à renouveler une carte expirée.</p>
+
+<p>Le financement du contenu électronique est assuré par les bibliothèques membres de CW MARS et le Conseil des commissaires des bibliothèques de Massachusetts avec un financement de l'Institut du musée et des services de bibliothèque et le Commonwealth de Massachusetts.</p>
+
+</div>
+<!-- The following <div> tag should be placed on the web page where the library would like the registration form to display -->
+<div id="eCARD" data-language="fr" data-branchid="[% ctx_org %]"></div>
+[% ELSE %]
+<p>
+[% l('Electronic card registration is not enabled for this library.') %]
+</p>
+[% END #IF %]
+</div>
+</div>
+[% END #WRAPPER %]
--- /dev/null
+[%- PROCESS "opac/parts/header.tt2";
+ PROCESS "opac/parts/org_selector.tt2";
+ WRAPPER "opac/parts/base.tt2";
+ INCLUDE "opac/parts/topnav.tt2";
+ ctx.page_title = l("Get a CW MARS eCard");
+ ctx_org = ctx.physical_loc || ctx.search_ou || ctx.aou_tree.id;
+%]
+<div id="content-wrapper">
+<div id="main-content-register"
+ style="margin: auto; width: 65%;">
+<h2>Zdobądź CW MARS ECARD</h2>
+[% IF ctx.ecard.enabled && ctx.ecard.quipu_id %]
+<div id="ecard-intro">
+<!-- The following script tags can be placed in the library's <head> or <body> tag -->
+<script src="https://ecard-us2.quipugroup.net/js/eCARDEmbed.js"></script>
+<script>loadQGeCARD([% ctx.ecard.quipu_id %])</script>
+
+[% INCLUDE "opac/ecard/lang.tt2" %]
+
+<p>ECARD jest karta elektroniczny biblioteki CW MARS, którą możesz zarejestrować się w Internecie, aby uzyskać dostęp do materiałów elektronicznych, takich jak e-książki, audiobooki, czasopisma, gazety, i bazy danych.</p>
+
+<p>Karta jest dla klientów, którzy nie mają już fizyczną karty biblioteki CW Mars i mogą zostać zaktualizowane do fizycznej karty biblioteki z przywilejami pożyczkowania, odwiedzając lokalną bibliotekę. Aby uzyskać więcej informacji na temat ECARD, przeczytaj nasze FAQ.</p>
+
+<p>Kwalifikujesz się do ubiegania się o Karta CW MARS, jeśli ...</p>
+<ul>
+<li>mieszkasz w mieście Massachusetts z biblioteką członkowską CW MARS,</li>
+<li>masz 13 lat albo więcej,</li>
+<li>I obecnie nie masz już fizyczną karty biblioteki z biblioteki członkowskiej CW MARS.</li>
+</ul>
+
+<p>Skontaktuj się z lokalną biblioteką, jeśli nie kwalifikujesz się do rejestracji online albo odnowić wygasłą kartę.</p>
+
+<p>Finansowanie treści elektronicznych jest dostarczane przez biblioteki członkowskie CW MARS, a Rada Massachusetts komisarzy bibliotecznych z finansowaniem z Instytutu Muzeum i Biblioteki oraz Wspólnoty Massachusetts.</p>
+
+</div>
+<!-- The following <div> tag should be placed on the web page where the library would like the registration form to display -->
+<div id="eCARD" data-language="pl" data-branchid="[% ctx_org %]"></div>
+[% ELSE %]
+<p>
+[% l('Electronic card registration is not enabled for this library.') %]
+</p>
+[% END #IF %]
+</div>
+</div>
+[% END #WRAPPER %]
--- /dev/null
+[%- PROCESS "opac/parts/header.tt2";
+ PROCESS "opac/parts/org_selector.tt2";
+ WRAPPER "opac/parts/base.tt2";
+ INCLUDE "opac/parts/topnav.tt2";
+ ctx.page_title = l("Get a CW MARS eCard");
+ ctx_org = ctx.physical_loc || ctx.search_ou || ctx.aou_tree.id;
+%]
+<div id="content-wrapper">
+<div id="main-content-register"
+ style="margin: auto; width: 65%;">
+<h2>Получите электронный билет CW MARS</h2>
+[% IF ctx.ecard.enabled && ctx.ecard.quipu_id %]
+<div id="ecard-intro">
+<!-- The following script tags can be placed in the library's <head> or <body> tag -->
+<script src="https://ecard-us2.quipugroup.net/js/eCARDEmbed.js"></script>
+<script>loadQGeCARD([% ctx.ecard.quipu_id %])</script>
+
+[% INCLUDE "opac/ecard/lang.tt2" %]
+
+<p>Электронный билет - это библиотечный билет CW MARS, который вы можете зарегистрировать в Интернете для доступа к электронным материалам, как например электронные книги, аудиокниги, журналы и базы данных.</p>
+
+<p>Электронный билет предназначен для посетителей, у которых еще нет библиотечного билета CW MARS, и его можно улутчить к физическому библиотечному билету с привилегиями заимствования, посетив местную библиотеку. Для получения дополнительной информации об электронном билете прочтите наш <a href="https://www.cwmars.org/help/general-faq#h.tsmz4ldtjggv" target="_blank" rel="noopener">FAQ</a>.</p>
+
+<p>Вы имеете право подать заявку на получение билета CW MARS eCard, если вы ...</p>
+<ul>
+<li>живете в городе в Массачусетс с библиотекочным членом <a href="https://www.cwmars.org/memberlibraries" target="_blank" rel="noopener">CW MARS</a>,</li>
+<li>13 лет и старше,</li>
+<li>и если в настоящее время у вас нет читательского билета из библиотеки-члена <a href="https://www.cwmars.org/memberlibraries" target="_blank" rel="noopener">CW MARS</a>.</li>
+</ul>
+
+<p>Обратитесь в местную библиотеку, если вы не имеете права зарегистрироваться онлайн или продлить библиотечный билет с истекшим сроком действия.</p>
+
+<p>Финансирование электронного контента обеспечивается библиотеками-членами CW MARS и Советом комиссаров библиотек штата Массачусетс при финансовой поддержке Института музейного и библиотечного обслуживания и Содружества Массачусетса.</p>
+
+</div>
+<!-- The following <div> tag should be placed on the web page where the library would like the registration form to display -->
+<div id="eCARD" data-language="ru" data-branchid="[% ctx_org %]"></div>
+[% ELSE %]
+<p>
+[% l('Electronic card registration is not enabled for this library.') %]
+</p>
+[% END #IF %]
+</div>
+</div>
+[% END #WRAPPER %]
--- /dev/null
+[%- PROCESS "opac/parts/header.tt2";
+ PROCESS "opac/parts/org_selector.tt2";
+ WRAPPER "opac/parts/base.tt2";
+ INCLUDE "opac/parts/topnav.tt2";
+ ctx.page_title = l("Get a CW MARS eCard");
+ ctx_org = ctx.physical_loc || ctx.search_ou || ctx.aou_tree.id;
+%]
+<div id="content-wrapper">
+<div id="main-content-register"
+ style="margin: auto; width: 65%;">
+<h2>获取 CW MARS 电子卡</h2>
+[% IF ctx.ecard.enabled && ctx.ecard.quipu_id %]
+<div id="ecard-intro">
+<!-- The following script tags can be placed in the library's <head> or <body> tag -->
+<script src="https://ecard-us2.quipugroup.net/js/eCARDEmbed.js"></script>
+<script>loadQGeCARD([% ctx.ecard.quipu_id %])</script>
+
+[% INCLUDE "opac/ecard/lang.tt2" %]
+
+<p>电子卡是 CW MARS 借书证,您可以在线注册,用来访问各种电子资料:电子书、有声读物、杂志和数据库等。</p>
+
+<p>电子卡适用于还没有办理 CW MARS 借书证的顾客。您可通过使用电子卡访问当地图书馆,进而升级为具有借阅权限的实体借书证。 有关电子卡的更多信息,请阅读我们的常见问题解答。</p>
+
+<p>您将有资格申请 CW MARS 电子卡,如果您...</p>
+<ul>
+<li>住在有 CW MARS 会员图书馆的马萨诸塞州的镇子</li>
+<li>年龄在 13 岁或以上</li>
+<li>目前还没有 CW MARS 成员图书馆的借书证</li>
+</ul>
+
+<p>如果您没有资格在线注册或更新过期的卡片,请联系您当地的图书馆。</p>
+
+<p></p>
+
+</div>
+<!-- The following <div> tag should be placed on the web page where the library would like the registration form to display -->
+<div id="eCARD" data-language="zh" data-branchid="[% ctx_org %]"></div>
+[% ELSE %]
+<p>
+[% l('Electronic card registration is not enabled for this library.') %]
+</p>
+[% END #IF %]
+</div>
+</div>
+[% END #WRAPPER %]
--- /dev/null
+[%-
+MACRO getformurl(lang, name)
+IF ctx.ecard.lang == lang;
+ name;
+ELSE;
+ path = '/eg/opac/ecard/form';
+ IF lang != "en";
+ path = path _ "_" _ lang;
+ END;
+ '<a href="' _ path _ '">' _ name _ '</a>';
+END;
+-%]
+<p>
+(
+[% getformurl('en', 'English') %] |
+[% getformurl('es', 'Español') %] |
+<!-- [% getformurl('pt', 'Português') %] | -->
+[% getformurl('zh', '中文') %] |
+[% getformurl('fr', 'Français') %] |
+[% getformurl('pl', 'Polszczyzna') %] |
+[% getformurl('ru', 'Русский') %]
+)
+</p>
--- /dev/null
+[% ctx.response %]
--- /dev/null
+<!doctype html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <title>[% l('Confirm an eCard Account') %]</title>
+ [% INCLUDE 'opac/parts/googalytics_new.tt2' %]
+
+ <link rel="stylesheet" href="/js/ui/default/staff/build/css/bootstrap.min.css" />
+
+ <!-- local CSS -->
+ <style>
+ /* BC screen reader links are not correctly hidden via their API.
+ Add some additional CSS to hide them */
+ .screen_reader_nav {
+ position: absolute;
+ top: -1000px;
+ left: -1000px;
+ z-index: 0;
+ }
+ #ecard-container-wrapper {
+ width: 98%;
+ }
+ #ecard-container {
+ margin-bottom: 20px;
+ color: #585d5e;
+ font-family: 'Open Sans', sans-serif;
+ letter-spacing: .5pt;
+ font-size: 15px;
+ width: 900px; /* to match bibliocms */
+ margin-left: auto;
+ margin-right: auto;
+ }
+ </style>
+
+ <script>
+ function handleSubmit() {
+ if (typeof ga === 'function') {
+ ga('send', 'event', 'Ecard Verify', 'submit', 'Forms');
+ }
+ return true;
+ }
+
+ function handleCancel() {
+ // unused at time of writing, keep around just in case.
+ if (typeof ga === 'function') {
+ ga('send', 'event', 'Ecard Verify', 'cancel', 'Forms');
+ }
+ return false; // avoid submit
+ }
+ </script>
+
+ <!-- BC CSS -->
+ [% ctx.bc_css %]
+ <!-- BC END CSS -->
+
+ </head>
+ <body>
+
+ <!-- BC SCREEN READER NAVIGATION -->
+ [% ctx.bc_screen_reader_navigation %]
+ <!-- BC END SCREEN READER NAVIGATION -->
+
+ <!-- BC HEADER -->
+ [% ctx.bc_header %]
+ <!-- BC END HEADER -->
+
+ <div id='ecard-container-wrapper' role="main">
+ <div id='ecard-container'>
+
+ <div id='ecard-preamble'>
+ <h1>Confirm Your KCLS eCard</h1>
+ <p>
+ Please fill out the form below to confirm your eCard account.
+ </p>
+ [% IF ctx.verify_failed %]
+ <div id='ecard-verify-failed'>
+ <div class="alert alert-warning" role="alert">
+ <p>
+ It appears that your confirmation did not go through.
+ This could happen for a variety of reasons:
+ </p>
+ <br/>
+ <ul>
+ <li>You mistyped the confirmation code</li>
+ <li>
+ You typed in the code, but you provided it more than 30
+ days after your application. If so, please feel free to reapply.
+ </li>
+ <li>You already confirmed, so your eCard is ready to use!</li>
+ </ul>
+ <br/>
+ <p>
+ If you have any questions about how to confirm your eCard
+ please contact <a href="https://kcls.org/ask/">Ask KCLS</a>
+ or staff at <a href="https://kcls.bibliocommons.com/locations">
+ your neighborhood library</a>.
+ </p>
+ </div>
+ </div>
+ [% END %]
+ </div>
+
+ [% IF ctx.verify_success %]
+ <div id='ecard-verify-success'>
+ <div class="alert alert-success" role="alert">
+ <p>
+ Congratulations! You have successfully confirmed your KCLS eCard!
+ </p>
+ <p>
+ <b>If you have not yet had a chance to find out what you can do with
+ your eCard, go to <a href="https://kcls.org/onlinelibrary">KCLS Online Resources</a>.
+ Read, stream, listen, find information, advance your studies, and enjoy!</b>
+ </p>
+ </div>
+ </div>
+ [% ELSE %]
+ <div id='ecard-verify-form' class='col-md-6'>
+ <form method='POST' onsubmit="return handleSubmit()">
+ <div class="form-group">
+ <label for="barcode">eCard Number</label>
+ <input type="text" class="form-control" id="barcode"
+ name="barcode" placeholder="eCard Number"
+ value="[% ctx.barcode | html %]"/>
+ </div>
+ <div class="form-group">
+ <label for="verification_code">6-Character Confirmation Code</label>
+ <input type="text" class="form-control" id="verification_code"
+ name="verification_code" placeholder="Confirmation Code"
+ value="[% ctx.verify_code | html %]"/>
+ </div>
+ <button type="submit" class="btn btn-default">Submit</button>
+ </form>
+ </div>
+ <div style="clear:both"></div>
+ [% END %]
+
+ </div>
+ </div>
+
+ <!-- BC FOOTER -->
+ [% ctx.bc_footer %]
+ <!-- BC END FOOTER -->
+
+ <!-- unlike the quipu form page, we have to manaully load jquery here -->
+ <script src="[% ctx.media_prefix %]/js/ui/default/common/build/js/jquery.min.js"></script>
+
+ <!-- BC JS -->
+ [% ctx.bc_js %]
+ <!-- BC END JS -->
+
+ </body>
+</html>
+
--- /dev/null
+[%
+ arrow_right = '►';
+ arrow_down = '▼';
+%]
+<div>
+ <div id='rdetail_extras_div'>
+ [%
+ IF ctx.google_books_preview;
+ label = l('Google Preview');
+ name = 'google_preview';
+ href = 'javascript:GBDisplayPreview();';
+ %]
+ <div id="gbp_extra" class="rdetail_extras hide_me">
+ <div class="rdetail_extras_hr"></div>
+ <div id="gbp_extra_links" class="rdetail_extras_link">
+ <a id='gbp_arrow_link' name='[% name %]' href='[% href %]' class='rdetail_extras_lbl'>[% arrow_right %]</a>
+ <a id='gbp_arrow_down_link' name='[% name %]' href='[% href %]' class='rdetail_extras_lbl hide_me'>[% arrow_down %]</a>
+ <a name='[% name %]_lbl' href='[% href %]' class="rdetail_extras_lbl">[% label %]</a></div>
+ </div>
+ <div id="gbp_extra_container" class='rdetail_extras_div'></div>
+ [% END %]
+
+ [% # Hidden extras are not yet implemented. Some may require JS
+
+ MACRO tab_is_active(tab) BLOCK;
+ exp_name = 'expand_' _ tab;
+ IF ctx.$exp_name OR ctx.expand_all; 1; END;
+ END;
+
+ # Let's see if we should hide the content cafe / simple summary content
+ hide_summary = 1;
+ IF attrs.summaries.0; hide_summary = 0; ELSE;
+ # Expose content cafe if it's reasonable to do so.
+ # This approach only works when using embedded content cafe.
+ IF ENV.OILS_CONTENT_CAFE_USER;
+ ident = attrs.isbn_clean || attrs.upc;
+ IF ident; hide_summary = 0; END;
+ END;
+ END;
+
+ # if no added content is available, hide the main tab.
+ # if any content is available, use the first tab as the default display tab.
+ default_ac = '';
+ IF !tab_is_active('addedcontent');
+ hide_ac = 1;
+ FOR type IN ctx.added_content.keys;
+ IF ctx.added_content.$type.status != '2'; # not available
+ hide_ac = 0;
+ END;
+ IF ctx.added_content.$type.status == '1';
+ SET default_ac = type UNLESS default_ac;
+ END;
+ END;
+ END;
+
+ extras = [
+ # {name => 'summaryplus', label => l('Summaries & More'), hide => hide_summary},
+ # {name => 'annotation', label => l('Annotation'), hide => 1},
+ # {name => 'awards', label => l('Awards, Reviews, & Suggested Reads')},
+ # {name => 'excerpt', label => l('Excerpt'), hide => 1},
+ # {name => 'issues', label => l('Issues Held'), hide => !(ctx.have_holdings_to_show || ctx.have_mfhd_to_show)},
+ # {name => 'preview', label => l('Preview'), hide => 1},
+ # {name => 'addedcontent', label => l('Additional Content'), hide => hide_ac}, # hide if all content is known to not exist
+ # {name => 'cnbrowse', label => l('Shelf Browser')},
+ {name => 'marchtml', label => l('Bibliographic Record')}
+ ];
+
+ FOREACH extra IN extras;
+ IF extra.hide; NEXT; END;
+ name = extra.name;
+ %]
+ <div class="rdetail_extras">
+ <div class="rdetail_extras_hr"></div>
+ <div class="rdetail_extras_link">
+ [%
+ IF tab_is_active(name);
+ href = mkurl('', {}, ['expand', 'ac']);
+ arrow = arrow_down;
+ ELSE;
+ IF name == 'addedcontent' AND default_ac;
+ href = mkurl('', {expand => name, ac => default_ac}) _ '#' _ name;
+ ELSE;
+ href = mkurl('', {expand => name}) _ '#' _ name;
+ END;
+ arrow = arrow_right;
+ END;
+ %]
+ <a name='[% name %]' href='[% href %]' class="rdetail_extras_lbl">[% arrow %] [% extra.label | html %]</a>
+ </div>
+ </div>
+ <div class='rdetail_extras_div'>
+ [% IF tab_is_active(name);
+ IF name == 'marchtml';
+ ctx.marchtml;
+ ELSE;
+ # Load the template for the selected extra
+ INCLUDE "opac/parts/record/${name}.tt2";
+ END;
+ END;
+ %]
+ </div>
+ [% END %]
+ </div>
+</div>
--- /dev/null
+User-agent: *
+Disallow: /
+