From 4ebbd5ab167c13e7b7fc9e223fa4a869ce301d6e Mon Sep 17 00:00:00 2001 From: Hector Castro <hector.hecaxmmx@gmail.com> Date: Mon, 20 Apr 2015 15:09:11 -0600 Subject: [PATCH] Bug 13642 [ENH] Adding new features for Dublin Core metadata When Koha export a bibliographic record to DC, makes it in XML format. This XML not follows the DC-XML recommendations as should be: elements in uppercase eg. dc:Date, dc:Creator, section 4.2, recommendation 4 explain that "The property names for the 15 DC elements should be all lower-case." eg. dc:date, dc:creator" and section "4.3 Example - a simple DC record", xsi:schemaLocation="http://example.org/myapp/ http://example.org/myapp/schema.xsd" schema does not exist. The recommendation can be consulted at <http://dublincore.org/documents/dc-xml-guidelines/>. This new feature, adds an ability to export Dublin Core metadata to XML and RDF (including rdfxml, rdfjson, ntriples, turtle, etc.) Test plan --------------- 1) Download Dublin Core file. Open up the file, and make sure that the document not follows the DC-XML recommendations as should be. 2) Apply patches. 3) Go to whichever bib record in OPAC or staff and click on Save > Dublin Core. A modal will display, prove all options. 4) Change the system preference 'Opac ExportOptions' by enabling and disabling Dublin Core and try to download a record in the OPAC. 5) Try several bibliographic records in any format (book, magazine, DVD, etc.) to confirm that properly exported. 6) RDF/XML can be validated per RDF Validator W3C. 7) DC-XML cannot valid if not exist a valid XSD schema. 8) OAI-DC can be validated using <http://www.freeformatter.com/xml-validator-xsd.html> and the proper schema <http://www.openarchives.org/OAI/2.0/oai_dc.xsd> typed in text field for URL. 9) Since unit test fail last time, test with prove t/db_dependent/Record.t Sponsored-by: Universidad de El Salvador Signed-off-by: Hector Castro <hector.hecaxmmx@gmail.com> XML::Entities, HTML::Entities and, HTML::Entities::Numbered were eliminated from patch, use instead C4::Record::_entity_encode, RDF::Helper has been eliminated too. --- C4/Installer/PerlDependencies.pm | 5 + C4/Record.pm | 127 ++- Koha/DublinCore.pm | 1011 ++++++++++++++++++++ catalogue/export.pl | 36 +- debian/control | 4 +- .../intranet-tmpl/prog/en/css/staff-global.css | 10 + .../intranet-tmpl/prog/en/includes/cat-toolbar.inc | 2 +- .../prog/en/modules/catalogue/detail.tt | 159 ++- koha-tmpl/opac-tmpl/bootstrap/css/opac.css | 2 +- .../bootstrap/en/includes/opac-detail-sidebar.inc | 5 +- .../opac-tmpl/bootstrap/en/modules/opac-detail.tt | 162 ++++ koha-tmpl/opac-tmpl/bootstrap/js/script.js | 2 +- opac/opac-export.pl | 36 +- t/db_dependent/Record.t | 39 +- 14 files changed, 1545 insertions(+), 55 deletions(-) create mode 100644 Koha/DublinCore.pm diff --git a/C4/Installer/PerlDependencies.pm b/C4/Installer/PerlDependencies.pm index 9ddeca8..ca7b50f 100644 --- a/C4/Installer/PerlDependencies.pm +++ b/C4/Installer/PerlDependencies.pm @@ -737,6 +737,11 @@ our $PERL_DEPS = { 'required' => '0', 'min_ver' => '0.89', }, + 'RDF::Trine' => { + 'usage' => 'Core', + 'required' => '1', + 'min_ver' => '1.000', + }, }; 1; diff --git a/C4/Record.pm b/C4/Record.pm index 5d894fa..2c6aac2 100644 --- a/C4/Record.pm +++ b/C4/Record.pm @@ -25,7 +25,7 @@ use strict; # please specify in which methods a given module is used use MARC::Record; # marc2marcxml, marcxml2marc, changeEncoding use MARC::File::XML; # marc2marcxml, marcxml2marc, changeEncoding -use MARC::Crosswalk::DublinCore; # marc2dcxml +use Koha::DublinCore; # marc2dcxml use Biblio::EndnoteStyle; use Unicode::Normalize; # _entity_encode use C4::Biblio; #marc2bibtex @@ -219,20 +219,34 @@ sub marcxml2marc { =head2 marc2dcxml - Convert from ISO-2709 to Dublin Core - my ($error,$dcxml) = marc2dcxml($marc,$qualified); + ($error,$marc) = marc2dcxml($marc, $type, $qualified, + $entities, $root, $xsi_schemaLocation, $rdf_subject, $rdf_format); Returns a DublinCore::Record object, will eventually return a Dublin Core scalar -FIXME: should return actual XML, not just an object +FIXME: should return actual XML, not just an object (Koha::DublinCore return an XML) C<$marc> - an ISO-2709 scalar or MARC::Record object -C<$qualified> - specify whether qualified Dublin Core should be used in the input or output [0] +C<$type> - the recommendation ( simple-dc-rdf, dc-rdf, dc-xml, oai-dc, srw_dc ) + +C<$qualified> - specify whether simple or qualified Dublin Core should be used in output [0 or 1] + +C<$entities> placing entities to 0 will codify only the five basic entities e.g., <, >, ", &, and &apos. Conversely if it is encoded to 1, all entities will coded into decimal + +C<$root> root element for XML files + +C<$xsi_schemaLocation> the xsischemaLocation for XML files. + +C<$rdf_subject> Represent the main subject of RDF triples (for Koha the URI of the resource) + +C<$rdf_format> Imply multiple formats for RDF (ntriples, nquads, rdfxml, rdfjson, ntriples-canonical, turtle) =cut sub marc2dcxml { - my ($marc,$qualified) = @_; + my ( $marc, $type, $qualified, $entities, $root, $xsi_schemaLocation, $rdf_subject, + $rdf_format ) = @_; my $error; # test if it's already a MARC::Record object, if not, make it one my $marc_record_obj; @@ -246,24 +260,93 @@ sub marc2dcxml { $error .="\nCreation of MARC::Record object failed: ".$MARC::File::ERROR; } } - my $crosswalk = MARC::Crosswalk::DublinCore->new; - if ($qualified) { - $crosswalk = MARC::Crosswalk::DublinCore->new( qualified => 1 ); - } - my $dcxml = $crosswalk->as_dublincore($marc_record_obj); - my $dcxmlfinal = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; - $dcxmlfinal .= "<metadata - xmlns=\"http://example.org/myapp/\" - xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" - xsi:schemaLocation=\"http://example.org/myapp/ http://example.org/myapp/schema.xsd\" - xmlns:dc=\"http://purl.org/dc/elements/1.1/\" - xmlns:dcterms=\"http://purl.org/dc/terms/\">"; - - foreach my $element ( $dcxml->elements() ) { - $dcxmlfinal.="<"."dc:".$element->name().">".$element->content()."</"."dc:".$element->name().">\n"; + my $dcxml; + + SWITCH: + for ($type) { + if (/^simple-dc-rdf/) { + my $objectDC = Koha::DublinCore->new({ + type => 'rdf', + qualified => 0, + get_marc_record => $marc, + }); + + $objectDC->get_rdf_data({ + rdf_subject => $rdf_subject, + rdf_format => $rdf_format, + entities => 1, + }); + $dcxml = $objectDC->write_rdf(); + last SWITCH; + } + if (/^dc-rdf/) { + my $objectDC = Koha::DublinCore->new({ + type => 'rdf', + qualified => 1, + get_marc_record => $marc, + }); + + $objectDC->get_rdf_data({ + rdf_subject => $rdf_subject, + rdf_format => $rdf_format, + entities => 1, + }); + $dcxml = $objectDC->write_rdf(); + last SWITCH; + } + if (/^dc-xml/) { + my $objectDC = Koha::DublinCore->new({ + type => 'xml', + qualified => $qualified, + get_marc_record => $marc, + }); + + $objectDC->get_xml_data({ + root => $root, + xsi_schemaLocation => $xsi_schemaLocation, + entities => 1, + }); + $dcxml = $objectDC->write_xml(); + last SWITCH; + } + if (/^oai-dc/) { + my $objectDC = Koha::DublinCore->new({ + type => 'xml', + qualified => 0, + get_marc_record => $marc, + }); + + $objectDC->get_xml_data({ + root => 'oai_dc:dc', + xsi_schemaLocation => 'http://www.openarchives.org/OAI/2.0/oai_dc/' . + ' http://www.openarchives.org/OAI/2.0/oai_dc.xsd', + entities => 0, + opt_namespace => 'oai_dc', + opt_namespace_url => 'http://www.openarchives.org/OAI/2.0/oai_dc/', + }); + $dcxml = $objectDC->write_xml(); + last SWITCH; + } + if (/^srw_dc/) { + my $objectDC = Koha::DublinCore->new({ + type => 'xml', + qualified => 0, + get_marc_record => $marc, + }); + + $objectDC->get_xml_data({ + root => 'srw_dc:dc', + xsi_schemaLocation => 'info:srw/schema/1/dc-schema' . + ' http://www.loc.gov/standards/sru/resources/dc-schema.xsd', + entities => 0, + opt_namespace => 'srw_dc', + opt_namespace_url => 'info:srw/schema/1/dc-schema', + }); + $dcxml = $objectDC->write_xml(); + last SWITCH; + } } - $dcxmlfinal .= "\n</metadata>"; - return ($error,$dcxmlfinal); + return ( $error, $dcxml ); } =head2 marc2modsxml - Convert from ISO-2709 to MODS diff --git a/Koha/DublinCore.pm b/Koha/DublinCore.pm new file mode 100644 index 0000000..ad7b073 --- /dev/null +++ b/Koha/DublinCore.pm @@ -0,0 +1,1011 @@ +#!/usr/bin/perl +package Koha::DublinCore; + +# +# This file is part of Koha. +# +# Copyright (C) 2014 Universidad de El Salvador, +# Facultad Multidisciplinaria Oriental +# +# Koha is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# Koha is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see <http://www.gnu.org/licenses>. +# + +=head1 NAME + +Koha::DublinCore - transform the values of MARC::Crosswalk::DublinCore +into metadata in XML or RDF format. + +=head1 SYNOPSIS + +=head2 XML-DC + + use Koha::DublinCore; + use MARC::File::USMARC; + my $batch = MARC::File::USMARC->in('in.mrc'); + + #the $record will be a MARC::Record object. + my $record = $batch->next(); + + #Simple DC-XML + my $objectDC = Koha::DublinCore->new({ + type => 'xml', + qualified => 0, + get_marc_record => $record}); + + #Qualified DC-XML + my $objectDC = Koha::DublinCore->new({ + type => 'xml', + qualified => 1, + get_marc_record => $record}); + + #After call constructor you need to pass the root element and + #the schema in .xsd format. If you prefer or you don't know nothing + #about it pass the method in blank, i.e., without arguments. + #Also you can determine if you want to encode with xml entities or + #just with the five basics entities. + #Set entities to 0 for the five basics or 1 to encode with the + #complete xml entities. + $objectDC->get_xml_data({ + root => 'metadata', + xsi_schemaLocation => 'http://example.org/myapp/' . + ' http://example.org/myapp/schema.xsd', + }); + #This print your xml file in STDOUT + my $XML-DC = $objectDC->write_xml(); + print $XML-DC; + + #Close the file according to MARC::File::USMARC + $batch->close(); + undef $batch; + + #Or if you want to generate a file + open (OUTPUT, '> dc2xml.xml') or die $!; + print OUTPUT $XML-DC; + close(OUTPUT); + +=head2 DC-RDF + + use Koha::DublinCore; + use MARC::File::USMARC; + my $marc = MARC::File::USMARC->in('in.mrc'); + my $record = $marc->next(); + + #Simple DC-RDF is not used but not deprecated, DublinCore + #can generate it as follow: + my $objectDC = Koha::DublinCore->new({ + type => 'rdf', + qualified => 0, + get_marc_record => $record}); + + #DC-RDF + my $objectDC = Koha::DublinCore->new({ + type => 'rdf', + qualified => 1, + get_marc_record => $record}); + + #The get_rdf_data method for RDF does not need to use the root element + #and the schema, but you need to declare the resource being described, + #i.e., the record. + #Note: For Koha is the IRI identifier of the record + $objectDC->get_rdf_data({ + rdf_subject => 'http://opac.mydomain.edu/cgi-bin/koha/opac-detail.pl?biblionumber=17589', + }); + + my $XML-RDF = $objectDC->write_rdf(); + print $XML-RDF; + #Close the file according to MARC::File::USMARC + $batch->close(); + undef $marc; + +=head1 DESCRIPTION + +The Koha::DublinCore defines the interface to transform +and manipulate MARC records into DC-XML or DC-RDF recommendation. +This package transform MARC records to XML or RDF/XML Dublin Core +and follows the recommendations listed below: + +L<DC-XML-GUIDELINES [DCMI Recommendation]|http://dublincore.org/documents/dc-xml-guidelines/> + +L<Expressing Simple Dublin Core in RDF-XML|http://dublincore.org/documents/dcmes-xml/> +This recommendation is superseded by DC-RDFrecommendation but not obsoleted at all. + +L<DC-RDF [DCMI Recommendation]|http://dublincore.org/documents/dc-rdf/> + +=cut + +use Modern::Perl; +use Carp; +use utf8; +use version; + +BEGIN { + require Exporter; + + # set the version for version checking + our $VERSION = version->declare("v0.01"); + + # Inherit from Exporter to export functions and variables + our @ISA = qw(Exporter); + + # Functions and variables which are exported by default + our @EXPORT = qw(new get_xml_data get_rdf_data write_xml write_rdf); + + # Functions and variables which can be optionally exported + our @EXPORT_OK = + qw(type qualified get_marc_record root xsi_schemaLocation rdf_subject rdf_format opt_namespace opt_namespace_url); + +} + +use MARC::File::USMARC; +use MARC::Crosswalk::DublinCore; +use XML::LibXML; +use C4::Record; +use RDF::Trine; +use base qw(Class::Accessor); +__PACKAGE__->mk_accessors( + qw(type qualified get_marc_record root xsi_schemaLocation rdf_subject rdf_format entities opt_namespace opt_namespace_url) +); + +# Defining some constants +my $xsi_schema = qq(http://www.w3.org/2001/XMLSchema-instance); +my $unqualified = qq(http://purl.org/dc/elements/1.1/); +my $qualified = qq(http://purl.org/dc/terms/); +my $dcam = qq(http://purl.org/dc/dcam/); +my $rdfNS = qq(http://www.w3.org/1999/02/22-rdf-syntax-ns#); +my @elementupcase = + qw/tableOfContents dateAccepted dateCopyrighted dateSubmitted isVersionOf hasVersion isReplacedBy isRequiredBy isPartOf hasPart isReferencedBy isFormatOf hasFormat conformsTo accrualMethod accrualPeriodicity accrualPolicy instructionalMethod rightsHolder educationLevel accessRights bibliographicCitation/; +my $map; + +=head2 METHODS + +=over 12 + +=item C<new> + +Return a new Koha::DublinCore object. +This constructor sets the output type (RDF or XML), the level of the standard (Simple DC or Qualified DC) and the MARC record to be transformed to DC. + + my $objectDC = Koha::DublinCore->new({ + type => 'rdf', + qualified => 0, + get_marc_record => $record}); + +=cut + +sub new { + my ( $class, $args ) = @_; + $args = {} unless defined $args; + return bless( $args, $class ); +} + +=item C<get_xml_data> + +This method is just for DC-XML: Fetch the xml root element and the schema in .xsd format. + + $objectDC->get_xml_data({ + root => 'metadata', + xsi_schemaLocation => 'http://example.org/myapp/ http://example.org/myapp/schema.xsd', + entities => 1, + opt_namespace => 'oai_dc', + opt_namespace_url => 'http://www.openarchives.org/OAI/2.0/oai_dc/', + }); + +The entities argument is for extended xml entities, i.e., placing entities to zero will codify only the five basic entities e.g., <, >, ", &, and &apos. Conversely if it is encoded to one, all entities will coded into decimal. + +Additionally, has been included the opt_namespace and opt_namespace_url arguments to include another XML name space, like OAI-DC or SRW-DC. + +NOTE: This method is only for use of the DC-XML recommendation, i.e., type => 'xml'. +See C<new> method or the section SYNOPSIS. + +=cut + +sub get_xml_data { + + my $self = shift; + my ($args) = @_; + + if (@_) { + $self->root( $args->{root} ); + $self->xsi_schemaLocation( $args->{xsi_schemaLocation} ); + $self->entities( $args->{entities} ); + $self->opt_namespace( $args->{opt_namespace} ); + $self->opt_namespace_url( $args->{opt_namespace_url} ); + } + + #if data not filled + $self->{root} = "metadata" unless ( defined $self->{root} ); + $self->{entities} = 0 unless ( defined $self->{entities} ); + my %dataxml = ( + xmlroot => $self->{root}, + entities => $self->{entities}, + opt_namespace => $self->{opt_namespace}, + opt_namespace_url => $self->{opt_namespace_url}, + ); + + if ( exists $self->{xsi_schemaLocation} ) { + $dataxml{'xsi_schemaLocation'} = $self->{xsi_schemaLocation}; + } + if ( exists $self->{xsi_schemaLocation} ) { + $dataxml{'opt_namespace'} = $self->{opt_namespace}; + } + if ( exists $self->{xsi_schemaLocation} ) { + $dataxml{'opt_namespace_url'} = $self->{opt_namespace_url}; + } + return \%dataxml; +} + +=item C<get_rdf_data> + +This method is only for DC-RDF: Fetch the IRI identifier of the resource being described. As well, you can pass the format you want to generate with the rdf, by default the DC-RDF specify RDF/XML but RDF can represent in other formats listed below: + +. ntriples + +. nquads + +. rdfxml + +. rdfjson + +. ntriples-canonical + +. turtle + + $objectDC->get_rdf_data({ + rdf_subject => 'http://opac.mydomain.edu/cgi-bin/koha/opac-detail.pl?biblionumber=17589', + rdf_format => 'rdfxml', + entities => 0|1, + }); + +NOTE: The entities is needed only for rdfxml value and is used like C<get_xml_data> method. + +=cut + +sub get_rdf_data { + + my $self = shift; + my ($args) = @_; + + if (@_) { + $self->rdf_subject( $args->{rdf_subject} ); + $self->rdf_format( $args->{rdf_format} ); + $self->entities( $args->{entities} ); + } + + #if data not filled + $self->{rdf_subject} = "http://koha-community.org/" + unless ( defined $self->{rdf_subject} ); + $self->{rdf_format} = "rdfxml" unless ( defined $self->{rdf_format} ); + $self->{entities} = 0 unless ( defined $self->{entities} ); + my %rdfdescription = ( + rdf_subject => $self->{rdf_subject}, + rdf_format => $self->{rdf_format}, + entities => $self->{entities}, + ); + + return \%rdfdescription; +} + +=item C<conversion_to_dc> + +Get the MARC record and return a Dublin Core elements, passed as argument in dc_order_execution method. + +USAGE: + my dc = $self->conversion_to_dc(); + $self->dc_order_execution ($dc, $dcxml, $root); + +=cut + +sub conversion_to_dc { + + my $self = shift; + my $marc_record_obj = $self->get_marc_record(); + my $crosswalk; + my $dc; + + #if data not filled + $self->qualified(0) unless ( exists $self->{qualified} ); + if ( $self->qualified() != 0 and $self->qualified() != 1 ) + { + croak "Only the 0 or 1 values are accepted\n" . + "Set qualified => " . $self->qualified() . " is no good, stopped"; + } + if ( $self->qualified() == 1 ) { + $crosswalk = MARC::Crosswalk::DublinCore->new( qualified => 1 ); + } + elsif ( $self->qualified() == 0 ) { + $crosswalk = MARC::Crosswalk::DublinCore->new( qualified => 0 ); + } + if ( $marc_record_obj =~ /^MARC::Record/ ) { + $dc = $crosswalk->as_dublincore($marc_record_obj); + } + else { + croak "MARC::Record object failed or not a MARC::Record\n" . + "Stopped due get_marc_record => is not a MARC::Record"; + } + + return $dc; + +} +=item C<write_xml> + +Return the xml object as string. + +NOTE: This method is only for use of the DC-XML recommendation, i.e., type => 'xml'. +See C<new> and C<get_xml_data> methods or the section SYNOPSIS. + +=cut + +sub write_xml { + my $self = shift; + my $dataxml = $self->get_xml_data(); + my $dc = $self->conversion_to_dc(); + + #Looking for bad data + if ( $self->type() ne 'xml' and $self->type() ne 'rdf' ) + { + croak "Only the xml or rdf values are accepted\n" . + "Set type => " . $self->type() . " is no good, stopped"; + } + elsif ( $self->type() eq 'rdf' ) + { + croak "The constructor specified rdf\n" . + "Cannot use this method with rdf. This is no good, stopped"; + } + + if ( $self->entities() != 0 and $self->entities() != 1 ) + { + croak "Only the 0 or 1 values are accepted\n" . + "Set entities => " . $self->entities() . " is no good, stopped"; + } + + #Creating XML object + my $doc = XML::LibXML::Document->new( '1.0', 'utf-8' ); + my $root = $doc->createElement( $dataxml->{'xmlroot'} ); + $root->setNamespace( $xsi_schema, 'xsi', 0 ); + + if ( defined $dataxml->{'opt_namespace'} ) { + $root->setNamespace( $dataxml->{'opt_namespace_url'}, + $dataxml->{'opt_namespace'}, 0 ); + } + + if ( $self->type() eq 'xml' ) { + if ( $self->qualified() == 0 ) { + if ( defined $dataxml->{'xsi_schemaLocation'} ) { + $root->setAttribute( + 'xsi:schemaLocation' => $dataxml->{'xsi_schemaLocation'} ); + $root->setNamespace( $unqualified, 'dc', 0 ); + $self->dc_order_execution( $dc, $doc, $root ); + } + else { + $root->setNamespace( $unqualified, 'dc', 0 ); + $self->dc_order_execution( $dc, $doc, $root ); + } + } + elsif ( $self->qualified() == 1 ) { + if ( defined $dataxml->{'xsi_schemaLocation'} ) { + $root->setAttribute( + 'xsi:schemaLocation' => $dataxml->{'xsi_schemaLocation'} ); + $root->setNamespace( $unqualified, 'dc', 0 ); + $root->setNamespace( $qualified, 'dcterms', 0 ); + $self->dc_order_execution( $dc, $doc, $root ); + } + else { + $root->setNamespace( $unqualified, 'dc', 0 ); + $root->setNamespace( $qualified, 'dcterms', 0 ); + $self->dc_order_execution( $dc, $doc, $root ); + } + } + } + + $doc->setDocumentElement($root); + + #Enabling or desabling entities and print the xml and, decoding string to utf8 + if ( $dataxml->{'entities'} == 1 ) { + my $serialized_data = $doc->toString(1); + utf8::decode($serialized_data); + my ($dcxml_entity_encoded) = C4::Record::_entity_encode($serialized_data); + $serialized_data = $dcxml_entity_encoded; + return $serialized_data; + } + else { + return $doc->toString(1); + } +} + +=item C<write_rdf> + +Return the rdf object as string. + +NOTE: This method is only for use of the DC-RDF recommendation, i.e., type => 'rdf'. +See C<new> and C<get_rdf_data> methods or the section SYNOPSIS. + +=cut + +sub write_rdf { + my $self = shift; + my $rdfdescription = $self->get_rdf_data(); + my $dc = $self->conversion_to_dc(); + my $serializer; + my %namespaces; + + #Looking for bad data + if ( $self->type() ne 'xml' and $self->type() ne 'rdf' ) + { + croak "Only the xml or rdf values are accepted\n" . + "Set type => " . $self->type() . " is no good, stopped"; + } + elsif ( $self->type() eq 'xml' ) { + croak "The constructor specified xml\n" . + "Cannot use this method with xml. This is no good, stopped"; + } + + if ( $self->entities() != 0 and $self->entities() != 1 ) + { + croak "Only the 0 or 1 values are accepted\n" . + "Set entities => " . $self->entities() . " is no good, stopped"; + } + + # Creating the triple store in temporary data + my $store = RDF::Trine::Store::Memory->new(); + + # Creating the model + my $rdf = RDF::Trine::Model->new($store); + + # Creating the subject + my $subject = + RDF::Trine::Node::Resource->new( $rdfdescription->{'rdf_subject'} ); + + $namespaces{'rdf'} = $rdfNS; + + if ( $self->qualified() == 0 ) { + + # Declaring all namespaces in a hash + $namespaces{'dc'} = $unqualified; + } + else { + + # Declaring all namespaces in a hash + $namespaces{'dcterms'} = $qualified; + $namespaces{'dcam'} = $dcam; + } + + # Creating namespaces + $map = RDF::Trine::NamespaceMap->new( \%namespaces ); + + if ( $self->type() eq 'rdf' ) { + $self->dc_order_execution( $dc, $rdf, $subject ); + } + + #Enabling or desabling entities and print the xml and, decoding string to utf8 + if ( $rdfdescription->{'rdf_format'} eq 'rdfxml' ) { + if ( $rdfdescription->{'entities'} == 1 ) { + $serializer = + RDF::Trine::Serializer::RDFXML->new( + namespaces => {%namespaces} ); + my $serialized_data = $serializer->serialize_model_to_string($rdf); + utf8::decode($serialized_data); + my ($dcxml_entity_encoded) = C4::Record::_entity_encode($serialized_data); + return $serialized_data = $dcxml_entity_encoded; + } + else { + $serializer = + RDF::Trine::Serializer::RDFXML->new( + namespaces => {%namespaces} ); + return $serializer->serialize_model_to_string($rdf); + } + } + elsif ( $rdfdescription->{'rdf_format'} eq 'turtle' ) { + $serializer = + RDF::Trine::Serializer::Turtle->new( namespaces => {%namespaces} ); + return $serializer->serialize_model_to_string($rdf); + } + else { + $serializer = + RDF::Trine::Serializer->new( $rdfdescription->{'rdf_format'} ); + return $serializer->serialize_model_to_string($rdf); + } +} + +=item C<upper_or_lowercase> + +This subroutine define if is necessary to convert lowercase some qualifiers or let them as crosswalk method basis + +USAGE: upper_or_lowercase (element->qualifier()) + +=cut + +sub upper_or_lowercase { + + + my $dcelement = $_[0]; + my $count = 0; + my $result; + while ( $count <= $#elementupcase ) { + if ( $elementupcase[$count] eq $dcelement ) { + $result = $dcelement; + last; + } + elsif ( $dcelement ne $elementupcase[$count] ) { + $result = lc($dcelement); + $count++; + next; + } + } + + return $result; + +} + +=item C<xml_constructor> + +xml_constructor ( doc, root, namespace, attr, element_name, element_content, element_qualifier, element_scheme ) + +USAGE: define all posible elements (name, content, qualifier, scheme) as neccesary +doc: the XML object +root: append root to doc +namespace: defined as "dc" or "dcterms" +attr: a boolean value to determinate xsi:type xml namespace for dcterms +Examples: +xml_constructor ( $dcxml, $root, "dc", 0, element->name(), element->content() ); +xml_constructor ( $dcxml, $root, "dcterms", 1, element->name(), element->content(), $element->qualifier() ); + +NOTE: This is a routine not a method. + +=cut + +sub xml_constructor { + + my ( $doc, $root, $namespace, $attr, $element_name, $element_content, + $element_qualifier, $element_scheme ) + = @_; + + # This scalar is used for deleting spaces in scheme elements + my $deletespaces; + + # This scalar is used for making upper or lowercase the qualifier elements + my $lowercase; + my $tagxml; + + if ( $namespace eq "dc" ) { + $lowercase = lc($element_name); + } + elsif ( $namespace eq "dcterms" ) { + $lowercase = upper_or_lowercase($element_qualifier); + + #replacing spacial to spatial, bug from dublin or crosswalk. + $lowercase =~ s/spacial/spatial/; + } + + if ( ( $namespace eq "dc" or "dcterms" ) and $attr == 0 ) { + + # This will do something like: <dc:title>Title</dc:title> + $tagxml = XML::LibXML::Element->new($lowercase); + $tagxml->setNamespace( undef, $namespace, 1 ); + $tagxml->appendTextNode($element_content); + $root->appendChild($tagxml); + } + elsif ( ( $namespace eq "dcterms" ) and $attr == 1 ) { + +# This will do something like: <dcterms:spatial xsi:type="dcterms:ISO3166">us</dcterms:spatial> + $deletespaces = $element_scheme; + $deletespaces =~ s/\s//; + $tagxml = XML::LibXML::Element->new($lowercase); + $tagxml->setNamespace( undef, $namespace, 1 ); + my $attribute = $namespace . ':' . $deletespaces; + $tagxml->setAttribute( 'xsi:type', $attribute ); + $tagxml->appendTextNode($element_content); + $root->appendChild($tagxml); + } + elsif ( ( $namespace eq "dc" ) and $attr == 1 ) { + +# This will do something like: <dc:subject xsi:type="dcterms:LCSH">Water supply.</dc:subject> + if ( $element_scheme ne "DCMI Type Vocabulary" ) + { #Dublin core returns DCMI Type Vocabulary + $deletespaces = $element_scheme; + $deletespaces =~ s/\s//; + $tagxml = XML::LibXML::Element->new($lowercase); + $tagxml->setNamespace( undef, $namespace, 1 ); + my $attribute = 'dcterms:' . $deletespaces; + $tagxml->setAttribute( 'xsi:type', $attribute ); + $tagxml->appendTextNode($element_content); + $root->appendChild($tagxml); + } + elsif ( $element_scheme eq "DCMI Type Vocabulary" ) + { #Changing for DCMIType + # This will do something like: <dc:type xsi:type="dcterms:DCMIType">Text</dc:type> + $tagxml = XML::LibXML::Element->new($lowercase); + $tagxml->setNamespace( undef, $namespace, 1 ); + $tagxml->setAttribute( 'xsi:type', 'dcterms:DCMIType' ); + $tagxml->appendTextNode($element_content); + $root->appendChild($tagxml); + } + } #if...elsif + + return $tagxml; + +} #subroutine + +=item C<rdf_constructor> + +xml_constructor ( rdf, subject, namespace, attr, element_name, element_content, element_qualifier, element_scheme ) + +USAGE: define all posible elements (name, content, qualifier, scheme) as neccesary +rdf: the RDF object +subject: the subject for the triples +namespace: defined as "dc" or "dcterms". This is for Simple DC or DC-RDF recommendations. +attr: a boolean value to determine the nodeID attribute for dcterms + +NOTE: This is a routine not a method. + +=cut + +sub rdf_constructor { + + my ( $rdf, $subject, $namespace, $attr, $element_name, $element_content, + $element_qualifier, $element_scheme ) + = @_; + + #This scalar is used for deleting spaces in scheme elements + my $deletespaces; + + #This scalar is used for making upper or lowercase the qualifier elements + my $lowercase; + + if ( $namespace eq "dc" ) { + $lowercase = lc($element_name); + } + elsif ( $namespace eq "dcterms" ) { + $lowercase = upper_or_lowercase($element_qualifier); + + #replacing spacial to spatial, bug from dublin or crosswalk. + $lowercase =~ s/spacial/spatial/; + } + + if ( ( $namespace eq "dc" or "dcterms" ) and $attr == 0 ) { + + # This will do something like: <dc:title>Title</dc:title> + my $predicate = undef; + if ( $namespace eq "dc" ) { + $predicate = $map->dc($lowercase); + } + else { + $predicate = $map->dcterms($lowercase); + } + my $object = RDF::Trine::Node::Literal->new($element_content); + my $statement = + RDF::Trine::Statement->new( $subject, $predicate, $object ); + $rdf->add_statement($statement); + } + elsif ( ( $namespace eq "dc" ) and $attr == 2 ) { + + # This will do something like: <dcterms:title>Title</dcterms:title> + my $predicate = $map->dcterms($lowercase); + my $object = RDF::Trine::Node::Literal->new($element_content); + my $statement = + RDF::Trine::Statement->new( $subject, $predicate, $object ); + $rdf->add_statement($statement); + } + elsif ( ( $namespace eq "dc" ) and $attr == 1 ) { + $deletespaces = $element_scheme; + $deletespaces =~ s/\s//; + SWITCH: + for ($element_scheme) { + if (/^ISO 3166/) { + + # Dublin core returns DCMI Type Vocabulary + # This will do something like: + # <rdf:Description rdf:nodeID="country"> + # <dcam:memberOf rdf:resource="http://purl.org/dc/terms/ISO3166"/> + # <rdf:value>us</rdf:value> + # </rdf:Description> + # <dcterms:spatial rdf:nodeID="country"/> + my $objectbnode = RDF::Trine::Node::Blank->new('country'); + my $predicate = $map->dcterms($lowercase); + my $object = RDF::Trine::Node::Literal->new($element_content); + my $dcam_member_of = $map->dcam('memberOf'); + my $resource_schema = $map->dcterms($deletespaces); + my $rdf_value = $map->rdf('value'); + my $statement1 = + RDF::Trine::Statement->new( $subject, $predicate, + $objectbnode ); + my $statement2 = + RDF::Trine::Statement->new( $objectbnode, $dcam_member_of, + $resource_schema ); + my $statement3 = + RDF::Trine::Statement->new( $objectbnode, $rdf_value, + $object ); + $rdf->add_statement($statement1); + $rdf->add_statement($statement2); + $rdf->add_statement($statement3); + last SWITCH; + } + if (/^DCMI Type Vocabulary/) { #Changing for DCMIType + my $objectbnode = RDF::Trine::Node::Blank->new('DCMIType'); + my $predicate = $map->dcterms($lowercase); + my $object = RDF::Trine::Node::Literal->new($element_content); + my $dcam_member_of = $map->dcam('memberOf'); + my $resource_schema = $map->dcterms('DCMIType'); + my $rdf_value = $map->rdf('value'); + my $statement1 = + RDF::Trine::Statement->new( $subject, $predicate, + $objectbnode ); + my $statement2 = + RDF::Trine::Statement->new( $objectbnode, $dcam_member_of, + $resource_schema ); + my $statement3 = + RDF::Trine::Statement->new( $objectbnode, $rdf_value, + $object ); + $rdf->add_statement($statement1); + $rdf->add_statement($statement2); + $rdf->add_statement($statement3); + last SWITCH; + } + if (/^ISO 639-2/) { #Changing bnodeId ISO639-2 for language + my $objectbnode = RDF::Trine::Node::Blank->new('language'); + my $predicate = $map->dcterms($lowercase); + my $object = RDF::Trine::Node::Literal->new($element_content); + my $dcam_member_of = $map->dcam('memberOf'); + my $resource_schema = $map->dcterms($deletespaces); + my $rdf_value = $map->rdf('value'); + my $statement1 = + RDF::Trine::Statement->new( $subject, $predicate, + $objectbnode ); + my $statement2 = + RDF::Trine::Statement->new( $objectbnode, $dcam_member_of, + $resource_schema ); + my $statement3 = + RDF::Trine::Statement->new( $objectbnode, $rdf_value, + $object ); + $rdf->add_statement($statement1); + $rdf->add_statement($statement2); + $rdf->add_statement($statement3); + last SWITCH; + } + if (/^RFC 1766/) { #Changing bnodeId RFC1766 for languagetag + my $objectbnode = RDF::Trine::Node::Blank->new('languagetag'); + my $predicate = $map->dcterms($lowercase); + my $object = RDF::Trine::Node::Literal->new($element_content); + my $dcam_member_of = $map->dcam('memberOf'); + my $resource_schema = $map->dcterms($deletespaces); + my $rdf_value = $map->rdf('value'); + my $statement1 = + RDF::Trine::Statement->new( $subject, $predicate, + $objectbnode ); + my $statement2 = + RDF::Trine::Statement->new( $objectbnode, $dcam_member_of, + $resource_schema ); + my $statement3 = + RDF::Trine::Statement->new( $objectbnode, $rdf_value, + $object ); + $rdf->add_statement($statement1); + $rdf->add_statement($statement2); + $rdf->add_statement($statement3); + last SWITCH; + } + if ( /^LCSH/ || /^MeSH/ || /^LCC/ || /^DDC/ || + /^UDC/ || /^IMT/ || /^URI/ || /^TGN/ ) + { #Scheme sharing common elements + my $objectbnode = RDF::Trine::Node::Blank->new($deletespaces); + my $predicate = $map->dcterms($lowercase); + my $object = RDF::Trine::Node::Literal->new($element_content); + my $dcam_member_of = $map->dcam('memberOf'); + my $resource_schema = $map->dcterms($deletespaces); + my $rdf_value = $map->rdf('value'); + my $statement1 = + RDF::Trine::Statement->new( $subject, $predicate, + $objectbnode ); + my $statement2 = + RDF::Trine::Statement->new( $objectbnode, $dcam_member_of, + $resource_schema ); + my $statement3 = + RDF::Trine::Statement->new( $objectbnode, $rdf_value, + $object ); + $rdf->add_statement($statement1); + $rdf->add_statement($statement2); + $rdf->add_statement($statement3); + last SWITCH; + } + } + } #if-elsif + return $rdf; +} #subroutine + +=item C<dc_order_execution> + +USAGE: Get the parameters for xml or rdf and execute in sequence. + + my dc = $self->conversion_to_dc(); + $self->dc_order_execution ($dc, $dcxml, $root); + +=back + +=cut + +sub dc_order_execution { + + my $self = shift; + + if ( $self->type() eq 'xml' ) { #Order for xml + my ( $dc, $dcxml, $root ) = @_; + foreach my $element ( $dc->elements() ) { + SWITCH: { + if ( $element->name() + and not defined $element->scheme() + and not defined $element->qualifier() ) + { + $dcxml = + xml_constructor( $dcxml, $root, "dc", 0, $element->name(), + $element->content() ); + last SWITCH; + } + + if ( $element->name() + and not defined $element->scheme() + and not defined $element->qualifier() ) + { + $dcxml = + xml_constructor( $dcxml, $root, "dcterms", 0, + $element->name(), $element->content() ); + last SWITCH; + } + + if ( $element->name() + and $element->scheme() + and $element->qualifier() ) + { + $dcxml = xml_constructor( + $dcxml, $root, + "dcterms", 1, + $element->name(), $element->content(), + $element->qualifier(), $element->scheme() + ); + last SWITCH; + } + + if ( $element->name() + and $element->scheme() + and ( $element->scheme ne "DCMI Type Vocabulary" ) ) + { + $dcxml = + xml_constructor( $dcxml, $root, "dc", 1, $element->name(), + $element->content(), $element->qualifier(), + $element->scheme() ); + last SWITCH; + } + + if ( $element->name() + and $element->scheme() + and ( $element->scheme() eq "DCMI Type Vocabulary" ) ) + { + $dcxml = + xml_constructor( $dcxml, $root, "dc", 1, $element->name(), + $element->content(), $element->qualifier(), + $element->scheme() ); + last SWITCH; + } + + if ( $element->name() and $element->qualifier() ) { + $dcxml = xml_constructor( + $dcxml, $root, + "dcterms", 0, + $element->name(), $element->content(), + $element->qualifier(), $element->scheme() + ); + last SWITCH; + } #if + } #SWITCH + } #foreach 1 + } + elsif ( $self->type() eq 'rdf' ) { #Order for rdf/xml + my ( $dc, $rdf, $subject ) = @_; + foreach my $element ( $dc->elements() ) { + SWITCH: { + if ( $element->name() + and not defined $element->scheme() + and not defined $element->qualifier() ) + { + rdf_constructor( $rdf, $subject, "dc", 0, $element->name(), + $element->content() ) + unless $self->qualified() == 1; + rdf_constructor( $rdf, $subject, "dc", 2, $element->name(), + $element->content() ) + unless $self->qualified() == 0; + last SWITCH; + } + + if ( $element->name() + and $element->scheme() + and ( $element->scheme ne "DCMI Type Vocabulary" ) ) + { + rdf_constructor( $rdf, $subject, "dc", 1, $element->name(), + $element->content(), $element->qualifier(), + $element->scheme() ); + last SWITCH; + } + + if ( $element->name() + and $element->scheme() + and ( $element->scheme() eq "DCMI Type Vocabulary" ) ) + { + rdf_constructor( $rdf, $subject, "dc", 1, $element->name(), + $element->content(), $element->qualifier(), + $element->scheme() ); + last SWITCH; + } + + if ( $element->name() and $element->qualifier() ) { + rdf_constructor( + $rdf, $subject, + "dcterms", 0, + $element->name(), $element->content(), + $element->qualifier(), $element->scheme() + ); + last SWITCH; + } #if + } #SWITCH + } #foreach 2 + } + return; +} + +END { + + #When opened with MARC::File::USMARC, close marc record if not closed + sub DESTROY { + my $self = shift; + if ( $self->{get_marc_record} =~ /^MARC:File::USMARC/ ) { + $self->{get_marc_record}->close(); + undef $self->{get_marc_record}; + } + } +} +1; +__END__ + +=head1 VERSION + +version 0.01 + +=head1 RELATES MODULES + +This package requires the following modules: + +L<DublinCore::Record> + +L<MARC::Record> + +L<MARC::File::USMARC> + +L<MARC::Crosswalk::DublinCore> + +L<XML::LibXML> + +L<RDF::Trine> + +L<C4::Record> + +=head1 SEE ALSO + +Dublin Core Web Page L<http://dublincore.org>. + +=head1 LICENSE + +Copyright (c) 2014 Koha Community. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. + +=head1 AUTHOR + +Hector Eduardo Catro Avalos E<lt> hector.hecaxmmx at gmail dot com E<gt> +and the Koha Development Team. + +=cut diff --git a/catalogue/export.pl b/catalogue/export.pl index e66d3f2..c4e0617 100755 --- a/catalogue/export.pl +++ b/catalogue/export.pl @@ -26,6 +26,14 @@ my $format=$query->param("format"); my $error = ''; if ($op eq "export") { my $biblionumber = $query->param("bib"); + my $recommendation = $query->param("recommendation"); + my $formats = $query->param("formats"); + my $qualifier = $query->param("qualifier"); + my $root_element = $query->param("root_element"); + my $xsischemalocation = $query->param("xsischemalocation"); + my $resource_url = $query->url(-base => 1) . + '/cgi-bin/koha/catalogue/detail.pl?biblionumber=' . + $biblionumber; if ($biblionumber){ my $marc = GetMarcBiblio($biblionumber, 1); @@ -51,8 +59,32 @@ if ($op eq "export") { $format = "bibtex"; } elsif ($format =~ /dc/) { - ($error,$marc) = marc2dcxml($marc,1); - $format = "dublin-core.xml"; + SWITCH: + for ($recommendation) { + if (/^simple-dc-rdf/) { + ($error,$marc) = marc2dcxml($marc, $recommendation, 0, + 1, undef, undef, $resource_url , $formats); + $format = "dublin-core." . $formats; + last SWITCH; } + if (/^dc-rdf/) { + ($error,$marc) = marc2dcxml($marc, $recommendation, 1, + 1, undef, undef, $resource_url, $formats); + $format = "dublin-core." . $formats; + last SWITCH; } + if (/^dc-xml/) { + ($error,$marc) = marc2dcxml($marc, $recommendation, $qualifier, + 1, $root_element, $xsischemalocation, undef, undef); + $format = "dublin-core.xml"; + last SWITCH; } + if (/^oai-dc/) { + ($error,$marc) = marc2dcxml($marc, $recommendation); + $format = "dublin-core.xml"; + last SWITCH; } + if (/^srw_dc/) { + ($error,$marc) = marc2dcxml($marc, $recommendation); + $format = "dublin-core.xml"; + last SWITCH; } + } } elsif ($format =~ /marc8/) { $marc = changeEncoding($marc,"MARC","MARC21","MARC-8"); diff --git a/debian/control b/debian/control index 8a3b9d0..d059e50 100644 --- a/debian/control +++ b/debian/control @@ -88,6 +88,7 @@ Build-Depends: libalgorithm-checkdigits-perl, libpdf-reuse-barcode-perl, libpdf-reuse-perl, libpdf-table-perl, + librdf-trine-perl, libscalar-list-utils-perl, libschedule-at-perl, libsms-send-perl, @@ -125,7 +126,7 @@ Build-Depends: libalgorithm-checkdigits-perl, libyaml-perl, libyaml-syck-perl, perl, - perl-modules, + perl-modules, debhelper (>= 7.0.50), gettext, xsltproc, docbook-xsl, libxml2-utils, bash-completion, perl-modules (>= 5.14.2) | libtest-simple-perl (>= 0.98) @@ -285,6 +286,7 @@ Depends: libalgorithm-checkdigits-perl, libpdf-reuse-barcode-perl, libpdf-reuse-perl, libpdf-table-perl, + librdf-trine-perl, libscalar-list-utils-perl, libschedule-at-perl, libsms-send-perl, diff --git a/koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css b/koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css index 2c4011f..6e6ed95 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css +++ b/koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css @@ -2798,3 +2798,13 @@ div#cn_browser_table_wrapper > table#cn_browser_table { margin: auto; width:90%; } + +/* CSS for Dublin Core Modal */ + +#dc-rdf, #dc-xml { + display: none; +} + +.label_dc { + cursor: pointer; +} diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/cat-toolbar.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/cat-toolbar.inc index ee39f31..d5b454d 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/includes/cat-toolbar.inc +++ b/koha-tmpl/intranet-tmpl/prog/en/includes/cat-toolbar.inc @@ -221,7 +221,7 @@ CAN_user_serials_create_subscription ) %] <button class="btn btn-small dropdown-toggle" data-toggle="dropdown"><i class="icon-download-alt"></i> Save <span class="caret"></span></button> <ul class="dropdown-menu"> <li><a href="/cgi-bin/koha/catalogue/export.pl?format=bibtex&op=export&bib=[% biblionumber %]">BIBTEX</a></li> - <li><a href="/cgi-bin/koha/catalogue/export.pl?format=dc&op=export&bib=[% biblionumber %]">Dublin Core (XML)</a></li> + <li><a href="#" data-toggle="modal" data-target="#exportModal_">Dublin Core</a></li> <li><a href="/cgi-bin/koha/catalogue/export.pl?format=marcxml&op=export&bib=[% biblionumber %]">MARCXML</a></li> <li><a href="/cgi-bin/koha/catalogue/export.pl?format=marc8&op=export&bib=[% biblionumber %]">MARC (non-Unicode/MARC-8)</a></li> <li><a href="/cgi-bin/koha/catalogue/export.pl?format=utf8&op=export&bib=[% biblionumber %]">MARC (Unicode/UTF-8)</a></li> diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tt index 41730f5..dd1aa55 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tt @@ -303,6 +303,83 @@ function verify_images() { [% END %] }); + + //JQuery for Dublin Core Modal + $(document).ready(function(){ + $("#input-simple").click(function(){ + $(".rdfoptions").removeAttr("disabled"); + $(".xmloptions").attr("disabled","disabled"); + $("#dc-rdf").toggle(true); + $("#dc-xml").hide(); + }); + }); + + $(document).ready(function(){ + $("#input-rdf").click(function(){ + $(".rdfoptions").removeAttr("disabled"); + $(".xmloptions").attr("disabled","disabled"); + $("#dc-rdf").toggle(true); + $("#dc-xml").hide(); + }); + }); + + $(document).ready(function(){ + $("#input-xml").click(function(){ + $(".xmloptions").removeAttr("disabled"); + $(".rdfoptions").attr("disabled","disabled"); + if($("#root_checked").is(':checked')){ + $("#root_value").removeAttr("disabled"); + } else { + $("#root_value").attr("disabled","disabled"); + } + if($("#schema_checked").is(':checked')){ + $("#schema_value").removeAttr("disabled"); + } else { + $("#schema_value").attr("disabled","disabled"); + } + $("#dc-xml").toggle(); + $("#dc-rdf").hide(); + }); + }); + + $(document).ready(function(){ + $("#root_checked").click(function(){ + if($("#root_checked").is(':checked')){ + $("#root_value").removeAttr("disabled"); + } else { + $("#root_value").attr("disabled","disabled"); + } + }); + }); + + $(document).ready(function(){ + $("#schema_checked").click(function(){ + if($("#schema_checked").is(':checked')){ + $("#schema_value").removeAttr("disabled"); + } else { + $("#schema_value").attr("disabled","disabled"); + } + }); + }); + + $(document).ready(function(){ + $("#input-oai").click(function(){ + $(".rdfoptions").attr("disabled","disabled"); + $(".xmloptions").attr("disabled","disabled"); + $("#dc-rdf").hide(); + $("#dc-xml").hide(); + }); + }); + + $(document).ready(function(){ + $("#input-srw").click(function(){ + $(".rdfoptions").attr("disabled","disabled"); + $(".xmloptions").attr("disabled","disabled"); + $("#dc-rdf").hide(); + $("#dc-xml").hide(); + }); + }); + //]]> </script> </head> @@ -1049,7 +1126,7 @@ function verify_images() { <th>Save Record</th> </tr> <tr><td> Select download format: <select name="format"> <option value="mods">MODS (XML)</option> - <option value="dc">Dublin Core (XML)</option> + <option data-toggle="modal" data-target="#exportModal_">Dublin Core</option> <option value="marcxml">MARCXML</option> <option value="marc8">MARC (non-Unicode/MARC-8)</option> <option value="utf8">MARC (Unicode/UTF-8)</option> </select> @@ -1082,4 +1159,84 @@ function verify_images() { </div> [% END %] </div> + + <!--Modal for Dublin Core--> + <div class="modal hide" id="exportModal_" tabindex="-1" role="dialog" aria-labelledby="exportLabelexportModal_" aria-hidden="true"> + <div class="modal-header"> + <button type="button" class="closebtn" data-dismiss="modal" aria-hidden="true">×</button> + <h3 id="exportLabelexportModal_">Exporting to Dublin Core...</h3> + </div> + <!-- Form to recollect data for Dublin Core--> + <form method="get" action="/cgi-bin/koha/catalogue/export.pl"> + <div class="modal-body"> + <fieldset> + <input id="input-simple" type="radio" name="recommendation" value="simple-dc-rdf"> + <label class="label_dc" for="input-simple">Simple DC-RDF</label> + <br> + <input id="input-rdf" type="radio" name="recommendation" value="dc-rdf" checked> + <label class="label_dc" for="input-rdf">DC-RDF (Recommended)</label> + <div id="dc-rdf"> + <br><b>Output options for RDF</b> + <br>DC-RDF is downloadable in "rdfxml" by default (this is according with the + <br>recommendation), but you can download the file in other formats: + <br> + <input id="rdfxml" class="rdfoptions" type="radio" name="formats" value="rdfxml" checked> + <label class="label_dc" for="rdfxml">rdfxml</label> + <input id="rdfjson" class="rdfoptions" type="radio" name="formats" value="rdfjson"> + <label class="label_dc" for="rdfjson">rdfjson</label> + <input id="ntriples" class="rdfoptions" type="radio" name="formats" value="ntriples"> + <label class="label_dc" for="ntriples">ntriples</label> + <input id="nquads" class="rdfoptions" type="radio" name="formats" value="nquads"> + <label class="label_dc" for="nquads">nquads</label> + <input id="ntriples_canonical" class="rdfoptions" type="radio" name="formats" value="ntriples-canonical"> + <label class="label_dc" for="ntriples_canonical">ntriples-canonical</label> + <input id="turtle" class="rdfoptions" type="radio" name="formats" value="turtle"> + <label class="label_dc" for="turtle">turtle</label> + </div> + <br> + <input id="input-xml" type="radio" name="recommendation" value="dc-xml"> + <label class="label_dc" for="input-xml">DC-XML</label> + <div id="dc-xml"> + <p><b>Output options for DC-XML</b> + <br> + <b>Dublin Core level</b></p> + <p><input id="simple_dc" class="xmloptions" type="radio" name="qualifier" value="0" checked disabled> + <label class="label_dc" for="simple_dc">Simple Dublin Core</label> + <input id="qualified_dc" class="xmloptions" type="radio" name="qualifier" value="1" disabled> + <label class="label_dc" for="qualified_dc">Qualified Dublin Core</label></p> + <b>Other data (Optional)</b> + <br> + <input id="root_checked" class="xmloptions" type="checkbox" value="root"> + <label class="label_dc" for="root_checked">Root element: </label> + <input id="root_value" class="xmloptions" type="text" name="root_element" value="metadata" disabled> + <br>The xsischemaLocation should be filled like: + <br>http://example.org/myapp/ http://example.org/myapp/schema.xsd + <br> + <input id="schema_checked" class="xmloptions" type="checkbox" value="schema" disabled> + <label class="label_dc" for="schema_checked">xsischemaLocation: </label> + <input id="schema_value" class="xmloptions" type="url" name="xsischemalocation" disabled><br> + </div> + <br> + <input id="input-oai" type="radio" name="recommendation" value="oai-dc"> + <label class="label_dc" for="input-oai">OAI-DC</label> + <br> + <input id="input-srw" type="radio" name="recommendation" value="srw_dc"> + <label class="label_dc" for="input-srw">SRW-DC</label> + <br> + <div> + <br>Learn more about DCMI Specifications at: <a href="http://dublincore.org/specifications/">http://dublincore.org/specifications/</a> + <br> + </div> + </fieldset> + </div> + <div class="modal-footer"> + <button type="submit" class="btn">Export</button> + <button class="btn btn-link" data-dismiss="modal" aria-hidden="true">Cancel</button> + </div> + <input type="hidden" name="op" value="export" /> + <input type="hidden" name="format" value="dc" /> + <input type="hidden" name="bib" value="[% biblionumber %]" /> + </form> + </div> + [% INCLUDE 'intranet-bottom.inc' %] diff --git a/koha-tmpl/opac-tmpl/bootstrap/css/opac.css b/koha-tmpl/opac-tmpl/bootstrap/css/opac.css index 188fdab..79e7940 100644 --- a/koha-tmpl/opac-tmpl/bootstrap/css/opac.css +++ b/koha-tmpl/opac-tmpl/bootstrap/css/opac.css @@ -1 +1 @@ -.shadowed{-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,0.2);-moz-box-shadow:0 1px 1px 0 rgba(0,0,0,0.2);box-shadow:0 1px 1px 0 rgba(0,0,0,0.2)}body{background-color:#eaeae6}html,body{height:100%}.no-js .dateformat{display:inline;white-space:nowrap}.no-js .modal-body{padding:0}.no-js .selections-toolbar{display:none}.js .dateformat{display:none}#wrap{min-height:100%;height:auto !important;height:100%}.popup{padding-left:0;padding-right:0}a{color:#0076b2}a.cancel{padding-left:1em}a:visited{color:#0076b2}a.title{font-weight:bold;font-size:108%}a.btn:visited{color:#333}a.btn-primary:visited{color:#fff}.ui-widget-content a,.ui-widget-content a:visited{color:#0076b2}h1{font-size:140%;line-height:150%}h1#libraryname{background:transparent url(../images/logo-koha.png) no-repeat scroll 0;border:0;float:left !important;margin:0;padding:0;width:120px}h1#libraryname a{border:0;cursor:pointer;display:block;height:0 !important;margin:0;overflow:hidden;padding:40px 0 0;text-decoration:none;width:120px}h2{font-size:130%;line-height:150%}h3{font-size:120%;line-height:150%}h4{font-size:110%}h5{font-size:100%}caption{font-size:120%;font-weight:bold;margin:0;text-align:left}input,textarea{width:auto}.input-fluid{width:50%}legend{font-size:110%;font-weight:bold}table,td{background-color:#fff}td .btn{white-space:nowrap}td .btn-link{padding:0}#advsearches label,#booleansearch label{display:inline}#basketcount{display:inline;margin:0;padding:0}#basketcount span{background-color:#ffc;color:#000;display:inline;font-size:80%;font-weight:normal;margin:0 0 0 .9em;padding:0 .3em 0 .3em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}#members{display:block}#members p{color:#eee}#members a{color:#a6d8ed;font-weight:bold}#members a.logout{color:#e8583c;padding:0 .3em 0 .3em}#koha_url p{color:#666;float:right;margin:0}#moresearches{margin:.5em 0;padding:0 .8em}#moresearches li{display:inline;white-space:nowrap}#moresearches li:after{content:" | "}#moresearches ul{margin:0}#moresearches li:last-child:after{content:""}#news{margin:.5em 0}.newscontainer{border:1px solid #ddd;border-bottom-width:0;border-top-left-radius:5px;border-top-right-radius:5px}.newsheader{background-color:#ecede6;border-bottom:1px solid #ddd;margin:0;padding:8px}.newsbody{padding:8px}.newsfooter{border-bottom:1px solid #ddd;font-style:italic;padding:4px 8px}#opacheader{background-color:#ddd}#selections,.selections{font-weight:bold}.actions a{white-space:nowrap}.actions a.hold{background-image:url("../images/sprite.png");background-position:-5px -542px;background-repeat:no-repeat;margin-right:1em;padding-left:21px;text-decoration:none}.actions a.addtocart{background-image:url("../images/sprite.png");background-position:-5px -572px;background-repeat:no-repeat;margin-right:1em;padding-left:20px;text-decoration:none}.actions a.addtoshelf{background-image:url("../images/sprite.png");background-position:-5px -27px;background-repeat:no-repeat;margin-right:1em;padding-left:20px;text-decoration:none}.actions a.addtolist{background-position:-5px -27px;margin-right:1em;padding-left:20px;text-decoration:none}.actions a.tag_add{background-position:-5px -1110px;margin-right:1em;padding-left:20px;text-decoration:none}.actions a.removefromlist{background-position:-8px -690px;margin-right:1em;text-decoration:none;padding-left:15px}.alert{background:#fffbe5;background:-moz-linear-gradient(top, #fffbe5 0, #fff0b2 9%, #fff1a8 89%, #f7e665 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fffbe5), color-stop(9%, #fff0b2), color-stop(89%, #fff1a8), color-stop(100%, #f7e665));background:-webkit-linear-gradient(top, #fffbe5 0, #fff0b2 9%, #fff1a8 89%, #f7e665 100%);background:-o-linear-gradient(top, #fffbe5 0, #fff0b2 9%, #fff1a8 89%, #f7e665 100%);background:-ms-linear-gradient(top, #fffbe5 0, #fff0b2 9%, #fff1a8 89%, #f7e665 100%);background:linear-gradient(to bottom, #fffbe5 0, #fff0b2 9%, #fff1a8 89%, #f7e665 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbe5', endColorstr='#f7e665', GradientType=0);border-color:#d6c43b;color:#333}.alert-info{background:#f4f6fa;background:-moz-linear-gradient(top, #f4f6fa 0, #eaeef5 4%, #e8edf6 96%, #cddbf2 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f4f6fa), color-stop(4%, #eaeef5), color-stop(96%, #e8edf6), color-stop(100%, #cddbf2));background:-webkit-linear-gradient(top, #f4f6fa 0, #eaeef5 4%, #e8edf6 96%, #cddbf2 100%);background:-o-linear-gradient(top, #f4f6fa 0, #eaeef5 4%, #e8edf6 96%, #cddbf2 100%);background:-ms-linear-gradient(top, #f4f6fa 0, #eaeef5 4%, #e8edf6 96%, #cddbf2 100%);background:linear-gradient(to bottom, #f4f6fa 0, #eaeef5 4%, #e8edf6 96%, #cddbf2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f4f6fa', endColorstr='#cddbf2', GradientType=0);border-color:#c5d1e5;color:#333}.alert-success{background:#f8ffe8;background:-moz-linear-gradient(top, #f8ffe8 0, #e3f5ab 4%, #dcf48d 98%, #9ebf28 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f8ffe8), color-stop(4%, #e3f5ab), color-stop(98%, #dcf48d), color-stop(100%, #9ebf28));background:-webkit-linear-gradient(top, #f8ffe8 0, #e3f5ab 4%, #dcf48d 98%, #9ebf28 100%);background:-o-linear-gradient(top, #f8ffe8 0, #e3f5ab 4%, #dcf48d 98%, #9ebf28 100%);background:-ms-linear-gradient(top, #f8ffe8 0, #e3f5ab 4%, #dcf48d 98%, #9ebf28 100%);background:linear-gradient(to bottom, #f8ffe8 0, #e3f5ab 4%, #dcf48d 98%, #9ebf28 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8ffe8', endColorstr='#9ebf28', GradientType=0);border-color:#9fba35;color:#333}.breadcrumb{background-color:#f2f2ef;font-size:85%;list-style:none outside none;margin:10px 20px;padding:5px 10px;-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px}.form-inline{display:inline;padding:0;margin:0}.form-inline fieldset{margin:.3em 0;padding:.3em}.main{background-color:#fff;border:1px solid #d2d2cf;-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px;-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,0.2);-moz-box-shadow:0 1px 1px 0 rgba(0,0,0,0.2);box-shadow:0 1px 1px 0 rgba(0,0,0,0.2);margin-top:.5em;margin-bottom:.5em}.mastheadsearch{-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px;padding:.8em;margin:.5em 0;background:#c7c7c1;background:-moz-linear-gradient(top, #c7c7c1 38%, #a7a7a2 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(38%, #c7c7c1), color-stop(100%, #a7a7a2));background:-webkit-linear-gradient(top, #c7c7c1 38%, #a7a7a2 100%);background:-o-linear-gradient(top, #c7c7c1 38%, #a7a7a2 100%);background:-ms-linear-gradient(top, #c7c7c1 38%, #a7a7a2 100%);background:linear-gradient(to bottom, #c7c7c1 38%, #a7a7a2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#c7c7c1', endColorstr='#a7a7a2', GradientType=0)}.mastheadsearch label{font-size:115%;font-weight:bold}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#9fe1ff;font-weight:bold}.navbar-fixed-bottom.navbar-static-bottom{margin-top:.5em;position:static}#changelanguage .nav>.active>p{padding:0 15px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f4f4f4}.ui-tabs-nav .ui-tabs-active a,.ui-tabs-nav a:hover,.ui-tabs-nav a:focus,.ui-tabs-nav a:active,.ui-tabs-nav span.a{background:none repeat scroll 0 0 transparent;outline:0 none}.ui-widget,.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:inherit;font-size:inherit}ul.ui-tabs-nav li{list-style:none}.ui-tabs.ui-widget-content{background:transparent none;border:0}.ui-tabs .ui-tabs-panel{border:1px solid #d8d8d8;margin-bottom:1em}.ui-tabs-nav.ui-widget-header{border:0;background:none}.ui-tabs .ui-tabs-nav li{background:#f3f3f3 none;border-color:#d8d8d8;margin-right:.4em}.ui-tabs .ui-tabs-nav li.ui-tabs-active{background-color:#fff;border:1px solid #d8d8d8;border-bottom:0}.ui-tabs .ui-tabs-nav li.ui-tabs-active a{color:#000;font-weight:bold}.ui-tabs .ui-tabs-nav li.ui-state-default.ui-state-hover{background:#f3f3f3 none}.ui-tabs .ui-tabs-nav li.ui-tabs-active.ui-state-hover{background:#fff none}.ui-tabs .ui-state-default a,.ui-tabs .ui-state-default a:link,.ui-tabs .ui-state-default a:visited{color:#069}.ui-tabs .ui-state-hover a,.ui-tabs .ui-state-hover a:link,.ui-tabs .ui-state-hover a:visited{color:#903}.statictabs ul{background:none repeat scroll 0 0 transparent;border:0 none;margin:0;padding:.2em .2em 0;border-bottom-right-radius:4px;border-bottom-left-radius:4px;border-top-right-radius:4px;border-top-left-radius:4px;color:#222;font-weight:bold;font-size:100%;line-height:1.3;list-style:none outside none;outline:0 none;text-decoration:none}.statictabs ul:before{content:"";display:table}.statictabs ul:after{clear:both;content:"";display:table}.statictabs li{background:none repeat scroll 0 0 #e6f0f2;border:1px solid #b9d8d9;border-bottom:0 none !important;border-top-right-radius:4px;border-top-left-radius:4px;float:left;list-style:none outside none;margin-bottom:0;margin-right:.4em;padding:0;position:relative;white-space:nowrap;top:1px;color:#555;font-weight:normal}.statictabs li.active{background-color:#fff;color:#212121;font-weight:normal;padding-bottom:1px}.statictabs li a{color:#004d99;cursor:pointer;float:left;padding:.5em 1em;text-decoration:none}.statictabs li a:hover{background-color:#edf4f5;border-top-right-radius:4px;border-top-left-radius:4px;color:#538200}.statictabs li.active a{color:#000;font-weight:bold;cursor:text;background:none repeat scroll 0 0 transparent;outline:0 none}.statictabs .tabs-container{border:1px solid #b9d8d9;background:none repeat scroll 0 0 transparent;display:block;padding:1em 1.4em;border-bottom-right-radius:4px;border-bottom-left-radius:4px;color:#222}.ui-datepicker table{width:100%;font-size:.9em;border:0;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{background:transparent none;padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker-trigger{vertical-align:middle;margin:0 3px}.ui-datepicker{-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,0.2);-moz-box-shadow:0 1px 1px 0 rgba(0,0,0,0.2);box-shadow:0 1px 1px 0 rgba(0,0,0,0.2)}.ui-widget-content{border:1px solid #aaa;background:#fff none;color:#222}.ui-widget-header{border:1px solid #aaa;background:#e6f0f2 none;color:#222;font-weight:bold}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #aaa;background:#f4f8f9 none;font-weight:normal;color:#555}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #aaa;background:#e6f0f2 none;font-weight:normal;color:#212121}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #aaa;background:#fff none;font-weight:normal;color:#212121}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee;color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec;color:#cd0a0a}.ui-autocomplete{position:absolute;cursor:default;-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,0.2);-moz-box-shadow:0 1px 1px 0 rgba(0,0,0,0.2);box-shadow:0 1px 1px 0 rgba(0,0,0,0.2)}.ui-autocomplete.ui-widget-content .ui-state-hover{border:1px solid #aaa;background:#e6f0f2 none;font-weight:normal;color:#212121}.ui-autocomplete-loading{background:#fff url("../../img/loading-small.gif") right center no-repeat}.ui-menu li{list-style:none}th{background-color:#ecede6}.item-thumbnail{max-width:none}.no-image{background-color:#fff;border:1px solid #aaa;color:#979797;display:block;font-size:86%;font-weight:bold;text-align:center;width:75px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}#bookcover .no-image{margin-right:10px;margin-bottom:10px}td.overdue{color:#c33}table{font-size:90%}th.sum{text-align:right}td.sum{background-color:#ffc;font-weight:bold}th[scope=row]{background-color:transparent;text-align:right}.required{color:#c00}.label{background-color:transparent;color:inherit;display:inline;font-weight:normal;padding:0;text-shadow:none}.blabel{background-color:#999;border-radius:3px;color:#fff;display:inline-block;font-weight:bold;padding:2px 4px;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.label-important{background-color:#b94a48}.label-warning{background-color:#f89406}.label-success{background-color:#468847}.label-info{background-color:#3a87ad}.label-inverse{background-color:#333}fieldset.rows{float:left;font-size:90%;clear:left;margin:.9em 0 0 0;padding:0;width:100%}fieldset.rows legend{font-weight:bold;font-size:130%}fieldset.rows label,fieldset.rows .label{float:left;font-weight:bold;width:9em;margin-right:1em;text-align:right}fieldset.rows label.lradio{float:none;margin:inherit;width:auto}fieldset.rows fieldset{margin:0;padding:.3em}fieldset.rows ol{padding:1em 1em 0 1em;list-style-type:none}fieldset.rows ol.lradio label{width:auto;float:none;margin-right:0}fieldset.rows ol.lradio label.lradio{float:left;width:12em;margin-right:1em}fieldset.rows li{float:left;clear:left;padding-bottom:1em;list-style-type:none;width:100%}fieldset.rows li.lradio{padding-left:8.5em;width:auto}fieldset.rows li.lradio label{float:none;width:auto;margin:0 0 0 1em}fieldset.rows .hint{display:block;margin-left:11em}fieldset.action{clear:both;float:none;border:none;margin:0;padding:1em 0 .3em 0;width:auto}fieldset.action p{margin-bottom:1em}fieldset table{font-size:100%}div.rows+div.rows{margin-top:.6em}div.rows{float:left;clear:left;margin:0 0 0 0;padding:0;width:100%}div.rows span.label{float:left;font-weight:bold;width:9em;margin-right:1em;text-align:left}div.rows ol{list-style-type:none;margin-left:0;padding:.5em 1em 0 0}div.rows li{border-bottom:1px solid #eee;float:left;clear:left;padding-bottom:.2em;padding-top:.1em;list-style-type:none;width:100%}div.rows ul li{margin-left:7.3em}div.rows ul li:first-child{float:none;clear:none;margin-left:0}div.rows ol li li{border-bottom:0}.tagweight0{font-size:12px}.tagweight1{font-size:14px}.tagweight2{font-size:16px}.tagweight3{font-size:18px}.tagweight4{font-size:20px}.tagweight5{font-size:22px}.tagweight6{font-size:24px}.tagweight7{font-size:26px}.tagweight8{font-size:28px}.tagweight9{font-size:30px}.toolbar{background-color:#eee;border:1px solid #e8e8e8;font-size:85%;padding:3px 3px 5px 5px;vertical-align:middle}.toolbar a{white-space:nowrap}.toolbar label{display:inline;font-size:100%;font-weight:bold;margin-left:.5em}.toolbar select{font-size:97%;height:auto;line-height:inherit;padding:0;margin:0;width:auto;white-space:nowrap}.toolbar .hold,.toolbar #tagsel_tag{padding-left:28px;font-size:97%;font-weight:bold}.toolbar #tagsel_form{margin-top:.5em}.toolbar li{display:inline;list-style:none}.toolbar li a{border-left:1px solid #e8e8e8}.toolbar li:first-child a{border-left:0}.toolbar ul{padding-left:0}#basket .toolbar{padding:7px 5px 9px 9px}#selections-toolbar,.selections-toolbar{background:-moz-linear-gradient(top, #b2b2b2 0, #e0e0e0 14%, #e8e8e8 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #b2b2b2), color-stop(14%, #e0e0e0), color-stop(100%, #e8e8e8));background:-webkit-linear-gradient(top, #b2b2b2 0, #e0e0e0 14%, #e8e8e8 100%);background:-o-linear-gradient(top, #b2b2b2 0, #e0e0e0 14%, #e8e8e8 100%);background:-ms-linear-gradient(top, #b2b2b2 0, #e0e0e0 14%, #e8e8e8 100%);background:linear-gradient(top, #b2b2b2 0, #e0e0e0 14%, #e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e0e0e0', endColorstr='#e8e8e8', GradientType=0);margin:0 0 1em 0;padding-top:.5em;padding-left:10px}.list-actions{display:inline}#tagsel_span input.submit,#tagsel_tag{border:0;background-color:transparent;font-size:100%;color:#0076b2;cursor:pointer;background-image:url("../images/sprite.png");background-position:1px -643px;background-repeat:no-repeat;padding-left:25px;text-decoration:none}#tagsel_tag.disabled{background-position:-1px -667px}#tagsel_span input:hover,#selections-toolbar input.hold:hover{color:#005580;text-decoration:underline}#tagsel_span input.disabled,#tagsel_span input.disabled:hover,#tagsel_span input.hold.disabled,#tagsel_span input.hold.disabled:hover,#selections-toolbar input.hold.disabled,#selections-toolbar input.hold.disabled:hover,#selections-toolbar a.disabled,#selections-toolbar a.disabled:hover,.selections-toolbar a.disabled,.selections-toolbar a.disabled:hover{color:#888;text-decoration:none;padding-left:23px}.results_summary{display:block;font-size:85%;color:#707070;padding:0 0 .5em 0}.results_summary .results_summary{font-size:100%}.results_summary.actions{margin-top:.5em}.results_summary.tagstatus{display:inline}.results_summary .label{color:#202020}.results_summary a{font-weight:normal}#views{border-bottom:1px solid #d6d6d6;margin-bottom:.5em;padding:0 2em .2em .2em;white-space:nowrap}.view{padding:.2em .2em 2px .2em}#bibliodescriptions,#isbdcontents{clear:left;margin-top:.5em}.view a,.view span{background-image:url("../images/sprite.png");background-repeat:no-repeat;font-size:87%;font-weight:normal;padding:.4em .7em 5px 26px;text-decoration:none}span#MARCview,span#ISBDview,span#Normalview,span#Fullhistory,span#Briefhistory{font-weight:bold}a#MARCview,span#MARCview{background-position:-3px -23px}a#MARCviewPop,span#MARCviewPop{background-position:-3px -23px}a#ISBDview,span#ISBDview{background-position:-3px -52px}a#Normalview,span#Normalview{background-position:-1px 6px}.view a{background-color:#f3f3f3;border-left:1px solid #c9c9c9}#bookcover{float:left;margin:0;padding:0}#bookcover .no-image{margin-right:10px;margin-bottom:10px}#bookcover img{margin:0 1em 1em 0}.results-pagination{position:absolute;top:32px;left:-1px;width:100%;height:auto;border:1px solid #d0d0d0;display:none;background-color:#f3f3f3;padding-bottom:10px;z-index:100}.back{float:right}.back input{background:none !important;color:#999 !important}.pagination_list ul{padding-top:40px;padding-left:0}.pagination_list li{list-style:none;float:bottom;padding:4px;color:#999}.pagination_list li.highlight{background-color:#f3f3f3;border-top:1px solid #ddd;border-bottom:1px solid #ddd}.pagination_list li a{padding-left:0}.pagination_list .li_pag_index{color:#999;float:left;font-size:15px;font-weight:bold;padding-right:10px;text-align:right;width:13px}.nav_results{background-color:#f3f3f3;border:1px solid #d0d0d0;font-size:95%;font-weight:bold;margin-top:.5em;position:relative}.nav_results .l_Results a{background:#e1e1e1 url("../images/sprite.png") no-repeat 0 -504px;color:#069;display:block;padding:8px 28px;text-decoration:none}.nav_results .l_Results:hover{background-color:#d9d9d9}.pg_menu{margin:0;border-top:1px solid #d0d0d0;white-space:nowrap}.pg_menu li{color:#b2b2b2;display:inline;list-style:none;margin:0}.pg_menu li.back_results a{border-left:1px solid #d0d0d0;border-right:1px solid #d0d0d0}.pg_menu li a,.pg_menu li span{background-color:#f3f3f3;display:block;float:left;padding:.4em .5em;text-decoration:none;font-weight:normal;text-align:center}.pg_menu li span{color:#b2b2b2}#listResults li{background-color:#999;color:#c5c5c5;font-weight:normal;display:block;margin-right:1px;font-size:80%;padding:0;text-align:center;min-width:18px}#listResults li:hover{background-color:#069}#listResults li a{color:#fff;font-weight:normal}.nav_pages .close_pagination{padding-right:10px;position:absolute;right:3px;top:-25px}.nav_pages .close_pagination a{text-decoration:none !important}.nav_pages ul{padding-top:10px}.nav_pages li{list-style:none;float:left;padding:4px;color:#999}.nav_pages li a{text-decoration:none !important}.nav_pages li a:hover{text-decoration:underline}.nav_pages li ul{float:left}#action{margin:.5em 0 0 0;background-color:#f3f3f3;border:1px solid #e8e8e8;padding-bottom:3px}#action li{list-style:none;margin:.2em;padding:.3em 0}#action a{font-weight:bold;text-decoration:none}#export li,#moresearches_menu li{padding:0;margin:0}#export li a,#moresearches_menu li a{font-weight:normal}#export li a.menu-inactive,#moresearches_menu li a.menu-inactive{font-weight:bold}#format,#furthersearches{padding-left:35px}.highlight_controls{float:left}a.addtocart,a.addtoshelf,a.brief,a.deleteshelf,a.deleteshelf.disabled,a.detail,a.download,a.editshelf,a.empty,a.hide,a.highlight_toggle,a.hold,a.hold.disabled,a.incart,a.new,a.print-small,a.print-large,a.removeitems,a.removeitems.disabled,a.reserve,a.send,a.tag_add,a.removefromlist,input.hold,input.hold.disabled,input.editshelf,.newshelf,.newshelf.disabled,.deleteshelf{background-image:url("../images/sprite.png");background-repeat:no-repeat}a.addtocart{background-position:-5px -265px;padding-left:35px}a.addtoshelf{background-position:-5px -225px;padding-left:35px}a.brief{background-position:-2px -868px;text-decoration:none;padding-left:27px}a.cartRemove{color:#c33;font-size:90%;margin:0;padding:0}a.detail{background-position:-2px -898px;text-decoration:none;padding-left:27px}a.download{background-position:-5px -348px;padding-left:20px;text-decoration:none}a.editshelf{background-position:2px -348px;padding-left:26px;text-decoration:none}a.empty{background-position:2px -598px;text-decoration:none;padding-left:30px}a.hide{background-position:-3px -814px;text-decoration:none;padding-left:26px}a.highlight_toggle{background-position:-5px -841px;display:none;padding-left:35px}a.hold,input.hold{background-position:-2px -453px;text-decoration:none;padding-left:23px}a.hold.disabled,input.hold.disabled{background-position:-5px -621px}a.incart{background-position:-5px -265px;color:#666;padding-left:35px}a.new{background-image:url("../images/sprite.png");background-position:-4px -922px;padding-left:23px;text-decoration:none}a.print-small{background-position:0 -423px;text-decoration:none;padding-left:30px}a.print-large{background-position:-5px -186px;text-decoration:none;padding-left:35px}a.removeitems,a.deleteshelf{background-position:2px -690px;text-decoration:none;padding-left:25px}a.removeitems.disabled,a.deleteshelf.disabled{background-position:2px -712px}a.reserve{background-position:-6px -144px;padding-left:35px}a.send{background-position:2px -386px;text-decoration:none;padding-left:28px}a.tag_add{background-position:3px -1111px;padding-left:27px;text-decoration:none}input.hold{background-color:transparent;border:0;color:#0076b2;font-weight:bold}input.editshelf{background-color:transparent;background-position:2px -736px;border:0;color:#069;cursor:pointer;filter:none;font-size:100%;padding-left:29px;text-decoration:none}.newshelf{background-position:2px -764px;border:0;color:#069;cursor:pointer;filter:none;font-size:100%;padding-left:28px;text-decoration:none}.newshelf.disabled{background-position:-4px -791px}.deleteshelf{background-color:transparent;background-position:2px -690px;border:0;color:#069;cursor:pointer;filter:none;font-size:100%;padding-left:25px;text-decoration:none}.links a{font-weight:bold}.deleteshelf:hover{color:#903}.editshelf:active,.deleteshelf:active{border:0}#tagslist li{display:inline}#login4tags{background-image:url("../images/sprite.png");background-position:-6px -1130px;background-repeat:no-repeat;padding-left:20px;text-decoration:none}.tag_results_input{margin-left:1em;padding:.3em;font-size:12px}.tag_results_input input[type="text"]{font-size:inherit;margin:0;padding:0}.tag_results_input label{display:inline}.tagsinput input[type="text"]{font-size:inherit;margin:0;padding:0}.tagsinput label{display:inline}.branch-info-tooltip{display:none}.ui-tooltip-content p{margin:.3em 0}#social_networks a{background:transparent url("../images/social-sprite.png") no-repeat;display:block;height:20px !important;width:20px;text-indent:-999em}#social_networks span{color:#274d7f;display:block;float:left;font-size:85%;font-weight:bold;line-height:2em;margin:.5em 0 .5em .5em !important}#social_networks div{float:left !important;margin:.5em 0 .5em .2em !important}#social_networks #facebook{background-position:-7px -35px}#social_networks #twitter{background-position:-7px -5px}#social_networks #linkedin{background-position:-7px -95px}#social_networks #delicious{background-position:-7px -66px}#social_networks #email{background-position:-7px -126px}#marc td,#marc th{background-color:transparent;border:0;padding:3px 5px;text-align:left}#marc td:first-child{text-indent:2em}#marc p{padding-bottom:.6em}#marc p .label{font-weight:bold}#marc ul{padding-bottom:.6em}#marc .results_summary{clear:left}#marc .results_summary ul{display:inline;float:none;clear:none;margin:0;padding:0;list-style:none}#marc .results_summary li{display:inline}#items,#items td #items th{border:1px solid #eee;font-size:90%}#plainmarc table{border:0;margin:.7em 0 0 0;font-family:monospace;font-size:95%}#plainmarc th{background-color:#fff;border:0;white-space:nowrap;text-align:left;vertical-align:top;padding:2px}#plainmarc td{border:0;padding:2px;vertical-align:top}#renewcontrols{float:right;font-size:66%}#renewcontrols a{background-repeat:no-repeat;text-decoration:none;padding:.1em .4em;padding-left:18px}#renewselected_link{background-image:url("../images/sprite.png");background-position:-5px -986px;background-repeat:no-repeat}#renewall_link{background-image:url("../images/sprite.png");background-position:-8px -967px;background-repeat:no-repeat}.authref{text-indent:2em}.authref .label{font-style:italic}.authstanza{margin-top:1em}.authstanzaheading{font-weight:bold}.authorizedheading{font-weight:bold}.authstanza li{margin-left:.5em}.authres_notes,.authres_seealso,.authres_otherscript{padding-top:.5em}.authres_notes{font-style:italic}#didyoumean{background-color:#eee;border:1px solid #e8e8e8;margin:0 0 .5em;text-align:left;padding:.5em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.suggestionlabel{font-weight:bold}.searchsuggestion{padding:.2em .5em;white-space:nowrap;display:inline-block}.authlink{padding-left:.25em}#hierarchies a{font-weight:normal;text-decoration:underline;color:#069}#hierarchies a:hover{color:#903}#top-pages{margin:0 0 .5em}.dropdown-menu>li>a{font-size:90%}a.listmenulink:link,a.listmenulink:visited{color:#0076b2;font-weight:bold}a.listmenulink:hover,a.listmenulink:active{color:#fff;font-weight:bold}#cartDetails,#cartUpdate,#holdDetails,#listsDetails{background-color:#fff;border:1px solid rgba(0,0,0,0.2);border-radius:6px 6px 6px 6px;box-shadow:0 5px 10px rgba(0,0,0,0.2);color:#000;display:none;font-size:90%;margin:0;padding:8px 20px;text-align:center;width:180px;z-index:2}#cartmenulink{white-space:nowrap}#search-facets,#menu{border:1px solid #d2d2cf;-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px}#search-facets ul,#menu ul{margin:0;padding:.3em}#search-facets form,#menu form{margin:0}#search-facets h4,#menu h4{font-size:90%;margin:0 0 .6em 0;text-align:center}#search-facets h4 a,#menu h4 a{background-color:#f2f2ef;border-radius:8px 8px 0 0;border-bottom:1px solid #d8d8d8;display:block;font-weight:bold;padding:.7em .2em;text-decoration:none}#search-facets li,#menu li{font-size:90%;font-weight:bold;list-style-type:none}#search-facets li li,#menu li li{font-weight:normal;font-size:95%;line-height:125%;margin-bottom:2px;padding:.1em .2em}#search-facets li.showmore a,#menu li.showmore a{font-weight:bold;text-indent:1em}#search-facets a,#menu a{font-weight:normal;text-decoration:underline}#search-facets .facet-count,#menu .facet-count{display:inline-block}#menu{font-size:94%}#menu li{list-style-type:none}#menu li a{background:#eee;text-decoration:none;display:block;border:1px solid #d8d8d8;border-radius:5px 0 0 5px;border-bottom-color:#999;font-size:111%;padding:.4em .6em;margin:.4em 0;margin-right:-1px}#menu li a:hover{background:#eaeef5}#menu li.active a{background-color:#fff;background-image:none;border-right-width:0;font-weight:bold}#menu li.active a:hover{background-color:#fff}#menu h4{display:none}#addto{max-width:10em}.addto a.addtocart{background-image:url("../images/sprite.png");background-position:-5px -266px;background-repeat:no-repeat;text-decoration:none;padding-left:33px}.searchresults p{margin:0;padding:0 0 .6em 0}.searchresults p.details{color:#979797}.searchresults a.highlight_toggle{background-image:url("../images/sprite.png");background-position:-11px -841px;background-repeat:no-repeat;display:none;font-weight:normal;padding:0 10px 0 21px}.searchresults .commentline{background-color:#ffc;background-color:rgba(255,255,204,0.4);border:1px solid #ccc;display:inline-block;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,0.2);-moz-box-shadow:0 1px 1px 0 rgba(0,0,0,0.2);box-shadow:0 1px 1px 0 rgba(0,0,0,0.2);margin:.3em;padding:.4em}.searchresults .commentline.yours{background-color:#effed5;background-color:rgba(239,254,213,0.4)}.commentline .avatar{float:right;padding-left:.5em}.term{color:#900;background-color:#ffc}.shelvingloc{display:block;font-style:italic}#CheckAll,#CheckNone,.CheckAll,.CheckNone{font-weight:normal;margin:0 .5em;text-decoration:underline}span.sep{color:#888;padding:0 .2em 0 .5em;text-shadow:1px 1px 0 #fff}.pages span:first-child,.pages a:first-child{border-width:1px 1px 1px 1px;border-bottom-left-radius:3px;border-top-left-radius:3px}.pages span:last-child,.pages a:last-child{border-width:1px 1px 1px 0;border-bottom-right-radius:3px;border-top-right-radius:3px}.pages .inactive,.pages .currentPage,.pages a{-moz-border-bottom-colors:none;-moz-border-left-colors:none;-moz-border-right-colors:none;-moz-border-top-colors:none;background-color:#fff;border-color:#ddd;border-image:none;border-style:solid;border-width:1px 1px 1px 0;float:left;font-size:11.9px;line-height:20px;padding:4px 12px;text-decoration:none}.pages .inactive{background-color:#f5f5f5}.pages a[rel='last']{border-bottom-right-radius:3px;border-top-right-radius:3px}.hold-message{background-color:#fff0b1;display:inline-block;margin:.5em;padding:.2em .5em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.reserve_date,.expiration_date{white-space:nowrap}.close{color:#08c;position:inherit;top:auto;right:auto;filter:none;float:none;font-size:inherit;font-weight:normal;opacity:inherit;text-shadow:none}.close:hover{color:#538200;filter:inherit;font-size:inherit;opacity:inherit}.alert .closebtn{position:relative;top:-2px;right:-21px;line-height:20px}.modal-header .closebtn{margin-top:2px}.closebtn{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.closebtn:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.closebtn{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn-group label,.btn-group select{font-size:13px}.span2 select{width:100%}.popup .main{font-size:90%;padding:0 1em}.popup legend{line-height:1.5em;margin-bottom:.5em}.item-status{display:block;font-size:95%;margin-bottom:.5em}.available{color:#060}.waiting,.intransit,.notforloan,.checkedout,.lost,.notonhold{display:block}.notforloan{color:#900}.lost{color:#666}.suggestion{background-color:#eeeeeb;border:1px solid #ddded3;margin:1em auto;padding:.5em;width:35%;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.librarypulldown .transl1{width:auto}.nolibrarypulldown{width:68%}.nolibrarypulldown .transl1{width:87%}#opac-main-search select{width:auto;max-width:12em}#logo{background:transparent url("../images/koha-logo-navbar.png") no-repeat scroll 0;border:0;float:left !important;margin:0;padding:0;width:100px}#logo a{border:0;cursor:pointer;display:block;height:0 !important;margin:0;overflow:hidden;padding:40px 0 0;text-decoration:none;width:100px}#user-menu-trigger{display:none}#user-menu-trigger .icon-user{background:transparent url("../lib/bootstrap/img/glyphicons-halflings-white.png") no-repeat;background-position:-168px 0;background-repeat:no-repeat;height:14px;line-height:14px;margin:12px 0 0;vertical-align:text-top;width:14px}#user-menu-trigger .caret{border-bottom-color:#999;border-top-color:#999;margin-top:18px}.floating{-webkit-box-shadow:0 3px 2px 0 rgba(0,0,0,0.4);box-shadow:0 3px 2px 0 rgba(0,0,0,0.4);margin-top:0}.tdlabel{font-weight:bold;display:none}td img{max-width:none}#ulactioncontainer{min-width:16em}.notesrow label{font-weight:bold}.notesrow span{display:block}.thumbnail-shelfbrowser span{margin:0 auto}.dropdown-menu>li>a.menu-inactive:hover{background:#fff none;color:#000}.table .sorting_asc{padding-right:19px;background:url("../images/asc.gif") no-repeat scroll right center #ecede6}.table .sorting_desc{padding-right:19px;background:url("../images/desc.gif") no-repeat scroll right center #ecede6}.table .sorting{padding-right:19px;background:url("../images/ascdesc.gif") no-repeat scroll right center #ecede6}.table .nosort,.table .nosort.sorting_asc,.table .nosort.sorting_desc,.table .nosort.sorting{padding-right:19px;background:#ecede6 none}.table th,.table td{line-height:135%}.tags ul{display:inline;list-style:none;margin-left:0}.tags ul li{display:inline}.coverimages{float:right}#i18nMenu{margin-left:1em}#i18nMenu li{font-size:85%}#i18nMenu li li{font-size:100%}#i18nMenu li li>a{font-size:100%}#i18nMenu li li>a:hover{color:#fff}#i18nMenu li a{color:#0076b2}#i18nMenu .dropdown-menu li p{clear:both;display:block;font-weight:normal;line-height:20px;padding:3px 20px;white-space:nowrap}#subjectsList label,#authorSearch label{display:inline;vertical-align:middle}#subjectsList ul,#authorSearch ul{border-bottom:1px solid #eee;list-style-type:none;margin:0;padding:.6em 0}#subjectsList li,#authorSearch li{list-style-type:none;margin:0;padding:0}#overdrive-results{font-weight:bold;padding-left:1em}.throbber{vertical-align:middle}#overdrive-results-list .star-rating-control{display:block;overflow:auto}#shelfbrowser table{margin:0}#shelfbrowser table,#shelfbrowser td,#shelfbrowser th{border:0;font-size:90%;text-align:center}#shelfbrowser td,#shelfbrowser th{padding:3px 5px;width:20%}#shelfbrowser a{display:block;font-size:110%;font-weight:bold;text-decoration:none}#shelfbrowser #browser_next,#shelfbrowser #browser_previous{background-image:url("../images/sprite.png");background-repeat:no-repeat;width:16px}#shelfbrowser #browser_next a,#shelfbrowser #browser_previous a{cursor:pointer;display:block;height:0 !important;margin:0;overflow:hidden;padding:50px 0 0;text-decoration:none;width:16px}#shelfbrowser #browser_previous{background-position:-9px -1007px}#shelfbrowser #browser_next{background-position:-9px -1057px}#holds{margin:0 auto;max-width:800px}.holdrow{clear:both;padding:0 1em 1em 1em;border-bottom:1px solid #ccc;margin-bottom:.5em}.holdrow fieldset{border:0;margin:0;float:none}.holdrow fieldset .label{font-size:14px}.holdrow label{display:inline}.hold-options{clear:both}.toggle-hold-options{background-color:#eee;clear:both;display:block;font-weight:bold;margin:1em 0;padding:.5em}.copiesrow{clear:both}#idreambooksreadometer{float:right}a.idreambooksrating{font-size:30px;color:#29ade4;padding-left:85px;line-height:30px;text-decoration:none}.idreambookslegend{font-size:small}a.reviewlink,a.reviewlink:visited{text-decoration:none;color:#000;font-weight:normal}.idreambookssummary a{color:#707070;text-decoration:none}.idreambookssummary img,.idbresult img{vertical-align:middle}.idbresult{color:#29ade4;text-align:center;margin:.5em;padding:.5em}.idbresult a,.idbresult a:visited{text-decoration:none;color:#29ade4}.idbresult img{padding-right:6px}.js-show{display:none}.modal-nojs .modal-header,.modal-nojs .modal-footer{display:none}.contents{width:75%}.contentblock{font-size:95%;line-height:135%;position:relative;margin-left:2em}.contents .t:first-child:before{content:"→ "}.contents .t:before{content:"\A → ";white-space:pre}.contents .t{font-weight:bold;display:inline}.contents .r{display:inline}.m880{display:block;text-align:right;float:right;width:50%;padding-left:20px}@media only screen and (min-width:0) and (max-width:304px){#oh:after{content:"(min-width: 0px) and (max-width: 304px)"}input,select,textarea{width:auto;max-width:11em}}@media only screen and (min-width:0) and (max-width:390px){#oh:after{content:"(min-width: 0px) and (max-width: 390px)"}.ui-tabs .ui-tabs-nav li a,.statictabs li a{padding:.1em .5em}#views{border:0;padding:0;margin:0}.view{padding:0}.view a,.view span{border:1px solid #c9c9c9;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;font-size:80%;padding:.3em .4em 4px 26px}.input-fluid{width:90%}}@media only screen and (min-width:305px) and (max-width:341px){#oh:after{content:"(min-width: 305px) and (max-width: 341px)"}}@media only screen and (min-width:342px) and (max-width:479px){#oh:after{content:"(min-width: 342px) and (max-width: 479px)"}.input-fluid{width:75%}}@media (max-width:979px){.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;margin-left:0;margin-right:0}}@media only screen and (max-width:608px){fieldset.rows label{display:block;float:none;text-align:left}fieldset.rows li{padding-bottom:.5em}fieldset.rows ol{margin-left:0}fieldset.rows .hint{margin-left:0}body{padding:0}.tdlabel{display:inline}.navbar-fixed-top,.navbar-static-top{margin:0}.navbar-inner{padding:0}.checkall,.clearall,.highlight_controls,#selections-toolbar,.selectcol,.list-actions,#remove-selected{display:none}.table td.bibliocol{padding-left:1.3em}.actions{display:block}.actions a,.actions #login4tags{background-color:#f2f2ef;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;font-weight:bold;display:block;font-size:120%;margin:2px 0}.actions .label{display:block;font-weight:bold}.actions #login4tags{margin-right:1em}#opac-main-search button,#opac-main-search input,#opac-main-search select,#opac-main-search .librarypulldown .transl1,#opac-main-search .input-append{display:block;width:97%;max-width:100%;margin:.5em 0;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}#opac-main-search .input-append{margin:0;width:100%}#opac-main-search .librarypulldown .transl1{width:94.5%}#toolbar .resort{font-size:14px;max-width:100%;margin:.5em 0;padding:4px 6px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.mastheadsearch{margin:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.main{margin:.5em 0;padding:15px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.breadcrumb{margin:10px 0}#moresearches{text-align:center}#searchsubmit{font-weight:bold}.ui-tabs-panel .item-thumbnail,.tabs-container .item-thumbnail,#topissues .item-thumbnail,#usertags .item-thumbnail,#usersuggestions .item-thumbnail{margin:.5em 0 0 .5em}.ui-tabs-panel .table-bordered,.tabs-container .table-bordered,#topissues .table-bordered,#usertags .table-bordered,#usersuggestions .table-bordered{border:none}.ui-tabs-panel .table th,.tabs-container .table th,#topissues .table th,#usertags .table th,#usersuggestions .table th,.ui-tabs-panel .table thead,.tabs-container .table thead,#topissues .table thead,#usertags .table thead,#usersuggestions .table thead{display:none}.ui-tabs-panel .table td,.tabs-container .table td,#topissues .table td,#usertags .table td,#usersuggestions .table td{border-right:1px solid #ddd;border-left:1px solid #ddd;border-top:0;display:block;padding:.2em}.ui-tabs-panel .table p,.tabs-container .table p,#topissues .table p,#usertags .table p,#usersuggestions .table p{margin-bottom:2px}.ui-tabs-panel tr,.tabs-container tr,#topissues tr,#usertags tr,#usersuggestions tr{display:block;margin-bottom:.6em}.ui-tabs-panel tr td:first-child,.tabs-container tr td:first-child,#topissues tr td:first-child,#usertags tr td:first-child,#usersuggestions tr td:first-child{border-top:1px solid #ddd;border-radius:5px 5px 0 0}.ui-tabs-panel tr td:last-child,.tabs-container tr td:last-child,#topissues tr td:last-child,#usertags tr td:last-child,#usersuggestions tr td:last-child{border-radius:0 0 5px 5px;border-bottom:2px solid #cacaca}.no-image{display:none}}@media only screen and (max-width:700px){#opac-main-search label{display:none}#logo{background:transparent url("../lib/bootstrap/img/glyphicons-halflings-white.png") no-repeat;background-position:0 -24px;margin:14px 14px 0 14px;width:14px}#logo a{padding:14px 0 0;width:14px}#user-menu-trigger{display:inline;margin-right:12px}#members{display:none;clear:both}#members li{padding-right:20px;text-align:right;border-bottom:1px solid #555}#members li:first-child{border-top:1px solid #555}#members li:last-child{border-bottom:none}#members .nav{float:none}#members .nav.pull-right{float:none}#members .nav>li{float:none}#members .divider-vertical{border:0;height:0;margin:0}}@media only screen and (min-width:480px) and (max-width:608px){#oh:after{content:" Between 480 pixels and 608 pixels. "}.input-fluid{width:75%}}@media only screen and (min-width:608px) and (max-width:767px){#oh:after{content:" Between 608 pixels and 767 pixels. "}.main{padding:.8em 20px}.breadcrumb{margin:10px 0}.navbar-static-bottom{margin-left:-20px;margin-right:-20px}.row-fluid input.span6{width:48.9362%}}@media only screen and (max-width:767px){a.title{font-size:120%}#userresults{margin:0 -20px}.breadcrumb,#top-pages,.menu-collapse{display:none}#search-facets,#menu{margin-bottom:.5em}#search-facets h4,#menu h4{display:block;margin:0;padding:0}#search-facets h4 a,#menu h4 a{-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px;border-bottom:0;font-weight:normal;padding:.7em .2em}#search-facets ul,#menu ul{padding:0}#menu li a{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;border:0;display:block;font-size:120%;text-decoration:none;border-bottom:1px solid #d8d8d8;margin:0}#menu li.active a{border-top:1px solid #d8d8d8;border-right-width:1px}#menu li:last-child a{-webkit-border-radius:0 0 7px 7px;-moz-border-radius:0 0 7px 7px;border-radius:0 0 7px 7px}#search-facets li{padding:.4em}#search-facets h5{margin:.2em}#menu h4 a.menu-open,#search-facets h4 a.menu-open{-webkit-border-radius:7px 7px 0 0;-moz-border-radius:7px 7px 0 0;border-radius:7px 7px 0 0;border-bottom:1px solid #d8d8d8}}@media only screen and (max-width:800px){.cartlabel,.listslabel{display:none}.navbar .divider-vertical{margin:0 2px}.navbar #members .divider-vertical{margin:0 9px}}@media only screen and (min-width:768px){.main{margin-left:20px;margin-right:20px}#menu{border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;border-right:1px solid #d8d8d8}#menu h4{display:none}#menu ul{padding:1em 0 1em 0}}@media only screen and (min-width:768px) and (max-width:984px){#oh:after{content:" Between 768 and 984 pixels. "}.librarypulldown .transl1{width:38%}}@media only screen and (min-width:984px){#oh:after{content:" Above 984 pixels. "}.librarypulldown .transl1{width:53%}}@media only screen and (max-width:1040px){.pg_menu li a{float:none;text-align:left}.pg_menu li.back_results a{border:1px solid #d0d0d0;border-width:1px 0 1px 0}#ulactioncontainer{min-width:0}} \ No newline at end of file +.shadowed{-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,0.2);-moz-box-shadow:0 1px 1px 0 rgba(0,0,0,0.2);box-shadow:0 1px 1px 0 rgba(0,0,0,0.2)}body{background-color:#eaeae6}html,body{height:100%}.no-js .dateformat{display:inline;white-space:nowrap}.no-js .modal-body{padding:0}.no-js .selections-toolbar{display:none}.js .dateformat{display:none}#wrap{min-height:100%;height:auto !important;height:100%}.popup{padding-left:0;padding-right:0}a{color:#0076b2}a.cancel{padding-left:1em}a:visited{color:#0076b2}a.title{font-weight:bold;font-size:108%}a.btn:visited{color:#333}a.btn-primary:visited{color:#fff}.ui-widget-content a,.ui-widget-content a:visited{color:#0076b2}h1{font-size:140%;line-height:150%}h1#libraryname{background:transparent url(../images/logo-koha.png) no-repeat scroll 0;border:0;float:left !important;margin:0;padding:0;width:120px}h1#libraryname a{border:0;cursor:pointer;display:block;height:0 !important;margin:0;overflow:hidden;padding:40px 0 0;text-decoration:none;width:120px}h2{font-size:130%;line-height:150%}h3{font-size:120%;line-height:150%}h4{font-size:110%}h5{font-size:100%}caption{font-size:120%;font-weight:bold;margin:0;text-align:left}input,textarea{width:auto}.input-fluid{width:50%}legend{font-size:110%;font-weight:bold}table,td{background-color:#fff}td .btn{white-space:nowrap}td .btn-link{padding:0}#advsearches label,#booleansearch label{display:inline}#basketcount{display:inline;margin:0;padding:0}#basketcount span{background-color:#ffc;color:#000;display:inline;font-size:80%;font-weight:normal;margin:0 0 0 .9em;padding:0 .3em 0 .3em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}#members{display:block}#members p{color:#eee}#members a{color:#a6d8ed;font-weight:bold}#members a.logout{color:#e8583c;padding:0 .3em 0 .3em}#koha_url p{color:#666;float:right;margin:0}#moresearches{margin:.5em 0;padding:0 .8em}#moresearches li{display:inline;white-space:nowrap}#moresearches li:after{content:" | "}#moresearches ul{margin:0}#moresearches li:last-child:after{content:""}#news{margin:.5em 0}.newscontainer{border:1px solid #ddd;border-bottom-width:0;border-top-left-radius:5px;border-top-right-radius:5px}.newsheader{background-color:#ecede6;border-bottom:1px solid #ddd;margin:0;padding:8px}.newsbody{padding:8px}.newsfooter{border-bottom:1px solid #ddd;font-style:italic;padding:4px 8px}#opacheader{background-color:#ddd}#selections,.selections{font-weight:bold}.actions a{white-space:nowrap}.actions a.hold{background-image:url("../images/sprite.png");background-position:-5px -542px;background-repeat:no-repeat;margin-right:1em;padding-left:21px;text-decoration:none}.actions a.addtocart{background-image:url("../images/sprite.png");background-position:-5px -572px;background-repeat:no-repeat;margin-right:1em;padding-left:20px;text-decoration:none}.actions a.addtoshelf{background-image:url("../images/sprite.png");background-position:-5px -27px;background-repeat:no-repeat;margin-right:1em;padding-left:20px;text-decoration:none}.actions a.addtolist{background-position:-5px -27px;margin-right:1em;padding-left:20px;text-decoration:none}.actions a.tag_add{background-position:-5px -1110px;margin-right:1em;padding-left:20px;text-decoration:none}.actions a.removefromlist{background-position:-8px -690px;margin-right:1em;text-decoration:none;padding-left:15px}.alert{background:#fffbe5;background:-moz-linear-gradient(top, #fffbe5 0, #fff0b2 9%, #fff1a8 89%, #f7e665 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fffbe5), color-stop(9%, #fff0b2), color-stop(89%, #fff1a8), color-stop(100%, #f7e665));background:-webkit-linear-gradient(top, #fffbe5 0, #fff0b2 9%, #fff1a8 89%, #f7e665 100%);background:-o-linear-gradient(top, #fffbe5 0, #fff0b2 9%, #fff1a8 89%, #f7e665 100%);background:-ms-linear-gradient(top, #fffbe5 0, #fff0b2 9%, #fff1a8 89%, #f7e665 100%);background:linear-gradient(to bottom, #fffbe5 0, #fff0b2 9%, #fff1a8 89%, #f7e665 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbe5', endColorstr='#f7e665', GradientType=0);border-color:#d6c43b;color:#333}.alert-info{background:#f4f6fa;background:-moz-linear-gradient(top, #f4f6fa 0, #eaeef5 4%, #e8edf6 96%, #cddbf2 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f4f6fa), color-stop(4%, #eaeef5), color-stop(96%, #e8edf6), color-stop(100%, #cddbf2));background:-webkit-linear-gradient(top, #f4f6fa 0, #eaeef5 4%, #e8edf6 96%, #cddbf2 100%);background:-o-linear-gradient(top, #f4f6fa 0, #eaeef5 4%, #e8edf6 96%, #cddbf2 100%);background:-ms-linear-gradient(top, #f4f6fa 0, #eaeef5 4%, #e8edf6 96%, #cddbf2 100%);background:linear-gradient(to bottom, #f4f6fa 0, #eaeef5 4%, #e8edf6 96%, #cddbf2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f4f6fa', endColorstr='#cddbf2', GradientType=0);border-color:#c5d1e5;color:#333}.alert-success{background:#f8ffe8;background:-moz-linear-gradient(top, #f8ffe8 0, #e3f5ab 4%, #dcf48d 98%, #9ebf28 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f8ffe8), color-stop(4%, #e3f5ab), color-stop(98%, #dcf48d), color-stop(100%, #9ebf28));background:-webkit-linear-gradient(top, #f8ffe8 0, #e3f5ab 4%, #dcf48d 98%, #9ebf28 100%);background:-o-linear-gradient(top, #f8ffe8 0, #e3f5ab 4%, #dcf48d 98%, #9ebf28 100%);background:-ms-linear-gradient(top, #f8ffe8 0, #e3f5ab 4%, #dcf48d 98%, #9ebf28 100%);background:linear-gradient(to bottom, #f8ffe8 0, #e3f5ab 4%, #dcf48d 98%, #9ebf28 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8ffe8', endColorstr='#9ebf28', GradientType=0);border-color:#9fba35;color:#333}.breadcrumb{background-color:#f2f2ef;font-size:85%;list-style:none outside none;margin:10px 20px;padding:5px 10px;-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px}.form-inline{display:inline;padding:0;margin:0}.form-inline fieldset{margin:.3em 0;padding:.3em}.main{background-color:#fff;border:1px solid #d2d2cf;-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px;-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,0.2);-moz-box-shadow:0 1px 1px 0 rgba(0,0,0,0.2);box-shadow:0 1px 1px 0 rgba(0,0,0,0.2);margin-top:.5em;margin-bottom:.5em}.mastheadsearch{-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px;padding:.8em;margin:.5em 0;background:#c7c7c1;background:-moz-linear-gradient(top, #c7c7c1 38%, #a7a7a2 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(38%, #c7c7c1), color-stop(100%, #a7a7a2));background:-webkit-linear-gradient(top, #c7c7c1 38%, #a7a7a2 100%);background:-o-linear-gradient(top, #c7c7c1 38%, #a7a7a2 100%);background:-ms-linear-gradient(top, #c7c7c1 38%, #a7a7a2 100%);background:linear-gradient(to bottom, #c7c7c1 38%, #a7a7a2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#c7c7c1', endColorstr='#a7a7a2', GradientType=0)}.mastheadsearch label{font-size:115%;font-weight:bold}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#9fe1ff;font-weight:bold}.navbar-fixed-bottom.navbar-static-bottom{margin-top:.5em;position:static}#changelanguage .nav>.active>p{padding:0 15px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f4f4f4}.ui-tabs-nav .ui-tabs-active a,.ui-tabs-nav a:hover,.ui-tabs-nav a:focus,.ui-tabs-nav a:active,.ui-tabs-nav span.a{background:none repeat scroll 0 0 transparent;outline:0 none}.ui-widget,.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:inherit;font-size:inherit}ul.ui-tabs-nav li{list-style:none}.ui-tabs.ui-widget-content{background:transparent none;border:0}.ui-tabs .ui-tabs-panel{border:1px solid #d8d8d8;margin-bottom:1em}.ui-tabs-nav.ui-widget-header{border:0;background:none}.ui-tabs .ui-tabs-nav li{background:#f3f3f3 none;border-color:#d8d8d8;margin-right:.4em}.ui-tabs .ui-tabs-nav li.ui-tabs-active{background-color:#fff;border:1px solid #d8d8d8;border-bottom:0}.ui-tabs .ui-tabs-nav li.ui-tabs-active a{color:#000;font-weight:bold}.ui-tabs .ui-tabs-nav li.ui-state-default.ui-state-hover{background:#f3f3f3 none}.ui-tabs .ui-tabs-nav li.ui-tabs-active.ui-state-hover{background:#fff none}.ui-tabs .ui-state-default a,.ui-tabs .ui-state-default a:link,.ui-tabs .ui-state-default a:visited{color:#069}.ui-tabs .ui-state-hover a,.ui-tabs .ui-state-hover a:link,.ui-tabs .ui-state-hover a:visited{color:#903}.statictabs ul{background:none repeat scroll 0 0 transparent;border:0 none;margin:0;padding:.2em .2em 0;border-bottom-right-radius:4px;border-bottom-left-radius:4px;border-top-right-radius:4px;border-top-left-radius:4px;color:#222;font-weight:bold;font-size:100%;line-height:1.3;list-style:none outside none;outline:0 none;text-decoration:none}.statictabs ul:before{content:"";display:table}.statictabs ul:after{clear:both;content:"";display:table}.statictabs li{background:none repeat scroll 0 0 #e6f0f2;border:1px solid #b9d8d9;border-bottom:0 none !important;border-top-right-radius:4px;border-top-left-radius:4px;float:left;list-style:none outside none;margin-bottom:0;margin-right:.4em;padding:0;position:relative;white-space:nowrap;top:1px;color:#555;font-weight:normal}.statictabs li.active{background-color:#fff;color:#212121;font-weight:normal;padding-bottom:1px}.statictabs li a{color:#004d99;cursor:pointer;float:left;padding:.5em 1em;text-decoration:none}.statictabs li a:hover{background-color:#edf4f5;border-top-right-radius:4px;border-top-left-radius:4px;color:#538200}.statictabs li.active a{color:#000;font-weight:bold;cursor:text;background:none repeat scroll 0 0 transparent;outline:0 none}.statictabs .tabs-container{border:1px solid #b9d8d9;background:none repeat scroll 0 0 transparent;display:block;padding:1em 1.4em;border-bottom-right-radius:4px;border-bottom-left-radius:4px;color:#222}.ui-datepicker table{width:100%;font-size:.9em;border:0;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{background:transparent none;padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker-trigger{vertical-align:middle;margin:0 3px}.ui-datepicker{-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,0.2);-moz-box-shadow:0 1px 1px 0 rgba(0,0,0,0.2);box-shadow:0 1px 1px 0 rgba(0,0,0,0.2)}.ui-widget-content{border:1px solid #aaa;background:#fff none;color:#222}.ui-widget-header{border:1px solid #aaa;background:#e6f0f2 none;color:#222;font-weight:bold}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #aaa;background:#f4f8f9 none;font-weight:normal;color:#555}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #aaa;background:#e6f0f2 none;font-weight:normal;color:#212121}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #aaa;background:#fff none;font-weight:normal;color:#212121}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee;color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec;color:#cd0a0a}.ui-autocomplete{position:absolute;cursor:default;-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,0.2);-moz-box-shadow:0 1px 1px 0 rgba(0,0,0,0.2);box-shadow:0 1px 1px 0 rgba(0,0,0,0.2)}.ui-autocomplete.ui-widget-content .ui-state-hover{border:1px solid #aaa;background:#e6f0f2 none;font-weight:normal;color:#212121}.ui-autocomplete-loading{background:#fff url("../../img/loading-small.gif") right center no-repeat}.ui-menu li{list-style:none}th{background-color:#ecede6}.item-thumbnail{max-width:none}.no-image{background-color:#fff;border:1px solid #aaa;color:#979797;display:block;font-size:86%;font-weight:bold;text-align:center;width:75px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}#bookcover .no-image{margin-right:10px;margin-bottom:10px}td.overdue{color:#c33}table{font-size:90%}th.sum{text-align:right}td.sum{background-color:#ffc;font-weight:bold}th[scope=row]{background-color:transparent;text-align:right}.required{color:#c00}.label{background-color:transparent;color:inherit;display:inline;font-weight:normal;padding:0;text-shadow:none}.blabel{background-color:#999;border-radius:3px;color:#fff;display:inline-block;font-weight:bold;padding:2px 4px;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.label-important{background-color:#b94a48}.label-warning{background-color:#f89406}.label-success{background-color:#468847}.label-info{background-color:#3a87ad}.label-inverse{background-color:#333}fieldset.rows{float:left;font-size:90%;clear:left;margin:.9em 0 0 0;padding:0;width:100%}fieldset.rows legend{font-weight:bold;font-size:130%}fieldset.rows label,fieldset.rows .label{float:left;font-weight:bold;width:9em;margin-right:1em;text-align:right}fieldset.rows label.lradio{float:none;margin:inherit;width:auto}fieldset.rows fieldset{margin:0;padding:.3em}fieldset.rows ol{padding:1em 1em 0 1em;list-style-type:none}fieldset.rows ol.lradio label{width:auto;float:none;margin-right:0}fieldset.rows ol.lradio label.lradio{float:left;width:12em;margin-right:1em}fieldset.rows li{float:left;clear:left;padding-bottom:1em;list-style-type:none;width:100%}fieldset.rows li.lradio{padding-left:8.5em;width:auto}fieldset.rows li.lradio label{float:none;width:auto;margin:0 0 0 1em}fieldset.rows .hint{display:block;margin-left:11em}fieldset.action{clear:both;float:none;border:none;margin:0;padding:1em 0 .3em 0;width:auto}fieldset.action p{margin-bottom:1em}fieldset table{font-size:100%}div.rows+div.rows{margin-top:.6em}div.rows{float:left;clear:left;margin:0 0 0 0;padding:0;width:100%}div.rows span.label{float:left;font-weight:bold;width:9em;margin-right:1em;text-align:left}div.rows ol{list-style-type:none;margin-left:0;padding:.5em 1em 0 0}div.rows li{border-bottom:1px solid #eee;float:left;clear:left;padding-bottom:.2em;padding-top:.1em;list-style-type:none;width:100%}div.rows ul li{margin-left:7.3em}div.rows ul li:first-child{float:none;clear:none;margin-left:0}div.rows ol li li{border-bottom:0}.tagweight0{font-size:12px}.tagweight1{font-size:14px}.tagweight2{font-size:16px}.tagweight3{font-size:18px}.tagweight4{font-size:20px}.tagweight5{font-size:22px}.tagweight6{font-size:24px}.tagweight7{font-size:26px}.tagweight8{font-size:28px}.tagweight9{font-size:30px}.toolbar{background-color:#eee;border:1px solid #e8e8e8;font-size:85%;padding:3px 3px 5px 5px;vertical-align:middle}.toolbar a{white-space:nowrap}.toolbar label{display:inline;font-size:100%;font-weight:bold;margin-left:.5em}.toolbar select{font-size:97%;height:auto;line-height:inherit;padding:0;margin:0;width:auto;white-space:nowrap}.toolbar .hold,.toolbar #tagsel_tag{padding-left:28px;font-size:97%;font-weight:bold}.toolbar #tagsel_form{margin-top:.5em}.toolbar li{display:inline;list-style:none}.toolbar li a{border-left:1px solid #e8e8e8}.toolbar li:first-child a{border-left:0}.toolbar ul{padding-left:0}#basket .toolbar{padding:7px 5px 9px 9px}#selections-toolbar,.selections-toolbar{background:-moz-linear-gradient(top, #b2b2b2 0, #e0e0e0 14%, #e8e8e8 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #b2b2b2), color-stop(14%, #e0e0e0), color-stop(100%, #e8e8e8));background:-webkit-linear-gradient(top, #b2b2b2 0, #e0e0e0 14%, #e8e8e8 100%);background:-o-linear-gradient(top, #b2b2b2 0, #e0e0e0 14%, #e8e8e8 100%);background:-ms-linear-gradient(top, #b2b2b2 0, #e0e0e0 14%, #e8e8e8 100%);background:linear-gradient(top, #b2b2b2 0, #e0e0e0 14%, #e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e0e0e0', endColorstr='#e8e8e8', GradientType=0);margin:0 0 1em 0;padding-top:.5em;padding-left:10px}.list-actions{display:inline}#tagsel_span input.submit,#tagsel_tag{border:0;background-color:transparent;font-size:100%;color:#0076b2;cursor:pointer;background-image:url("../images/sprite.png");background-position:1px -643px;background-repeat:no-repeat;padding-left:25px;text-decoration:none}#tagsel_tag.disabled{background-position:-1px -667px}#tagsel_span input:hover,#selections-toolbar input.hold:hover{color:#005580;text-decoration:underline}#tagsel_span input.disabled,#tagsel_span input.disabled:hover,#tagsel_span input.hold.disabled,#tagsel_span input.hold.disabled:hover,#selections-toolbar input.hold.disabled,#selections-toolbar input.hold.disabled:hover,#selections-toolbar a.disabled,#selections-toolbar a.disabled:hover,.selections-toolbar a.disabled,.selections-toolbar a.disabled:hover{color:#888;text-decoration:none;padding-left:23px}.results_summary{display:block;font-size:85%;color:#707070;padding:0 0 .5em 0}.results_summary .results_summary{font-size:100%}.results_summary.actions{margin-top:.5em}.results_summary.tagstatus{display:inline}.results_summary .label{color:#202020}.results_summary a{font-weight:normal}#views{border-bottom:1px solid #d6d6d6;margin-bottom:.5em;padding:0 2em .2em .2em;white-space:nowrap}.view{padding:.2em .2em 2px .2em}#bibliodescriptions,#isbdcontents{clear:left;margin-top:.5em}.view a,.view span{background-image:url("../images/sprite.png");background-repeat:no-repeat;font-size:87%;font-weight:normal;padding:.4em .7em 5px 26px;text-decoration:none}span#MARCview,span#ISBDview,span#Normalview,span#Fullhistory,span#Briefhistory{font-weight:bold}a#MARCview,span#MARCview{background-position:-3px -23px}a#MARCviewPop,span#MARCviewPop{background-position:-3px -23px}a#ISBDview,span#ISBDview{background-position:-3px -52px}a#Normalview,span#Normalview{background-position:-1px 6px}.view a{background-color:#f3f3f3;border-left:1px solid #c9c9c9}#bookcover{float:left;margin:0;padding:0}#bookcover .no-image{margin-right:10px;margin-bottom:10px}#bookcover img{margin:0 1em 1em 0}.results-pagination{position:absolute;top:32px;left:-1px;width:100%;height:auto;border:1px solid #d0d0d0;display:none;background-color:#f3f3f3;padding-bottom:10px;z-index:100}.back{float:right}.back input{background:none !important;color:#999 !important}.pagination_list ul{padding-top:40px;padding-left:0}.pagination_list li{list-style:none;float:bottom;padding:4px;color:#999}.pagination_list li.highlight{background-color:#f3f3f3;border-top:1px solid #ddd;border-bottom:1px solid #ddd}.pagination_list li a{padding-left:0}.pagination_list .li_pag_index{color:#999;float:left;font-size:15px;font-weight:bold;padding-right:10px;text-align:right;width:13px}.nav_results{background-color:#f3f3f3;border:1px solid #d0d0d0;font-size:95%;font-weight:bold;margin-top:.5em;position:relative}.nav_results .l_Results a{background:#e1e1e1 url("../images/sprite.png") no-repeat 0 -504px;color:#069;display:block;padding:8px 28px;text-decoration:none}.nav_results .l_Results:hover{background-color:#d9d9d9}.pg_menu{margin:0;border-top:1px solid #d0d0d0;white-space:nowrap}.pg_menu li{color:#b2b2b2;display:inline;list-style:none;margin:0}.pg_menu li.back_results a{border-left:1px solid #d0d0d0;border-right:1px solid #d0d0d0}.pg_menu li a,.pg_menu li span{background-color:#f3f3f3;display:block;float:left;padding:.4em .5em;text-decoration:none;font-weight:normal;text-align:center}.pg_menu li span{color:#b2b2b2}#listResults li{background-color:#999;color:#c5c5c5;font-weight:normal;display:block;margin-right:1px;font-size:80%;padding:0;text-align:center;min-width:18px}#listResults li:hover{background-color:#069}#listResults li a{color:#fff;font-weight:normal}.nav_pages .close_pagination{padding-right:10px;position:absolute;right:3px;top:-25px}.nav_pages .close_pagination a{text-decoration:none !important}.nav_pages ul{padding-top:10px}.nav_pages li{list-style:none;float:left;padding:4px;color:#999}.nav_pages li a{text-decoration:none !important}.nav_pages li a:hover{text-decoration:underline}.nav_pages li ul{float:left}#action{margin:.5em 0 0 0;background-color:#f3f3f3;border:1px solid #e8e8e8;padding-bottom:3px}#action li{list-style:none;margin:.2em;padding:.3em 0}#action a{font-weight:bold;text-decoration:none}#export li,#moresearches_menu li{padding:0;margin:0}#export li a,#moresearches_menu li a{font-weight:normal}#export li a.menu-inactive,#moresearches_menu li a.menu-inactive{font-weight:bold}#format,#furthersearches{padding-left:35px}.highlight_controls{float:left}a.addtocart,a.addtoshelf,a.brief,a.deleteshelf,a.deleteshelf.disabled,a.detail,a.download,a.editshelf,a.empty,a.hide,a.highlight_toggle,a.hold,a.hold.disabled,a.incart,a.new,a.print-small,a.print-large,a.removeitems,a.removeitems.disabled,a.reserve,a.send,a.tag_add,a.removefromlist,input.hold,input.hold.disabled,input.editshelf,.newshelf,.newshelf.disabled,.deleteshelf{background-image:url("../images/sprite.png");background-repeat:no-repeat}a.addtocart{background-position:-5px -265px;padding-left:35px}a.addtoshelf{background-position:-5px -225px;padding-left:35px}a.brief{background-position:-2px -868px;text-decoration:none;padding-left:27px}a.cartRemove{color:#c33;font-size:90%;margin:0;padding:0}a.detail{background-position:-2px -898px;text-decoration:none;padding-left:27px}a.download{background-position:-5px -348px;padding-left:20px;text-decoration:none}a.editshelf{background-position:2px -348px;padding-left:26px;text-decoration:none}a.empty{background-position:2px -598px;text-decoration:none;padding-left:30px}a.hide{background-position:-3px -814px;text-decoration:none;padding-left:26px}a.highlight_toggle{background-position:-5px -841px;display:none;padding-left:35px}a.hold,input.hold{background-position:-2px -453px;text-decoration:none;padding-left:23px}a.hold.disabled,input.hold.disabled{background-position:-5px -621px}a.incart{background-position:-5px -265px;color:#666;padding-left:35px}a.new{background-image:url("../images/sprite.png");background-position:-4px -922px;padding-left:23px;text-decoration:none}a.print-small{background-position:0 -423px;text-decoration:none;padding-left:30px}a.print-large{background-position:-5px -186px;text-decoration:none;padding-left:35px}a.removeitems,a.deleteshelf{background-position:2px -690px;text-decoration:none;padding-left:25px}a.removeitems.disabled,a.deleteshelf.disabled{background-position:2px -712px}a.reserve{background-position:-6px -144px;padding-left:35px}a.send{background-position:2px -386px;text-decoration:none;padding-left:28px}a.tag_add{background-position:3px -1111px;padding-left:27px;text-decoration:none}input.hold{background-color:transparent;border:0;color:#0076b2;font-weight:bold}input.editshelf{background-color:transparent;background-position:2px -736px;border:0;color:#069;cursor:pointer;filter:none;font-size:100%;padding-left:29px;text-decoration:none}.newshelf{background-position:2px -764px;border:0;color:#069;cursor:pointer;filter:none;font-size:100%;padding-left:28px;text-decoration:none}.newshelf.disabled{background-position:-4px -791px}.deleteshelf{background-color:transparent;background-position:2px -690px;border:0;color:#069;cursor:pointer;filter:none;font-size:100%;padding-left:25px;text-decoration:none}.links a{font-weight:bold}.deleteshelf:hover{color:#903}.editshelf:active,.deleteshelf:active{border:0}#tagslist li{display:inline}#login4tags{background-image:url("../images/sprite.png");background-position:-6px -1130px;background-repeat:no-repeat;padding-left:20px;text-decoration:none}.tag_results_input{margin-left:1em;padding:.3em;font-size:12px}.tag_results_input input[type="text"]{font-size:inherit;margin:0;padding:0}.tag_results_input label{display:inline}.tagsinput input[type="text"]{font-size:inherit;margin:0;padding:0}.tagsinput label{display:inline}.branch-info-tooltip{display:none}.ui-tooltip-content p{margin:.3em 0}#social_networks a{background:transparent url("../images/social-sprite.png") no-repeat;display:block;height:20px !important;width:20px;text-indent:-999em}#social_networks span{color:#274d7f;display:block;float:left;font-size:85%;font-weight:bold;line-height:2em;margin:.5em 0 .5em .5em !important}#social_networks div{float:left !important;margin:.5em 0 .5em .2em !important}#social_networks #facebook{background-position:-7px -35px}#social_networks #twitter{background-position:-7px -5px}#social_networks #linkedin{background-position:-7px -95px}#social_networks #delicious{background-position:-7px -66px}#social_networks #email{background-position:-7px -126px}#marc td,#marc th{background-color:transparent;border:0;padding:3px 5px;text-align:left}#marc td:first-child{text-indent:2em}#marc p{padding-bottom:.6em}#marc p .label{font-weight:bold}#marc ul{padding-bottom:.6em}#marc .results_summary{clear:left}#marc .results_summary ul{display:inline;float:none;clear:none;margin:0;padding:0;list-style:none}#marc .results_summary li{display:inline}#items,#items td #items th{border:1px solid #eee;font-size:90%}#plainmarc table{border:0;margin:.7em 0 0 0;font-family:monospace;font-size:95%}#plainmarc th{background-color:#fff;border:0;white-space:nowrap;text-align:left;vertical-align:top;padding:2px}#plainmarc td{border:0;padding:2px;vertical-align:top}#renewcontrols{float:right;font-size:66%}#renewcontrols a{background-repeat:no-repeat;text-decoration:none;padding:.1em .4em;padding-left:18px}#renewselected_link{background-image:url("../images/sprite.png");background-position:-5px -986px;background-repeat:no-repeat}#renewall_link{background-image:url("../images/sprite.png");background-position:-8px -967px;background-repeat:no-repeat}.authref{text-indent:2em}.authref .label{font-style:italic}.authstanza{margin-top:1em}.authstanzaheading{font-weight:bold}.authorizedheading{font-weight:bold}.authstanza li{margin-left:.5em}.authres_notes,.authres_seealso,.authres_otherscript{padding-top:.5em}.authres_notes{font-style:italic}#didyoumean{background-color:#eee;border:1px solid #e8e8e8;margin:0 0 .5em;text-align:left;padding:.5em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.suggestionlabel{font-weight:bold}.searchsuggestion{padding:.2em .5em;white-space:nowrap;display:inline-block}.authlink{padding-left:.25em}#hierarchies a{font-weight:normal;text-decoration:underline;color:#069}#hierarchies a:hover{color:#903}#top-pages{margin:0 0 .5em}.dropdown-menu>li>a{font-size:90%}a.listmenulink:link,a.listmenulink:visited{color:#0076b2;font-weight:bold}a.listmenulink:hover,a.listmenulink:active{color:#fff;font-weight:bold}#cartDetails,#cartUpdate,#holdDetails,#listsDetails{background-color:#fff;border:1px solid rgba(0,0,0,0.2);border-radius:6px 6px 6px 6px;box-shadow:0 5px 10px rgba(0,0,0,0.2);color:#000;display:none;font-size:90%;margin:0;padding:8px 20px;text-align:center;width:180px;z-index:2}#cartmenulink{white-space:nowrap}#search-facets,#menu{border:1px solid #d2d2cf;-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px}#search-facets ul,#menu ul{margin:0;padding:.3em}#search-facets form,#menu form{margin:0}#search-facets h4,#menu h4{font-size:90%;margin:0 0 .6em 0;text-align:center}#search-facets h4 a,#menu h4 a{background-color:#f2f2ef;border-radius:8px 8px 0 0;border-bottom:1px solid #d8d8d8;display:block;font-weight:bold;padding:.7em .2em;text-decoration:none}#search-facets li,#menu li{font-size:90%;font-weight:bold;list-style-type:none}#search-facets li li,#menu li li{font-weight:normal;font-size:95%;line-height:125%;margin-bottom:2px;padding:.1em .2em}#search-facets li.showmore a,#menu li.showmore a{font-weight:bold;text-indent:1em}#search-facets a,#menu a{font-weight:normal;text-decoration:underline}#search-facets .facet-count,#menu .facet-count{display:inline-block}#menu{font-size:94%}#menu li{list-style-type:none}#menu li a{background:#eee;text-decoration:none;display:block;border:1px solid #d8d8d8;border-radius:5px 0 0 5px;border-bottom-color:#999;font-size:111%;padding:.4em .6em;margin:.4em 0;margin-right:-1px}#menu li a:hover{background:#eaeef5}#menu li.active a{background-color:#fff;background-image:none;border-right-width:0;font-weight:bold}#menu li.active a:hover{background-color:#fff}#menu h4{display:none}#addto{max-width:10em}.addto a.addtocart{background-image:url("../images/sprite.png");background-position:-5px -266px;background-repeat:no-repeat;text-decoration:none;padding-left:33px}.searchresults p{margin:0;padding:0 0 .6em 0}.searchresults p.details{color:#979797}.searchresults a.highlight_toggle{background-image:url("../images/sprite.png");background-position:-11px -841px;background-repeat:no-repeat;display:none;font-weight:normal;padding:0 10px 0 21px}.searchresults .commentline{background-color:#ffc;background-color:rgba(255,255,204,0.4);border:1px solid #ccc;display:inline-block;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,0.2);-moz-box-shadow:0 1px 1px 0 rgba(0,0,0,0.2);box-shadow:0 1px 1px 0 rgba(0,0,0,0.2);margin:.3em;padding:.4em}.searchresults .commentline.yours{background-color:#effed5;background-color:rgba(239,254,213,0.4)}.commentline .avatar{float:right;padding-left:.5em}.term{color:#900;background-color:#ffc}.shelvingloc{display:block;font-style:italic}#CheckAll,#CheckNone,.CheckAll,.CheckNone{font-weight:normal;margin:0 .5em;text-decoration:underline}span.sep{color:#888;padding:0 .2em 0 .5em;text-shadow:1px 1px 0 #fff}.pages span:first-child,.pages a:first-child{border-width:1px 1px 1px 1px;border-bottom-left-radius:3px;border-top-left-radius:3px}.pages span:last-child,.pages a:last-child{border-width:1px 1px 1px 0;border-bottom-right-radius:3px;border-top-right-radius:3px}.pages .inactive,.pages .currentPage,.pages a{-moz-border-bottom-colors:none;-moz-border-left-colors:none;-moz-border-right-colors:none;-moz-border-top-colors:none;background-color:#fff;border-color:#ddd;border-image:none;border-style:solid;border-width:1px 1px 1px 0;float:left;font-size:11.9px;line-height:20px;padding:4px 12px;text-decoration:none}.pages .inactive{background-color:#f5f5f5}.pages a[rel='last']{border-bottom-right-radius:3px;border-top-right-radius:3px}.hold-message{background-color:#fff0b1;display:inline-block;margin:.5em;padding:.2em .5em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.reserve_date,.expiration_date{white-space:nowrap}.close{color:#08c;position:inherit;top:auto;right:auto;filter:none;float:none;font-size:inherit;font-weight:normal;opacity:inherit;text-shadow:none}.close:hover{color:#538200;filter:inherit;font-size:inherit;opacity:inherit}.alert .closebtn{position:relative;top:-2px;right:-21px;line-height:20px}.modal-header .closebtn{margin-top:2px}.closebtn{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.closebtn:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.closebtn{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn-group label,.btn-group select{font-size:13px}.span2 select{width:100%}.popup .main{font-size:90%;padding:0 1em}.popup legend{line-height:1.5em;margin-bottom:.5em}.item-status{display:block;font-size:95%;margin-bottom:.5em}.available{color:#060}.waiting,.intransit,.notforloan,.checkedout,.lost,.notonhold{display:block}.notforloan{color:#900}.lost{color:#666}.suggestion{background-color:#eeeeeb;border:1px solid #ddded3;margin:1em auto;padding:.5em;width:35%;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.librarypulldown .transl1{width:auto}.nolibrarypulldown{width:68%}.nolibrarypulldown .transl1{width:87%}#opac-main-search select{width:auto;max-width:12em}#logo{background:transparent url("../images/koha-logo-navbar.png") no-repeat scroll 0;border:0;float:left !important;margin:0;padding:0;width:100px}#logo a{border:0;cursor:pointer;display:block;height:0 !important;margin:0;overflow:hidden;padding:40px 0 0;text-decoration:none;width:100px}#user-menu-trigger{display:none}#user-menu-trigger .icon-user{background:transparent url("../lib/bootstrap/img/glyphicons-halflings-white.png") no-repeat;background-position:-168px 0;background-repeat:no-repeat;height:14px;line-height:14px;margin:12px 0 0;vertical-align:text-top;width:14px}#user-menu-trigger .caret{border-bottom-color:#999;border-top-color:#999;margin-top:18px}.floating{-webkit-box-shadow:0 3px 2px 0 rgba(0,0,0,0.4);box-shadow:0 3px 2px 0 rgba(0,0,0,0.4);margin-top:0}.tdlabel{font-weight:bold;display:none}td img{max-width:none}#ulactioncontainer{min-width:16em}.notesrow label{font-weight:bold}.notesrow span{display:block}.thumbnail-shelfbrowser span{margin:0 auto}.dropdown-menu>li>a.menu-inactive:hover{background:#fff none;color:#000}.table .sorting_asc{padding-right:19px;background:url("../images/asc.gif") no-repeat scroll right center #ecede6}.table .sorting_desc{padding-right:19px;background:url("../images/desc.gif") no-repeat scroll right center #ecede6}.table .sorting{padding-right:19px;background:url("../images/ascdesc.gif") no-repeat scroll right center #ecede6}.table .nosort,.table .nosort.sorting_asc,.table .nosort.sorting_desc,.table .nosort.sorting{padding-right:19px;background:#ecede6 none}.table th,.table td{line-height:135%}.tags ul{display:inline;list-style:none;margin-left:0}.tags ul li{display:inline}.coverimages{float:right}#i18nMenu{margin-left:1em}#i18nMenu li{font-size:85%}#i18nMenu li li{font-size:100%}#i18nMenu li li>a{font-size:100%}#i18nMenu li li>a:hover{color:#fff}#i18nMenu li a{color:#0076b2}#i18nMenu .dropdown-menu li p{clear:both;display:block;font-weight:normal;line-height:20px;padding:3px 20px;white-space:nowrap}#subjectsList label,#authorSearch label{display:inline;vertical-align:middle}#subjectsList ul,#authorSearch ul{border-bottom:1px solid #eee;list-style-type:none;margin:0;padding:.6em 0}#subjectsList li,#authorSearch li{list-style-type:none;margin:0;padding:0}#overdrive-results{font-weight:bold;padding-left:1em}.throbber{vertical-align:middle}#overdrive-results-list .star-rating-control{display:block;overflow:auto}#shelfbrowser table{margin:0}#shelfbrowser table,#shelfbrowser td,#shelfbrowser th{border:0;font-size:90%;text-align:center}#shelfbrowser td,#shelfbrowser th{padding:3px 5px;width:20%}#shelfbrowser a{display:block;font-size:110%;font-weight:bold;text-decoration:none}#shelfbrowser #browser_next,#shelfbrowser #browser_previous{background-image:url("../images/sprite.png");background-repeat:no-repeat;width:16px}#shelfbrowser #browser_next a,#shelfbrowser #browser_previous a{cursor:pointer;display:block;height:0 !important;margin:0;overflow:hidden;padding:50px 0 0;text-decoration:none;width:16px}#shelfbrowser #browser_previous{background-position:-9px -1007px}#shelfbrowser #browser_next{background-position:-9px -1057px}#holds{margin:0 auto;max-width:800px}.holdrow{clear:both;padding:0 1em 1em 1em;border-bottom:1px solid #ccc;margin-bottom:.5em}.holdrow fieldset{border:0;margin:0;float:none}.holdrow fieldset .label{font-size:14px}.holdrow label{display:inline}.hold-options{clear:both}.toggle-hold-options{background-color:#eee;clear:both;display:block;font-weight:bold;margin:1em 0;padding:.5em}.copiesrow{clear:both}#idreambooksreadometer{float:right}a.idreambooksrating{font-size:30px;color:#29ade4;padding-left:85px;line-height:30px;text-decoration:none}.idreambookslegend{font-size:small}a.reviewlink,a.reviewlink:visited{text-decoration:none;color:#000;font-weight:normal}.idreambookssummary a{color:#707070;text-decoration:none}.idreambookssummary img,.idbresult img{vertical-align:middle}.idbresult{color:#29ade4;text-align:center;margin:.5em;padding:.5em}.idbresult a,.idbresult a:visited{text-decoration:none;color:#29ade4}.idbresult img{padding-right:6px}.js-show{display:none}.modal-nojs .modal-header,.modal-nojs .modal-footer{display:none}.contents{width:75%}.contentblock{font-size:95%;line-height:135%;position:relative;margin-left:2em}.contents .t:first-child:before{content:"→ "}.contents .t:before{content:"\A → ";white-space:pre}.contents .t{font-weight:bold;display:inline}.contents .r{display:inline}.m880{display:block;text-align:right;float:right;width:50%;padding-left:20px}@media only screen and (min-width:0) and (max-width:304px){#oh:after{content:"(min-width: 0px) and (max-width: 304px)"}input,select,textarea{width:auto;max-width:11em}}@media only screen and (min-width:0) and (max-width:390px){#oh:after{content:"(min-width: 0px) and (max-width: 390px)"}.ui-tabs .ui-tabs-nav li a,.statictabs li a{padding:.1em .5em}#views{border:0;padding:0;margin:0}.view{padding:0}.view a,.view span{border:1px solid #c9c9c9;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;font-size:80%;padding:.3em .4em 4px 26px}.input-fluid{width:90%}}@media only screen and (min-width:305px) and (max-width:341px){#oh:after{content:"(min-width: 305px) and (max-width: 341px)"}}@media only screen and (min-width:342px) and (max-width:479px){#oh:after{content:"(min-width: 342px) and (max-width: 479px)"}.input-fluid{width:75%}}@media (max-width:979px){.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;margin-left:0;margin-right:0}}@media only screen and (max-width:608px){fieldset.rows label{display:block;float:none;text-align:left}fieldset.rows li{padding-bottom:.5em}fieldset.rows ol{margin-left:0}fieldset.rows .hint{margin-left:0}body{padding:0}.tdlabel{display:inline}.navbar-fixed-top,.navbar-static-top{margin:0}.navbar-inner{padding:0}.checkall,.clearall,.highlight_controls,#selections-toolbar,.selectcol,.list-actions,#remove-selected{display:none}.table td.bibliocol{padding-left:1.3em}.actions{display:block}.actions a,.actions #login4tags{background-color:#f2f2ef;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;font-weight:bold;display:block;font-size:120%;margin:2px 0}.actions .label{display:block;font-weight:bold}.actions #login4tags{margin-right:1em}#opac-main-search button,#opac-main-search input,#opac-main-search select,#opac-main-search .librarypulldown .transl1,#opac-main-search .input-append{display:block;width:97%;max-width:100%;margin:.5em 0;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}#opac-main-search .input-append{margin:0;width:100%}#opac-main-search .librarypulldown .transl1{width:94.5%}#toolbar .resort{font-size:14px;max-width:100%;margin:.5em 0;padding:4px 6px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.mastheadsearch{margin:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.main{margin:.5em 0;padding:15px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.breadcrumb{margin:10px 0}#moresearches{text-align:center}#searchsubmit{font-weight:bold}.ui-tabs-panel .item-thumbnail,.tabs-container .item-thumbnail,#topissues .item-thumbnail,#usertags .item-thumbnail,#usersuggestions .item-thumbnail{margin:.5em 0 0 .5em}.ui-tabs-panel .table-bordered,.tabs-container .table-bordered,#topissues .table-bordered,#usertags .table-bordered,#usersuggestions .table-bordered{border:none}.ui-tabs-panel .table th,.tabs-container .table th,#topissues .table th,#usertags .table th,#usersuggestions .table th,.ui-tabs-panel .table thead,.tabs-container .table thead,#topissues .table thead,#usertags .table thead,#usersuggestions .table thead{display:none}.ui-tabs-panel .table td,.tabs-container .table td,#topissues .table td,#usertags .table td,#usersuggestions .table td{border-right:1px solid #ddd;border-left:1px solid #ddd;border-top:0;display:block;padding:.2em}.ui-tabs-panel .table p,.tabs-container .table p,#topissues .table p,#usertags .table p,#usersuggestions .table p{margin-bottom:2px}.ui-tabs-panel tr,.tabs-container tr,#topissues tr,#usertags tr,#usersuggestions tr{display:block;margin-bottom:.6em}.ui-tabs-panel tr td:first-child,.tabs-container tr td:first-child,#topissues tr td:first-child,#usertags tr td:first-child,#usersuggestions tr td:first-child{border-top:1px solid #ddd;border-radius:5px 5px 0 0}.ui-tabs-panel tr td:last-child,.tabs-container tr td:last-child,#topissues tr td:last-child,#usertags tr td:last-child,#usersuggestions tr td:last-child{border-radius:0 0 5px 5px;border-bottom:2px solid #cacaca}.no-image{display:none}}@media only screen and (max-width:700px){#opac-main-search label{display:none}#logo{background:transparent url("../lib/bootstrap/img/glyphicons-halflings-white.png") no-repeat;background-position:0 -24px;margin:14px 14px 0 14px;width:14px}#logo a{padding:14px 0 0;width:14px}#user-menu-trigger{display:inline;margin-right:12px}#members{display:none;clear:both}#members li{padding-right:20px;text-align:right;border-bottom:1px solid #555}#members li:first-child{border-top:1px solid #555}#members li:last-child{border-bottom:none}#members .nav{float:none}#members .nav.pull-right{float:none}#members .nav>li{float:none}#members .divider-vertical{border:0;height:0;margin:0}}@media only screen and (min-width:480px) and (max-width:608px){#oh:after{content:" Between 480 pixels and 608 pixels. "}.input-fluid{width:75%}}@media only screen and (min-width:608px) and (max-width:767px){#oh:after{content:" Between 608 pixels and 767 pixels. "}.main{padding:.8em 20px}.breadcrumb{margin:10px 0}.navbar-static-bottom{margin-left:-20px;margin-right:-20px}.row-fluid input.span6{width:48.9362%}}@media only screen and (max-width:767px){a.title{font-size:120%}#userresults{margin:0 -20px}.breadcrumb,#top-pages,.menu-collapse{display:none}#search-facets,#menu{margin-bottom:.5em}#search-facets h4,#menu h4{display:block;margin:0;padding:0}#search-facets h4 a,#menu h4 a{-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px;border-bottom:0;font-weight:normal;padding:.7em .2em}#search-facets ul,#menu ul{padding:0}#menu li a{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;border:0;display:block;font-size:120%;text-decoration:none;border-bottom:1px solid #d8d8d8;margin:0}#menu li.active a{border-top:1px solid #d8d8d8;border-right-width:1px}#menu li:last-child a{-webkit-border-radius:0 0 7px 7px;-moz-border-radius:0 0 7px 7px;border-radius:0 0 7px 7px}#search-facets li{padding:.4em}#search-facets h5{margin:.2em}#menu h4 a.menu-open,#search-facets h4 a.menu-open{-webkit-border-radius:7px 7px 0 0;-moz-border-radius:7px 7px 0 0;border-radius:7px 7px 0 0;border-bottom:1px solid #d8d8d8}}@media only screen and (max-width:800px){.cartlabel,.listslabel{display:none}.navbar .divider-vertical{margin:0 2px}.navbar #members .divider-vertical{margin:0 9px}}@media only screen and (min-width:768px){.main{margin-left:20px;margin-right:20px}#menu{border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;border-right:1px solid #d8d8d8}#menu h4{display:none}#menu ul{padding:1em 0 1em 0}}@media only screen and (min-width:768px) and (max-width:984px){#oh:after{content:" Between 768 and 984 pixels. "}.librarypulldown .transl1{width:38%}}@media only screen and (min-width:984px){#oh:after{content:" Above 984 pixels. "}.librarypulldown .transl1{width:53%}}@media only screen and (max-width:1040px){.pg_menu li a{float:none;text-align:left}.pg_menu li.back_results a{border:1px solid #d0d0d0;border-width:1px 0 1px 0}#ulactioncontainer{min-width:0}}#dc_fieldset{border:1px solid #dddddd; border-width:1px;padding:5px;border-radius:10px}.label_dc{display:inline;padding:0px;margin:0px;cursor: pointer}#dc_fieldset div{display:none} diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/includes/opac-detail-sidebar.inc b/koha-tmpl/opac-tmpl/bootstrap/en/includes/opac-detail-sidebar.inc index a4ef40e..b9972e7 100644 --- a/koha-tmpl/opac-tmpl/bootstrap/en/includes/opac-detail-sidebar.inc +++ b/koha-tmpl/opac-tmpl/bootstrap/en/includes/opac-detail-sidebar.inc @@ -38,11 +38,13 @@ <a id="format" class="dropdown-toggle" data-toggle="dropdown" href="#">Save record <b class="caret"></b></a> <ul class="dropdown-menu pull-right" role="menu" aria-labelledby="format"> [% FOREACH option IN export_options %] + [% IF option == 'dc' %] + <li><a role="menuitem" href="#" data-toggle="modal" data-target="#exportModal_">Dublin Core</a></li> + [% ELSE %] <li> <a role="menuitem" href="/cgi-bin/koha/opac-export.pl?op=export&bib=[% biblionumber %]&format=[% option %]"> [% SWITCH option %] [% CASE 'bibtex' %]BIBTEX - [% CASE 'dc' %]Dublin Core (XML) [% CASE 'endnote' %]EndNote [% CASE 'marcxml' %]MARCXML [% CASE 'marc8' %]MARC (non-Unicode/MARC-8) @@ -54,6 +56,7 @@ [% END %] </a> </li> + [% END %] [% END %] </ul> </div> diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-detail.tt b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-detail.tt index d79a51c..c452ce1 100644 --- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-detail.tt +++ b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-detail.tt @@ -1153,6 +1153,84 @@ </div> <!-- / .container-fluid --> </div> <!-- / .main --> +<!-- Dublin Core Modal Form --> +<div class="modal fade" id="exportModal_" tabindex="-1" role="dialog" aria-labelledby="exportModalLabel" aria-hidden="true"> + <div class="modal-header"> + <button type="button" class="closebtn" data-dismiss="modal" aria-hidden="true">×</button> + <h3 class="modal-title" id="exportModalLabel">Exporting to Dublin Core...</h3> + </div> + <form method="get" action="/cgi-bin/koha/opac-export.pl"> + <div class="modal-body"> + <fieldset id="dc_fieldset"> + <input id="input-simple" type="radio" name="recommendation" value="simple-dc-rdf"> + <label class="label_dc" for="input-simple">Simple DC-RDF</label> + <br> + <input id="input-rdf" type="radio" name="recommendation" value="dc-rdf" checked> + <label class="label_dc" for="input-rdf">DC-RDF (Recommended)</label> + <div id="dc-rdf"> + <br><b>Output options for RDF</b> + <br>DC-RDF is downloadable in "rdfxml" by default (this is according with the + <br>recommendation), but you can download the file in other formats: + <br> + <input id="rdfxml" class="rdfoptions" type="radio" name="formats" value="rdfxml" checked> + <label class="label_dc" for="rdfxml">rdfxml</label> + <input id="rdfjson" class="rdfoptions" type="radio" name="formats" value="rdfjson"> + <label class="label_dc" for="rdfjson">rdfjson</label> + <input id="ntriples" class="rdfoptions" type="radio" name="formats" value="ntriples"> + <label class="label_dc" for="ntriples">ntriples</label> + <input id="nquads" class="rdfoptions" type="radio" name="formats" value="nquads"> + <label class="label_dc" for="nquads">nquads</label> + <input id="ntriples_canonical" class="rdfoptions" type="radio" name="formats" value="ntriples-canonical"> + <label class="label_dc" for="ntriples_canonical">ntriples-canonical</label> + <input id="turtle" class="rdfoptions" type="radio" name="formats" value="turtle"> + <label class="label_dc" for="turtle">turtle</label> + </div> + <br> + <input id="input-xml" type="radio" name="recommendation" value="dc-xml"> + <label class="label_dc" for="input-xml">DC-XML</label> + <div id="dc-xml"> + <p><b>Output options for DC-XML</b> + <br> + <b>Dublin Core level</b></p> + <p><input id="simple_dc" class="xmloptions" type="radio" name="qualifier" value="0" checked disabled> + <label class="label_dc" for="simple_dc">Simple Dublin Core</label> + <input id="qualified_dc" class="xmloptions" type="radio" name="qualifier" value="1" disabled> + <label class="label_dc" for="qualified_dc">Qualified Dublin Core</label></p> + <b>Other data (Optional)</b> + <br> + <input id="root_checked" class="xmloptions" type="checkbox" value="root"> + <label class="label_dc" for="root_checked">Root element: </label> + <input id="root_value" class="xmloptions" type="text" name="root_element" value="metadata" disabled> + <br>The xsischemaLocation should be filled like: + <br>http://example.org/myapp/ http://example.org/myapp/schema.xsd + <br> + <input id="schema_checked" class="xmloptions" type="checkbox" value="schema" disabled> + <label class="label_dc" for="schema_checked">xsischemaLocation: </label> + <input id="schema_value" class="xmloptions" type="url" name="xsischemalocation" disabled><br> + </div> + <br> + <input id="input-oai" type="radio" name="recommendation" value="oai-dc"> + <label class="label_dc" for="input-oai">OAI-DC</label> + <br> + <input id="input-srw" type="radio" name="recommendation" value="srw_dc"> + <label class="label_dc" for="input-srw">SRW-DC</label> + <br> + <div> + <br>Learn more about DCMI Specifications at: <a href="http://dublincore.org/specifications/">http://dublincore.org/specifications/</a> + <br> + </div> + </fieldset> + </div> + <div class="modal-footer"> + <button type="submit" class="btn">Export</button> + <button class="btn btn-link" data-dismiss="modal" aria-hidden="true">Cancel</button> + </div> + <input type="hidden" name="op" value="export" /> + <input type="hidden" name="format" value="dc" /> + <input type="hidden" name="bib" value="[% biblionumber %]" /> + </form> +</div> + [% INCLUDE 'opac-bottom.inc' %] [%# End of template %] @@ -1854,4 +1932,88 @@ //]]> </script> [% END # / IF OPACPopupAuthorsSearch %] +[% PROCESS jqueryDC %] [% END %] + +[% BLOCK jqueryDC %] + <script type="text/javascript"> + //<![CDATA[ + //JQuery for Dublin Core Modal + $(document).ready(function(){ + $("#input-simple").click(function(){ + $(".rdfoptions").removeAttr("disabled"); + $(".xmloptions").attr("disabled","disabled"); + $("#dc-rdf").toggle(true); + $("#dc-xml").hide(); + }); + }); + + $(document).ready(function(){ + $("#input-rdf").click(function(){ + $(".rdfoptions").removeAttr("disabled"); + $(".xmloptions").attr("disabled","disabled"); + $("#dc-rdf").toggle(true); + $("#dc-xml").hide(); + }); + }); + + $(document).ready(function(){ + $("#input-xml").click(function(){ + $(".xmloptions").removeAttr("disabled"); + $(".rdfoptions").attr("disabled","disabled"); + if($("#root_checked").is(':checked')){ + $("#root_value").removeAttr("disabled"); + } else { + $("#root_value").attr("disabled","disabled"); + } + if($("#schema_checked").is(':checked')){ + $("#schema_value").removeAttr("disabled"); + } else { + $("#schema_value").attr("disabled","disabled"); + } + $("#dc-xml").toggle(); + $("#dc-rdf").hide(); + }); + }); + + $(document).ready(function(){ + $("#root_checked").click(function(){ + if($("#root_checked").is(':checked')){ + $("#root_value").removeAttr("disabled"); + } else { + $("#root_value").attr("disabled","disabled"); + } + }); + }); + + $(document).ready(function(){ + $("#schema_checked").click(function(){ + if($("#schema_checked").is(':checked')){ + $("#schema_value").removeAttr("disabled"); + } else { + $("#schema_value").attr("disabled","disabled"); + } + }); + }); + + $(document).ready(function(){ + $("#input-oai").click(function(){ + $(".rdfoptions").attr("disabled","disabled"); + $(".xmloptions").attr("disabled","disabled"); + $("#dc-rdf").hide(); + $("#dc-xml").hide(); + }); + }); + + $(document).ready(function(){ + $("#input-srw").click(function(){ + $(".rdfoptions").attr("disabled","disabled"); + $(".xmloptions").attr("disabled","disabled"); + $("#dc-rdf").hide(); + $("#dc-xml").hide(); + }); + }); + //]]> + </script> + +[% END %] [%# End of jqueryDC %] diff --git a/koha-tmpl/opac-tmpl/bootstrap/js/script.js b/koha-tmpl/opac-tmpl/bootstrap/js/script.js index de8401b..a0dbbd2 100644 --- a/koha-tmpl/opac-tmpl/bootstrap/js/script.js +++ b/koha-tmpl/opac-tmpl/bootstrap/js/script.js @@ -63,4 +63,4 @@ $(document).ready(function(){ $("#members").removeAttr("style"); } }); -}); \ No newline at end of file +}); diff --git a/opac/opac-export.pl b/opac/opac-export.pl index bf040db..c7bfe61 100755 --- a/opac/opac-export.pl +++ b/opac/opac-export.pl @@ -34,6 +34,14 @@ my $format=$query->param("format")||'utf8'; my $biblionumber = $query->param("bib")||0; $biblionumber = int($biblionumber); my ($marc, $error)= ('',''); +my $recommendation = $query->param("recommendation"); +my $formats = $query->param("formats"); +my $qualifier = $query->param("qualifier"); +my $root_element = $query->param("root_element"); +my $xsischemalocation = $query->param("xsischemalocation"); +my $resource_url = $query->url(-base => 1) . + '/cgi-bin/koha/opac-detail.pl?biblionumber=' . + $biblionumber; $marc = GetMarcBiblio($biblionumber, 1) if $biblionumber; if(!$marc) { @@ -61,8 +69,32 @@ elsif ($format =~ /bibtex/) { $format = 'bibtex'; } elsif ($format =~ /dc/) { - ($error,$marc) = marc2dcxml($marc,1); - $format = "dublin-core.xml"; + SWITCH: + for ($recommendation) { + if (/^simple-dc-rdf/) { + ($error,$marc) = marc2dcxml($marc, $recommendation, 0, + 1, undef, undef, $resource_url , $formats); + $format = "dublin-core." . $formats; + last SWITCH; } + if (/^dc-rdf/) { + ($error,$marc) = marc2dcxml($marc, $recommendation, 1, + 1, undef, undef, $resource_url, $formats); + $format = "dublin-core." . $formats; + last SWITCH; } + if (/^dc-xml/) { + ($error,$marc) = marc2dcxml($marc, $recommendation, $qualifier, + 1, $root_element, $xsischemalocation, undef, undef); + $format = "dublin-core.xml"; + last SWITCH; } + if (/^oai-dc/) { + ($error,$marc) = marc2dcxml($marc, $recommendation); + $format = "dublin-core.xml"; + last SWITCH; } + if (/^srw_dc/) { + ($error,$marc) = marc2dcxml($marc, $recommendation); + $format = "dublin-core.xml"; + last SWITCH; } + } } elsif ($format =~ /marc8/) { ($error,$marc) = changeEncoding($marc,"MARC","MARC21","MARC-8"); diff --git a/t/db_dependent/Record.t b/t/db_dependent/Record.t index e8d6094..d372c4c 100755 --- a/t/db_dependent/Record.t +++ b/t/db_dependent/Record.t @@ -46,29 +46,22 @@ is ($marcxml, $testxml, "testing marc2xml"); my $marcconvert=marcxml2marc($marcxml); is ($marcconvert->as_xml,$marc->as_xml, "testing xml2marc"); -my $marcdc=marc2dcxml($marc); -my $test2xml=qq(<?xml version="1.0" encoding="UTF-8"?> -<metadata - xmlns="http://example.org/myapp/" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://example.org/myapp/ http://example.org/myapp/schema.xsd" - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:dcterms="http://purl.org/dc/terms/"> -</metadata>); - -is ($marcdc, $test2xml, "testing marc2dcxml"); - -my $marcqualified=marc2dcxml($marc,1); -my $test3xml=qq(<?xml version="1.0" encoding="UTF-8"?> -<metadata - xmlns="http://example.org/myapp/" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://example.org/myapp/ http://example.org/myapp/schema.xsd" - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:dcterms="http://purl.org/dc/terms/"> -</metadata>); - -is ($marcqualified, $test3xml, "testing marcQualified"); +my $marcrdf=marc2dcxml($marc, 'dc-rdf', 1, + 0, undef, undef, undef, 'rdfxml'); +my $test2xml=qq(<?xml version="1.0" encoding="utf-8"?> +<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dcam="http://purl.org/dc/dcam/" xmlns:dcterms="http://purl.org/dc/terms/"> +</rdf:RDF> +); + +is ($marcrdf, $test2xml, "testing marc2dcxml with dc-rdf"); + +my $marcdc=marc2dcxml($marc, 'dc-xml', 0, + 0, 'metadata', undef, undef, undef); +my $test3xml=qq(<?xml version="1.0" encoding="utf-8"?> +<metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dc="http://purl.org/dc/elements/1.1/"/> +); + +is ($marcdc, $test3xml, "testing marc2dcxml with unqualified dc-xml"); my $mods=marc2modsxml($marc); my $test4xml=qq(<?xml version="1.0" encoding="UTF-8"?> -- 1.7.10.4