From 91cddc5c574b4ac3cd66abc0c8c00b991bce49e0 Mon Sep 17 00:00:00 2001
From: Jonathan Druart <jonathan.druart@biblibre.com>
Date: Wed, 31 Oct 2012 11:10:44 +0100
Subject: [PATCH] Bug 8992: Interfacing with the Idref webservice

On the detail page (in the opac), if the biblio comes from the Sudoc,
you must have a link (on the right of the author link) which open a popup with
informations about this author (publications by role).

To test:

1/ Modify your zebra conf in order to index the ppn:
  ccl.properties:
    Identifier-standard 1=1007 4=6
    ident Identifier-standard

record.abs: (biblios)
    melm 009 Identifier-standard:w,Number-standard:n

2/ Switch on the Idref system preference

3/ Simulate a SUDOC record:
  Fill a 7..$3 field with a ppn (032581270 for example).
  Fill the 009 field with an integer

4/ Go to the opac detail page of this notice.
You should see the IDREF link.
If you click on it, a popup displays a loading icon and after a few
seconds (depending of the productivity of the authority :)), a list of
roles. For each role, a table displays all his corresponding publications.

5/ On the right, you have 2 links: 1 for a koha search for this result
and 1 for a SUDOC link
---
 C4/Biblio.pm                                       |    6 ++
 installer/data/mysql/updatedatabase.pl             |   16 ++++
 .../en/modules/admin/preferences/web_services.pref |    7 ++
 koha-tmpl/opac-tmpl/prog/en/css/datatables.css     |   42 ++++-----
 koha-tmpl/opac-tmpl/prog/en/css/opac.css           |   41 +++++++++
 koha-tmpl/opac-tmpl/prog/en/includes/greybox.inc   |    7 ++
 koha-tmpl/opac-tmpl/prog/en/modules/opac-detail.tt |   10 ++-
 koha-tmpl/opac-tmpl/prog/en/modules/opac-idref.tt  |   66 ++++++++++++++
 koha-tmpl/opac-tmpl/prog/images/first-disabled.png |  Bin 0 -> 843 bytes
 koha-tmpl/opac-tmpl/prog/images/first.png          |  Bin 0 -> 720 bytes
 koha-tmpl/opac-tmpl/prog/images/last-disabled.png  |  Bin 0 -> 826 bytes
 koha-tmpl/opac-tmpl/prog/images/last.png           |  Bin 0 -> 737 bytes
 koha-tmpl/opac-tmpl/prog/images/next-disabled.png  |  Bin 0 -> 866 bytes
 koha-tmpl/opac-tmpl/prog/images/next.png           |  Bin 0 -> 736 bytes
 koha-tmpl/opac-tmpl/prog/images/prev-disabled.png  |  Bin 0 -> 862 bytes
 koha-tmpl/opac-tmpl/prog/images/prev.png           |  Bin 0 -> 745 bytes
 opac/opac-detail.pl                                |   13 +++
 opac/opac-idref.pl                                 |   91 ++++++++++++++++++++
 18 files changed, 277 insertions(+), 22 deletions(-)
 create mode 100644 koha-tmpl/opac-tmpl/prog/en/includes/greybox.inc
 create mode 100644 koha-tmpl/opac-tmpl/prog/en/modules/opac-idref.tt
 create mode 100644 koha-tmpl/opac-tmpl/prog/images/first-disabled.png
 create mode 100644 koha-tmpl/opac-tmpl/prog/images/first.png
 create mode 100644 koha-tmpl/opac-tmpl/prog/images/last-disabled.png
 create mode 100644 koha-tmpl/opac-tmpl/prog/images/last.png
 create mode 100644 koha-tmpl/opac-tmpl/prog/images/next-disabled.png
 create mode 100644 koha-tmpl/opac-tmpl/prog/images/next.png
 create mode 100644 koha-tmpl/opac-tmpl/prog/images/prev-disabled.png
 create mode 100644 koha-tmpl/opac-tmpl/prog/images/prev.png
 create mode 100755 opac/opac-idref.pl

diff --git a/C4/Biblio.pm b/C4/Biblio.pm
index afb60d3..6a8d68c 100644
--- a/C4/Biblio.pm
+++ b/C4/Biblio.pm
@@ -1834,9 +1834,14 @@ sub GetMarcAuthors {
         }
 
         # other subfields
+        my $unimarc3;
         for my $authors_subfield (@subfields) {
             next if ( $authors_subfield->[0] eq '9' );
 
+            # unimarc3 contains the $3 of the author for UNIMARC.
+            # For french academic libraries, it's the "ppn", and it's required for idref webservice
+            $unimarc3 = $authors_subfield->[1] if $marcflavour eq 'UNIMARC' and $authors_subfield->[0] =~ /3/;
+
             # don't load unimarc subfields 3, 5
             next if ( $marcflavour eq 'UNIMARC' and ( $authors_subfield->[0] =~ /3|5/ ) );
 
@@ -1872,6 +1877,7 @@ sub GetMarcAuthors {
         push @marcauthors, {
             MARCAUTHOR_SUBFIELDS_LOOP => \@subfields_loop,
             authoritylink => $subfield9,
+            unimarc3 => $unimarc3
         };
     }
     return \@marcauthors;
diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl
index 7ab48ee..8e9509b 100755
--- a/installer/data/mysql/updatedatabase.pl
+++ b/installer/data/mysql/updatedatabase.pl
@@ -6020,6 +6020,22 @@ if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
    SetVersion ($DBversion);
 }
 
+
+
+
+$DBversion = "3.09.00.XXX";
+if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
+    $dbh->do(qq{
+        INSERT INTO systempreferences (variable,value,explanation,options,type)
+        VALUES('IDREF','0','Disable/enable the IDREF webservice from the OPAC detail page.',NULL,'YesNo')
+    });
+    print "Upgrade to $DBversion done (Add system preference IDREF))\n";
+    SetVersion($DBversion);
+}
+
+
+
+
 =head1 FUNCTIONS
 
 =head2 TableExists($table)
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/web_services.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/web_services.pref
index 7244675..a3ad67f 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/web_services.pref
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/web_services.pref
@@ -44,3 +44,10 @@ Web services:
             - pref: SvcMaxReportRows
               class: integer
             - rows of a report requested via the reports web service.
+    IDREF:
+        -
+            - pref: IDREF
+              choices:
+                yes: Enable
+                no: Disable
+            - the IDREF webservice from the opac detail page
diff --git a/koha-tmpl/opac-tmpl/prog/en/css/datatables.css b/koha-tmpl/opac-tmpl/prog/en/css/datatables.css
index e7b11bd..2a80b5a 100644
--- a/koha-tmpl/opac-tmpl/prog/en/css/datatables.css
+++ b/koha-tmpl/opac-tmpl/prog/en/css/datatables.css
@@ -3,23 +3,23 @@ input.search_init {
 }
 .sorting_asc {
     padding-right: 19px;
-    background: url("../../img/asc.gif") no-repeat scroll right center #EEEEEE;
+    background: url("../../images/asc.gif") no-repeat scroll right center #EEEEEE;
 }
 .sorting_desc {
     padding-right: 19px;
-    background: url("../../img/desc.gif") no-repeat scroll right center #EEEEEE;
+    background: url("../../images/desc.gif") no-repeat scroll right center #EEEEEE;
 }
 .sorting {
     padding-right: 19px;
-    background: url("../../img/ascdesc.gif") no-repeat scroll right center #EEEEEE;
+    background: url("../../images/ascdesc.gif") no-repeat scroll right center #EEEEEE;
 }
 .sorting_asc_disabled {
     padding-right: 19px;
-    background: url("../../img/datatables/sort_asc_disabled.png") no-repeat scroll right center #EEEEEE;
+    background: url("../../images/datatables/sort_asc_disabled.png") no-repeat scroll right center #EEEEEE;
 }
 .sorting_desc_disabled {
     padding-right: 19px;
-    background: url("../../img/datatables/sort_desc_disabled.png") no-repeat scroll right center #EEEEEE;
+    background: url("../../images/datatables/sort_desc_disabled.png") no-repeat scroll right center #EEEEEE;
 }
 .sorting_disabled {
     padding-right: 19px;
@@ -83,25 +83,25 @@ div.dataTables_paginate {
     color : #0000CC;
 }
 .paging_full_numbers span.paginate_button.first {
-    background-image : url('../../img/first.png');
+    background-image : url('../../images/first.png');
     background-repeat: no-repeat;
     background-position : 2px center;
     padding-left : 2em;
 }
 .paging_full_numbers span.paginate_button.previous {
-    background-image : url('../../img/prev.png');
+    background-image : url('../../images/prev.png');
     background-repeat: no-repeat;
     background-position : 2px center;
     padding-left : 2em;
 }
 .paging_full_numbers span.paginate_button.next {
-    background-image : url('../../img/next.png');
+    background-image : url('../../images/next.png');
     background-repeat: no-repeat;
     background-position : right center;
     padding-right : 2em;
 }
 .paging_full_numbers span.paginate_button.last {
-    background-image : url('../../img/last.png');
+    background-image : url('../../images/last.png');
     background-repeat: no-repeat;
     background-position : right center;
     border-right : 1px solid #686868;
@@ -147,31 +147,31 @@ div.dataTables_paginate.paging_four_button {
     width: 16px;
 }
 .paginate_disabled_first {
-    background-image: url("../../img/first-disabled.png");
+    background-image: url("../../images/first-disabled.png");
 }
 .paginate_enabled_first {
-    background-image: url("../../img/first.png");
+    background-image: url("../../images/first.png");
     cursor: pointer;
 }
 .paginate_disabled_previous {
-    background-image: url("../../img/prev-disabled.png");
+    background-image: url("../../images/prev-disabled.png");
 }
 .paginate_enabled_previous {
-    background-image: url("../../img/prev.png");
+    background-image: url("../../images/prev.png");
     cursor: pointer;
 }
 .paginate_disabled_next {
-    background-image: url("../../img/next-disabled.png");
+    background-image: url("../../images/next-disabled.png");
 }
 .paginate_enabled_next {
-    background-image: url("../../img/next.png");
+    background-image: url("../../images/next.png");
     cursor: pointer;
 }
 .paginate_disabled_last {
-    background-image: url("../../img/last-disabled.png");
+    background-image: url("../../images/last-disabled.png");
 }
 .paginate_enabled_last {
-    background-image: url("../../img/last.png");
+    background-image: url("../../images/last.png");
     cursor: pointer;
 }
 
@@ -248,16 +248,16 @@ table.display thead th {
     width: 19px;
 }
 .paginate_disabled_previous {
-    background-image: url("../../img/datatables/back_disabled.jpg");
+    background-image: url("../../images/datatables/back_disabled.jpg");
 }
 .paginate_enabled_previous {
-    background-image: url("../../img/datatables/back_enabled.jpg");
+    background-image: url("../../images/datatables/back_enabled.jpg");
 }
 .paginate_disabled_next {
-    background-image: url("../../img/datatables/forward_disabled.jpg");
+    background-image: url("../../images/datatables/forward_disabled.jpg");
 }
 .paginate_enabled_next {
-    background-image: url("../../img/datatables/forward_enabled.jpg");
+    background-image: url("../../images/datatables/forward_enabled.jpg");
 }
 .spacer {
     clear: both;
diff --git a/koha-tmpl/opac-tmpl/prog/en/css/opac.css b/koha-tmpl/opac-tmpl/prog/en/css/opac.css
index 7ab95e0..5fdcc07 100644
--- a/koha-tmpl/opac-tmpl/prog/en/css/opac.css
+++ b/koha-tmpl/opac-tmpl/prog/en/css/opac.css
@@ -2820,3 +2820,44 @@ body#opac-main #opacmainuserblockmobile {
 .tagweight9 {
     font-size: 30px;
 }
+
+div.pager {
+    background-color : #E8E8E8;
+    border : 1px solid #BCBCBC;
+    -moz-border-radius : 5px;
+    display : inline-block;
+    font-size : 85%;
+    padding : .3em .5em .3em .5em;
+    margin : .4em 0;
+}
+div.pager img {
+    vertical-align : middle;
+}
+div.pager img.last {
+    padding-right: 5px;
+}
+div.pager input.pagedisplay {
+    border : 0;
+    background-color : transparent;
+    font-weight: bold;
+    text-align : center;
+}
+a.localimage img {
+    border : 1px solid #0000CC;
+    margin : 0 .5em;
+    padding : .3em;
+}
+div.pager p {
+    margin: 0;
+}
+
+
+/* IDREF */
+#idref h2.role {
+    background-color: #DDDEEE;
+    cursor: pointer;
+}
+
+#idref table {
+    margin: 0;
+}
diff --git a/koha-tmpl/opac-tmpl/prog/en/includes/greybox.inc b/koha-tmpl/opac-tmpl/prog/en/includes/greybox.inc
new file mode 100644
index 0000000..b955b44
--- /dev/null
+++ b/koha-tmpl/opac-tmpl/prog/en/includes/greybox.inc
@@ -0,0 +1,7 @@
+<script type="text/javascript">
+    var GB_ROOT_DIR = "[% themelang %]/lib/greybox/";
+</script>
+<script type="text/javascript" src="[% themelang %]/lib/greybox/AJS.js"></script>
+<script type="text/javascript" src="[% themelang %]/lib/greybox/AJS_fx.js"></script>
+<script type="text/javascript" src="[% themelang %]/lib/greybox/gb_scripts.js"></script>
+<link href="[% themelang %]/lib/greybox/gb_styles.css" rel="stylesheet" type="text/css" />
diff --git a/koha-tmpl/opac-tmpl/prog/en/modules/opac-detail.tt b/koha-tmpl/opac-tmpl/prog/en/modules/opac-detail.tt
index 1d0523a..c942b2b 100644
--- a/koha-tmpl/opac-tmpl/prog/en/modules/opac-detail.tt
+++ b/koha-tmpl/opac-tmpl/prog/en/modules/opac-detail.tt
@@ -11,6 +11,7 @@
 [% END %]
 [% IF ( OpacStarRatings != 'disable' ) %]<script type="text/javascript" src="/opac-tmpl/prog/en/lib/jquery/plugins/jquery.rating.js"></script>
 <link rel="stylesheet" type="text/css" href="/opac-tmpl/prog/en/css/jquery.rating.css" />[% END %]
+[% INCLUDE greybox.inc %]
 
 [% IF ( OpacHighlightedWords ) %]<script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery.highlight-3.js"></script>[% END %]
 <script type="text/JavaScript" language="JavaScript">
@@ -345,7 +346,11 @@ YAHOO.util.Event.onContentReady("furtherm", function () {
         [% XSLTBloc %]
     [% ELSE %]
     <h1 class="title">[% title |html %][% IF ( subtitle ) %] <span class="subtitle">[% FOREACH subtitl IN subtitle %][% subtitl.subfield |html %] [% END %]</span>[% END %]</h1>
-    [% IF ( author ) %]<h5 class="author">by <a href="/cgi-bin/koha/opac-search.pl?q=au:[% author |url %]">[% author |html %]</a></h5>[% END %] 
+    [% IF ( author ) %]
+      <h5 class="author">
+        by <a href="/cgi-bin/koha/opac-search.pl?q=au:[% author |url %]">[% author |html %]</a>
+      </h5>
+    [% END %]
 
     <span class="results_summary">[% UNLESS ( item_level_itypes ) %]
         [
@@ -369,6 +374,9 @@ YAHOO.util.Event.onContentReady("furtherm", function () {
             [% IF (MARCAUTHOR.authoritylink) %]
                 <a class='authlink' href="/cgi-bin/koha/opac-authoritiesdetail.pl?authid=[% MARCAUTHOR.authoritylink %]"><img style="vertical-align:middle" height="15" width="15" src="/opac-tmpl/prog/images/filefind.png"></a>
             [% END %]
+            [% IF ( IDREF and MARCAUTHOR.unimarc3) %]
+                <a href="/cgi-bin/koha/opac-idref.pl?unimarc3=[% MARCAUTHOR.unimarc3 %]" title="IDREF" rel="gb_page_center[600,500]">IDREF</a>
+            [% END %]
             [% UNLESS ( loop.last ) %]|[% END %]
         [% END %]
     </span>
diff --git a/koha-tmpl/opac-tmpl/prog/en/modules/opac-idref.tt b/koha-tmpl/opac-tmpl/prog/en/modules/opac-idref.tt
new file mode 100644
index 0000000..6adbbc5
--- /dev/null
+++ b/koha-tmpl/opac-tmpl/prog/en/modules/opac-idref.tt
@@ -0,0 +1,66 @@
+[% INCLUDE 'doc-head-open.inc' %]
+[% IF ( LibraryNameTitle ) %][% LibraryNameTitle %][% ELSE %]Koha online[% END %] catalog &rsaquo; Your search IDREF for ppn [% unimarc3 %]
+[% INCLUDE 'doc-head-close.inc' %]
+  <link rel="stylesheet" href="[% themelang %]/css/datatables.css" />
+  <script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery.dataTables.min.js"></script>
+  [% INCLUDE 'datatables-strings.inc' %]
+  <script type="text/javascript" src="[% themelang %]/js/datatables.js"></script>
+  <script type="text/javascript">
+    $(document).ready(function (){
+        $("table").dataTable($.extend(true, {}, dataTablesDefaults, {
+            "oLanguage": {
+                "sSearch": _("Search all columns:")
+            },
+            'bFilter': false,
+            'sPaginationType': 'four_button',
+            'aoColumnDefs': [
+                { 'aTargets': [-1, -2], 'bSortable': false }
+            ],
+            'aLengthMenu': [[10, 25, 50, 100, 250, 500, 1000, -1], [10, 25, 50, 100, 250, 500, 1000, _("All")]],
+        }));
+
+        $(".role").click(function(){
+            var docs_node = $(this).parent().find("div.docs");
+            if ( $(docs_node).is(":visible") ) {
+                $(".docs").hide();
+            } else {
+                $(".docs").hide();
+                docs_node.show();
+            }
+        });
+        $(".docs").hide();
+    });
+  </script>
+</head>
+<body>
+<div id="idref">
+  [% IF error %]
+    This ppn is not found on the idref service.
+  [% ELSE %]
+    [% FOREACH role IN content %]
+      <div>
+        <h2 class="role" title="Click to expand this role">[% role.role_name %] ([% role.count %])</h2>
+          <div class="docs">
+            <table>
+              <thead>
+                <th>Citation</th>
+                <th>Koha</th>
+                <th>Sudoc</th>
+              </thead>
+              <tbody>
+                [% FOREACH doc IN role.docs %]
+                  <tr>
+                    <td>[% doc.citation %]</td>
+                    <td><a href="/cgi-bin/koha/opac-search.pl?q=kw,phr=[% doc.ppn %]" target="_blank">Koha</a></td>
+                    <td><a href="http://www.sudoc.fr/[% doc.ppn %]" target="_blank">Sudoc</a></td>
+                  </tr>
+                [% END %]
+              </tbody>
+            </table>
+          </div>
+      </div>
+    [% END %]
+  [% END %]
+</div>
+[% INCLUDE 'opac-bottom.inc' %]
+
diff --git a/koha-tmpl/opac-tmpl/prog/images/first-disabled.png b/koha-tmpl/opac-tmpl/prog/images/first-disabled.png
new file mode 100644
index 0000000000000000000000000000000000000000..fdf2106cf24f9e6536907061ea9be1945552c635
GIT binary patch
literal 843
zcmV-R1GM~!P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!-AP12RCwBA
z{Qv(y12ULAd9oBEBcn7>Tog$2L*+jL@oOM{nwy*Z3|T!u05QT00BYm`YS0i96El~T
zl+@zo<uzbqW77c1fB*jd#-~r8F1&pC^4gm>Z%zW0-vAo)1*8ukfWQWTGy~a&y1Ke9
z;^N{FKtt5HxVRWNI5-$U@;`q3VEFv`GsBZ7Pj0<>^=iePJ9qW~Ejyo+lk){2fLOq$
z0BzRM(Q%QGkSJ18QsM#H%<${iFNUvQzk&?_@qq?2@bU4f{r&s52#6UTJb3UOsPzm$
z05J;-3rhhdU4R;sfmo8Aot@#`yLSw~fB$Cq_wOGVgV^WJonrvXGYAO@u>oBn3G~*}
zBS(%r1qdJ}pefQoo3%tmMb$u>K~9}CX%fSdB}?D|b?w?UhBIf*FuZ>Knt_v(lR-g2
zK@CW20bM5z5I`UUM0t3447j<u!G1*sAm@WL@7lEsF81x)HwFO#0g#*l(CeZA0mK4|
zDppoj4Up|$zI*{|g5je_k20J-eHyMA<Q-7B0KEZ{*8mFf0|XEgaykI9fd;}20I`t)
z$N*TZfWigD1_&S~prVgJfg2#FfkGRm2&CD}%#5L=qy)tRQ1pTV85m19KzacJ2;_p-
zA3uJ)08A+000Joz5fOpM0LaNOLqL3xnx{{nf(*C-N}T`!1PX(v&!0cP2DJSaFfi4C
zam^4PAI|_yfnXYBI7kc>c)-NOaPi{BTR_9Efs!^r05Nadw(awwLx=t|Gc*4NMw2lx
zU9brX3c_8$#Kgn^Ox6sbSOVF+W5<p!Krhb*YTgG-&Nl%92$m9W0A0ZevT@IzJrU~a
z>S~~r$Is8t07`Yh^w03<(Ic?UfByVg!NS6_2b3Q`dI16mB{Kmj4WL)dfwUG-qXCEy
z)BtkH4IsV%)OZc(B5-B`<pYpDfB<5|mYqSV6O>4Ra{SO}{RpJN*%_!2B|8HI7y#v+
VkuA4ftNj1~002ovPDHLkV1ks|VH^Me

literal 0
HcmV?d00001

diff --git a/koha-tmpl/opac-tmpl/prog/images/first.png b/koha-tmpl/opac-tmpl/prog/images/first.png
new file mode 100644
index 0000000000000000000000000000000000000000..6f11fcb086b1bfa51bc5070ca45fac0a988c624c
GIT binary patch
literal 720
zcmV;>0x$iEP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!Vo5|nR5;6}
zlS^+BQ547f0sI7f4p_Q$!@|Vwx--6F!p6i!Q&&#9anYDUW`HQBO=|;{NKLAi)JR+D
z2+}kbI#7m(KwIcg7;qRE7@!>ITpohD^Ctgf=H~o==W*|y0)VM;-LQd9lR=YF)677|
z!Jh8V_;KSkP5LJrlF9S+j0qkk+2iPm7~x{#{$ZSbvzK9J-4zqYVC)27V7~717pTZd
znit9v$VwYJS3ROyLxp^?0)a!0U)oMn7(0Xv0eUoZ@gH)t)d5_J+J%bT22oSJ)g^nf
zqQZVCEIYOm2+<P&_Jw6*=Ak)XX+fdd0->rB;rB+cID%~N1o%g50=A<=fWgC_GFUb)
z%s4&22M=t~3G+RMgR^pz#KbcfK)ZtsdJ$j@d{400GnQJeAz+sPu#&f$`6hKh0J%~V
zq(%oWs|qZyzh}{lfSK@dRK#JSxg@DDP3^*cD+kP0j(npKkSQvp3bk_uYtD5My##O+
z;RpcDs9R5c#9;NFP5{z^GN_^r%PX%(0OOZ~7+aNFP*XZk{E2|i#E`vI`YjCrsfz|V
zndEsDXoqvug2CxaF}ZvhdOaY6!{9q~KO+jO!o5Vk0qt%NcD}`cvVR;6QTNzYGWq-=
zUX+?7V0e7VLW2m6_>T!vT6W8eRsOC$*+0hNMWWwDsLfA)S*X-WV71;M{bCz<v<Oa~
zSHSFW$#eA9?~62kl^2{LYSq2T2g51I2@;tJ_8iNK;PppffnMTgEg$~A%Hxme;j64^
z{-u|BZd+k#t6f~QFyb?_gPk*bnA=SJ-;e2kp7SrPKM4}2E#B7v0000<MNUMnLSTZm
Co<+<6

literal 0
HcmV?d00001

diff --git a/koha-tmpl/opac-tmpl/prog/images/last-disabled.png b/koha-tmpl/opac-tmpl/prog/images/last-disabled.png
new file mode 100644
index 0000000000000000000000000000000000000000..e3815b5f55add82f1db9114a095d1bd776742650
GIT binary patch
literal 826
zcmV-A1I7G_P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!%t=H+RCwBA
z{Qv(y12UL0Wr`F~Oq!9AQ54AK2Z;gsAA!_sAby&goBIq|JwO04!VCav<N>lZ#KpzU
zrKF^^czAdW*x1-KK=R+ef4}kh^XCgMUc9*W_U+q~K(QM@gT8?D0R#}(fXS05^8nd~
zy1Ke9Km#Jg#KhFNxVRWNI5<GIGyM4Rg8^s&!{f(~Z@qr~dc~bPclH3)p9dKN5I`(Y
zmuP@AOG-)>DJm-R0BvUY_3IbImoH#T7(jfW!3=zSd}^02T>`0Lc<|uCcc9c6fB<3^
z78aHQO1da1DJ283BuMeelP4MY`T4=N|NHk3Y}mJN-#`X10M)a-di6>Y=&GkjjvRRk
z5I{`8z>=1bkkA4-8>IQ;$Bzs<ckX1ke*HQFEPN(Sn#8bd*)p&<I5{~P<mKhn*xA{&
zK!FVqKrBE)6ck_}KmYvs6Ko?$BghaCTSG$wC6+)g5fl^zF%5uN6d-_DfG*%?Wo6X>
znh5tZ%;p0J4lulX_YQ6-hz40AARqwZgG}ZJ2p}e84ajU}W@d)pzkf3@F)@L~VB#Pe
z6eb`!5C8}uCQu>)2FMMN(||4k+rq-a0#;B|RK#FnVuE5gC=5WZ0=nb|(Dfey0tgg{
zuYmz~0Tg&3Ntg{KB_&}0f(#TD6@|M36jo23JONp70hBrc0tl22p1yqf@)|G<Zt?Q+
zs(}<27Z<}dgEYm)#)4e{ipFQpo-tg!c<~lc?ixrhKmajs+qUiVp+krM1O56Nn97WS
zA<PB}WuVKz27qW#00UzRta-<d9bbT6o(<Hz510~f0t65X)NeO{lAIuod-m*!P*+!1
zgQh%&zkmNSym|8ml#IbP1Nkd}0lWuj@C}e&fB=GLCTM=p0464LpqLiWc2GQPfD8cQ
z8$huOKv!M^YDURS00G2EC_97XL7@!_Fd!QvI|Bq501}dz-y{)%cmMzZ07*qoM6N<$
Ef;ulvi2wiq

literal 0
HcmV?d00001

diff --git a/koha-tmpl/opac-tmpl/prog/images/last.png b/koha-tmpl/opac-tmpl/prog/images/last.png
new file mode 100644
index 0000000000000000000000000000000000000000..72079357614b4254b163a5cac766093d1f99bbe7
GIT binary patch
literal 737
zcmV<70v`Q|P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!b4f%&R5;6}
zlS^+BQ547f0sI7f4p_Q$!%lo8-5FmoVPoQ=sVgVd*hOQ6%m7hLo7M&@3DuxNYNSOv
z1!)=!1<Di<Xo2z?5T*>za-4I45g$8m^55K?|L?r+odSTVNnJ96LXt|7TGI4L>d~Fz
z&-h8>1xd<>>vgSt=Y;X^$Jv9(As-4y`R%<J`^J-EW^7e0#$fDkfRXv4)tje6he@tb
zse>SPp?5wYYBW2LD^|g`7v>f>k`%^{A!C3N&EeR0q1EmI9<kGhs?Y^q(pkGt?gX&|
z+kv29b{-)_NdVXvmW`RmX2)&`ia$C~s122`wINq+%aDytA9sJXfbA#{pt7^a43>?j
zT<^fuCti3LD9UEdoCoe2BcvKUvD7KhHa~-21gL%Aj#%s&OGVR_$6iSuSoaqp%eN%J
z76DWmU8pyEP^yWrwDz7wF9N262N52Jg#ie_jHv7Leqfv#&`?`&#}Fpfom5)T>7B!>
zWsOHK0qlpu1b_k9E1Iu8-65F`u4B0T$PKrdAs|z3NmX=VY5BDbP=DEtvNfR%4Y5Zu
z5VMpOD@qkb3GkT!aIm<Uc(w+#*&?@~vbYmWCRc&M07wQ6<tFB2K_o)+O*%~4>-Gn*
z`85iZ>7zVE#RF?u>-GjXzTT2IfyTsX6XN-%yiPPHr0n_^E8Hzpe7MH(L!#e?D90zS
zP^g}fN@{04Qcb!flJ%iEo~?q;Y!zl{=dXt}`IHwd0cyqO;QYY^WD0dM6YM#f=E3C+
z!2-R=&FDY;{gfv^)4f+|?c7Tj^US!+(gqX%T+i_HIx{<~voklC*uOv1|9t14Z-oeY
T<X^Ql00000NkvXXu0mjfFR4u9

literal 0
HcmV?d00001

diff --git a/koha-tmpl/opac-tmpl/prog/images/next-disabled.png b/koha-tmpl/opac-tmpl/prog/images/next-disabled.png
new file mode 100644
index 0000000000000000000000000000000000000000..58b03409bfbe94b6eca9d45b3442245664d4b754
GIT binary patch
literal 866
zcmV-o1D*VdP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!^hrcPRCwBA
z{Qv(y12UL0Wr`F~Od7}(1!8_iMn(o8|09t78pwW{lauodSv^1iF~SU(Jb5w?kkXKl
zkT3^gEgl{o12#4`4UpXT@855H`t<3-%a<>&y?y)kBv8+d+}zwRAUS{l0viC*3^d(P
zM@Pp+TwFXtR8&-ro12?~gM)(sY5>ERFJBlQKYo1c)vH%4?%cVv2dMr$&^2EG0*D3b
z5)F`Mpv^@}N=iIHn;Cxn`o-||>sPQOD=RC5n3xy?FE6j!-@kv0fSBR_{rlg6QfB}H
zh*?-zSPE#X3s7USva+%yNb|F25O0DM{`>cj;p4}T48MQ>X5i!FV-OM&VgtHD66mU@
zhYufq3J^d{K&MDcN=j-0ZBPSg2Ktp@&YU@5C&R$(*|Wi}dGqEC11BdZgMxyB8qj-M
zAiV$q!~_fjQJ{YfKz{!D^C#F=P`J#UI~S}8<N^?wH*X%8|Lxm120=kVkdOgLFF*h>
zfuaf&+Ax2E0LTCkUbt`}!;c?7z-*8~ixw?n`0(Ka12Bd_Vj4gf@B;)8$O~{=Kr}2`
znVFfv1_A>PEDqy?G=peRn1Iv*1Q5szAAz>q067ih3YcP$g5u(0a1?@K;m@Bx3?(Hc
z3`|T+48XJiGUNu(o{s<l1oFabP$B^Z9w>l7rh+t=mX?D33*v)p1Q`YjSS~IuhNn-T
zg2XO>^a2DBv!|ygDBwhZSOpk3!oX-^FfuX%YX-RngdH6n!J1`cWWbt%(RT}|ehbim
zQvd<PylvaI&j$}4{10^6@7J$i8v_kt1BEguY(Oyr@(w#YJ2>P)=>w?#3((86f$H}G
zlk-i000O5(pyC@ZUcBH0h4`L5dm_};)zyHBi-Dh?A8ZKFU{Eq<xOnm6Enrxz0EWpP
zP<{aE1qdK`W&-9y9#GT(1JWEwYXO~Z07~MZzym1;8gv2ZnrlFel9>Pkh!I<M22#?X
sL;{LusQgDD`!$gL6sQp;I|Bq506C7S@8*npX8-^I07*qoM6N<$g03K4OaK4?

literal 0
HcmV?d00001

diff --git a/koha-tmpl/opac-tmpl/prog/images/next.png b/koha-tmpl/opac-tmpl/prog/images/next.png
new file mode 100644
index 0000000000000000000000000000000000000000..4a2f9d4e4a81857f509d85bbe46936c99709cd6f
GIT binary patch
literal 736
zcmV<60w4W}P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!a!Eu%R5;6}
zQ%i3WQ55bE@E7nqVCm8gyH;z`orxP0HYP5by0Me`=%O(~W-L)mo7M&@37XW}rlwS!
z4j`tnP@oJCf$}I61{?;4$54)QE)Vgs^CsWo-kk3{=R4=z2>_TF$F*h9sL-j<tC$%;
zKX}vp89z?EqC$KBt!Qw#GmQ5*#+`&tg+MSY93DluH?AZzYp)nE24jB{7?7{p*gO?D
zP4I=X2$I|Z<+4XmYqTL(tbpez$gk`rD2yG73<b1E4o1F9&6Waq<aQS-QU?ST^;Va>
zNpc$weSXQZ6Gag%5kOy9HfA1@<L3=1{%Av?+DA0kfLx_D64^WO@OL)~Xh(wrItO>g
zVA*&|VjFHeVhIV!`DzQM7F-a@NRTNvNlYYp4z%6NAQuJno^MeOJ!7dzy8e(=;etr6
z4q2h83Vb36o=G4!6u79$u)6u4LoN!;_)kItHmh9g5CP1HxVh+sSiS*Mlqx_uVfwL~
z+}p|}Y*;r1<Pw47K#&Mv`REnN(@)$aD~e9eJBh8y`F(O18y#3(dp#1+fBqWgs!|JT
zvO;_kGSw$1i}Hw!32-v8Y!zsWb!0(jb;g-=t_-~%K)Tc<<svyzkO?Lq?31ZrV>{g*
z9DE4_W&SW~qUN5hWN@-RUJ#q3Ngxr&iJp;+4aEd;HM{A>I)B?7>yL4`Nc6h^we^ve
z3YC6fwXTqAQWr8=Cd?emR={YnNptkhuSFVP<t3|+TDNcUUVj|Y1(EawJ%>{Q?6Lt^
zqF4A?)Arx1JpP&Pyh<4sUhXnam)AJ@xmkE-VuVGbg_|=vm|INb-=FD!zVlDxJ_uiv
SXLQ>D0000<MNUMnLSTa5n>yhD

literal 0
HcmV?d00001

diff --git a/koha-tmpl/opac-tmpl/prog/images/prev-disabled.png b/koha-tmpl/opac-tmpl/prog/images/prev-disabled.png
new file mode 100644
index 0000000000000000000000000000000000000000..225c9a9ab8b4827ea16bde80eeb48b562e9564ad
GIT binary patch
literal 862
zcmV-k1EKthP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!@JU2LRCwBA
z{Qv(y12UL0Wr`F~Oq!9AQ54AKhsu8h@?QhlPjho~pCPLU2p~q70YHsBK(>a2goHT|
zYw_^#7_hOiX@KN^{P=O>^XJbOUc7j5?aiAvCxOau01f&A(gzSgU<06<4Rv*OUBt!3
zBSb|-)wsF288|pNz=nVS{+$760K=0fPj0<>^=if4yLa~h)t?6$0uVqfAO#?sL7IU!
z7bz(z@c?aR`2G7g!`H80!3MCfurL4(X5i!FQ~Ue(ZxIkP+`oVSJ5cHjKmaj|h=@o5
zC0&3TlYv;0ot>TG<HwH--@bhVYX&L)^XCs(Oi)meK}bl5?d8jtl0Sd`e0t=_k*5Fw
z!~_a3ke@-$25J8E=@Z!YIdkTKTn5HK#SHW3&u0MopMjH;lR-g2K@I3VEs$P-0Ad1#
zHZL!)0m#oFg}?v<g$V;t9Iko7gb8py$Ymgx0NDmW2Z{m&5ECe>SXo&$K(>PdYudDF
zV5k54_mAP%uU}xzFqeS512O<;AvoNChVlah5XcK)#ULA)n3x#2xVXRyL41&NK`sLY
zB1jE1z`+KCya{3h1Q5szAA!!i0Sa-TOBj-qlNo?%0BiurJDHi8U_QujkOolHzI*o$
z<h2{11O^a5ATPZB@ZrM+P$+|J1lg37lmxdG6a$HgiEuv1MZoj`a>WHu>I4WNW=~H~
zkdsA#rmF}D2nYkC37lvQ3=F^;VE)(B(_@g9mS%YR^eMyP!-sDH^=tu(p8^OV=55=y
zeLi&P(0`y4f4_eH+87kiz$k?WB*-hEKm!`i@a)+$hV9$8e*p&eY@qsmz?66sAb?n)
zdE&<N=g&Dov9Nph?g({tbv01R<LBoGdjV)L!{f(~87^MD2(ozv&^w@{3<?7VfB=GL
zrpc2h^8jtr07{wzxmrNmLGi2sG62ZF0aSMZXzMi~J_%HJBPS;ZoS6Uuh!IzI1|<?u
oJVT=noSlKpr$CJ;*%=_f02&gb@5#$_MF0Q*07*qoM6N<$f_qtQg8%>k

literal 0
HcmV?d00001

diff --git a/koha-tmpl/opac-tmpl/prog/images/prev.png b/koha-tmpl/opac-tmpl/prog/images/prev.png
new file mode 100644
index 0000000000000000000000000000000000000000..15d1584bdbb2c26a9fc4c8269aa54615a58a4657
GIT binary patch
literal 745
zcmV<F0v7#=P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!dr3q=R5;6}
zlTB|DQ51&z1N;U24p_Q$L!$8`YEc&^ZcNyixM*4vBdIZs#aaksiDKHcHc&~>1hlor
z)=Ec^h7>5J3?Bj(D6|X+0|UcQj&m*_Qg!D|-c07sd7pF6opXl(U}#WhW<VxMAxSAo
z)s?clC;Kyg(0EFceC$nGZTq@UxqVT3XLpYc1VikmH%!0YNKhlzq8ei`_5`47K5cPk
zHG#c2lPi>g<C`EJw}~n>0W$d_xV%ATb~UcS*dC+@kfS*m{?64KBH-eM78JQAu#&2c
z7TM!?0X98;&a@msh@1ehFDx4~_smCS0rm@Z$dv@5Y^ec>Jl}_`uDh5!i#cpZh5&_)
z{y|~cgJzZ1d%`?CxkdJIg%by0u(~PqB0%Zdj?maMmYO=M!=;B#0>~5_5YO>&?w*4H
z@LRbi!eNPrxg`gUUIeK8JG(3%R{o~|7so$K+8_qZe0Iz($pKd%d&oOhA&AGYXkKE`
zO8~w=kN^smCS05H!-WT*2mpbXAJK6B{s*`+;U?8|s%XO8{Hs1d`DH6am$(L0coEX9
z)c+Ho)WS9-4?6~g4NrO@c2FaKCYmmR!DQ~YpfIn+s8pr^?KThtmU&}3Kr*7R^y^Rk
z5Xsb_*=oc3w-9KI@B4=+yK6a8uQ@#oTkf1PnlL+NjAm=Zh)+xqld|idFEF=^(avw|
z4U*w)Kx6;t<Z{I-2`p7bQVoJ|m@soRT?C!U!i^f1e-F~&C~M6g&4Sg=xcxCm<;vtt
zu;);cg%xK2w1!z`ME~yZQ69WZw_hgJ<1bdIshN4&@XW|g>nV0ZXQD@SHtHr7{`Y12
bpX>Y!%!CO%>C8GV00000NkvXXu0mjfJYGkQ

literal 0
HcmV?d00001

diff --git a/opac/opac-detail.pl b/opac/opac-detail.pl
index d9ecdfa..1beabb1 100755
--- a/opac/opac-detail.pl
+++ b/opac/opac-detail.pl
@@ -950,6 +950,19 @@ if (my $search_for_title = C4::Context->preference('OPACSearchForTitleIn')){
     $template->param('OPACSearchForTitleIn' => $search_for_title);
 }
 
+#IDREF
+if ( C4::Context->preference("IDREF") ) {
+    # If the record comes from the SUDOC
+    if ( $record->field('009') ) {
+        my $unimarc3 = $record->field("009")->data;
+        if ( $unimarc3 =~ /^\d+$/ ) {
+            $template->param(
+                IDREF => 1,
+            );
+        }
+    }
+}
+
 # We try to select the best default tab to show, according to what
 # the user wants, and what's available for display
 my $opac_serial_default = C4::Context->preference('opacSerialDefaultTab');
diff --git a/opac/opac-idref.pl b/opac/opac-idref.pl
new file mode 100755
index 0000000..8980a41
--- /dev/null
+++ b/opac/opac-idref.pl
@@ -0,0 +1,91 @@
+#!/usr/bin/perl
+
+use Modern::Perl;
+
+use CGI;
+use LWP::UserAgent;
+use HTTP::Request::Common;
+use JSON;
+use Encode;
+
+use C4::Auth;
+use C4::Context;
+use C4::Search;
+use C4::Output;
+
+my $cgi = new CGI;
+my ( $template, $borrowernumber, $cookie ) = get_template_and_user(
+    {
+        template_name   => "opac-idref.tt",
+        query           => $cgi,
+        type            => "opac",
+        authnotrequired => ( C4::Context->preference("OpacPublic") ? 1 : 0 ),
+        flagsrequired   => { borrow => 1 },
+    }
+);
+
+my $ua = LWP::UserAgent->new;
+
+my $base = 'http://www.idref.fr/services/biblio/';
+my $unimarc3 = $cgi->param('unimarc3');
+
+my $request = HTTP::Request->new(
+    'GET',
+    $base . $unimarc3 . ".json",
+);
+$request->protocol('HTTP/1.1');
+my $response = $ua->request($request);
+if ( not $response->is_success) {
+    $template->param(error => $base.$unimarc3.'.json');
+    output_html_with_http_headers $cgi, $cookie, $template->output;
+    exit;
+}
+
+my $content = Encode::decode("utf8", $response->content);
+my $json = from_json( $content );
+my $r;
+my $role_name;
+my @unimarc3;
+my @results = ref $json->{sudoc}{result} eq "ARRAY"
+            ? @{ $json->{sudoc}{result} }
+            : ($json->{sudoc}{result});
+
+for my $role_node ( @results ) {
+    while ( my ( $k, $v ) = each %$role_node ) {
+        next unless $k eq "role";
+        my $role_name;
+        my $count = 0;
+        my $role_data = {};
+        my @nodes = ref $v eq "ARRAY"
+                    ? @$v
+                    : ($v);
+        for my $node ( @nodes ) {
+            while ( ( $k, $v ) = each %$node ) {
+                given ( $k ) {
+                    when ( "roleName" ) {
+                        $role_name = $v;
+                        $role_data->{role_name} = $role_name;
+                    }
+                    when ( "count" ) {
+                        $role_data->{count} = $v;
+                    }
+                    when ( "doc" ) {
+                        push @{ $role_data->{docs} }, $v;
+                    }
+                    default {
+                        # unimarcCode and marc21Code
+                    }
+                }
+            }
+        }
+        push @$r, $role_data;
+    }
+}
+
+$template->param(
+    content => $r,
+    unimarc3 => $unimarc3,
+);
+
+output_html_with_http_headers $cgi, $cookie, $template->output;
+
-- 
1.7.10.4