Add start of 2.3 installer. Remove obsolete? files conflicting with 2.3 installer
[koha.git] / C4 / Biblio.pm
index 5b56cfe..8f75db9 100644 (file)
@@ -1,4 +1,5 @@
 package C4::Biblio;
+
 # Copyright 2000-2002 Katipo Communications
 #
 # This file is part of Koha.
@@ -28,43 +29,50 @@ use vars qw($VERSION @ISA @EXPORT);
 $VERSION = 0.01;
 
 @ISA = qw(Exporter);
+
 #
 # don't forget MARCxxx subs are exported only for testing purposes. Should not be used
 # as the old-style API and the NEW one are the only public functions.
 #
 @EXPORT = qw(
-            &updateBiblio &updateBiblioItem &updateItem
-            &itemcount &newbiblio &newbiblioitem
-            &modnote &newsubject &newsubtitle
-            &modbiblio &checkitems
-            &newitems &modbibitem
-            &modsubtitle &modsubject &modaddauthor &moditem &countitems
-            &delitem &deletebiblioitem &delbiblio
-            &getitemtypes &getbiblio
-            &getbiblioitembybiblionumber
-            &getbiblioitem &getitemsbybiblioitem
-            &skip
-            &newcompletebiblioitem
-
-            &MARCfind_oldbiblionumber_from_MARCbibid
-            &MARCfind_MARCbibid_from_oldbiblionumber
-               &MARCfind_marc_from_kohafield
-            &MARCfindsubfield
-            &MARCgettagslib
-
-               &NEWnewbiblio &NEWnewitem
-               &NEWmodbiblio &NEWmoditem
-               &NEWdelbiblio &NEWdelitem
-
-            &MARCaddbiblio &MARCadditem
-            &MARCmodsubfield &MARCaddsubfield
-            &MARCmodbiblio &MARCmoditem
-            &MARCkoha2marcBiblio &MARCmarc2koha
-               &MARCkoha2marcItem &MARChtml2marc
-            &MARCgetbiblio &MARCgetitem
-            &MARCaddword &MARCdelword
-               &char_decode
- );
+  &updateBiblio &updateBiblioItem &updateItem
+  &itemcount &newbiblio &newbiblioitem
+  &modnote &newsubject &newsubtitle
+  &modbiblio &checkitems
+  &newitems &modbibitem
+  &modsubtitle &modsubject &modaddauthor &moditem &countitems
+  &delitem &deletebiblioitem &delbiblio
+  &getbiblio
+  &getbiblioitembybiblionumber
+  &getbiblioitem &getitemsbybiblioitem
+  &skip &getitemtypes
+  &newcompletebiblioitem
+
+  &MARCfind_oldbiblionumber_from_MARCbibid
+  &MARCfind_MARCbibid_from_oldbiblionumber
+  &MARCfind_marc_from_kohafield
+  &MARCfindsubfield
+  &MARCfind_frameworkcode
+  &MARCgettagslib
+
+  &NEWnewbiblio &NEWnewitem
+  &NEWmodbiblio &NEWmoditem
+  &NEWdelbiblio &NEWdelitem
+  &NEWmodbiblioframework
+
+  &MARCaddbiblio &MARCadditem
+  &MARCmodsubfield &MARCaddsubfield
+  &MARCmodbiblio &MARCmoditem
+  &MARCkoha2marcBiblio &MARCmarc2koha
+  &MARCkoha2marcItem &MARChtml2marc
+  &MARCgetbiblio &MARCgetitem
+  &MARCaddword &MARCdelword
+  &MARCdelsubfield
+  &char_decode
+  
+  &FindDuplicate
+  &DisplayISBN
+);
 
 #
 #
@@ -129,9 +137,10 @@ the db header $dbh is always passed as parameter to avoid over-DB connexion
 
 =over 4
 
-=item @tagslib = &MARCgettagslib($dbh,1|0);
+=item @tagslib = &MARCgettagslib($dbh,1|0,$itemtype);
 
 last param is 1 for liblibrarian and 0 for libopac
+$itemtype contains the itemtype framework reference. If empty or does not exist, the default one is used
 returns a hash with tag/subfield meaning
 =item ($tagfield,$tagsubfield) = &MARCfind_marc_from_kohafield($dbh,$kohafield);
 
@@ -174,7 +183,7 @@ adds a subfield in a biblio (in the MARC tables only).
 
 Returns a MARC::Record for the biblio $bibid.
 
-=item &MARCmodbiblio($dbh,$bibid,$record,$delete);
+=item &MARCmodbiblio($dbh,$bibid,$record,$frameworkcode,$delete);
 
 MARCmodbiblio changes a biblio for a biblio,MARC::Record passed as parameter
 It 1st delete the biblio, then recreates it.
@@ -195,6 +204,7 @@ MARCfindsubfieldid find a subfieldid for a bibid/tag/tagorder/subfield/subfieldo
 =item &MARCdelsubfield($dbh,$bibid,$tag,$tagorder,$subfield,$subfieldorder);
 
 MARCdelsubfield delete a subfield for a bibid/tag/tagorder/subfield/subfieldorder
+If $subfieldorder is not set, delete all the $tag$subfield subfields 
 
 =item &MARCdelbiblio($dbh,$bibid);
 
@@ -219,116 +229,153 @@ used to manage MARC_word table and should not be useful elsewhere
 =cut
 
 sub MARCgettagslib {
-       my ($dbh,$forlibrarian)= @_;
-       my $sth;
-       my $libfield = ($forlibrarian eq 1)? 'liblibrarian' : 'libopac';
-       $sth=$dbh->prepare("select tagfield,$libfield as lib,mandatory from marc_tag_structure order by tagfield");
-       $sth->execute;
-       my ($lib,$tag,$res,$tab,$mandatory,$repeatable);
-       while ( ($tag,$lib,$mandatory) = $sth->fetchrow) {
-               $res->{$tag}->{lib}=$lib;
-               $res->{$tab}->{tab}=""; # XXX
-               $res->{$tag}->{mandatory}=$mandatory;
-       }
+    my ( $dbh, $forlibrarian, $frameworkcode ) = @_;
+    $frameworkcode = "" unless $frameworkcode;
+    my $sth;
+    my $libfield = ( $forlibrarian eq 1 ) ? 'liblibrarian' : 'libopac';
+
+    # check that framework exists
+    $sth =
+      $dbh->prepare(
+        "select count(*) from marc_tag_structure where frameworkcode=?");
+    $sth->execute($frameworkcode);
+    my ($total) = $sth->fetchrow;
+    $frameworkcode = "" unless ( $total > 0 );
+    $sth =
+      $dbh->prepare(
+"select tagfield,liblibrarian,libopac,mandatory,repeatable from marc_tag_structure where frameworkcode=? order by tagfield"
+    );
+    $sth->execute($frameworkcode);
+    my ( $liblibrarian, $libopac, $tag, $res, $tab, $mandatory, $repeatable );
+
+    while ( ( $tag, $liblibrarian, $libopac, $mandatory, $repeatable ) = $sth->fetchrow ) {
+        $res->{$tag}->{lib}        = ($forlibrarian or !$libopac)?$liblibrarian:$libopac;
+        $res->{$tab}->{tab}        = "";            # XXX
+        $res->{$tag}->{mandatory}  = $mandatory;
+        $res->{$tag}->{repeatable} = $repeatable;
+    }
 
-       $sth=$dbh->prepare("select tagfield,tagsubfield,$libfield as lib,tab, mandatory, repeatable,authorised_value,thesaurus_category,value_builder,kohafield from marc_subfield_structure order by tagfield,tagsubfield");
-       $sth->execute;
-
-       my $subfield;
-       my $authorised_value;
-       my $thesaurus_category;
-       my $value_builder;
-       my $kohafield;
-       while ( ($tag, $subfield, $lib, $tab, $mandatory, $repeatable,$authorised_value,$thesaurus_category,$value_builder,$kohafield) = $sth->fetchrow) {
-               $res->{$tag}->{$subfield}->{lib}=$lib;
-               $res->{$tag}->{$subfield}->{tab}=$tab;
-               $res->{$tag}->{$subfield}->{mandatory}=$mandatory;
-               $res->{$tag}->{$subfield}->{repeatable}=$repeatable;
-               $res->{$tag}->{$subfield}->{authorised_value}=$authorised_value;
-               $res->{$tag}->{$subfield}->{thesaurus_category}=$thesaurus_category;
-               $res->{$tag}->{$subfield}->{value_builder}=$value_builder;
-               $res->{$tag}->{$subfield}->{kohafield}=$kohafield;
-       }
-       return $res;
+    $sth =
+      $dbh->prepare(
+"select tagfield,tagsubfield,liblibrarian,libopac,tab, mandatory, repeatable,authorised_value,authtypecode,value_builder,kohafield,seealso,hidden,isurl,link from marc_subfield_structure where frameworkcode=? order by tagfield,tagsubfield"
+    );
+    $sth->execute($frameworkcode);
+
+    my $subfield;
+    my $authorised_value;
+    my $authtypecode;
+    my $value_builder;
+    my $kohafield;
+    my $seealso;
+    my $hidden;
+    my $isurl;
+       my $link;
+
+    while (
+        ( $tag,         $subfield,   $liblibrarian,   , $libopac,      $tab,
+        $mandatory,     $repeatable, $authorised_value, $authtypecode,
+        $value_builder, $kohafield,  $seealso,          $hidden,
+        $isurl,                        $link )
+        = $sth->fetchrow
+      )
+    {
+        $res->{$tag}->{$subfield}->{lib}              = ($forlibrarian or !$libopac)?$liblibrarian:$libopac;
+        $res->{$tag}->{$subfield}->{tab}              = $tab;
+        $res->{$tag}->{$subfield}->{mandatory}        = $mandatory;
+        $res->{$tag}->{$subfield}->{repeatable}       = $repeatable;
+        $res->{$tag}->{$subfield}->{authorised_value} = $authorised_value;
+        $res->{$tag}->{$subfield}->{authtypecode}     = $authtypecode;
+        $res->{$tag}->{$subfield}->{value_builder}    = $value_builder;
+        $res->{$tag}->{$subfield}->{kohafield}        = $kohafield;
+        $res->{$tag}->{$subfield}->{seealso}          = $seealso;
+        $res->{$tag}->{$subfield}->{hidden}           = $hidden;
+        $res->{$tag}->{$subfield}->{isurl}            = $isurl;
+        $res->{$tag}->{$subfield}->{link}            = $link;
+    }
+    return $res;
 }
 
 sub MARCfind_marc_from_kohafield {
-    my ($dbh,$kohafield) = @_;
-    my $sth=$dbh->prepare("select tagfield,tagsubfield from marc_subfield_structure where kohafield=?");
-    $sth->execute($kohafield);
-    my ($tagfield,$tagsubfield) = $sth->fetchrow;
-    return ($tagfield,$tagsubfield);
+    my ( $dbh, $kohafield,$frameworkcode ) = @_;
+    return 0, 0 unless $kohafield;
+       my $relations = C4::Context->marcfromkohafield;
+       return ($relations->{$frameworkcode}->{$kohafield}->[0],$relations->{$frameworkcode}->{$kohafield}->[1]);
 }
 
 sub MARCfind_oldbiblionumber_from_MARCbibid {
-    my ($dbh,$MARCbibid) = @_;
-    my $sth=$dbh->prepare("select biblionumber from marc_biblio where bibid=?");
+    my ( $dbh, $MARCbibid ) = @_;
+    my $sth =
+      $dbh->prepare("select biblionumber from marc_biblio where bibid=?");
     $sth->execute($MARCbibid);
     my ($biblionumber) = $sth->fetchrow;
     return $biblionumber;
 }
 
 sub MARCfind_MARCbibid_from_oldbiblionumber {
-    my ($dbh,$oldbiblionumber) = @_;
-    my $sth=$dbh->prepare("select bibid from marc_biblio where biblionumber=?");
+    my ( $dbh, $oldbiblionumber ) = @_;
+    my $sth =
+      $dbh->prepare("select bibid from marc_biblio where biblionumber=?");
     $sth->execute($oldbiblionumber);
     my ($bibid) = $sth->fetchrow;
     return $bibid;
 }
 
 sub MARCaddbiblio {
+
 # pass the MARC::Record to this function, and it will create the records in the marc tables
-       my ($dbh,$record,$biblionumber,$bibid) = @_;
+       my ($dbh,$record,$biblionumber,$frameworkcode,$bibid) = @_;
        my @fields=$record->fields();
-#      warn "IN MARCaddbiblio $bibid => ".$record->as_formatted;
 # my $bibid;
 # adding main table, and retrieving bibid
 # if bibid is sent, then it's not a true add, it's only a re-add, after a delete (ie, a mod)
-# if bibid empty => true add, find a new bibid number
-       unless ($bibid) {
-               $dbh->do("lock tables marc_biblio WRITE,marc_subfield_table WRITE, marc_word WRITE, marc_blob_subfield WRITE, stopwords READ");
-               my $sth=$dbh->prepare("insert into marc_biblio (datecreated,biblionumber) values (now(),?)");
-               $sth->execute($biblionumber);
-               $sth=$dbh->prepare("select max(bibid) from marc_biblio");
-               $sth->execute;
-               ($bibid)=$sth->fetchrow;
-               $sth->finish;
-       }
-       my $fieldcount=0;
-       # now, add subfields...
-       foreach my $field (@fields) {
-               $fieldcount++;
-               if ($field->tag() <10) {
-                               &MARCaddsubfield($dbh,$bibid,
-                                               $field->tag(),
-                                               '',
-                                               $fieldcount,
-                                               '',
-                                               1,
-                                               $field->data()
-                                               );
-               } else {
-                       my @subfields=$field->subfields();
-                       foreach my $subfieldcount (0..$#subfields) {
-                               &MARCaddsubfield($dbh,$bibid,
-                                               $field->tag(),
-                                               $field->indicator(1).$field->indicator(2),
-                                               $fieldcount,
-                                               $subfields[$subfieldcount][0],
-                                               $subfieldcount+1,
-                                               $subfields[$subfieldcount][1]
-                                               );
-                       }
-               }
-       }
-       $dbh->do("unlock tables");
-       return $bibid;
+    # if bibid empty => true add, find a new bibid number
+    unless ($bibid) {
+        $dbh->do(
+"lock tables marc_biblio WRITE,marc_subfield_table WRITE, marc_word WRITE, marc_blob_subfield WRITE, stopwords READ"
+        );
+        my $sth =
+          $dbh->prepare(
+"insert into marc_biblio (datecreated,biblionumber,frameworkcode) values (now(),?,?)"
+        );
+        $sth->execute( $biblionumber, $frameworkcode );
+        $sth = $dbh->prepare("select max(bibid) from marc_biblio");
+        $sth->execute;
+        ($bibid) = $sth->fetchrow;
+        $sth->finish;
+    }
+    my $fieldcount = 0;
+
+    # now, add subfields...
+    foreach my $field (@fields) {
+        $fieldcount++;
+        if ( $field->tag() < 10 ) {
+            &MARCaddsubfield( $dbh, $bibid, $field->tag(), '', $fieldcount, '',
+                1, $field->data() );
+        }
+        else {
+            my @subfields = $field->subfields();
+            foreach my $subfieldcount ( 0 .. $#subfields ) {
+                &MARCaddsubfield(
+                    $dbh,
+                    $bibid,
+                    $field->tag(),
+                    $field->indicator(1) . $field->indicator(2),
+                    $fieldcount,
+                    $subfields[$subfieldcount][0],
+                    $subfieldcount + 1,
+                    $subfields[$subfieldcount][1]
+                );
+            }
+        }
+    }
+    $dbh->do("unlock tables");
+    return $bibid;
 }
 
 sub MARCadditem {
+
 # pass the MARC::Record to this function, and it will create the records in the marc tables
     my ($dbh,$record,$biblionumber) = @_;
-#    warn "adding : ".$record->as_formatted();
 # search for MARC biblionumber
     $dbh->do("lock tables marc_biblio WRITE,marc_subfield_table WRITE, marc_word WRITE, marc_blob_subfield WRITE, stopwords READ");
     my $bibid = &MARCfind_MARCbibid_from_oldbiblionumber($dbh,$biblionumber);
@@ -336,173 +383,251 @@ sub MARCadditem {
     my $sth = $dbh->prepare("select max(tagorder) from marc_subfield_table where bibid=?");
     $sth->execute($bibid);
     my ($fieldcount) = $sth->fetchrow;
+
     # now, add subfields...
     foreach my $field (@fields) {
-       my @subfields=$field->subfields();
-       $fieldcount++;
-       foreach my $subfieldcount (0..$#subfields) {
-                   &MARCaddsubfield($dbh,$bibid,
-                                $field->tag(),
-                                $field->indicator(1).$field->indicator(2),
-                                $fieldcount,
-                                $subfields[$subfieldcount][0],
-                                $subfieldcount+1,
-                                $subfields[$subfieldcount][1]
-                                );
-       }
+        my @subfields = $field->subfields();
+        $fieldcount++;
+        foreach my $subfieldcount ( 0 .. $#subfields ) {
+            &MARCaddsubfield(
+                $dbh,
+                $bibid,
+                $field->tag(),
+                $field->indicator(1) . $field->indicator(2),
+                $fieldcount,
+                $subfields[$subfieldcount][0],
+                $subfieldcount + 1,
+                $subfields[$subfieldcount][1]
+            );
+        }
     }
     $dbh->do("unlock tables");
     return $bibid;
 }
 
 sub MARCaddsubfield {
-# Add a new subfield to a tag into the DB.
-       my ($dbh,$bibid,$tagid,$tag_indicator,$tagorder,$subfieldcode,$subfieldorder,$subfieldvalues) = @_;
-       # if not value, end of job, we do nothing
-       if (length($subfieldvalues) ==0) {
-               return;
-       }
-       if (not($subfieldcode)) {
-               $subfieldcode=' ';
-       }
-       my @subfieldvalues = split /\|/,$subfieldvalues;
-       foreach my $subfieldvalue (@subfieldvalues) {
-               if (length($subfieldvalue)>255) {
-                       $dbh->do("lock tables marc_blob_subfield WRITE, marc_subfield_table WRITE");
-                       my $sth=$dbh->prepare("insert into marc_blob_subfield (subfieldvalue) values (?)");
-                       $sth->execute($subfieldvalue);
-                       $sth=$dbh->prepare("select max(blobidlink)from marc_blob_subfield");
-                       $sth->execute;
-                       my ($res)=$sth->fetchrow;
-                       $sth=$dbh->prepare("insert into marc_subfield_table (bibid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,valuebloblink) values (?,?,?,?,?,?,?)");
-                       $sth->execute($bibid,(sprintf "%03s",$tagid),$tagorder,$tag_indicator,$subfieldcode,$subfieldorder,$res);
-                       if ($sth->errstr) {
-                               warn "ERROR ==> insert into marc_subfield_table (bibid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,subfieldvalue) values ($bibid,$tagid,$tagorder,$tag_indicator,$subfieldcode,$subfieldorder,$subfieldvalue)\n";
-                       }
-               $dbh->do("unlock tables");
-               } else {
-                       my $sth=$dbh->prepare("insert into marc_subfield_table (bibid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,subfieldvalue) values (?,?,?,?,?,?,?)");
-                       $sth->execute($bibid,(sprintf "%03s",$tagid),$tagorder,$tag_indicator,$subfieldcode,$subfieldorder,$subfieldvalue);
-                       if ($sth->errstr) {
-                       warn "ERROR ==> insert into marc_subfield_table (bibid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,subfieldvalue) values ($bibid,$tagid,$tagorder,$tag_indicator,$subfieldcode,$subfieldorder,$subfieldvalue)\n";
-                       }
-               }
-               &MARCaddword($dbh,$bibid,$tagid,$tagorder,$subfieldcode,$subfieldorder,$subfieldvalue);
-       }
+
+    # Add a new subfield to a tag into the DB.
+    my (
+        $dbh,      $bibid,        $tagid,         $tag_indicator,
+        $tagorder, $subfieldcode, $subfieldorder, $subfieldvalues
+      )
+      = @_;
+         return unless $subfieldvalues;
+# warn "$tagid / $subfieldcode / $subfieldvalues";
+    # if not value, end of job, we do nothing
+#     if ( length($subfieldvalues) == 0 ) {
+#         return;
+#     }
+    if ( not($subfieldcode) ) {
+        $subfieldcode = ' ';
+    }
+    my @subfieldvalues = split /\||#/, $subfieldvalues;
+    foreach my $subfieldvalue (@subfieldvalues) {
+        if ( length($subfieldvalue) > 255 ) {
+            $dbh->do(
+"lock tables marc_blob_subfield WRITE, marc_subfield_table WRITE"
+            );
+            my $sth =
+              $dbh->prepare(
+                "insert into marc_blob_subfield (subfieldvalue) values (?)");
+            $sth->execute($subfieldvalue);
+            $sth =
+              $dbh->prepare("select max(blobidlink)from marc_blob_subfield");
+            $sth->execute;
+            my ($res) = $sth->fetchrow;
+            $sth =
+              $dbh->prepare(
+"insert into marc_subfield_table (bibid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,valuebloblink) values (?,?,?,?,?,?,?)"
+            );
+            $sth->execute( $bibid, ( sprintf "%03s", $tagid ), $tagorder,
+                $tag_indicator, $subfieldcode, $subfieldorder, $res );
+
+            if ( $sth->errstr ) {
+                warn
+"ERROR ==> insert into marc_subfield_table (bibid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,subfieldvalue) values ($bibid,$tagid,$tagorder,$tag_indicator,$subfieldcode,$subfieldorder,$subfieldvalue)\n";
+            }
+            $dbh->do("unlock tables");
+        }
+        else {
+            my $sth =
+              $dbh->prepare(
+"insert into marc_subfield_table (bibid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,subfieldvalue) values (?,?,?,?,?,?,?)"
+            );
+            $sth->execute(
+                $bibid,        ( sprintf "%03s", $tagid ),
+                $tagorder,     $tag_indicator,
+                $subfieldcode, $subfieldorder,
+                $subfieldvalue
+            );
+            if ( $sth->errstr ) {
+                warn
+"ERROR ==> insert into marc_subfield_table (bibid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,subfieldvalue) values ($bibid,$tagid,$tagorder,$tag_indicator,$subfieldcode,$subfieldorder,$subfieldvalue)\n";
+            }
+        }
+        &MARCaddword(
+            $dbh,          $bibid,         $tagid,       $tagorder,
+            $subfieldcode, $subfieldorder, $subfieldvalue
+        );
+    }
 }
 
 sub MARCgetbiblio {
-# Returns MARC::Record of the biblio passed in parameter.
-    my ($dbh,$bibid)=@_;
+
+    # Returns MARC::Record of the biblio passed in parameter.
+    my ( $dbh, $bibid ) = @_;
     my $record = MARC::Record->new();
-#---- TODO : the leader is missing
-       $record->leader('                        ');
-    my $sth=$dbh->prepare("select bibid,subfieldid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,subfieldvalue,valuebloblink
+#      warn "". $bidid;
+
+    #---- TODO : the leader is missing
+    $record->leader('                        ');
+    my $sth =
+      $dbh->prepare(
+"select bibid,subfieldid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,subfieldvalue,valuebloblink
                                 from marc_subfield_table
                                 where bibid=? order by tag,tagorder,subfieldcode
-                        ");
-       my $sth2=$dbh->prepare("select subfieldvalue from marc_blob_subfield where blobidlink=?");
-       $sth->execute($bibid);
-       my $prevtagorder=1;
-       my $prevtag='XXX';
-       my $previndicator;
-       my $field; # for >=10 tags
-       my $prevvalue; # for <10 tags
-       while (my $row=$sth->fetchrow_hashref) {
-               if ($row->{'valuebloblink'}) { #---- search blob if there is one
-                       $sth2->execute($row->{'valuebloblink'});
-                       my $row2=$sth2->fetchrow_hashref;
-                       $sth2->finish;
-                       $row->{'subfieldvalue'}=$row2->{'subfieldvalue'};
-               }
-               if ($row->{tagorder} ne $prevtagorder || $row->{tag} ne $prevtag) {
-                       $previndicator.="  ";
-                       if ($prevtag <10) {
-                       $record->add_fields((sprintf "%03s",$prevtag),$prevvalue) unless $prevtag eq "XXX"; # ignore the 1st loop
-                       } else {
-                               $record->add_fields($field) unless $prevtag eq "XXX";
-                       }
-                       undef $field;
-                       $prevtagorder=$row->{tagorder};
-                       $prevtag = $row->{tag};
-                       $previndicator=$row->{tag_indicator};
-                       if ($row->{tag}<10) {
-                               $prevvalue = $row->{subfieldvalue};
-                       } else {
-                               $field = MARC::Field->new((sprintf "%03s",$prevtag), substr($row->{tag_indicator}.'  ',0,1), substr($row->{tag_indicator}.'  ',1,1), $row->{'subfieldcode'}, $row->{'subfieldvalue'} );
-                       }
-               } else {
-                       if ($row->{tag} <10) {
-                               $record->add_fields((sprintf "%03s",$row->{tag}), $row->{'subfieldvalue'});
-                       } else {
-                               $field->add_subfields($row->{'subfieldcode'}, $row->{'subfieldvalue'} );
-                       }
-                       $prevtag= $row->{tag};
-                       $previndicator=$row->{tag_indicator};
-               }
-       }
-       # the last has not been included inside the loop... do it now !
-       if ($prevtag ne "XXX") { # check that we have found something. Otherwise, prevtag is still XXX and we
-                                               # must return an empty record, not make MARC::Record fail because we try to
-                                               # create a record with XXX as field :-(
-               if ($prevtag <10) {
-                       $record->add_fields($prevtag,$prevvalue);
-               } else {
-       #               my $field = MARC::Field->new( $prevtag, "", "", %subfieldlist);
-                       $record->add_fields($field);
-               }
-       }
-       return $record;
+                        "
+    );
+    my $sth2 =
+      $dbh->prepare(
+        "select subfieldvalue from marc_blob_subfield where blobidlink=?");
+    $sth->execute($bibid);
+    my $prevtagorder = 1;
+    my $prevtag      = 'XXX';
+    my $previndicator;
+    my $field;        # for >=10 tags
+    my $prevvalue;    # for <10 tags
+    while ( my $row = $sth->fetchrow_hashref ) {
+
+        if ( $row->{'valuebloblink'} ) {    #---- search blob if there is one
+            $sth2->execute( $row->{'valuebloblink'} );
+            my $row2 = $sth2->fetchrow_hashref;
+            $sth2->finish;
+            $row->{'subfieldvalue'} = $row2->{'subfieldvalue'};
+        }
+        if ( $row->{tagorder} ne $prevtagorder || $row->{tag} ne $prevtag ) {
+            $previndicator .= "  ";
+            if ( $prevtag < 10 ) {
+                $record->add_fields( ( sprintf "%03s", $prevtag ), $prevvalue )
+                  unless $prevtag eq "XXX";    # ignore the 1st loop
+            }
+            else {
+                $record->add_fields($field) unless $prevtag eq "XXX";
+            }
+            undef $field;
+            $prevtagorder  = $row->{tagorder};
+            $prevtag       = $row->{tag};
+            $previndicator = $row->{tag_indicator};
+            if ( $row->{tag} < 10 ) {
+                $prevvalue = $row->{subfieldvalue};
+            }
+            else {
+                $field = MARC::Field->new(
+                    ( sprintf "%03s", $prevtag ),
+                    substr( $row->{tag_indicator} . '  ', 0, 1 ),
+                    substr( $row->{tag_indicator} . '  ', 1, 1 ),
+                    $row->{'subfieldcode'},
+                    $row->{'subfieldvalue'}
+                );
+            }
+        }
+        else {
+            if ( $row->{tag} < 10 ) {
+                $record->add_fields( ( sprintf "%03s", $row->{tag} ),
+                    $row->{'subfieldvalue'} );
+            }
+            else {
+                $field->add_subfields( $row->{'subfieldcode'},
+                    $row->{'subfieldvalue'} );
+            }
+            $prevtag       = $row->{tag};
+            $previndicator = $row->{tag_indicator};
+        }
+    }
+
+    # the last has not been included inside the loop... do it now !
+    if ( $prevtag ne "XXX" )
+    { # check that we have found something. Otherwise, prevtag is still XXX and we
+         # must return an empty record, not make MARC::Record fail because we try to
+         # create a record with XXX as field :-(
+        if ( $prevtag < 10 ) {
+            $record->add_fields( $prevtag, $prevvalue );
+        }
+        else {
+
+            #                  my $field = MARC::Field->new( $prevtag, "", "", %subfieldlist);
+            $record->add_fields($field);
+        }
+    }
+    return $record;
 }
+
 sub MARCgetitem {
-# Returns MARC::Record of the biblio passed in parameter.
-    my ($dbh,$bibid,$itemnumber)=@_;
+
+    # Returns MARC::Record of the biblio passed in parameter.
+    my ( $dbh, $bibid, $itemnumber ) = @_;
     my $record = MARC::Record->new();
-# search MARC tagorder
-    my $sth2 = $dbh->prepare("select tagorder from marc_subfield_table,marc_subfield_structure where marc_subfield_table.tag=marc_subfield_structure.tagfield and marc_subfield_table.subfieldcode=marc_subfield_structure.tagsubfield and bibid=? and kohafield='items.itemnumber' and subfieldvalue=?");
-    $sth2->execute($bibid,$itemnumber);
+
+    # search MARC tagorder
+    my $sth2 =
+      $dbh->prepare(
+"select tagorder from marc_subfield_table,marc_subfield_structure where marc_subfield_table.tag=marc_subfield_structure.tagfield and marc_subfield_table.subfieldcode=marc_subfield_structure.tagsubfield and bibid=? and kohafield='items.itemnumber' and subfieldvalue=?"
+    );
+    $sth2->execute( $bibid, $itemnumber );
     my ($tagorder) = $sth2->fetchrow_array();
-#---- TODO : the leader is missing
-    my $sth=$dbh->prepare("select bibid,subfieldid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,subfieldvalue,valuebloblink
+
+    #---- TODO : the leader is missing
+    my $sth =
+      $dbh->prepare(
+"select bibid,subfieldid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,subfieldvalue,valuebloblink
                                 from marc_subfield_table
                                 where bibid=? and tagorder=? order by subfieldcode,subfieldorder
-                        ");
-       $sth2=$dbh->prepare("select subfieldvalue from marc_blob_subfield where blobidlink=?");
-       $sth->execute($bibid,$tagorder);
-       while (my $row=$sth->fetchrow_hashref) {
-       if ($row->{'valuebloblink'}) { #---- search blob if there is one
-               $sth2->execute($row->{'valuebloblink'});
-               my $row2=$sth2->fetchrow_hashref;
-               $sth2->finish;
-               $row->{'subfieldvalue'}=$row2->{'subfieldvalue'};
-       }
-       if ($record->field($row->{'tag'})) {
-           my $field;
+                        "
+    );
+    $sth2 =
+      $dbh->prepare(
+        "select subfieldvalue from marc_blob_subfield where blobidlink=?");
+    $sth->execute( $bibid, $tagorder );
+    while ( my $row = $sth->fetchrow_hashref ) {
+        if ( $row->{'valuebloblink'} ) {    #---- search blob if there is one
+            $sth2->execute( $row->{'valuebloblink'} );
+            my $row2 = $sth2->fetchrow_hashref;
+            $sth2->finish;
+            $row->{'subfieldvalue'} = $row2->{'subfieldvalue'};
+        }
+        if ( $record->field( $row->{'tag'} ) ) {
+            my $field;
+
 #--- this test must stay as this, because of strange behaviour of mySQL/Perl DBI with char var containing a number...
-#--- sometimes, eliminates 0 at beginning, sometimes no ;-\\\
-           if (length($row->{'tag'}) <3) {
-               $row->{'tag'} = "0".$row->{'tag'};
-           }
-           $field =$record->field($row->{'tag'});
-           if ($field) {
-               my $x = $field->add_subfields($row->{'subfieldcode'},$row->{'subfieldvalue'});
-               $record->delete_field($field);
-               $record->add_fields($field);
-           }
-       } else {
-           if (length($row->{'tag'}) < 3) {
-               $row->{'tag'} = "0".$row->{'tag'};
-           }
-           my $temp = MARC::Field->new($row->{'tag'}," "," ", $row->{'subfieldcode'} => $row->{'subfieldvalue'});
-           $record->add_fields($temp);
-       }
+            #--- sometimes, eliminates 0 at beginning, sometimes no ;-\\\
+            if ( length( $row->{'tag'} ) < 3 ) {
+                $row->{'tag'} = "0" . $row->{'tag'};
+            }
+            $field = $record->field( $row->{'tag'} );
+            if ($field) {
+                my $x =
+                  $field->add_subfields( $row->{'subfieldcode'},
+                    $row->{'subfieldvalue'} );
+                $record->delete_field($field);
+                $record->add_fields($field);
+            }
+        }
+        else {
+            if ( length( $row->{'tag'} ) < 3 ) {
+                $row->{'tag'} = "0" . $row->{'tag'};
+            }
+            my $temp =
+              MARC::Field->new( $row->{'tag'}, " ", " ",
+                $row->{'subfieldcode'} => $row->{'subfieldvalue'} );
+            $record->add_fields($temp);
+        }
 
     }
     return $record;
 }
 
 sub MARCmodbiblio {
-       my ($dbh,$bibid,$record,$delete)=@_;
+       my ($dbh,$bibid,$record,$frameworkcode,$delete)=@_;
        my $oldrecord=&MARCgetbiblio($dbh,$bibid);
        if ($oldrecord eq $record) {
                return;
@@ -511,296 +636,387 @@ sub MARCmodbiblio {
 # 2nd recreate it
        my $biblionumber = MARCfind_oldbiblionumber_from_MARCbibid($dbh,$bibid);
        &MARCdelbiblio($dbh,$bibid,1);
-       &MARCaddbiblio($dbh,$record,$biblionumber,$bibid);
+       &MARCaddbiblio($dbh,$record,$biblionumber,$frameworkcode,$bibid);
 }
 
 sub MARCdelbiblio {
-       my ($dbh,$bibid,$keep_items) = @_;
-# if the keep_item is set to 1, then all items are preserved.
-# This flag is set when the delbiblio is called by modbiblio
-# due to a too complex structure of MARC (repeatable fields and subfields),
-# the best solution for a modif is to delete / recreate the record.
+    my ( $dbh, $bibid, $keep_items ) = @_;
+
+    # if the keep_item is set to 1, then all items are preserved.
+    # This flag is set when the delbiblio is called by modbiblio
+    # due to a too complex structure of MARC (repeatable fields and subfields),
+    # the best solution for a modif is to delete / recreate the record.
 
 # 1st of all, copy the MARC::Record to deletedbiblio table => if a true deletion, MARC data will be kept.
 # if deletion called before MARCmodbiblio => won't do anything, as the oldbiblionumber doesn't
-# exist in deletedbiblio table
-       my $record = MARCgetbiblio($dbh,$bibid);
-       my $oldbiblionumber = MARCfind_oldbiblionumber_from_MARCbibid($dbh,$bibid);
-       my $copy2deleted=$dbh->prepare("update deletedbiblio set marc=? where biblionumber=?");
-       $copy2deleted->execute($record->as_usmarc(),$oldbiblionumber);
-# now, delete in MARC tables.
-       if ($keep_items eq 1) {
-       #search item field code
-               my $sth = $dbh->prepare("select tagfield from marc_subfield_structure where kohafield like 'items.%'");
-               $sth->execute;
-               my $itemtag = $sth->fetchrow_hashref->{tagfield};
-               $dbh->do("delete from marc_subfield_table where bibid=$bibid and tag<>$itemtag");
-               $dbh->do("delete from marc_word where bibid=$bibid and tag<>$itemtag");
-       } else {
-               $dbh->do("delete from marc_biblio where bibid=$bibid");
-               $dbh->do("delete from marc_subfield_table where bibid=$bibid");
-               $dbh->do("delete from marc_word where bibid=$bibid");
-       }
+    # exist in deletedbiblio table
+    my $record = MARCgetbiblio( $dbh, $bibid );
+    my $oldbiblionumber =
+      MARCfind_oldbiblionumber_from_MARCbibid( $dbh, $bibid );
+    my $copy2deleted =
+      $dbh->prepare("update deletedbiblio set marc=? where biblionumber=?");
+    $copy2deleted->execute( $record->as_usmarc(), $oldbiblionumber );
+
+    # now, delete in MARC tables.
+    if ( $keep_items eq 1 ) {
+
+        #search item field code
+        my $sth =
+          $dbh->prepare(
+"select tagfield from marc_subfield_structure where kohafield like 'items.%'"
+        );
+        $sth->execute;
+        my $itemtag = $sth->fetchrow_hashref->{tagfield};
+        $dbh->do(
+"delete from marc_subfield_table where bibid=$bibid and tag<>$itemtag"
+        );
+        $dbh->do(
+"delete from marc_word where bibid=$bibid and not (tagsubfield like \"$itemtag%\")"
+        );
+    }
+    else {
+        $dbh->do("delete from marc_biblio where bibid=$bibid");
+        $dbh->do("delete from marc_subfield_table where bibid=$bibid");
+        $dbh->do("delete from marc_word where bibid=$bibid");
+    }
 }
 
 sub MARCdelitem {
-# delete the item passed in parameter in MARC tables.
-       my ($dbh,$bibid,$itemnumber)=@_;
-       #    my $record = MARC::Record->new();
-       # search MARC tagorder
-       my $record = MARCgetitem($dbh,$bibid,$itemnumber);
-       my $copy2deleted=$dbh->prepare("update deleteditems set marc=? where itemnumber=?");
-       $copy2deleted->execute($record->as_usmarc(),$itemnumber);
-
-       my $sth2 = $dbh->prepare("select tagorder from marc_subfield_table,marc_subfield_structure where marc_subfield_table.tag=marc_subfield_structure.tagfield and marc_subfield_table.subfieldcode=marc_subfield_structure.tagsubfield and bibid=? and kohafield='items.itemnumber' and subfieldvalue=?");
-       $sth2->execute($bibid,$itemnumber);
-       my ($tagorder) = $sth2->fetchrow_array();
-       my $sth=$dbh->prepare("delete from marc_subfield_table where bibid=? and tagorder=?");
-       $sth->execute($bibid,$tagorder);
+
+    # delete the item passed in parameter in MARC tables.
+    my ( $dbh, $bibid, $itemnumber ) = @_;
+
+    #    my $record = MARC::Record->new();
+    # search MARC tagorder
+    my $record = MARCgetitem( $dbh, $bibid, $itemnumber );
+    my $copy2deleted =
+      $dbh->prepare("update deleteditems set marc=? where itemnumber=?");
+    $copy2deleted->execute( $record->as_usmarc(), $itemnumber );
+
+    my $sth2 =
+      $dbh->prepare(
+"select tagorder from marc_subfield_table,marc_subfield_structure where marc_subfield_table.tag=marc_subfield_structure.tagfield and marc_subfield_table.subfieldcode=marc_subfield_structure.tagsubfield and bibid=? and kohafield='items.itemnumber' and subfieldvalue=?"
+    );
+    $sth2->execute( $bibid, $itemnumber );
+    my ($tagorder) = $sth2->fetchrow_array();
+    my $sth =
+      $dbh->prepare(
+        "delete from marc_subfield_table where bibid=? and tagorder=?");
+    $sth->execute( $bibid, $tagorder );
 }
 
 sub MARCmoditem {
        my ($dbh,$record,$bibid,$itemnumber,$delete)=@_;
-       my $oldrecord=&MARCgetitem($dbh,$bibid,$itemnumber);
-       # if nothing to change, don't waste time...
-       if ($oldrecord eq $record) {
-               return;
-       }
-
-       # otherwise, skip through each subfield...
-       my @fields = $record->fields();
-       # search old MARC item
-       my $sth2 = $dbh->prepare("select tagorder from marc_subfield_table,marc_subfield_structure where marc_subfield_table.tag=marc_subfield_structure.tagfield and marc_subfield_table.subfieldcode=marc_subfield_structure.tagsubfield and bibid=? and kohafield='items.itemnumber' and subfieldvalue=?");
-       $sth2->execute($bibid,$itemnumber);
-       my ($tagorder) = $sth2->fetchrow_array();
-       foreach my $field (@fields) {
-               my $oldfield = $oldrecord->field($field->tag());
-               my @subfields=$field->subfields();
-               my $subfieldorder=0;
-               foreach my $subfield (@subfields) {
-                       $subfieldorder++;
-#                      warn "compare : $oldfield".$oldfield->subfield(@$subfield[0]);
-                       if ($oldfield eq 0 or (length($oldfield->subfield(@$subfield[0])) ==0) ) {
-               # just adding datas...
-#              warn "addfield : / $subfieldorder / @$subfield[0] - @$subfield[1]";
-#                              warn "NEW subfield : $bibid,".$field->tag().",".$tagorder.",".@$subfield[0].",".$subfieldorder.",".@$subfield[1].")";
-                               &MARCaddsubfield($dbh,$bibid,$field->tag(),$field->indicator(1).$field->indicator(2),
-                                               $tagorder,@$subfield[0],$subfieldorder,@$subfield[1]);
-                       } else {
-#              warn "modfield : / $subfieldorder / @$subfield[0] - @$subfield[1]";
-               # modify he subfield if it's a different string
-                               if ($oldfield->subfield(@$subfield[0]) ne @$subfield[1] ) {
-                                       my $subfieldid=&MARCfindsubfieldid($dbh,$bibid,$field->tag(),$tagorder,@$subfield[0],$subfieldorder);
-#                                      warn "changing : $subfieldid, $bibid,".$field->tag(),",$tagorder,@$subfield[0],@$subfield[1],$subfieldorder";
-                                       &MARCmodsubfield($dbh,$subfieldid,@$subfield[1]);
-                               }
-                       }
-               }
-       }
+       my $biblionumber = MARCfind_oldbiblionumber_from_MARCbibid($dbh,$bibid);
+       &MARCdelitem($dbh,$bibid,$itemnumber);
+       &MARCadditem($dbh,$record,$biblionumber);
 }
 
-
 sub MARCmodsubfield {
-# Subroutine changes a subfield value given a subfieldid.
-    my ($dbh, $subfieldid, $subfieldvalue )=@_;
+
+    # Subroutine changes a subfield value given a subfieldid.
+    my ( $dbh, $subfieldid, $subfieldvalue ) = @_;
     $dbh->do("lock tables marc_blob_subfield WRITE,marc_subfield_table WRITE");
-    my $sth1=$dbh->prepare("select valuebloblink from marc_subfield_table where subfieldid=?");
+    my $sth1 =
+      $dbh->prepare(
+        "select valuebloblink from marc_subfield_table where subfieldid=?");
     $sth1->execute($subfieldid);
-    my ($oldvaluebloblink)=$sth1->fetchrow;
+    my ($oldvaluebloblink) = $sth1->fetchrow;
     $sth1->finish;
     my $sth;
+
     # if too long, use a bloblink
-    if (length($subfieldvalue)>255 ) {
-       # if already a bloblink, update it, otherwise, insert a new one.
-       if ($oldvaluebloblink) {
-           $sth=$dbh->prepare("update marc_blob_subfield set subfieldvalue=? where blobidlink=?");
-           $sth->execute($subfieldvalue,$oldvaluebloblink);
-       } else {
-           $sth=$dbh->prepare("insert into marc_blob_subfield (subfieldvalue) values (?)");
-           $sth->execute($subfieldvalue);
-           $sth=$dbh->prepare("select max(blobidlink) from marc_blob_subfield");
-           $sth->execute;
-           my ($res)=$sth->fetchrow;
-           $sth=$dbh->prepare("update marc_subfield_table set subfieldvalue=null, valuebloblink=$res where subfieldid=?");
-           $sth->execute($subfieldid);
-       }
-    } else {
-       # note this can leave orphan bloblink. Not a big problem, but we should build somewhere a orphan deleting script...
-       $sth=$dbh->prepare("update marc_subfield_table set subfieldvalue=?,valuebloblink=null where subfieldid=?");
-       $sth->execute($subfieldvalue, $subfieldid);
+    if ( length($subfieldvalue) > 255 ) {
+
+        # if already a bloblink, update it, otherwise, insert a new one.
+        if ($oldvaluebloblink) {
+            $sth =
+              $dbh->prepare(
+"update marc_blob_subfield set subfieldvalue=? where blobidlink=?"
+            );
+            $sth->execute( $subfieldvalue, $oldvaluebloblink );
+        }
+        else {
+            $sth =
+              $dbh->prepare(
+                "insert into marc_blob_subfield (subfieldvalue) values (?)");
+            $sth->execute($subfieldvalue);
+            $sth =
+              $dbh->prepare("select max(blobidlink) from marc_blob_subfield");
+            $sth->execute;
+            my ($res) = $sth->fetchrow;
+            $sth =
+              $dbh->prepare(
+"update marc_subfield_table set subfieldvalue=null, valuebloblink=? where subfieldid=?"
+            );
+            $sth->execute( $res, $subfieldid );
+        }
+    }
+    else {
+
+# note this can leave orphan bloblink. Not a big problem, but we should build somewhere a orphan deleting script...
+        $sth =
+          $dbh->prepare(
+"update marc_subfield_table set subfieldvalue=?,valuebloblink=null where subfieldid=?"
+        );
+        $sth->execute( $subfieldvalue, $subfieldid );
     }
     $dbh->do("unlock tables");
     $sth->finish;
-    $sth=$dbh->prepare("select bibid,tag,tagorder,subfieldcode,subfieldid,subfieldorder from marc_subfield_table where subfieldid=?");
+    $sth =
+      $dbh->prepare(
+"select bibid,tag,tagorder,subfieldcode,subfieldid,subfieldorder from marc_subfield_table where subfieldid=?"
+    );
     $sth->execute($subfieldid);
-    my ($bibid,$tagid,$tagorder,$subfieldcode,$x,$subfieldorder) = $sth->fetchrow;
-    $subfieldid=$x;
-    &MARCdelword($dbh,$bibid,$tagid,$tagorder,$subfieldcode,$subfieldorder);
-    &MARCaddword($dbh,$bibid,$tagid,$tagorder,$subfieldcode,$subfieldorder,$subfieldvalue);
-    return($subfieldid, $subfieldvalue);
+    my ( $bibid, $tagid, $tagorder, $subfieldcode, $x, $subfieldorder ) =
+      $sth->fetchrow;
+    $subfieldid = $x;
+    &MARCdelword( $dbh, $bibid, $tagid, $tagorder, $subfieldcode,
+        $subfieldorder );
+    &MARCaddword(
+        $dbh,          $bibid,         $tagid,       $tagorder,
+        $subfieldcode, $subfieldorder, $subfieldvalue
+    );
+    return ( $subfieldid, $subfieldvalue );
 }
 
 sub MARCfindsubfield {
-    my ($dbh,$bibid,$tag,$subfieldcode,$subfieldorder,$subfieldvalue) = @_;
-    my $resultcounter=0;
+    my ( $dbh, $bibid, $tag, $subfieldcode, $subfieldorder, $subfieldvalue ) =
+      @_;
+    my $resultcounter = 0;
     my $subfieldid;
     my $lastsubfieldid;
-    my $query="select subfieldid from marc_subfield_table where bibid=? and tag=? and subfieldcode=?";
+    my $query =
+"select subfieldid from marc_subfield_table where bibid=? and tag=? and subfieldcode=?";
+    my @bind_values = ( $bibid, $tag, $subfieldcode );
     if ($subfieldvalue) {
-       $query .= " and subfieldvalue=".$dbh->quote($subfieldvalue);
-    } else {
-       if ($subfieldorder<1) {
-           $subfieldorder=1;
-       }
-       $query .= " and subfieldorder=$subfieldorder";
+        $query .= " and subfieldvalue=?";
+        push ( @bind_values, $subfieldvalue );
     }
-    my $sti=$dbh->prepare($query);
-    $sti->execute($bibid,$tag, $subfieldcode);
-    while (($subfieldid) = $sti->fetchrow) {
-       $resultcounter++;
-       $lastsubfieldid=$subfieldid;
+    else {
+        if ( $subfieldorder < 1 ) {
+            $subfieldorder = 1;
+        }
+        $query .= " and subfieldorder=?";
+        push ( @bind_values, $subfieldorder );
     }
-    if ($resultcounter>1) {
-       # Error condition.  Values given did not resolve into a unique record.  Don't know what to edit
-       # should rarely occur (only if we use subfieldvalue with a value that exists twice, which is strange)
-       return -1;
-    } else {
-       return $lastsubfieldid;
+    my $sti = $dbh->prepare($query);
+    $sti->execute(@bind_values);
+    while ( ($subfieldid) = $sti->fetchrow ) {
+        $resultcounter++;
+        $lastsubfieldid = $subfieldid;
+    }
+    if ( $resultcounter > 1 ) {
+
+# Error condition.  Values given did not resolve into a unique record.  Don't know what to edit
+# should rarely occur (only if we use subfieldvalue with a value that exists twice, which is strange)
+        return -1;
+    }
+    else {
+        return $lastsubfieldid;
     }
 }
 
 sub MARCfindsubfieldid {
-       my ($dbh,$bibid,$tag,$tagorder,$subfield,$subfieldorder) = @_;
-       my $sth=$dbh->prepare("select subfieldid from marc_subfield_table
+    my ( $dbh, $bibid, $tag, $tagorder, $subfield, $subfieldorder ) = @_;
+    my $sth = $dbh->prepare( "select subfieldid from marc_subfield_table
                                where bibid=? and tag=? and tagorder=?
-                                       and subfieldcode=? and subfieldorder=?");
-       $sth->execute($bibid,$tag,$tagorder,$subfield,$subfieldorder);
-       my ($res) = $sth->fetchrow;
-       unless ($res) {
-               $sth=$dbh->prepare("select subfieldid from marc_subfield_table
+                                       and subfieldcode=? and subfieldorder=?"
+    );
+    $sth->execute( $bibid, $tag, $tagorder, $subfield, $subfieldorder );
+    my ($res) = $sth->fetchrow;
+    unless ($res) {
+        $sth = $dbh->prepare( "select subfieldid from marc_subfield_table
                                where bibid=? and tag=? and tagorder=?
-                                       and subfieldcode=?");
-               $sth->execute($bibid,$tag,$tagorder,$subfield);
-               ($res) = $sth->fetchrow;
-       }
+                                       and subfieldcode=?"
+        );
+        $sth->execute( $bibid, $tag, $tagorder, $subfield );
+        ($res) = $sth->fetchrow;
+    }
     return $res;
 }
 
+sub MARCfind_frameworkcode {
+    my ( $dbh, $bibid ) = @_;
+    my $sth =
+      $dbh->prepare("select frameworkcode from marc_biblio where bibid=?");
+    $sth->execute($bibid);
+    my ($frameworkcode) = $sth->fetchrow;
+    return $frameworkcode;
+}
+
 sub MARCdelsubfield {
-# delete a subfield for $bibid / tag / tagorder / subfield / subfieldorder
-    my ($dbh,$bibid,$tag,$tagorder,$subfield,$subfieldorder) = @_;
-    $dbh->do("delete from marc_subfield_table where bibid='$bibid' and
-                       tag='$tag' and tagorder='$tagorder'
-                       and subfieldcode='$subfield' and subfieldorder='$subfieldorder
-                       ");
+
+    # delete a subfield for $bibid / tag / tagorder / subfield / subfieldorder
+    my ( $dbh, $bibid, $tag, $tagorder, $subfield, $subfieldorder ) = @_;
+       if ($subfieldorder) {
+               $dbh->do( "delete from marc_subfield_table where bibid='$bibid' and
+                               tag='$tag' and tagorder='$tagorder'
+                               and subfieldcode='$subfield' and subfieldorder='$subfieldorder'
+                               "
+               );
+               $dbh->do( "delete from marc_word where bibid='$bibid' and
+                               tagsubfield='$tag$subfield' and tagorder='$tagorder'
+                               and subfieldorder='$subfieldorder'
+                               "
+               );
+       } else {
+               $dbh->do( "delete from marc_subfield_table where bibid='$bibid' and
+                               tag='$tag' and tagorder='$tagorder'
+                               and subfieldcode='$subfield'"
+               );
+               $dbh->do( "delete from marc_word where bibid='$bibid' and
+                               tagsubfield='$tag$subfield' and tagorder='$tagorder'"
+               );
+       }
 }
 
 sub MARCkoha2marcBiblio {
-# this function builds partial MARC::Record from the old koha-DB fields
-    my ($dbh,$biblionumber,$biblioitemnumber) = @_;
-    my $sth=$dbh->prepare("select tagfield,tagsubfield from marc_subfield_structure where kohafield=?");
+
+    # this function builds partial MARC::Record from the old koha-DB fields
+    my ( $dbh, $biblionumber, $biblioitemnumber ) = @_;
+    my $sth =
+      $dbh->prepare(
+"select tagfield,tagsubfield from marc_subfield_structure where frameworkcode=? and kohafield=?"
+    );
     my $record = MARC::Record->new();
-#--- if bibid, then retrieve old-style koha data
-    if ($biblionumber>0) {
-       my $sth2=$dbh->prepare("select biblionumber,author,title,unititle,notes,abstract,serial,seriestitle,copyrightdate,timestamp
-               from biblio where biblionumber=?");
-       $sth2->execute($biblionumber);
-       my $row=$sth2->fetchrow_hashref;
-       my $code;
-       foreach $code (keys %$row) {
-           if ($row->{$code}) {
-               &MARCkoha2marcOnefield($sth,$record,"biblio.".$code,$row->{$code});
-           }
-       }
+
+    #--- if bibid, then retrieve old-style koha data
+    if ( $biblionumber > 0 ) {
+        my $sth2 =
+          $dbh->prepare(
+"select biblionumber,author,title,unititle,notes,abstract,serial,seriestitle,copyrightdate,timestamp
+               from biblio where biblionumber=?"
+        );
+        $sth2->execute($biblionumber);
+        my $row = $sth2->fetchrow_hashref;
+        my $code;
+        foreach $code ( keys %$row ) {
+            if ( $row->{$code} ) {
+                &MARCkoha2marcOnefield( $sth, $record, "biblio." . $code,
+                    $row->{$code}, '');
+            }
+        }
     }
-#--- if biblioitem, then retrieve old-style koha data
-    if ($biblioitemnumber>0) {
-       my $sth2=$dbh->prepare(" SELECT biblioitemnumber,biblionumber,volume,number,classification,
+
+    #--- if biblioitem, then retrieve old-style koha data
+    if ( $biblioitemnumber > 0 ) {
+        my $sth2 =
+          $dbh->prepare(
+            " SELECT biblioitemnumber,biblionumber,volume,number,classification,
                                                itemtype,url,isbn,issn,dewey,subclass,publicationyear,publishercode,
                                                volumedate,volumeddesc,timestamp,illus,pages,notes AS bnotes,size,place
                                        FROM biblioitems
                                        WHERE biblioitemnumber=?
-                                       ");
-       $sth2->execute($biblioitemnumber);
-       my $row=$sth2->fetchrow_hashref;
-       my $code;
-       foreach $code (keys %$row) {
-           if ($row->{$code}) {
-               &MARCkoha2marcOnefield($sth,$record,"biblioitems.".$code,$row->{$code});
-           }
-       }
+                                       "
+        );
+        $sth2->execute($biblioitemnumber);
+        my $row = $sth2->fetchrow_hashref;
+        my $code;
+        foreach $code ( keys %$row ) {
+            if ( $row->{$code} ) {
+                &MARCkoha2marcOnefield( $sth, $record, "biblioitems." . $code,
+                    $row->{$code},'' );
+            }
+        }
+    }
+
+    # other fields => additional authors, subjects, subtitles
+    my $sth2 =
+      $dbh->prepare(
+        " SELECT author FROM additionalauthors WHERE biblionumber=?");
+    $sth2->execute($biblionumber);
+    while ( my $row = $sth2->fetchrow_hashref ) {
+        &MARCkoha2marcOnefield( $sth, $record, "additionalauthors.author",
+            $row->{'author'},'' );
+    }
+    $sth2 =
+      $dbh->prepare(" SELECT subject FROM bibliosubject WHERE biblionumber=?");
+    $sth2->execute($biblionumber);
+    while ( my $row = $sth2->fetchrow_hashref ) {
+        &MARCkoha2marcOnefield( $sth, $record, "bibliosubject.subject",
+            $row->{'subject'},'' );
+    }
+    $sth2 =
+      $dbh->prepare(
+        " SELECT subtitle FROM bibliosubtitle WHERE biblionumber=?");
+    $sth2->execute($biblionumber);
+    while ( my $row = $sth2->fetchrow_hashref ) {
+        &MARCkoha2marcOnefield( $sth, $record, "bibliosubtitle.subtitle",
+            $row->{'subtitle'},'' );
     }
-       # other fields => additional authors, subjects, subtitles
-       my $sth2=$dbh->prepare(" SELECT author FROM additionalauthors WHERE biblionumber=?");
-       $sth2->execute($biblionumber);
-       while (my $row=$sth2->fetchrow_hashref) {
-                       &MARCkoha2marcOnefield($sth,$record,"additionalauthors.author",$row->{'author'});
-               }
-       my $sth2=$dbh->prepare(" SELECT subject FROM bibliosubject WHERE biblionumber=?");
-       $sth2->execute($biblionumber);
-       while (my $row=$sth2->fetchrow_hashref) {
-                       &MARCkoha2marcOnefield($sth,$record,"bibliosubject.subject",$row->{'subject'});
-               }
-       my $sth2=$dbh->prepare(" SELECT subtitle FROM bibliosubtitle WHERE biblionumber=?");
-       $sth2->execute($biblionumber);
-       while (my $row=$sth2->fetchrow_hashref) {
-                       &MARCkoha2marcOnefield($sth,$record,"bibliosubtitle.title",$row->{'subtitle'});
-               }
     return $record;
 }
 
 sub MARCkoha2marcItem {
-# this function builds partial MARC::Record from the old koha-DB fields
-    my ($dbh,$biblionumber,$itemnumber) = @_;
-#    my $dbh=&C4Connect;
-    my $sth=$dbh->prepare("select tagfield,tagsubfield from marc_subfield_structure where kohafield=?");
+
+    # this function builds partial MARC::Record from the old koha-DB fields
+    my ( $dbh, $biblionumber, $itemnumber ) = @_;
+
+    #    my $dbh=&C4Connect;
+    my $sth =
+      $dbh->prepare(
+"select tagfield,tagsubfield from marc_subfield_structure where frameworkcode=? and kohafield=?"
+    );
     my $record = MARC::Record->new();
-#--- if item, then retrieve old-style koha data
-    if ($itemnumber>0) {
-#      print STDERR "prepare $biblionumber,$itemnumber\n";
-       my $sth2=$dbh->prepare("SELECT itemnumber,biblionumber,multivolumepart,biblioitemnumber,barcode,dateaccessioned,
+
+    #--- if item, then retrieve old-style koha data
+    if ( $itemnumber > 0 ) {
+
+        #      print STDERR "prepare $biblionumber,$itemnumber\n";
+        my $sth2 =
+          $dbh->prepare(
+"SELECT itemnumber,biblionumber,multivolumepart,biblioitemnumber,barcode,dateaccessioned,
                                                booksellerid,homebranch,price,replacementprice,replacementpricedate,datelastborrowed,
-                                               datelastseen,multivolume,stack,notforloan,itemlost,wthdrawn,bulk,issues,renewals,
+                                               datelastseen,multivolume,stack,notforloan,itemlost,wthdrawn,itemcallnumber,issues,renewals,
                                        reserves,restricted,binding,itemnotes,holdingbranch,timestamp
                                        FROM items
-                                       WHERE itemnumber=?");
-       $sth2->execute($itemnumber);
-       my $row=$sth2->fetchrow_hashref;
-       my $code;
-       foreach $code (keys %$row) {
-           if ($row->{$code}) {
-               &MARCkoha2marcOnefield($sth,$record,"items.".$code,$row->{$code});
-           }
-       }
+                                       WHERE itemnumber=?"
+        );
+        $sth2->execute($itemnumber);
+        my $row = $sth2->fetchrow_hashref;
+        my $code;
+        foreach $code ( keys %$row ) {
+            if ( $row->{$code} ) {
+                &MARCkoha2marcOnefield( $sth, $record, "items." . $code,
+                    $row->{$code},'' );
+            }
+        }
     }
     return $record;
 }
 
 sub MARCkoha2marcSubtitle {
-# this function builds partial MARC::Record from the old koha-DB fields
-    my ($dbh,$bibnum,$subtitle) = @_;
-    my $sth=$dbh->prepare("select tagfield,tagsubfield from marc_subfield_structure where kohafield=?");
+
+    # this function builds partial MARC::Record from the old koha-DB fields
+    my ( $dbh, $bibnum, $subtitle ) = @_;
+    my $sth =
+      $dbh->prepare(
+"select tagfield,tagsubfield from marc_subfield_structure where frameworkcode=? and kohafield=?"
+    );
     my $record = MARC::Record->new();
-    &MARCkoha2marcOnefield($sth,$record,"bibliosubtitle.subtitle",$subtitle);
+    &MARCkoha2marcOnefield( $sth, $record, "bibliosubtitle.subtitle",
+        $subtitle,'' );
     return $record;
 }
 
 sub MARCkoha2marcOnefield {
-    my ($sth,$record,$kohafieldname,$value)=@_;
+    my ( $sth, $record, $kohafieldname, $value,$frameworkcode ) = @_;
     my $tagfield;
     my $tagsubfield;
-    $sth->execute($kohafieldname);
-    if (($tagfield,$tagsubfield)=$sth->fetchrow) {
-       if ($record->field($tagfield)) {
-           my $tag =$record->field($tagfield);
-           if ($tag) {
-               $tag->add_subfields($tagsubfield,$value);
-               $record->delete_field($tag);
-               $record->add_fields($tag);
-           }
-       } else {
-           $record->add_fields($tagfield," "," ",$tagsubfield => $value);
-       }
+    $sth->execute($frameworkcode,$kohafieldname);
+    if ( ( $tagfield, $tagsubfield ) = $sth->fetchrow ) {
+        if ( $record->field($tagfield) ) {
+            my $tag = $record->field($tagfield);
+            if ($tag) {
+                $tag->add_subfields( $tagsubfield, $value );
+                $record->delete_field($tag);
+                $record->add_fields($tag);
+            }
+        }
+        else {
+            $record->add_fields( $tagfield, " ", " ", $tagsubfield => $value );
+        }
     }
     return $record;
 }
@@ -814,6 +1030,7 @@ sub MARChtml2marc {
        my $field; # if tag >=10
        for (my $i=0; $i< @$rtags; $i++) {
                # rebuild MARC::Record
+#                      warn "0=>".@$rtags[$i].@$rsubfields[$i]." = ".@$rvalues[$i].": ";
                if (@$rtags[$i] ne $prevtag) {
                        if ($prevtag < 10) {
                                if ($prevvalue) {
@@ -827,52 +1044,55 @@ sub MARChtml2marc {
                        $indicators{@$rtags[$i]}.='  ';
                        if (@$rtags[$i] <10) {
                                $prevvalue= @$rvalues[$i];
+                               undef $field;
                        } else {
+                               undef $prevvalue;
                                $field = MARC::Field->new( (sprintf "%03s",@$rtags[$i]), substr($indicators{@$rtags[$i]},0,1),substr($indicators{@$rtags[$i]},1,1), @$rsubfields[$i] => @$rvalues[$i]);
+#                      warn "1=>".@$rtags[$i].@$rsubfields[$i]." = ".@$rvalues[$i].": ".$field->as_formatted;
                        }
                        $prevtag = @$rtags[$i];
                } else {
                        if (@$rtags[$i] <10) {
                                $prevvalue=@$rvalues[$i];
                        } else {
-                               if (@$rvalues[$i]) {
+                               if (length(@$rvalues[$i])>0) {
                                        $field->add_subfields(@$rsubfields[$i] => @$rvalues[$i]);
+#                      warn "2=>".@$rtags[$i].@$rsubfields[$i]." = ".@$rvalues[$i].": ".$field->as_formatted;
                                }
                        }
                        $prevtag= @$rtags[$i];
                }
        }
        # the last has not been included inside the loop... do it now !
-       $record->add_fields($field);
-#      warn $record->as_formatted;
+       $record->add_fields($field) if $field;
+#      warn "HTML2MARC=".$record->as_formatted;
        return $record;
 }
 
 sub MARCmarc2koha {
-       my ($dbh,$record) = @_;
-       my $sth=$dbh->prepare("select tagfield,tagsubfield from marc_subfield_structure where kohafield=?");
+       my ($dbh,$record,$frameworkcode) = @_;
+       my $sth=$dbh->prepare("select tagfield,tagsubfield from marc_subfield_structure where frameworkcode=? and kohafield=?");
        my $result;
        my $sth2=$dbh->prepare("SHOW COLUMNS from biblio");
        $sth2->execute;
        my $field;
-       #    print STDERR $record->as_formatted;
        while (($field)=$sth2->fetchrow) {
-               $result=&MARCmarc2kohaOneField($sth,"biblio",$field,$record,$result);
+               $result=&MARCmarc2kohaOneField($sth,"biblio",$field,$record,$result,$frameworkcode);
        }
        $sth2=$dbh->prepare("SHOW COLUMNS from biblioitems");
        $sth2->execute;
        while (($field)=$sth2->fetchrow) {
                if ($field eq 'notes') { $field = 'bnotes'; }
-               $result=&MARCmarc2kohaOneField($sth,"biblioitems",$field,$record,$result);
+               $result=&MARCmarc2kohaOneField($sth,"biblioitems",$field,$record,$result,$frameworkcode);
        }
        $sth2=$dbh->prepare("SHOW COLUMNS from items");
        $sth2->execute;
        while (($field)=$sth2->fetchrow) {
-               $result = &MARCmarc2kohaOneField($sth,"items",$field,$record,$result);
+               $result=&MARCmarc2kohaOneField($sth,"items",$field,$record,$result,$frameworkcode);
        }
        # additional authors : specific
-       $result = &MARCmarc2kohaOneField($sth,"bibliosubtitle","subtitle",$record,$result);
-       $result = &MARCmarc2kohaOneField($sth,"additionalauthors","additionalauthors",$record,$result);
+       $result = &MARCmarc2kohaOneField($sth,"bibliosubtitle","subtitle",$record,$result,$frameworkcode);
+       $result = &MARCmarc2kohaOneField($sth,"additionalauthors","additionalauthors",$record,$result,$frameworkcode);
 # modify copyrightdate to keep only the 1st year found
        my $temp = $result->{'copyrightdate'};
        $temp =~ m/c(\d\d\d\d)/; # search cYYYY first
@@ -883,7 +1103,7 @@ sub MARCmarc2koha {
                $result->{'copyrightdate'} = $1;
        }
 # modify publicationyear to keep only the 1st year found
-       my $temp = $result->{'publicationyear'};
+       $temp = $result->{'publicationyear'};
        $temp =~ m/c(\d\d\d\d)/; # search cYYYY first
        if ($1>0) {
                $result->{'publicationyear'} = $1;
@@ -895,51 +1115,70 @@ sub MARCmarc2koha {
 }
 
 sub MARCmarc2kohaOneField {
+
 # FIXME ? if a field has a repeatable subfield that is used in old-db, only the 1st will be retrieved...
-       my ($sth,$kohatable,$kohafield,$record,$result)= @_;
-#    warn "kohatable / $kohafield / $result / ";
-       my $res="";
-       my $tagfield;
-       my $subfield;
-       $sth->execute($kohatable.".".$kohafield);
-       ($tagfield,$subfield) = $sth->fetchrow;
-       foreach my $field ($record->field($tagfield)) {
-               if ($field->subfield($subfield)) {
-               if ($result->{$kohafield}) {
-                       $result->{$kohafield} .= " | ".$field->subfield($subfield);
-               } else {
-                       $result->{$kohafield}=$field->subfield($subfield);
-               }
-               }
-       }
-       return $result;
+    my ( $sth, $kohatable, $kohafield, $record, $result,$frameworkcode ) = @_;
+    #    warn "kohatable / $kohafield / $result / ";
+    my $res = "";
+    my $tagfield;
+    my $subfield;
+    ( $tagfield, $subfield ) = MARCfind_marc_from_kohafield("",$kohatable.".".$kohafield,$frameworkcode);
+    foreach my $field ( $record->field($tagfield) ) {
+        if ( $field->subfields ) {
+            my @subfields = $field->subfields();
+            foreach my $subfieldcount ( 0 .. $#subfields ) {
+                               if ($subfields[$subfieldcount][0] eq $subfield) {
+                                       if ( $result->{$kohafield} ) {
+                                               $result->{$kohafield} .= " | " . $subfields[$subfieldcount][1];
+                                       }
+                                       else {
+                                               $result->{$kohafield} = $subfields[$subfieldcount][1];
+                                       }
+                               }
+                       }
+        }
+    }
+#      warn "OneField for $kohatable.$kohafield and $frameworkcode=> $tagfield, $subfield";
+    return $result;
 }
 
 sub MARCaddword {
-# split a subfield string and adds it into the word table.
-# removes stopwords
-    my ($dbh,$bibid,$tag,$tagorder,$subfieldid,$subfieldorder,$sentence) =@_;
-    $sentence =~ s/(\.|\?|\:|\!|\'|,|\-|\"|\(|\)|\[|\]|\{|\})/ /g;
-    my @words = split / /,$sentence;
-    my $stopwords= C4::Context->stopwords;
-    my $sth=$dbh->prepare("insert into marc_word (bibid, tag, tagorder, subfieldid, subfieldorder, word, sndx_word)
-                       values (?,?,?,?,?,?,soundex(?))");
+
+    # split a subfield string and adds it into the word table.
+    # removes stopwords
+    my (
+        $dbh,        $bibid,         $tag,    $tagorder,
+        $subfieldid, $subfieldorder, $sentence
+      )
+      = @_;
+    $sentence =~ s/(\.|\?|\:|\!|\'|,|\-|\"|\(|\)|\[|\]|\{|\}|\/)/ /g;
+    my @words = split / /, $sentence;
+    my $stopwords = C4::Context->stopwords;
+    my $sth       =
+      $dbh->prepare(
+"insert into marc_word (bibid, tagsubfield, tagorder, subfieldorder, word, sndx_word)
+                       values (?,concat(?,?),?,?,?,soundex(?))"
+    );
     foreach my $word (@words) {
-# we record only words longer than 2 car and not in stopwords hash
-       if (length($word)>2 and !($stopwords->{uc($word)})) {
-           $sth->execute($bibid,$tag,$tagorder,$subfieldid,$subfieldorder,$word,$word);
+# we record only words one char long and not in stopwords hash
+       if (length($word)>=1 and !($stopwords->{uc($word)})) {
+           $sth->execute($bibid,$tag,$subfieldid,$tagorder,$subfieldorder,$word,$word);
            if ($sth->err()) {
-               warn "ERROR ==> insert into marc_word (bibid, tag, tagorder, subfieldid, subfieldorder, word, sndx_word) values ($bibid,$tag,$tagorder,$subfieldid,$subfieldorder,$word,soundex($word))\n";
+               warn "ERROR ==> insert into marc_word (bibid, tagsubfield, tagorder, subfieldorder, word, sndx_word) values ($bibid,concat($tag,$subfieldid),$tagorder,$subfieldorder,$word,soundex($word))\n";
            }
        }
     }
 }
 
 sub MARCdelword {
+
 # delete words. this sub deletes all the words from a sentence. a subfield modif is done by a delete then a add
-    my ($dbh,$bibid,$tag,$tagorder,$subfield,$subfieldorder) = @_;
-    my $sth=$dbh->prepare("delete from marc_word where bibid=? and tag=? and tagorder=? and subfieldid=? and subfieldorder=?");
-    $sth->execute($bibid,$tag,$tagorder,$subfield,$subfieldorder);
+    my ( $dbh, $bibid, $tag, $tagorder, $subfield, $subfieldorder ) = @_;
+    my $sth =
+      $dbh->prepare(
+"delete from marc_word where bibid=? and tagsubfield=concat(?,?) and tagorder=? and subfieldorder=?"
+    );
+    $sth->execute( $bibid, $tag, $subfield, $tagorder, $subfieldorder );
 }
 
 #
@@ -951,7 +1190,6 @@ sub MARCdelword {
 # it's used with marcimport, and marc management tools
 #
 
-
 =item ($bibid,$oldbibnum,$oldbibitemnum) = NEWnewbibilio($dbh,$MARCRecord,$oldbiblio,$oldbiblioitem);
 
 creates a new biblio from a MARC::Record. The 3rd and 4th parameter are hashes and may be ignored. If only 2 params are passed to the sub, the old-db hashes
@@ -964,88 +1202,96 @@ adds an item in the db.
 =cut
 
 sub NEWnewbiblio {
-       my ($dbh, $record, $oldbiblio, $oldbiblioitem) = @_;
-       # note $oldbiblio and $oldbiblioitem are not mandatory.
-       # if not present, they will be builded from $record with MARCmarc2koha function
-       if (($oldbiblio) and not($oldbiblioitem)) {
-               print STDERR "NEWnewbiblio : missing parameter\n";
-               print "NEWnewbiblio : missing parameter : contact koha development  team\n";
-               die;
-       }
-       my $oldbibnum;
-       my $oldbibitemnum;
-       if ($oldbiblio) {
-               $oldbibnum = OLDnewbiblio($dbh,$oldbiblio);
-               $oldbiblioitem->{'biblionumber'} = $oldbibnum;
-               $oldbibitemnum = OLDnewbiblioitem($dbh,$oldbiblioitem);
-       } else {
-               my $olddata = MARCmarc2koha($dbh,$record);
-               $oldbibnum = OLDnewbiblio($dbh,$olddata);
-               $olddata->{'biblionumber'} = $oldbibnum;
-               $oldbibitemnum = OLDnewbiblioitem($dbh,$olddata);
-       }
-       # search subtiles, addiauthors and subjects
-       my ($tagfield,$tagsubfield) = MARCfind_marc_from_kohafield($dbh,"additionalauthors.author");
-       my @addiauthfields = $record->field($tagfield);
-       foreach my $addiauthfield (@addiauthfields) {
-               my @addiauthsubfields = $addiauthfield->subfield($tagsubfield);
-               foreach my $subfieldcount (0..$#addiauthsubfields) {
-                       OLDmodaddauthor($dbh,$oldbibnum,$addiauthsubfields[$subfieldcount]);
-               }
-       }
-       ($tagfield,$tagsubfield) = MARCfind_marc_from_kohafield($dbh,"bibliosubtitle.title");
-       my @subtitlefields = $record->field($tagfield);
-       foreach my $subtitlefield (@subtitlefields) {
-               my @subtitlesubfields = $subtitlefield->subfield($tagsubfield);
-               foreach my $subfieldcount (0..$#subtitlesubfields) {
-                       OLDnewsubtitle($dbh,$oldbibnum,$subtitlesubfields[$subfieldcount]);
-               }
-       }
-       ($tagfield,$tagsubfield) = MARCfind_marc_from_kohafield($dbh,"bibliosubject.subject");
-       my @subj = $record->field($tagfield);
-       my @subjects;
-       foreach my $subject (@subj) {
-               my @subjsubfield = $subject->subfield($tagsubfield);
-               foreach my $subfieldcount (0..$#subjsubfield) {
-                       push @subjects,$subjsubfield[$subfieldcount];
-               }
-       }
-       OLDmodsubject($dbh,$oldbibnum,1,@subjects);
-       # we must add bibnum and bibitemnum in MARC::Record...
-       # we build the new field with biblionumber and biblioitemnumber
-       # we drop the original field
-       # we add the new builded field.
-       # NOTE : Works only if the field is ONLY for biblionumber and biblioitemnumber
-       # (steve and paul : thinks 090 is a good choice)
-       my $sth=$dbh->prepare("select tagfield,tagsubfield from marc_subfield_structure where kohafield=?");
-       $sth->execute("biblio.biblionumber");
-       (my $tagfield1, my $tagsubfield1) = $sth->fetchrow;
-       $sth->execute("biblioitems.biblioitemnumber");
-       (my $tagfield2, my $tagsubfield2) = $sth->fetchrow;
-       if ($tagfield1 != $tagfield2) {
-               warn "Error in NEWnewbiblio : biblio.biblionumber and biblioitems.biblioitemnumber MUST have the same field number";
-               print "Content-Type: text/html\n\nError in NEWnewbiblio : biblio.biblionumber and biblioitems.biblioitemnumber MUST have the same field number";
-               die;
-       }
-       my $newfield = MARC::Field->new( $tagfield1,'','',
-                                               "$tagsubfield1" => $oldbibnum,
-                                               "$tagsubfield2" => $oldbibitemnum);
-       # drop old field and create new one...
-       my $old_field = $record->field($tagfield1);
-       $record->delete_field($old_field);
-       $record->add_fields($newfield);
-       my $bibid = MARCaddbiblio($dbh,$record,$oldbibnum);
-       return ($bibid,$oldbibnum,$oldbibitemnum );
+    my ( $dbh, $record, $frameworkcode ) = @_;
+    my $oldbibnum;
+    my $oldbibitemnum;
+    my $olddata = MARCmarc2koha( $dbh, $record,$frameworkcode );
+    $oldbibnum = OLDnewbiblio( $dbh, $olddata );
+    $olddata->{'biblionumber'} = $oldbibnum;
+    $oldbibitemnum = OLDnewbiblioitem( $dbh, $olddata );
+
+    # search subtiles, addiauthors and subjects
+    my ( $tagfield, $tagsubfield ) =
+      MARCfind_marc_from_kohafield( $dbh, "additionalauthors.author",$frameworkcode );
+    my @addiauthfields = $record->field($tagfield);
+    foreach my $addiauthfield (@addiauthfields) {
+        my @addiauthsubfields = $addiauthfield->subfield($tagsubfield);
+        foreach my $subfieldcount ( 0 .. $#addiauthsubfields ) {
+            OLDmodaddauthor( $dbh, $oldbibnum,
+                $addiauthsubfields[$subfieldcount] );
+        }
+    }
+    ( $tagfield, $tagsubfield ) =
+      MARCfind_marc_from_kohafield( $dbh, "bibliosubtitle.subtitle",$frameworkcode );
+    my @subtitlefields = $record->field($tagfield);
+    foreach my $subtitlefield (@subtitlefields) {
+        my @subtitlesubfields = $subtitlefield->subfield($tagsubfield);
+        foreach my $subfieldcount ( 0 .. $#subtitlesubfields ) {
+            OLDnewsubtitle( $dbh, $oldbibnum,
+                $subtitlesubfields[$subfieldcount] );
+        }
+    }
+    ( $tagfield, $tagsubfield ) =
+      MARCfind_marc_from_kohafield( $dbh, "bibliosubject.subject",$frameworkcode );
+    my @subj = $record->field($tagfield);
+    my @subjects;
+    foreach my $subject (@subj) {
+        my @subjsubfield = $subject->subfield($tagsubfield);
+        foreach my $subfieldcount ( 0 .. $#subjsubfield ) {
+            push @subjects, $subjsubfield[$subfieldcount];
+        }
+    }
+    OLDmodsubject( $dbh, $oldbibnum, 1, @subjects );
+
+    # we must add bibnum and bibitemnum in MARC::Record...
+    # we build the new field with biblionumber and biblioitemnumber
+    # we drop the original field
+    # we add the new builded field.
+# NOTE : Works only if the field is ONLY for biblionumber and biblioitemnumber
+    # (steve and paul : thinks 090 is a good choice)
+    my $sth =
+      $dbh->prepare(
+"select tagfield,tagsubfield from marc_subfield_structure where kohafield=?"
+    );
+    $sth->execute("biblio.biblionumber");
+    ( my $tagfield1, my $tagsubfield1 ) = $sth->fetchrow;
+    $sth->execute("biblioitems.biblioitemnumber");
+    ( my $tagfield2, my $tagsubfield2 ) = $sth->fetchrow;
+    if ( $tagfield1 != $tagfield2 ) {
+        warn
+"Error in NEWnewbiblio : biblio.biblionumber and biblioitems.biblioitemnumber MUST have the same field number";
+        print
+"Content-Type: text/html\n\nError in NEWnewbiblio : biblio.biblionumber and biblioitems.biblioitemnumber MUST have the same field number";
+        die;
+    }
+    my $newfield = MARC::Field->new(
+        $tagfield1, '', '', "$tagsubfield1" => $oldbibnum,
+        "$tagsubfield2" => $oldbibitemnum
+    );
+
+    # drop old field and create new one...
+    my $old_field = $record->field($tagfield1);
+    $record->delete_field($old_field);
+    $record->add_fields($newfield);
+    my $bibid = MARCaddbiblio( $dbh, $record, $oldbibnum, $frameworkcode );
+    return ( $bibid, $oldbibnum, $oldbibitemnum );
 }
 
+sub NEWmodbiblioframework {
+       my ($dbh,$bibid,$frameworkcode) =@_;
+       my $sth = $dbh->prepare("Update marc_biblio SET frameworkcode=? WHERE bibid=$bibid");
+       $sth->execute($frameworkcode);
+       return 1;
+}
 sub NEWmodbiblio {
-       my ($dbh,$record,$bibid) =@_;
-       &MARCmodbiblio($dbh,$bibid,$record,0);
-       my $oldbiblio = MARCmarc2koha($dbh,$record);
+       my ($dbh,$record,$bibid,$frameworkcode) =@_;
+       $frameworkcode="" unless $frameworkcode;
+       &MARCmodbiblio($dbh,$bibid,$record,$frameworkcode,0);
+       my $oldbiblio = MARCmarc2koha($dbh,$record,$frameworkcode);
        my $oldbiblionumber = OLDmodbiblio($dbh,$oldbiblio);
        OLDmodbibitem($dbh,$oldbiblio);
        # now, modify addi authors, subject, addititles.
-       my ($tagfield,$tagsubfield) = MARCfind_marc_from_kohafield($dbh,"additionalauthors.author");
+       my ($tagfield,$tagsubfield) = MARCfind_marc_from_kohafield($dbh,"additionalauthors.author",$frameworkcode);
        my @addiauthfields = $record->field($tagfield);
        foreach my $addiauthfield (@addiauthfields) {
                my @addiauthsubfields = $addiauthfield->subfield($tagsubfield);
@@ -1053,15 +1299,20 @@ sub NEWmodbiblio {
                        OLDmodaddauthor($dbh,$oldbiblionumber,$addiauthsubfields[$subfieldcount]);
                }
        }
-       ($tagfield,$tagsubfield) = MARCfind_marc_from_kohafield($dbh,"bibliosubtitle.subtitle");
+       ($tagfield,$tagsubfield) = MARCfind_marc_from_kohafield($dbh,"bibliosubtitle.subtitle",$frameworkcode);
        my @subtitlefields = $record->field($tagfield);
        foreach my $subtitlefield (@subtitlefields) {
                my @subtitlesubfields = $subtitlefield->subfield($tagsubfield);
+               # delete & create subtitle again because OLDmodsubtitle can't handle new subtitles
+               # between 2 modifs
+               $dbh->do("delete from bibliosubtitle where biblionumber=$oldbiblionumber");
                foreach my $subfieldcount (0..$#subtitlesubfields) {
-                       OLDmodsubtitle($dbh,$oldbiblionumber,$subtitlesubfields[$subfieldcount]);
+                       foreach my $subtit(split /\||#/,$subtitlesubfields[$subfieldcount]) {
+                               OLDnewsubtitle($dbh,$oldbiblionumber,$subtit);
+                       }
                }
        }
-       ($tagfield,$tagsubfield) = MARCfind_marc_from_kohafield($dbh,"bibliosubject.subject");
+       ($tagfield,$tagsubfield) = MARCfind_marc_from_kohafield($dbh,"bibliosubject.subject",$frameworkcode);
        my @subj = $record->field($tagfield);
        my @subjects;
        foreach my $subject (@subj) {
@@ -1075,47 +1326,60 @@ sub NEWmodbiblio {
 }
 
 sub NEWdelbiblio {
-       my ($dbh,$bibid)=@_;
-       my $biblio = &MARCfind_oldbiblionumber_from_MARCbibid($dbh,$bibid);
-       &OLDdelbiblio($dbh,$biblio);
-       my $sth = $dbh->prepare("select biblioitemnumber from biblioitems where biblionumber=?");
-       $sth->execute($biblio);
-       while(my ($biblioitemnumber) = $sth->fetchrow) {
-               OLDdeletebiblioitem($dbh,$biblioitemnumber);
-       }
-       &MARCdelbiblio($dbh,$bibid,0);
+    my ( $dbh, $bibid ) = @_;
+    my $biblio = &MARCfind_oldbiblionumber_from_MARCbibid( $dbh, $bibid );
+    &OLDdelbiblio( $dbh, $biblio );
+    my $sth =
+      $dbh->prepare(
+        "select biblioitemnumber from biblioitems where biblionumber=?");
+    $sth->execute($biblio);
+    while ( my ($biblioitemnumber) = $sth->fetchrow ) {
+        OLDdeletebiblioitem( $dbh, $biblioitemnumber );
+    }
+    &MARCdelbiblio( $dbh, $bibid, 0 );
 }
 
-
 sub NEWnewitem {
-       my ($dbh, $record,$bibid) = @_;
-       # add item in old-DB
-       my $item = &MARCmarc2koha($dbh,$record);
-       # needs old biblionumber and biblioitemnumber
-       $item->{'biblionumber'} = MARCfind_oldbiblionumber_from_MARCbibid($dbh,$bibid);
-       my $sth = $dbh->prepare("select biblioitemnumber from biblioitems where biblionumber=?");
-       $sth->execute($item->{'biblionumber'});
-       ($item->{'biblioitemnumber'}) = $sth->fetchrow;
-       my ($itemnumber,$error) = &OLDnewitems($dbh,$item,$item->{barcode});
-       # add itemnumber to MARC::Record before adding the item.
-       my $sth=$dbh->prepare("select tagfield,tagsubfield from marc_subfield_structure where kohafield=?");
-       &MARCkoha2marcOnefield($sth,$record,"items.itemnumber",$itemnumber);
-       # add the item
-       my $bib = &MARCadditem($dbh,$record,$item->{'biblionumber'});
+    my ( $dbh, $record, $bibid ) = @_;
+
+    # add item in old-DB
+       my $frameworkcode=MARCfind_frameworkcode($dbh,$bibid);
+    my $item = &MARCmarc2koha( $dbh, $record,$frameworkcode );
+    # needs old biblionumber and biblioitemnumber
+    $item->{'biblionumber'} =
+      MARCfind_oldbiblionumber_from_MARCbibid( $dbh, $bibid );
+    my $sth =
+      $dbh->prepare(
+        "select biblioitemnumber from biblioitems where biblionumber=?");
+    $sth->execute( $item->{'biblionumber'} );
+    ( $item->{'biblioitemnumber'} ) = $sth->fetchrow;
+    my ( $itemnumber, $error ) = &OLDnewitems( $dbh, $item, $item->{barcode} );
+
+    # add itemnumber to MARC::Record before adding the item.
+    $sth =
+      $dbh->prepare(
+"select tagfield,tagsubfield from marc_subfield_structure where frameworkcode=? and kohafield=?"
+    );
+    &MARCkoha2marcOnefield( $sth, $record, "items.itemnumber", $itemnumber,$frameworkcode );
+
+    # add the item
+    my $bib = &MARCadditem( $dbh, $record, $item->{'biblionumber'} );
 }
 
 sub NEWmoditem {
-       my ($dbh,$record,$bibid,$itemnumber,$delete) = @_;
-       &MARCmoditem($dbh,$record,$bibid,$itemnumber,$delete);
-       my $olditem = MARCmarc2koha($dbh,$record);
-       OLDmoditem($dbh,$olditem);
+    my ( $dbh, $record, $bibid, $itemnumber, $delete ) = @_;
+    
+       &MARCmoditem( $dbh, $record, $bibid, $itemnumber, $delete );
+       my $frameworkcode=MARCfind_frameworkcode($dbh,$bibid);
+    my $olditem = MARCmarc2koha( $dbh, $record,$frameworkcode );
+    OLDmoditem( $dbh, $olditem );
 }
 
 sub NEWdelitem {
-       my ($dbh,$bibid,$itemnumber)=@_;
-       my $biblio = &MARCfind_oldbiblionumber_from_MARCbibid($dbh,$bibid);
-       &OLDdelitem($dbh,$itemnumber);
-       &MARCdelitem($dbh,$bibid,$itemnumber);
+    my ( $dbh, $bibid, $itemnumber ) = @_;
+    my $biblio = &MARCfind_oldbiblionumber_from_MARCbibid( $dbh, $bibid );
+    &OLDdelitem( $dbh, $itemnumber );
+    &MARCdelitem( $dbh, $bibid, $itemnumber );
 }
 
 #
@@ -1189,150 +1453,185 @@ delete a biblio
 =cut
 
 sub OLDnewbiblio {
-  my ($dbh,$biblio) = @_;
-#  my $dbh    = &C4Connect;
-  my $query  = "Select max(biblionumber) from biblio";
-  my $sth    = $dbh->prepare($query);
-  $sth->execute;
-  my $data   = $sth->fetchrow_arrayref;
-  my $bibnum = $$data[0] + 1;
-  my $series = 0;
-
-  if ($biblio->{'seriestitle'}) { $series = 1 };
-  $sth->finish;
-  $query = "insert into biblio set biblionumber  = ?, title         = ?, author        = ?, copyrightdate = ?,
-                                                                       serial        = ?, seriestitle   = ?, notes         = ?, abstract      = ?";
-  $sth = $dbh->prepare($query);
-  $sth->execute($bibnum,$biblio->{'title'},$biblio->{'author'},$biblio->{'copyrightdate'},$series,$biblio->{'seriestitle'},$biblio->{'notes'},$biblio->{'abstract'});
-
-  $sth->finish;
-#  $dbh->disconnect;
-  return($bibnum);
+    my ( $dbh, $biblio ) = @_;
+
+    #  my $dbh    = &C4Connect;
+    my $sth = $dbh->prepare("Select max(biblionumber) from biblio");
+    $sth->execute;
+    my $data   = $sth->fetchrow_arrayref;
+    my $bibnum = $$data[0] + 1;
+    my $series = 0;
+
+    if ( $biblio->{'seriestitle'} ) { $series = 1 }
+    $sth->finish;
+    $sth =
+      $dbh->prepare(
+"insert into biblio set biblionumber  = ?, title = ?, author = ?, copyrightdate = ?, serial = ?, seriestitle = ?, notes = ?, abstract = ?, unititle = ?"
+    );
+    $sth->execute(
+        $bibnum,             $biblio->{'title'},
+        $biblio->{'author'}, $biblio->{'copyrightdate'},
+        $biblio->{'serial'},             $biblio->{'seriestitle'},
+        $biblio->{'notes'},  $biblio->{'abstract'},
+               $biblio->{'unititle'},
+    );
+
+    $sth->finish;
+
+    #  $dbh->disconnect;
+    return ($bibnum);
 }
 
 sub OLDmodbiblio {
-       my ($dbh,$biblio) = @_;
-       #  my $dbh   = C4Connect;
-       my $query;
-       my $sth;
+    my ( $dbh, $biblio ) = @_;
 
-       $query = "Update biblio set title         = ?, author        = ?, abstract      = ?, copyrightdate = ?,
-                                       seriestitle   = ?, serial        = ?, unititle      = ?, notes         = ? where biblionumber = ?";
-       $sth   = $dbh->prepare($query);
-       $sth->execute($biblio->{'title'},$biblio->{'author'},$biblio->{'abstract'},$biblio->{'copyrightdate'},
-                                               $biblio->{'seriestitle'},$biblio->{'serial'},$biblio->{'unititle'},$biblio->{'notes'},$biblio->{'biblionumber'});
+    #  my $dbh   = C4Connect;
+    my $query;
+    my $sth;
 
-       $sth->finish;
-       return($biblio->{'biblionumber'});
-} # sub modbiblio
+    $query = "";
+    $sth   =
+      $dbh->prepare(
+"Update biblio set title = ?, author = ?, abstract = ?, copyrightdate = ?, seriestitle = ?, serial = ?, unititle = ?, notes = ? where biblionumber = ?"
+    );
+    $sth->execute(
+        $biblio->{'title'},       $biblio->{'author'},
+        $biblio->{'abstract'},    $biblio->{'copyrightdate'},
+        $biblio->{'seriestitle'}, $biblio->{'serial'},
+        $biblio->{'unititle'},    $biblio->{'notes'},
+        $biblio->{'biblionumber'}
+    );
 
-sub OLDmodsubtitle {
-       my ($dbh,$bibnum, $subtitle) = @_;
-       my $query = "update bibliosubtitle set subtitle = ? where biblionumber = ?";
-       my $sth   = $dbh->prepare($query);
-       $sth->execute($subtitle,$bibnum);
-       $sth->finish;
-} # sub modsubtitle
+    $sth->finish;
+    return ( $biblio->{'biblionumber'} );
+}    # sub modbiblio
 
+sub OLDmodsubtitle {
+    my ( $dbh, $bibnum, $subtitle ) = @_;
+    my $sth =
+      $dbh->prepare(
+        "update bibliosubtitle set subtitle = ? where biblionumber = ?");
+    $sth->execute( $subtitle, $bibnum );
+    $sth->finish;
+}    # sub modsubtitle
 
 sub OLDmodaddauthor {
-    my ($dbh,$bibnum, $author) = @_;
-#    my $dbh   = C4Connect;
-    my $query = "Delete from additionalauthors where biblionumber = $bibnum";
-    my $sth = $dbh->prepare($query);
+    my ( $dbh, $bibnum, @authors ) = @_;
 
-    $sth->execute;
+    #    my $dbh   = C4Connect;
+    my $sth =
+      $dbh->prepare("Delete from additionalauthors where biblionumber = ?");
+
+    $sth->execute($bibnum);
     $sth->finish;
+    foreach my $author (@authors) {
+        if ( $author ne '' ) {
+            $sth =
+              $dbh->prepare(
+                "Insert into additionalauthors set author = ?, biblionumber = ?"
+            );
 
-    if ($author ne '') {
-        $query = "Insert into additionalauthors set
-                        author       = ?,
-                        biblionumber = ?";
-        $sth   = $dbh->prepare($query);
+            $sth->execute( $author, $bibnum );
 
-        $sth->execute($author,$bibnum);
+            $sth->finish;
+        }    # if
+    }
+}    # sub modaddauthor
 
+sub OLDmodsubject {
+    my ( $dbh, $bibnum, $force, @subject ) = @_;
+
+    #  my $dbh   = C4Connect;
+    my $count = @subject;
+    my $error;
+    for ( my $i = 0 ; $i < $count ; $i++ ) {
+        $subject[$i] =~ s/^ //g;
+        $subject[$i] =~ s/ $//g;
+        my $sth =
+          $dbh->prepare(
+"select * from catalogueentry where entrytype = 's' and catalogueentry = ?"
+        );
+        $sth->execute( $subject[$i] );
+
+        if ( my $data = $sth->fetchrow_hashref ) {
+        }
+        else {
+            if ( $force eq $subject[$i] || $force == 1 ) {
+
+                # subject not in aut, chosen to force anway
+                # so insert into cataloguentry so its in auth file
+                my $sth2 =
+                  $dbh->prepare(
+"Insert into catalogueentry (entrytype,catalogueentry) values ('s',?)"
+                );
+
+                $sth2->execute( $subject[$i] ) if ( $subject[$i] );
+                $sth2->finish;
+            }
+            else {
+                $error =
+                  "$subject[$i]\n does not exist in the subject authority file";
+                my $sth2 =
+                  $dbh->prepare(
+"Select * from catalogueentry where entrytype = 's' and (catalogueentry like ? or catalogueentry like ? or catalogueentry like ?)"
+                );
+                $sth2->execute( "$subject[$i] %", "% $subject[$i] %",
+                    "% $subject[$i]" );
+                while ( my $data = $sth2->fetchrow_hashref ) {
+                    $error .= "<br>$data->{'catalogueentry'}";
+                }    # while
+                $sth2->finish;
+            }    # else
+        }    # else
         $sth->finish;
-    } # if
-} # sub modaddauthor
-
+    }    # else
+    if ( $error eq '' ) {
+        my $sth =
+          $dbh->prepare("Delete from bibliosubject where biblionumber = ?");
+        $sth->execute($bibnum);
+        $sth->finish;
+        $sth =
+          $dbh->prepare(
+            "Insert into bibliosubject (subject,biblionumber) values (?,?)");
+        my $query;
+        foreach $query (@subject) {
+            $sth->execute( $query, $bibnum ) if ( $query && $bibnum );
+        }    # foreach
+        $sth->finish;
+    }    # if
 
-sub OLDmodsubject {
-       my ($dbh,$bibnum, $force, @subject) = @_;
-       #  my $dbh   = C4Connect;
-       my $count = @subject;
-       my $error;
-       for (my $i = 0; $i < $count; $i++) {
-               $subject[$i] =~ s/^ //g;
-               $subject[$i] =~ s/ $//g;
-               my $query = "select * from catalogueentry where entrytype = 's' and catalogueentry = '$subject[$i]'";
-               my $sth   = $dbh->prepare($query);
-               $sth->execute;
-
-               if (my $data = $sth->fetchrow_hashref) {
-               } else {
-                       if ($force eq $subject[$i] || $force == 1) {
-                               # subject not in aut, chosen to force anway
-                               # so insert into cataloguentry so its in auth file
-                               $query = "Insert into catalogueentry (entrytype,catalogueentry) values ('s','$subject[$i]')";
-                               my $sth2 = $dbh->prepare($query);
-
-                               $sth2->execute;
-                               $sth2->finish;
-                       } else {
-                               $error = "$subject[$i]\n does not exist in the subject authority file";
-                               $query = "Select * from catalogueentry where entrytype = 's' and (catalogueentry like '$subject[$i] %'
-                                                                       or catalogueentry like '% $subject[$i] %' or catalogueentry like '% $subject[$i]')";
-                               my $sth2 = $dbh->prepare($query);
-                               $sth2->execute;
-                               while (my $data = $sth2->fetchrow_hashref) {
-                                       $error .= "<br>$data->{'catalogueentry'}";
-                               } # while
-                               $sth2->finish;
-                       } # else
-               } # else
-               $sth->finish;
-       } # else
-       if ($error eq '') {
-               my $query = "Delete from bibliosubject where biblionumber = $bibnum";
-               my $sth   = $dbh->prepare($query);
-               $sth->execute;
-               $sth->finish;
-               $sth = $dbh->prepare("Insert into bibliosubject values (?,?)");
-               foreach $query (@subject) {
-                       $sth->execute($query,$bibnum);
-               } # foreach
-               $sth->finish;
-       } # if
-
-       #  $dbh->disconnect;
-       return($error);
-} # sub modsubject
+    #  $dbh->disconnect;
+    return ($error);
+}    # sub modsubject
 
 sub OLDmodbibitem {
-    my ($dbh,$biblioitem) = @_;
-#    my $dbh   = C4Connect;
+    my ( $dbh, $biblioitem ) = @_;
     my $query;
 
-    $biblioitem->{'itemtype'}        = $dbh->quote($biblioitem->{'itemtype'});
-    $biblioitem->{'url'}             = $dbh->quote($biblioitem->{'url'});
-    $biblioitem->{'isbn'}            = $dbh->quote($biblioitem->{'isbn'});
-    $biblioitem->{'publishercode'}   = $dbh->quote($biblioitem->{'publishercode'});
-    $biblioitem->{'publicationyear'} = $dbh->quote($biblioitem->{'publicationyear'});
-    $biblioitem->{'classification'}  = $dbh->quote($biblioitem->{'classification'});
-    $biblioitem->{'dewey'}          = $dbh->quote($biblioitem->{'dewey'});
-    $biblioitem->{'subclass'}       = $dbh->quote($biblioitem->{'subclass'});
-    $biblioitem->{'illus'}           = $dbh->quote($biblioitem->{'illus'});
-    $biblioitem->{'pages'}           = $dbh->quote($biblioitem->{'pages'});
-    $biblioitem->{'volumeddesc'}     = $dbh->quote($biblioitem->{'volumeddesc'});
-    $biblioitem->{'bnotes'}          = $dbh->quote($biblioitem->{'bnotes'});
-    $biblioitem->{'size'}            = $dbh->quote($biblioitem->{'size'});
-    $biblioitem->{'place'}           = $dbh->quote($biblioitem->{'place'});
+    $biblioitem->{'itemtype'}      = $dbh->quote( $biblioitem->{'itemtype'} );
+    $biblioitem->{'url'}           = $dbh->quote( $biblioitem->{'url'} );
+    $biblioitem->{'isbn'}          = $dbh->quote( $biblioitem->{'isbn'} );
+    $biblioitem->{'issn'}          = $dbh->quote( $biblioitem->{'issn'} );
+    $biblioitem->{'publishercode'} =
+      $dbh->quote( $biblioitem->{'publishercode'} );
+    $biblioitem->{'publicationyear'} =
+      $dbh->quote( $biblioitem->{'publicationyear'} );
+    $biblioitem->{'classification'} =
+      $dbh->quote( $biblioitem->{'classification'} );
+    $biblioitem->{'dewey'}       = $dbh->quote( $biblioitem->{'dewey'} );
+    $biblioitem->{'subclass'}    = $dbh->quote( $biblioitem->{'subclass'} );
+    $biblioitem->{'illus'}       = $dbh->quote( $biblioitem->{'illus'} );
+    $biblioitem->{'pages'}       = $dbh->quote( $biblioitem->{'pages'} );
+    $biblioitem->{'volumeddesc'} = $dbh->quote( $biblioitem->{'volumeddesc'} );
+    $biblioitem->{'bnotes'}      = $dbh->quote( $biblioitem->{'bnotes'} );
+    $biblioitem->{'size'}        = $dbh->quote( $biblioitem->{'size'} );
+    $biblioitem->{'place'}       = $dbh->quote( $biblioitem->{'place'} );
 
     $query = "Update biblioitems set
 itemtype        = $biblioitem->{'itemtype'},
 url             = $biblioitem->{'url'},
 isbn            = $biblioitem->{'isbn'},
+issn            = $biblioitem->{'issn'},
 publishercode   = $biblioitem->{'publishercode'},
 publicationyear = $biblioitem->{'publicationyear'},
 classification  = $biblioitem->{'classification'},
@@ -1346,39 +1645,40 @@ size            = $biblioitem->{'size'},
 place          = $biblioitem->{'place'}
 where biblioitemnumber = $biblioitem->{'biblioitemnumber'}";
 
-$dbh->do($query);
-if ($dbh->errstr) {
-       warn "$query";
-}
-#    $dbh->disconnect;
-} # sub modbibitem
+    $dbh->do($query);
+    if ( $dbh->errstr ) {
+        warn "$query";
+    }
+}    # sub modbibitem
 
 sub OLDmodnote {
-  my ($dbh,$bibitemnum,$note)=@_;
-#  my $dbh=C4Connect;
-  my $query="update biblioitems set notes='$note' where
+    my ( $dbh, $bibitemnum, $note ) = @_;
+
+    #  my $dbh=C4Connect;
+    my $query = "update biblioitems set notes='$note' where
   biblioitemnumber='$bibitemnum'";
-  my $sth=$dbh->prepare($query);
-  $sth->execute;
-  $sth->finish;
-#  $dbh->disconnect;
+    my $sth = $dbh->prepare($query);
+    $sth->execute;
+    $sth->finish;
+
+    #  $dbh->disconnect;
 }
 
 sub OLDnewbiblioitem {
-       my ($dbh,$biblioitem) = @_;
-       #  my $dbh   = C4Connect;
-       my $query = "Select max(biblioitemnumber) from biblioitems";
-       my $sth   = $dbh->prepare($query);
-       my $data;
-       my $bibitemnum;
+    my ( $dbh, $biblioitem ) = @_;
+
+    #  my $dbh   = C4Connect;
+    my $sth = $dbh->prepare("Select max(biblioitemnumber) from biblioitems");
+    my $data;
+    my $bibitemnum;
 
-       $sth->execute;
-       $data       = $sth->fetchrow_arrayref;
-       $bibitemnum = $$data[0] + 1;
+    $sth->execute;
+    $data       = $sth->fetchrow_arrayref;
+    $bibitemnum = $$data[0] + 1;
 
-       $sth->finish;
+    $sth->finish;
 
-       $sth = $dbh->prepare("insert into biblioitems set
+    $sth = $dbh->prepare( "insert into biblioitems set
                                                                        biblioitemnumber = ?,           biblionumber     = ?,
                                                                        volume           = ?,                   number           = ?,
                                                                        classification  = ?,                    itemtype         = ?,
@@ -1389,219 +1689,277 @@ sub OLDnewbiblioitem {
                                                                        volumeddesc      = ?,           illus            = ?,
                                                                        pages            = ?,                           notes            = ?,
                                                                        size             = ?,                           lccn             = ?,
-                                                                       marc             = ?,                           place            = ?");
-       $sth->execute($bibitemnum,                                                      $biblioitem->{'biblionumber'},
-                                               $biblioitem->{'volume'},                        $biblioitem->{'number'},
-                                               $biblioitem->{'classification'},                $biblioitem->{'itemtype'},
-                                               $biblioitem->{'url'},                                   $biblioitem->{'isbn'},
-                                               $biblioitem->{'issn'},                          $biblioitem->{'dewey'},
-                                               $biblioitem->{'subclass'},                      $biblioitem->{'publicationyear'},
-                                               $biblioitem->{'publishercode'}, $biblioitem->{'volumedate'},
-                                               $biblioitem->{'volumeddesc'},           $biblioitem->{'illus'},
-                                               $biblioitem->{'pages'},                         $biblioitem->{'bnotes'},
-                                               $biblioitem->{'size'},                          $biblioitem->{'lccn'},
-                                               $biblioitem->{'marc'},                          $biblioitem->{'place'});
-       $sth->finish;
-       #    $dbh->disconnect;
-       return($bibitemnum);
+                                                                       marc             = ?,                           place            = ?"
+    );
+    $sth->execute(
+        $bibitemnum,                     $biblioitem->{'biblionumber'},
+        $biblioitem->{'volume'},         $biblioitem->{'number'},
+        $biblioitem->{'classification'}, $biblioitem->{'itemtype'},
+        $biblioitem->{'url'},            $biblioitem->{'isbn'},
+        $biblioitem->{'issn'},           $biblioitem->{'dewey'},
+        $biblioitem->{'subclass'},       $biblioitem->{'publicationyear'},
+        $biblioitem->{'publishercode'},  $biblioitem->{'volumedate'},
+        $biblioitem->{'volumeddesc'},    $biblioitem->{'illus'},
+        $biblioitem->{'pages'},          $biblioitem->{'bnotes'},
+        $biblioitem->{'size'},           $biblioitem->{'lccn'},
+        $biblioitem->{'marc'},           $biblioitem->{'place'}
+    );
+    $sth->finish;
+
+    #    $dbh->disconnect;
+    return ($bibitemnum);
 }
 
 sub OLDnewsubject {
-  my ($dbh,$bibnum)=@_;
-  my $query="insert into bibliosubject (biblionumber) values ($bibnum)";
-  my $sth=$dbh->prepare($query);
-  $sth->execute;
-  $sth->finish;
+    my ( $dbh, $bibnum ) = @_;
+    my $sth =
+      $dbh->prepare("insert into bibliosubject (biblionumber) values (?)");
+    $sth->execute($bibnum);
+    $sth->finish;
 }
 
 sub OLDnewsubtitle {
-    my ($dbh,$bibnum, $subtitle) = @_;
-    my $query = "insert into bibliosubtitle set biblionumber = ?, subtitle = ?";
-    my $sth   = $dbh->prepare($query);
-    $sth->execute($bibnum,$subtitle);
+    my ( $dbh, $bibnum, $subtitle ) = @_;
+    my $sth =
+      $dbh->prepare(
+        "insert into bibliosubtitle set biblionumber = ?, subtitle = ?");
+    $sth->execute( $bibnum, $subtitle ) if $subtitle;
     $sth->finish;
 }
 
-
 sub OLDnewitems {
-       my ($dbh,$item, $barcode) = @_;
-       #  my $dbh   = C4Connect;
-       my $query = "Select max(itemnumber) from items";
-       my $sth   = $dbh->prepare($query);
-       my $data;
-       my $itemnumber;
-       my $error = "";
-
-       $sth->execute;
-       $data       = $sth->fetchrow_hashref;
-       $itemnumber = $data->{'max(itemnumber)'} + 1;
-       $sth->finish;
+    my ( $dbh, $item, $barcode ) = @_;
+
+    #  my $dbh   = C4Connect;
+    my $sth = $dbh->prepare("Select max(itemnumber) from items");
+    my $data;
+    my $itemnumber;
+    my $error = "";
+
+    $sth->execute;
+    $data       = $sth->fetchrow_hashref;
+    $itemnumber = $data->{'max(itemnumber)'} + 1;
+    $sth->finish;
+
 # FIXME the "notforloan" field seems to be named "loan" in some places. workaround bugfix.
-       if ($item->{'loan'}) {
-               $item->{'notforloan'} = $item->{'loan'};
-       }
-# if dateaccessioned is provided, use it. Otherwise, set to NOW()
-       if ($item->{'dateaccessioned'}) {
-               $sth=$dbh->prepare("Insert into items set
+    if ( $item->{'loan'} ) {
+        $item->{'notforloan'} = $item->{'loan'};
+    }
+
+    # if dateaccessioned is provided, use it. Otherwise, set to NOW()
+    if ( $item->{'dateaccessioned'} ) {
+        $sth = $dbh->prepare( "Insert into items set
                                                        itemnumber           = ?,                               biblionumber         = ?,
                                                        biblioitemnumber     = ?,                               barcode              = ?,
                                                        booksellerid         = ?,                                       dateaccessioned      = ?,
                                                        homebranch           = ?,                               holdingbranch        = ?,
                                                        price                = ?,                                               replacementprice     = ?,
                                                        replacementpricedate = NOW(),   itemnotes            = ?,
-                                                       notforloan = ?
-                                                       ");
-               $sth->execute($itemnumber,      $item->{'biblionumber'},
-                                                               $item->{'biblioitemnumber'},$barcode,
-                                                               $item->{'booksellerid'},$item->{'dateaccessioned'},
-                                                               $item->{'homebranch'},$item->{'holdingbranch'},
-                                                               $item->{'price'},$item->{'replacementprice'},
-                                                               $item->{'itemnotes'},$item->{'notforloan'});
-       } else {
-               $sth=$dbh->prepare("Insert into items set
+                                                       itemcallnumber  =?,                                                     notforloan = ?,
+                                                       location = ?
+                                                       "
+        );
+        $sth->execute(
+            $itemnumber,                 $item->{'biblionumber'},
+            $item->{'biblioitemnumber'}, $barcode,
+            $item->{'booksellerid'},     $item->{'dateaccessioned'},
+            $item->{'homebranch'},       $item->{'holdingbranch'},
+            $item->{'price'},            $item->{'replacementprice'},
+            $item->{'itemnotes'},        $item->{'itemcallnumber'},
+            $item->{'notforloan'},             $item->{'location'}
+        );
+    }
+    else {
+        $sth = $dbh->prepare( "Insert into items set
                                                        itemnumber           = ?,                               biblionumber         = ?,
                                                        biblioitemnumber     = ?,                               barcode              = ?,
                                                        booksellerid         = ?,                                       dateaccessioned      = NOW(),
                                                        homebranch           = ?,                               holdingbranch        = ?,
                                                        price                = ?,                                               replacementprice     = ?,
                                                        replacementpricedate = NOW(),   itemnotes            = ?,
-                                                       notforloan = ?
-                                                       ");
-               $sth->execute($itemnumber,      $item->{'biblionumber'},
-                                                               $item->{'biblioitemnumber'},$barcode,
-                                                               $item->{'booksellerid'},
-                                                               $item->{'homebranch'},$item->{'holdingbranch'},
-                                                               $item->{'price'},$item->{'replacementprice'},
-                                                               $item->{'itemnotes'},$item->{'notforloan'});
-       }
-       if (defined $sth->errstr) {
-               $error .= $sth->errstr;
-       }
-       $sth->finish;
-       return($itemnumber,$error);
+                                                       itemcallnumber = ? , notforloan = ?,
+                                                       location = ?
+                                                       "
+        );
+        $sth->execute(
+            $itemnumber,                 $item->{'biblionumber'},
+            $item->{'biblioitemnumber'}, $barcode,
+            $item->{'booksellerid'},     $item->{'homebranch'},
+            $item->{'holdingbranch'},    $item->{'price'},
+            $item->{'replacementprice'}, $item->{'itemnotes'},
+            $item->{'itemcallnumber'},   $item->{'notforloan'},
+                       $item->{'location'}
+        );
+    }
+    if ( defined $sth->errstr ) {
+        $error .= $sth->errstr;
+    }
+    $sth->finish;
+    return ( $itemnumber, $error );
 }
 
 sub OLDmoditem {
-    my ($dbh,$item) = @_;
+    my ( $dbh, $item ) = @_;
+
 #  my ($dbh,$loan,$itemnum,$bibitemnum,$barcode,$notes,$homebranch,$lost,$wthdrawn,$replacement)=@_;
-#  my $dbh=C4Connect;
-$item->{'itemnum'}=$item->{'itemnumber'} unless $item->{'itemnum'};
-  my $query="update items set  barcode='$item->{'barcode'}',itemnotes='$item->{'notes'}'
-                          where itemnumber=$item->{'itemnum'}";
-  if ($item->{'barcode'} eq ''){
-       $item->{'notforloan'}=0 unless $item->{'notforloan'};
-    $query="update items set notforloan=$item->{'notforloan'} where itemnumber=$item->{'itemnum'}";
-  }
-  if ($item->{'lost'} ne ''){
-    $query="update items set biblioitemnumber=$item->{'bibitemnum'},
-                             barcode='$item->{'barcode'}',
-                             itemnotes='$item->{'notes'}',
-                             homebranch='$item->{'homebranch'}',
-                             itemlost='$item->{'lost'}',
-                             wthdrawn='$item->{'wthdrawn'}'
-                          where itemnumber=$item->{'itemnum'}";
-  }
-  if ($item->{'replacement'} ne ''){
-    $query=~ s/ where/,replacementprice='$item->{'replacement'}' where/;
-  }
-  my $sth=$dbh->prepare($query);
-  $sth->execute;
-  $sth->finish;
-#  $dbh->disconnect;
+    #  my $dbh=C4Connect;
+    $item->{'itemnum'} = $item->{'itemnumber'} unless $item->{'itemnum'};
+    my $query = "update items set  barcode=?,itemnotes=?,itemcallnumber=?,notforloan=?,location=? where itemnumber=?";
+    my @bind = (
+        $item->{'barcode'},        $item->{'notes'},
+        $item->{'itemcallnumber'}, $item->{'notforloan'},
+        $item->{'location'},      $item->{'itemnum'}
+    );
+    if ( $item->{'lost'} ne '' ) {
+        $query = "update items set biblioitemnumber=?,
+                             barcode=?,
+                             itemnotes=?,
+                             homebranch=?,
+                             itemlost=?,
+                             wthdrawn=?,
+                            itemcallnumber=?,
+                            notforloan=?,
+                                location=?";
+        @bind = (
+            $item->{'bibitemnum'},     $item->{'barcode'},
+            $item->{'notes'},          $item->{'homebranch'},
+            $item->{'lost'},           $item->{'wthdrawn'},
+            $item->{'itemcallnumber'}, $item->{'notforloan'},
+            $item->{'location'},               $item->{'itemnum'}
+        );
+               if ($item->{homebranch}) {
+                       $query.=",homebranch=?";
+                       push @bind, $item->{homebranch};
+               }
+               if ($item->{holdingbranch}) {
+                       $query.=",holdingbranch=?";
+                       push @bind, $item->{holdingbranch};
+               }
+               $query.=" where itemnumber=?";
+    }
+    if ( $item->{'replacement'} ne '' ) {
+        $query =~ s/ where/,replacementprice='$item->{'replacement'}' where/;
+    }
+    my $sth = $dbh->prepare($query);
+    $sth->execute(@bind);
+    $sth->finish;
+
+    #  $dbh->disconnect;
 }
 
-sub OLDdelitem{
-  my ($dbh,$itemnum)=@_;
-#  my $dbh=C4Connect;
-  my $query="select * from items where itemnumber=$itemnum";
-  my $sth=$dbh->prepare($query);
-  $sth->execute;
-  my $data=$sth->fetchrow_hashref;
-  $sth->finish;
-  $query="Insert into deleteditems set ";
-  foreach my $temp (keys %$data){
-    $query .= "$temp = ".$dbh->quote($data->{$temp}).",";
-  }
-  $query=~ s/\,$//;
-#  print $query;
-  $sth=$dbh->prepare($query);
-  $sth->execute;
-  $sth->finish;
-  $query = "Delete from items where itemnumber=$itemnum";
-  $sth=$dbh->prepare($query);
-  $sth->execute;
-  $sth->finish;
-#  $dbh->disconnect;
+sub OLDdelitem {
+    my ( $dbh, $itemnum ) = @_;
+
+    #  my $dbh=C4Connect;
+    my $sth = $dbh->prepare("select * from items where itemnumber=?");
+    $sth->execute($itemnum);
+    my $data = $sth->fetchrow_hashref;
+    $sth->finish;
+    my $query = "Insert into deleteditems set ";
+    my @bind  = ();
+    foreach my $temp ( keys %$data ) {
+        $query .= "$temp = ?,";
+        push ( @bind, $data->{$temp} );
+    }
+    $query =~ s/\,$//;
+
+    #  print $query;
+    $sth = $dbh->prepare($query);
+    $sth->execute(@bind);
+    $sth->finish;
+    $sth = $dbh->prepare("Delete from items where itemnumber=?");
+    $sth->execute($itemnum);
+    $sth->finish;
+
+    #  $dbh->disconnect;
 }
 
 sub OLDdeletebiblioitem {
-    my ($dbh,$biblioitemnumber) = @_;
-#    my $dbh   = C4Connect;
-    my $query = "Select * from biblioitems
-where biblioitemnumber = $biblioitemnumber";
-    my $sth   = $dbh->prepare($query);
+    my ( $dbh, $biblioitemnumber ) = @_;
+
+    #    my $dbh   = C4Connect;
+    my $sth = $dbh->prepare( "Select * from biblioitems
+where biblioitemnumber = ?"
+    );
     my $results;
 
-    $sth->execute;
+    $sth->execute($biblioitemnumber);
 
-    if ($results = $sth->fetchrow_hashref) {
-       $sth->finish;
-        $sth=$dbh->prepare("Insert into deletedbiblioitems (biblioitemnumber, biblionumber, volume, number, classification, itemtype,
+    if ( $results = $sth->fetchrow_hashref ) {
+        $sth->finish;
+        $sth =
+          $dbh->prepare(
+"Insert into deletedbiblioitems (biblioitemnumber, biblionumber, volume, number, classification, itemtype,
                                        isbn, issn ,dewey ,subclass ,publicationyear ,publishercode ,volumedate ,volumeddesc ,timestamp ,illus ,
-                                       pages ,notes ,size ,url ,lccn ) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
-
-        $sth->execute($results->{biblioitemnumber}, $results->{biblionumber}, $results->{volume}, $results->{number}, $results->{classification}, $results->{itemtype},
-                                       $results->{isbn}, $results->{issn} ,$results->{dewey} ,$results->{subclass} ,$results->{publicationyear} ,$results->{publishercode} ,$results->{volumedate} ,$results->{volumeddesc} ,$results->{timestamp} ,$results->{illus} ,
-                                       $results->{pages} ,$results->{notes} ,$results->{size} ,$results->{url} ,$results->{lccn} );
-        $query = "Delete from biblioitems
-                        where biblioitemnumber = $biblioitemnumber";
-        $dbh->do($query);
-    } # if
+                                       pages ,notes ,size ,url ,lccn ) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
+        );
+
+        $sth->execute(
+            $results->{biblioitemnumber}, $results->{biblionumber},
+            $results->{volume},           $results->{number},
+            $results->{classification},   $results->{itemtype},
+            $results->{isbn},             $results->{issn},
+            $results->{dewey},            $results->{subclass},
+            $results->{publicationyear},  $results->{publishercode},
+            $results->{volumedate},       $results->{volumeddesc},
+            $results->{timestamp},        $results->{illus},
+            $results->{pages},            $results->{notes},
+            $results->{size},             $results->{url},
+            $results->{lccn}
+        );
+        my $sth2 =
+          $dbh->prepare("Delete from biblioitems where biblioitemnumber = ?");
+        $sth2->execute($biblioitemnumber);
+        $sth2->finish();
+    }    # if
     $sth->finish;
-# Now delete all the items attached to the biblioitem
-    $query = "Select * from items where biblioitemnumber = $biblioitemnumber";
-    $sth   = $dbh->prepare($query);
-    $sth->execute;
+
+    # Now delete all the items attached to the biblioitem
+    $sth = $dbh->prepare("Select * from items where biblioitemnumber = ?");
+    $sth->execute($biblioitemnumber);
     my @results;
-    while (@results = $sth->fetchrow_array) {
-       $query = "Insert into deleteditems values (";
-       foreach my $value (@results) {
-           $value  = $dbh->quote($value);
-           $query .= "$value,";
-       } # foreach
-       $query =~ s/\,$/\)/;
-       $dbh->do($query);
-    } # while
+    while ( my $data = $sth->fetchrow_hashref ) {
+        my $query = "Insert into deleteditems set ";
+        my @bind  = ();
+        foreach my $temp ( keys %$data ) {
+            $query .= "$temp = ?,";
+            push ( @bind, $data->{$temp} );
+        }
+        $query =~ s/\,$//;
+        my $sth2 = $dbh->prepare($query);
+        $sth2->execute(@bind);
+    }    # while
     $sth->finish;
-    $query = "Delete from items where biblioitemnumber = $biblioitemnumber";
-    $dbh->do($query);
-#    $dbh->disconnect;
-} # sub deletebiblioitem
-
-sub OLDdelbiblio{
-  my ($dbh,$biblio)=@_;
-  my $query="select * from biblio where biblionumber=$biblio";
-  my $sth=$dbh->prepare($query);
-  $sth->execute;
-  if (my @data=$sth->fetchrow_array){
-    $sth->finish;
-# FIXME => replace insert values by insert (field) values ($value)
-    $query="Insert into deletedbiblio values (";
-    foreach my $temp (@data){
-      $temp=~ s/\'/\\\'/g;
-      $query .= "'$temp',";
+    $sth = $dbh->prepare("Delete from items where biblioitemnumber = ?");
+    $sth->execute($biblioitemnumber);
+    $sth->finish();
+
+    #    $dbh->disconnect;
+}    # sub deletebiblioitem
+
+sub OLDdelbiblio {
+    my ( $dbh, $biblio ) = @_;
+    my $sth = $dbh->prepare("select * from biblio where biblionumber=?");
+    $sth->execute($biblio);
+    if ( my $data = $sth->fetchrow_hashref ) {
+        $sth->finish;
+        my $query = "Insert into deletedbiblio set ";
+        my @bind  = ();
+        foreach my $temp ( keys %$data ) {
+            $query .= "$temp = ?,";
+            push ( @bind, $data->{$temp} );
+        }
+
+        #replacing the last , by ",?)"
+        $query =~ s/\,$//;
+        $sth = $dbh->prepare($query);
+        $sth->execute(@bind);
+        $sth->finish;
+        $sth = $dbh->prepare("Delete from biblio where biblionumber=?");
+        $sth->execute($biblio);
+        $sth->finish;
     }
-    #replacing the last , by ",?)"
-    $query=~ s/\,$/\,\?\)/;
-    $sth=$dbh->prepare($query);
-    $sth->execute;
     $sth->finish;
-    $query = "Delete from biblio where biblionumber=$biblio";
-    $sth=$dbh->prepare($query);
-    $sth->execute;
-    $sth->finish;
-  }
-  $sth->finish;
 }
 
 #
@@ -1610,89 +1968,27 @@ sub OLDdelbiblio{
 #
 #
 
-sub itemcount{
-  my ($biblio)=@_;
-  my $dbh = C4::Context->dbh;
-  my $query="Select count(*) from items where biblionumber=$biblio";
-#  print $query;
-  my $sth=$dbh->prepare($query);
-  $sth->execute;
-  my $data=$sth->fetchrow_hashref;
-  $sth->finish;
-  return($data->{'count(*)'});
-}
-
-=item getorder
-
-  ($order, $ordernumber) = &getorder($biblioitemnumber, $biblionumber);
-
-Looks up the order with the given biblionumber and biblioitemnumber.
-
-Returns a two-element array. C<$ordernumber> is the order number.
-C<$order> is a reference-to-hash describing the order; its keys are
-fields from the biblio, biblioitems, aqorders, and aqorderbreakdown
-tables of the Koha database.
-
-=cut
-#'
-# FIXME - This is effectively identical to &C4::Catalogue::getorder.
-# Pick one and stick with it.
-sub getorder{
-  my ($bi,$bib)=@_;
-  my $dbh = C4::Context->dbh;
-  my $query="Select ordernumber
-       from aqorders
-       where biblionumber=? and biblioitemnumber=?";
-  my $sth=$dbh->prepare($query);
-  $sth->execute($bib,$bi);
-  # FIXME - Use fetchrow_array(), since we're only interested in the one
-  # value.
-  my $ordnum=$sth->fetchrow_hashref;
-  $sth->finish;
-  my $order=getsingleorder($ordnum->{'ordernumber'});
-#  print $query;
-  return ($order,$ordnum->{'ordernumber'});
-}
-
-=item getsingleorder
-
-  $order = &getsingleorder($ordernumber);
-
-Looks up an order by order number.
-
-Returns a reference-to-hash describing the order. The keys of
-C<$order> are fields from the biblio, biblioitems, aqorders, and
-aqorderbreakdown tables of the Koha database.
+sub itemcount {
+    my ($biblio) = @_;
+    my $dbh = C4::Context->dbh;
 
-=cut
-#'
-# FIXME - This is effectively identical to
-# &C4::Catalogue::getsingleorder.
-# Pick one and stick with it.
-sub getsingleorder {
-  my ($ordnum)=@_;
-  my $dbh = C4::Context->dbh;
-  my $query="Select * from biblio,biblioitems,aqorders,aqorderbreakdown
-  where aqorders.ordernumber=?
-  and biblio.biblionumber=aqorders.biblionumber and
-  biblioitems.biblioitemnumber=aqorders.biblioitemnumber and
-  aqorders.ordernumber=aqorderbreakdown.ordernumber";
-  my $sth=$dbh->prepare($query);
-  $sth->execute($ordnum);
-  my $data=$sth->fetchrow_hashref;
-  $sth->finish;
-  return($data);
+    #  print $query;
+    my $sth = $dbh->prepare("Select count(*) from items where biblionumber=?");
+    $sth->execute($biblio);
+    my $data = $sth->fetchrow_hashref;
+    $sth->finish;
+    return ( $data->{'count(*)'} );
 }
 
 sub newbiblio {
-       my ($biblio) = @_;
-       my $dbh    = C4::Context->dbh;
-       my $bibnum=OLDnewbiblio($dbh,$biblio);
-       # finds new (MARC bibid
-#      my $bibid = &MARCfind_MARCbibid_from_oldbiblionumber($dbh,$bibnum);
-       my $record = &MARCkoha2marcBiblio($dbh,$bibnum);
-       MARCaddbiblio($dbh,$record,$bibnum);
-       return($bibnum);
+    my ($biblio) = @_;
+    my $dbh    = C4::Context->dbh;
+    my $bibnum = OLDnewbiblio( $dbh, $biblio );
+    # finds new (MARC bibid
+    #  my $bibid = &MARCfind_MARCbibid_from_oldbiblionumber($dbh,$bibnum);
+    my $record = &MARCkoha2marcBiblio( $dbh, $bibnum );
+    MARCaddbiblio( $dbh, $record, $bibnum,'' );
+    return ($bibnum);
 }
 
 =item modbiblio
@@ -1720,7 +2016,7 @@ sub modbiblio {
        my $record = MARCkoha2marcBiblio($dbh,$biblionumber,$biblionumber);
        # finds new (MARC bibid
        my $bibid = &MARCfind_MARCbibid_from_oldbiblionumber($dbh,$biblionumber);
-       MARCmodbiblio($dbh,$bibid,$record,0);
+       MARCmodbiblio($dbh,$bibid,$record,"",0);
        return($biblionumber);
 } # sub modbiblio
 
@@ -1737,10 +2033,10 @@ C<$subtitle> is the new subtitle.
 =cut
 
 sub modsubtitle {
-  my ($bibnum, $subtitle) = @_;
-  my $dbh   = C4::Context->dbh;
-  &OLDmodsubtitle($dbh,$bibnum,$subtitle);
-} # sub modsubtitle
+    my ( $bibnum, $subtitle ) = @_;
+    my $dbh = C4::Context->dbh;
+    &OLDmodsubtitle( $dbh, $bibnum, $subtitle );
+}    # sub modsubtitle
 
 =item modaddauthor
 
@@ -1753,10 +2049,10 @@ C<&modaddauthor> deletes all additional authors.
 =cut
 
 sub modaddauthor {
-    my ($bibnum, $author) = @_;
-    my $dbh   = C4::Context->dbh;
-    &OLDmodaddauthor($dbh,$bibnum,$author);
-} # sub modaddauthor
+    my ( $bibnum, @authors ) = @_;
+    my $dbh = C4::Context->dbh;
+    &OLDmodaddauthor( $dbh, $bibnum, @authors );
+}    # sub modaddauthor
 
 =item modsubject
 
@@ -1769,441 +2065,609 @@ $error - Error message, or undef if successful.
 =cut
 
 sub modsubject {
-  my ($bibnum, $force, @subject) = @_;
-  my $dbh   = C4::Context->dbh;
-  my $error= &OLDmodsubject($dbh,$bibnum,$force, @subject);
-  return($error);
-} # sub modsubject
+    my ( $bibnum, $force, @subject ) = @_;
+    my $dbh = C4::Context->dbh;
+    my $error = &OLDmodsubject( $dbh, $bibnum, $force, @subject );
+        if ($error eq ''){
+    # When MARC is off, ensures that the MARC biblio table gets updated with new
+    # subjects, of course, it deletes the biblio in marc, and then recreates.
+    # This check is to ensure that no MARC data exists to lose.
+
+        if (C4::Context->preference("MARC") eq '0'){
+            my $MARCRecord = &MARCkoha2marcBiblio($dbh,$bibnum);
+            my $bibid = &MARCfind_MARCbibid_from_oldbiblionumber($dbh,$bibnum);
+            &MARCmodbiblio($dbh,$bibid, $MARCRecord);
+        }
+
+    }
+    return ($error);
+}    # sub modsubject
 
 sub modbibitem {
     my ($biblioitem) = @_;
-    my $dbh   = C4::Context->dbh;
-    &OLDmodbibitem($dbh,$biblioitem);
-} # sub modbibitem
+    my $dbh = C4::Context->dbh;
+    &OLDmodbibitem( $dbh, $biblioitem );
+}    # sub modbibitem
 
 sub modnote {
-  my ($bibitemnum,$note)=@_;
-  my $dbh = C4::Context->dbh;
-  &OLDmodnote($dbh,$bibitemnum,$note);
+    my ( $bibitemnum, $note ) = @_;
+    my $dbh = C4::Context->dbh;
+    &OLDmodnote( $dbh, $bibitemnum, $note );
 }
 
 sub newbiblioitem {
-       my ($biblioitem) = @_;
-       my $dbh   = C4::Context->dbh;
-       my $bibitemnum = &OLDnewbiblioitem($dbh,$biblioitem);
-       my $MARCbiblio= MARCkoha2marcBiblio($dbh,0,$bibitemnum); # the 0 means "do NOT retrieve biblio, only biblioitem, in the MARC record
-       my $bibid = &MARCfind_MARCbibid_from_oldbiblionumber($dbh,$biblioitem->{biblionumber});
-       &MARCaddbiblio($dbh,$MARCbiblio,$biblioitem->{biblionumber},$bibid);
-       return($bibitemnum);
+    my ($biblioitem) = @_;
+    my $dbh        = C4::Context->dbh;
+    my $bibitemnum = &OLDnewbiblioitem( $dbh, $biblioitem );
+
+    my $MARCbiblio =
+      MARCkoha2marcBiblio( $dbh, 0, $bibitemnum )
+      ; # the 0 means "do NOT retrieve biblio, only biblioitem, in the MARC record
+    my $bibid =
+      &MARCfind_MARCbibid_from_oldbiblionumber( $dbh,
+        $biblioitem->{biblionumber} );
+    &MARCaddbiblio( $dbh, $MARCbiblio, $biblioitem->{biblionumber}, '',$bibid );
+    return ($bibitemnum);
 }
 
 sub newsubject {
-  my ($bibnum)=@_;
-  my $dbh = C4::Context->dbh;
-  &OLDnewsubject($dbh,$bibnum);
+    my ($bibnum) = @_;
+    my $dbh = C4::Context->dbh;
+    &OLDnewsubject( $dbh, $bibnum );
 }
 
 sub newsubtitle {
-    my ($bibnum, $subtitle) = @_;
-    my $dbh   = C4::Context->dbh;
-    &OLDnewsubtitle($dbh,$bibnum,$subtitle);
+    my ( $bibnum, $subtitle ) = @_;
+    my $dbh = C4::Context->dbh;
+    &OLDnewsubtitle( $dbh, $bibnum, $subtitle );
 }
 
 sub newitems {
-  my ($item, @barcodes) = @_;
-  my $dbh   = C4::Context->dbh;
-  my $errors;
-  my $itemnumber;
-  my $error;
-  foreach my $barcode (@barcodes) {
-      ($itemnumber,$error)=&OLDnewitems($dbh,$item,uc($barcode));
-      $errors .=$error;
-      my $MARCitem = &MARCkoha2marcItem($dbh,$item->{biblionumber},$itemnumber);
-      &MARCadditem($dbh,$MARCitem,$item->{biblionumber});
-  }
-  return($errors);
+    my ( $item, @barcodes ) = @_;
+    my $dbh = C4::Context->dbh;
+    my $errors;
+    my $itemnumber;
+    my $error;
+    foreach my $barcode (@barcodes) {
+        ( $itemnumber, $error ) = &OLDnewitems( $dbh, $item, uc($barcode) );
+        $errors .= $error;
+        my $MARCitem =
+          &MARCkoha2marcItem( $dbh, $item->{biblionumber}, $itemnumber );
+        &MARCadditem( $dbh, $MARCitem, $item->{biblionumber} );
+    }
+    return ($errors);
 }
 
 sub moditem {
     my ($item) = @_;
     my $dbh = C4::Context->dbh;
-    &OLDmoditem($dbh,$item);
-    my $MARCitem = &MARCkoha2marcItem($dbh,$item->{'biblionumber'},$item->{'itemnum'});
-    my $bibid = &MARCfind_MARCbibid_from_oldbiblionumber($dbh,$item->{biblionumber});
-    &MARCmoditem($dbh,$MARCitem,$bibid,$item->{itemnum},0);
+    &OLDmoditem( $dbh, $item );
+    my $MARCitem =
+      &MARCkoha2marcItem( $dbh, $item->{'biblionumber'}, $item->{'itemnum'} );
+    my $bibid =
+      &MARCfind_MARCbibid_from_oldbiblionumber( $dbh, $item->{biblionumber} );
+    &MARCmoditem( $dbh, $MARCitem, $bibid, $item->{itemnum}, 0 );
 }
 
-sub checkitems{
-  my ($count,@barcodes)=@_;
-  my $dbh = C4::Context->dbh;
-  my $error;
-  for (my $i=0;$i<$count;$i++){
-    $barcodes[$i]=uc $barcodes[$i];
-    my $query="Select * from items where barcode='$barcodes[$i]'";
-    my $sth=$dbh->prepare($query);
-    $sth->execute;
-    if (my $data=$sth->fetchrow_hashref){
-      $error.=" Duplicate Barcode: $barcodes[$i]";
+sub checkitems {
+    my ( $count, @barcodes ) = @_;
+    my $dbh = C4::Context->dbh;
+    my $error;
+    my $sth = $dbh->prepare("Select * from items where barcode=?");
+    for ( my $i = 0 ; $i < $count ; $i++ ) {
+        $barcodes[$i] = uc $barcodes[$i];
+        $sth->execute( $barcodes[$i] );
+        if ( my $data = $sth->fetchrow_hashref ) {
+            $error .= " Duplicate Barcode: $barcodes[$i]";
+        }
     }
     $sth->finish;
-  }
-  return($error);
+    return ($error);
 }
 
-sub countitems{
-  my ($bibitemnum)=@_;
-  my $dbh = C4::Context->dbh;
-  my $query="Select count(*) from items where biblioitemnumber='$bibitemnum'";
-  my $sth=$dbh->prepare($query);
-  $sth->execute;
-  my $data=$sth->fetchrow_hashref;
-  $sth->finish;
-  return($data->{'count(*)'});
+sub countitems {
+    my ($bibitemnum) = @_;
+    my $dbh   = C4::Context->dbh;
+    my $query = "";
+    my $sth   =
+      $dbh->prepare("Select count(*) from items where biblioitemnumber=?");
+    $sth->execute($bibitemnum);
+    my $data = $sth->fetchrow_hashref;
+    $sth->finish;
+    return ( $data->{'count(*)'} );
 }
 
-sub delitem{
-  my ($itemnum)=@_;
-  my $dbh = C4::Context->dbh;
-  &OLDdelitem($dbh,$itemnum);
+sub delitem {
+    my ($itemnum) = @_;
+    my $dbh = C4::Context->dbh;
+    &OLDdelitem( $dbh, $itemnum );
 }
 
 sub deletebiblioitem {
     my ($biblioitemnumber) = @_;
-    my $dbh   = C4::Context->dbh;
-    &OLDdeletebiblioitem($dbh,$biblioitemnumber);
-} # sub deletebiblioitem
-
+    my $dbh = C4::Context->dbh;
+    &OLDdeletebiblioitem( $dbh, $biblioitemnumber );
+}    # sub deletebiblioitem
 
 sub delbiblio {
-       my ($biblio)=@_;
-       my $dbh = C4::Context->dbh;
-       &OLDdelbiblio($dbh,$biblio);
-       my $bibid = &MARCfind_MARCbibid_from_oldbiblionumber($dbh,$biblio);
-       &MARCdelbiblio($dbh,$bibid,0);
+    my ($biblio) = @_;
+    my $dbh = C4::Context->dbh;
+    &OLDdelbiblio( $dbh, $biblio );
+    my $bibid = &MARCfind_MARCbibid_from_oldbiblionumber( $dbh, $biblio );
+    &MARCdelbiblio( $dbh, $bibid, 0 );
 }
 
-sub getitemtypes {
-  my $dbh   = C4::Context->dbh;
-  my $query = "select * from itemtypes order by description";
-  my $sth   = $dbh->prepare($query);
-    # || die "Cannot prepare $query" . $dbh->errstr;
-  my $count = 0;
-  my @results;
-
-  $sth->execute;
-    # || die "Cannot execute $query\n" . $sth->errstr;
-  while (my $data = $sth->fetchrow_hashref) {
-    $results[$count] = $data;
-    $count++;
-  } # while
-
-  $sth->finish;
-  return($count, @results);
-} # sub getitemtypes
-
 sub getbiblio {
     my ($biblionumber) = @_;
-    my $dbh   = C4::Context->dbh;
-    my $query = "Select * from biblio where biblionumber = $biblionumber";
-    my $sth   = $dbh->prepare($query);
-      # || die "Cannot prepare $query\n" . $dbh->errstr;
+    my $dbh = C4::Context->dbh;
+    my $sth = $dbh->prepare("Select * from biblio where biblionumber = ?");
+
+    # || die "Cannot prepare $query\n" . $dbh->errstr;
     my $count = 0;
     my @results;
 
-    $sth->execute;
-      # || die "Cannot execute $query\n" . $sth->errstr;
-    while (my $data = $sth->fetchrow_hashref) {
-      $results[$count] = $data;
-      $count++;
-    } # while
+    $sth->execute($biblionumber);
+
+    # || die "Cannot execute $query\n" . $sth->errstr;
+    while ( my $data = $sth->fetchrow_hashref ) {
+        $results[$count] = $data;
+        $count++;
+    }    # while
 
     $sth->finish;
-    return($count, @results);
-} # sub getbiblio
+    return ( $count, @results );
+}    # sub getbiblio
 
 sub getbiblioitem {
     my ($biblioitemnum) = @_;
-    my $dbh   = C4::Context->dbh;
-    my $query = "Select * from biblioitems where
-biblioitemnumber = $biblioitemnum";
-    my $sth   = $dbh->prepare($query);
+    my $dbh = C4::Context->dbh;
+    my $sth = $dbh->prepare( "Select * from biblioitems where
+biblioitemnumber = ?"
+    );
     my $count = 0;
     my @results;
 
-    $sth->execute;
+    $sth->execute($biblioitemnum);
 
-    while (my $data = $sth->fetchrow_hashref) {
+    while ( my $data = $sth->fetchrow_hashref ) {
         $results[$count] = $data;
-       $count++;
-    } # while
+        $count++;
+    }    # while
 
     $sth->finish;
-    return($count, @results);
-} # sub getbiblioitem
+    return ( $count, @results );
+}    # sub getbiblioitem
 
 sub getbiblioitembybiblionumber {
     my ($biblionumber) = @_;
+    my $dbh = C4::Context->dbh;
+    my $sth = $dbh->prepare("Select * from biblioitems where biblionumber = ?");
+    my $count = 0;
+    my @results;
+
+    $sth->execute($biblionumber);
+
+    while ( my $data = $sth->fetchrow_hashref ) {
+        $results[$count] = $data;
+        $count++;
+    }    # while
+
+    $sth->finish;
+    return ( $count, @results );
+}    # sub
+
+sub getitemtypes {
     my $dbh   = C4::Context->dbh;
-    my $query = "Select * from biblioitems where biblionumber =
-$biblionumber";
+    my $query = "select * from itemtypes order by description";
     my $sth   = $dbh->prepare($query);
+
+    # || die "Cannot prepare $query" . $dbh->errstr;      
     my $count = 0;
     my @results;
 
     $sth->execute;
 
-    while (my $data = $sth->fetchrow_hashref) {
+    # || die "Cannot execute $query\n" . $sth->errstr;
+    while ( my $data = $sth->fetchrow_hashref ) {
         $results[$count] = $data;
-       $count++;
-    } # while
+        $count++;
+    }    # while
 
     $sth->finish;
-    return($count, @results);
-} # sub
+    return ( $count, @results );
+}    # sub getitemtypes
 
 sub getitemsbybiblioitem {
     my ($biblioitemnum) = @_;
-    my $dbh   = C4::Context->dbh;
-    my $query = "Select * from items, biblio where
+    my $dbh = C4::Context->dbh;
+    my $sth = $dbh->prepare( "Select * from items, biblio where
 biblio.biblionumber = items.biblionumber and biblioitemnumber
-= $biblioitemnum";
-    my $sth   = $dbh->prepare($query);
-      # || die "Cannot prepare $query\n" . $dbh->errstr;
+= ?"
+    );
+
+    # || die "Cannot prepare $query\n" . $dbh->errstr;
     my $count = 0;
     my @results;
 
-    $sth->execute;
-      # || die "Cannot execute $query\n" . $sth->errstr;
-    while (my $data = $sth->fetchrow_hashref) {
-      $results[$count] = $data;
-      $count++;
-    } # while
+    $sth->execute($biblioitemnum);
 
-    $sth->finish;
-    return($count, @results);
-} # sub getitemsbybiblioitem
+    # || die "Cannot execute $query\n" . $sth->errstr;
+    while ( my $data = $sth->fetchrow_hashref ) {
+        $results[$count] = $data;
+        $count++;
+    }    # while
 
+    $sth->finish;
+    return ( $count, @results );
+}    # sub getitemsbybiblioitem
 
 sub logchange {
-# Subroutine to log changes to databases
+
+    # Subroutine to log changes to databases
 # Eventually, this subroutine will be used to create a log of all changes made,
-# with the possibility of "undo"ing some changes
-    my $database=shift;
-    if ($database eq 'kohadb') {
-       my $type=shift;
-       my $section=shift;
-       my $item=shift;
-       my $original=shift;
-       my $new=shift;
-#      print STDERR "KOHA: $type $section $item $original $new\n";
-    } elsif ($database eq 'marc') {
-       my $type=shift;
-       my $Record_ID=shift;
-       my $tag=shift;
-       my $mark=shift;
-       my $subfield_ID=shift;
-       my $original=shift;
-       my $new=shift;
+    # with the possibility of "undo"ing some changes
+    my $database = shift;
+    if ( $database eq 'kohadb' ) {
+        my $type     = shift;
+        my $section  = shift;
+        my $item     = shift;
+        my $original = shift;
+        my $new      = shift;
+
+        #      print STDERR "KOHA: $type $section $item $original $new\n";
+    }
+    elsif ( $database eq 'marc' ) {
+        my $type        = shift;
+        my $Record_ID   = shift;
+        my $tag         = shift;
+        my $mark        = shift;
+        my $subfield_ID = shift;
+        my $original    = shift;
+        my $new         = shift;
+
 #      print STDERR "MARC: $type $Record_ID $tag $mark $subfield_ID $original $new\n";
     }
 }
 
 #------------------------------------------------
 
-
 #---------------------------------------
 # Find a biblio entry, or create a new one if it doesn't exist.
 #  If a "subtitle" entry is in hash, add it to subtitle table
 sub getoraddbiblio {
-       # input params
-       my (
-         $dbh,         # db handle
-                       # FIXME - Unused argument
-         $biblio,      # hash ref to fields
-       )=@_;
 
-       # return
-       my $biblionumber;
+    # input params
+    my (
+        $dbh,       # db handle
+                    # FIXME - Unused argument
+        $biblio,    # hash ref to fields
+    ) = @_;
 
-       my $debug=0;
-       my $sth;
-       my $error;
+    # return
+    my $biblionumber;
 
-       #-----
-       $dbh = C4::Context->dbh;
+    my $debug = 0;
+    my $sth;
+    my $error;
+
+    #-----
+    $dbh = C4::Context->dbh;
 
-       print "<PRE>Looking for biblio </PRE>\n" if $debug;
-       $sth=$dbh->prepare("select biblionumber
+    print "<PRE>Looking for biblio </PRE>\n" if $debug;
+    $sth = $dbh->prepare( "select biblionumber
                from biblio
                where title=? and author=?
-                 and copyrightdate=? and seriestitle=?");
-       $sth->execute(
-               $biblio->{title}, $biblio->{author},
-               $biblio->{copyright}, $biblio->{seriestitle} );
-       if ($sth->rows) {
-           ($biblionumber) = $sth->fetchrow;
-           print "<PRE>Biblio exists with number $biblionumber</PRE>\n" if $debug;
-       } else {
-           # Doesn't exist.  Add new one.
-           print "<PRE>Adding biblio</PRE>\n" if $debug;
-           ($biblionumber,$error)=&newbiblio($biblio);
-           if ( $biblionumber ) {
-             print "<PRE>Added with biblio number=$biblionumber</PRE>\n" if $debug;
-             if ( $biblio->{subtitle} ) {
-               &newsubtitle($biblionumber,$biblio->{subtitle} );
-             } # if subtitle
-           } else {
-               print "<PRE>Couldn't add biblio: $error</PRE>\n" if $debug;
-           } # if added
-       }
+                 and copyrightdate=? and seriestitle=?"
+    );
+    $sth->execute(
+        $biblio->{title},     $biblio->{author},
+        $biblio->{copyright}, $biblio->{seriestitle}
+    );
+    if ( $sth->rows ) {
+        ($biblionumber) = $sth->fetchrow;
+        print "<PRE>Biblio exists with number $biblionumber</PRE>\n" if $debug;
+    }
+    else {
+
+        # Doesn't exist.  Add new one.
+        print "<PRE>Adding biblio</PRE>\n" if $debug;
+        ( $biblionumber, $error ) = &newbiblio($biblio);
+        if ($biblionumber) {
+            print "<PRE>Added with biblio number=$biblionumber</PRE>\n"
+              if $debug;
+            if ( $biblio->{subtitle} ) {
+                &newsubtitle( $biblionumber, $biblio->{subtitle} );
+            }    # if subtitle
+        }
+        else {
+            print "<PRE>Couldn't add biblio: $error</PRE>\n" if $debug;
+        }    # if added
+    }
 
-       return $biblionumber,$error;
+    return $biblionumber, $error;
 
-} # sub getoraddbiblio
+}    # sub getoraddbiblio
 
 sub char_decode {
-       # converts ISO 5426 coded string to ISO 8859-1
-       # sloppy code : should be improved in next issue
-       my ($string,$encoding) = @_ ;
-       $_ = $string ;
-#      $encoding = C4::Context->preference("marcflavour") unless $encoding;
-       if ($encoding eq "UNIMARC") {
-               s/\xe1/Æ/gm ;
-               s/\xe2/Ð/gm ;
-               s/\xe9/Ø/gm ;
-               s/\xec/þ/gm ;
-               s/\xf1/æ/gm ;
-               s/\xf3/ð/gm ;
-               s/\xf9/ø/gm ;
-               s/\xfb/ß/gm ;
-               s/\xc1\x61/à/gm ;
-               s/\xc1\x65/è/gm ;
-               s/\xc1\x69/ì/gm ;
-               s/\xc1\x6f/ò/gm ;
-               s/\xc1\x75/ù/gm ;
-               s/\xc1\x41/À/gm ;
-               s/\xc1\x45/È/gm ;
-               s/\xc1\x49/Ì/gm ;
-               s/\xc1\x4f/Ò/gm ;
-               s/\xc1\x55/Ù/gm ;
-               s/\xc2\x41/Á/gm ;
-               s/\xc2\x45/É/gm ;
-               s/\xc2\x49/Í/gm ;
-               s/\xc2\x4f/Ó/gm ;
-               s/\xc2\x55/Ú/gm ;
-               s/\xc2\x59/Ý/gm ;
-               s/\xc2\x61/á/gm ;
-               s/\xc2\x65/é/gm ;
-               s/\xc2\x69/í/gm ;
-               s/\xc2\x6f/ó/gm ;
-               s/\xc2\x75/ú/gm ;
-               s/\xc2\x79/ý/gm ;
-               s/\xc3\x41/Â/gm ;
-               s/\xc3\x45/Ê/gm ;
-               s/\xc3\x49/Î/gm ;
-               s/\xc3\x4f/Ô/gm ;
-               s/\xc3\x55/Û/gm ;
-               s/\xc3\x61/â/gm ;
-               s/\xc3\x65/ê/gm ;
-               s/\xc3\x69/î/gm ;
-               s/\xc3\x6f/ô/gm ;
-               s/\xc3\x75/û/gm ;
-               s/\xc4\x41/Ã/gm ;
-               s/\xc4\x4e/Ñ/gm ;
-               s/\xc4\x4f/Õ/gm ;
-               s/\xc4\x61/ã/gm ;
-               s/\xc4\x6e/ñ/gm ;
-               s/\xc4\x6f/õ/gm ;
-               s/\xc8\x45/Ë/gm ;
-               s/\xc8\x49/Ï/gm ;
-               s/\xc8\x65/ë/gm ;
-               s/\xc8\x69/ï/gm ;
-               s/\xc8\x76/ÿ/gm ;
-               s/\xc9\x41/Ä/gm ;
-               s/\xc9\x4f/Ö/gm ;
-               s/\xc9\x55/Ü/gm ;
-               s/\xc9\x61/ä/gm ;
-               s/\xc9\x6f/ö/gm ;
-               s/\xc9\x75/ü/gm ;
-               s/\xca\x41/Å/gm ;
-               s/\xca\x61/å/gm ;
-               s/\xd0\x43/Ç/gm ;
-               s/\xd0\x63/ç/gm ;
-               # this handles non-sorting blocks (if implementation requires this)
-               $string = nsb_clean($_) ;
-       } elsif ($encoding eq "USMARC" || $encoding eq "MARC21") {
-               if(/[\xc1-\xff]/) {
-                       s/\xe1\x61/à/gm ;
-                       s/\xe1\x65/è/gm ;
-                       s/\xe1\x69/ì/gm ;
-                       s/\xe1\x6f/ò/gm ;
-                       s/\xe1\x75/ù/gm ;
-                       s/\xe1\x41/À/gm ;
-                       s/\xe1\x45/È/gm ;
-                       s/\xe1\x49/Ì/gm ;
-                       s/\xe1\x4f/Ò/gm ;
-                       s/\xe1\x55/Ù/gm ;
-                       s/\xe2\x41/Á/gm ;
-                       s/\xe2\x45/É/gm ;
-                       s/\xe2\x49/Í/gm ;
-                       s/\xe2\x4f/Ó/gm ;
-                       s/\xe2\x55/Ú/gm ;
-                       s/\xe2\x59/Ý/gm ;
-                       s/\xe2\x61/á/gm ;
-                       s/\xe2\x65/é/gm ;
-                       s/\xe2\x69/í/gm ;
-                       s/\xe2\x6f/ó/gm ;
-                       s/\xe2\x75/ú/gm ;
-                       s/\xe2\x79/ý/gm ;
-                       s/\xe3\x41/Â/gm ;
-                       s/\xe3\x45/Ê/gm ;
-                       s/\xe3\x49/Î/gm ;
-                       s/\xe3\x4f/Ô/gm ;
-                       s/\xe3\x55/Û/gm ;
-                       s/\xe3\x61/â/gm ;
-                       s/\xe3\x65/ê/gm ;
-                       s/\xe3\x69/î/gm ;
-                       s/\xe3\x6f/ô/gm ;
-                       s/\xe3\x75/û/gm ;
-                       s/\xe4\x41/Ã/gm ;
-                       s/\xe4\x4e/Ñ/gm ;
-                       s/\xe4\x4f/Õ/gm ;
-                       s/\xe4\x61/ã/gm ;
-                       s/\xe4\x6e/ñ/gm ;
-                       s/\xe4\x6f/õ/gm ;
-                       s/\xe8\x45/Ë/gm ;
-                       s/\xe8\x49/Ï/gm ;
-                       s/\xe8\x65/ë/gm ;
-                       s/\xe8\x69/ï/gm ;
-                       s/\xe8\x76/ÿ/gm ;
-                       s/\xe9\x41/Ä/gm ;
-                       s/\xe9\x4f/Ö/gm ;
-                       s/\xe9\x55/Ü/gm ;
-                       s/\xe9\x61/ä/gm ;
-                       s/\xe9\x6f/ö/gm ;
-                       s/\xe9\x75/ü/gm ;
-                       s/\xea\x41/Å/gm ;
-                       s/\xea\x61/å/gm ;
-                       # this handles non-sorting blocks (if implementation requires this)
-                       $string = nsb_clean($_) ;
-               }
-       }
-       return($string) ;
+
+    # converts ISO 5426 coded string to ISO 8859-1
+    # sloppy code : should be improved in next issue
+    my ( $string, $encoding ) = @_;
+    $_ = $string;
+
+    #  $encoding = C4::Context->preference("marcflavour") unless $encoding;
+    if ( $encoding eq "UNIMARC" ) {
+        s/\xe1/Æ/gm;
+        s/\xe2/Ð/gm;
+        s/\xe9/Ø/gm;
+        s/\xec/þ/gm;
+        s/\xf1/æ/gm;
+        s/\xf3/ð/gm;
+        s/\xf9/ø/gm;
+        s/\xfb/ß/gm;
+        s/\xc1\x61/à/gm;
+        s/\xc1\x65/è/gm;
+        s/\xc1\x69/ì/gm;
+        s/\xc1\x6f/ò/gm;
+        s/\xc1\x75/ù/gm;
+        s/\xc1\x41/À/gm;
+        s/\xc1\x45/È/gm;
+        s/\xc1\x49/Ì/gm;
+        s/\xc1\x4f/Ò/gm;
+        s/\xc1\x55/Ù/gm;
+        s/\xc2\x41/Á/gm;
+        s/\xc2\x45/É/gm;
+        s/\xc2\x49/Í/gm;
+        s/\xc2\x4f/Ó/gm;
+        s/\xc2\x55/Ú/gm;
+        s/\xc2\x59/Ý/gm;
+        s/\xc2\x61/á/gm;
+        s/\xc2\x65/é/gm;
+        s/\xc2\x69/í/gm;
+        s/\xc2\x6f/ó/gm;
+        s/\xc2\x75/ú/gm;
+        s/\xc2\x79/ý/gm;
+        s/\xc3\x41/Â/gm;
+        s/\xc3\x45/Ê/gm;
+        s/\xc3\x49/Î/gm;
+        s/\xc3\x4f/Ô/gm;
+        s/\xc3\x55/Û/gm;
+        s/\xc3\x61/â/gm;
+        s/\xc3\x65/ê/gm;
+        s/\xc3\x69/î/gm;
+        s/\xc3\x6f/ô/gm;
+        s/\xc3\x75/û/gm;
+        s/\xc4\x41/Ã/gm;
+        s/\xc4\x4e/Ñ/gm;
+        s/\xc4\x4f/Õ/gm;
+        s/\xc4\x61/ã/gm;
+        s/\xc4\x6e/ñ/gm;
+        s/\xc4\x6f/õ/gm;
+        s/\xc8\x45/Ë/gm;
+        s/\xc8\x49/Ï/gm;
+        s/\xc8\x65/ë/gm;
+        s/\xc8\x69/ï/gm;
+        s/\xc8\x76/ÿ/gm;
+        s/\xc9\x41/Ä/gm;
+        s/\xc9\x4f/Ö/gm;
+        s/\xc9\x55/Ü/gm;
+        s/\xc9\x61/ä/gm;
+        s/\xc9\x6f/ö/gm;
+        s/\xc9\x75/ü/gm;
+        s/\xca\x41/Å/gm;
+        s/\xca\x61/å/gm;
+        s/\xd0\x43/Ç/gm;
+        s/\xd0\x63/ç/gm;
+
+        # this handles non-sorting blocks (if implementation requires this)
+        $string = nsb_clean($_);
+    }
+    elsif ( $encoding eq "USMARC" || $encoding eq "MARC21" ) {
+        if (/[\xc1-\xff]/) {
+            s/\xe1\x61/à/gm;
+            s/\xe1\x65/è/gm;
+            s/\xe1\x69/ì/gm;
+            s/\xe1\x6f/ò/gm;
+            s/\xe1\x75/ù/gm;
+            s/\xe1\x41/À/gm;
+            s/\xe1\x45/È/gm;
+            s/\xe1\x49/Ì/gm;
+            s/\xe1\x4f/Ò/gm;
+            s/\xe1\x55/Ù/gm;
+            s/\xe2\x41/Á/gm;
+            s/\xe2\x45/É/gm;
+            s/\xe2\x49/Í/gm;
+            s/\xe2\x4f/Ó/gm;
+            s/\xe2\x55/Ú/gm;
+            s/\xe2\x59/Ý/gm;
+            s/\xe2\x61/á/gm;
+            s/\xe2\x65/é/gm;
+            s/\xe2\x69/í/gm;
+            s/\xe2\x6f/ó/gm;
+            s/\xe2\x75/ú/gm;
+            s/\xe2\x79/ý/gm;
+            s/\xe3\x41/Â/gm;
+            s/\xe3\x45/Ê/gm;
+            s/\xe3\x49/Î/gm;
+            s/\xe3\x4f/Ô/gm;
+            s/\xe3\x55/Û/gm;
+            s/\xe3\x61/â/gm;
+            s/\xe3\x65/ê/gm;
+            s/\xe3\x69/î/gm;
+            s/\xe3\x6f/ô/gm;
+            s/\xe3\x75/û/gm;
+            s/\xe4\x41/Ã/gm;
+            s/\xe4\x4e/Ñ/gm;
+            s/\xe4\x4f/Õ/gm;
+            s/\xe4\x61/ã/gm;
+            s/\xe4\x6e/ñ/gm;
+            s/\xe4\x6f/õ/gm;
+            s/\xe8\x45/Ë/gm;
+            s/\xe8\x49/Ï/gm;
+            s/\xe8\x65/ë/gm;
+            s/\xe8\x69/ï/gm;
+            s/\xe8\x76/ÿ/gm;
+            s/\xe9\x41/Ä/gm;
+            s/\xe9\x4f/Ö/gm;
+            s/\xe9\x55/Ü/gm;
+            s/\xe9\x61/ä/gm;
+            s/\xe9\x6f/ö/gm;
+            s/\xe9\x75/ü/gm;
+            s/\xea\x41/Å/gm;
+            s/\xea\x61/å/gm;
+
+            # this handles non-sorting blocks (if implementation requires this)
+            $string = nsb_clean($_);
+        }
+    }
+    return ($string);
 }
 
 sub nsb_clean {
-       my $NSB = '\x88' ;              # NSB : begin Non Sorting Block
-       my $NSE = '\x89' ;              # NSE : Non Sorting Block end
-       # handles non sorting blocks
-       my ($string) = @_ ;
-       $_ = $string ;
-       s/$NSB/(/gm ;
-       s/[ ]{0,1}$NSE/) /gm ;
-       $string = $_ ;
-       return($string) ;
+    my $NSB = '\x88';    # NSB : begin Non Sorting Block
+    my $NSE = '\x89';    # NSE : Non Sorting Block end
+                         # handles non sorting blocks
+    my ($string) = @_;
+    $_ = $string;
+    s/$NSB/(/gm;
+    s/[ ]{0,1}$NSE/) /gm;
+    $string = $_;
+    return ($string);
 }
 
-END { }       # module clean-up code here (global destructor)
+sub FindDuplicate {
+       my ($record)=@_;
+       my $dbh = C4::Context->dbh;
+       my $result = MARCmarc2koha($dbh,$record,'');
+       my $sth;
+       my ($biblionumber,$bibid,$title);
+       # search duplicate on ISBN, easy and fast...
+       if ($result->{isbn}) {
+               $sth = $dbh->prepare("select biblio.biblionumber,bibid,title from biblio,biblioitems,marc_biblio where biblio.biblionumber=biblioitems.biblionumber and marc_biblio.biblionumber=biblioitems.biblionumber and isbn=?");
+               $sth->execute($result->{'isbn'});
+               ($biblionumber,$bibid,$title) = $sth->fetchrow;
+               return $biblionumber,$bibid,$title if ($biblionumber);
+       }
+       # a more complex search : build a request for SearchMarc::catalogsearch()
+       my (@tags, @and_or, @excluding, @operator, @value, $offset,$length);
+       # search on biblio.title
+       my ($tag,$subfield) = MARCfind_marc_from_kohafield($dbh,"biblio.title","");
+       if ($record->field($tag)) {
+               if ($record->field($tag)->subfields($subfield)) {
+                       push @tags, "'".$tag.$subfield."'";
+                       push @and_or, "and";
+                       push @excluding, "";
+                       push @operator, "contains";
+                       push @value, $record->field($tag)->subfield($subfield);
+#                      warn "for title, I add $tag / $subfield".$record->field($tag)->subfield($subfield);
+               }
+       }
+       # ... and on biblio.author
+       ($tag,$subfield) = MARCfind_marc_from_kohafield($dbh,"biblio.author","");
+       if ($record->field($tag)) {
+               if ($record->field($tag)->subfields($subfield)) {
+                       push @tags, "'".$tag.$subfield."'";
+                       push @and_or, "and";
+                       push @excluding, "";
+                       push @operator, "contains";
+                       push @value, $record->field($tag)->subfield($subfield);
+#                      warn "for author, I add $tag / $subfield".$record->field($tag)->subfield($subfield);
+               }
+       }
+       # ... and on publicationyear.
+       ($tag,$subfield) = MARCfind_marc_from_kohafield($dbh,"biblioitems.publicationyear","");
+       if ($record->field($tag)) {
+               if ($record->field($tag)->subfields($subfield)) {
+                       push @tags, "'".$tag.$subfield."'";
+                       push @and_or, "and";
+                       push @excluding, "";
+                       push @operator, "=";
+                       push @value, $record->field($tag)->subfield($subfield);
+#                      warn "for publicationyear, I add $tag / $subfield".$record->field($tag)->subfield($subfield);
+               }
+       }
+       # ... and on size.
+       ($tag,$subfield) = MARCfind_marc_from_kohafield($dbh,"biblioitems.size","");
+       if ($record->field($tag)) {
+               if ($record->field($tag)->subfields($subfield)) {
+                       push @tags, "'".$tag.$subfield."'";
+                       push @and_or, "and";
+                       push @excluding, "";
+                       push @operator, "=";
+                       push @value, $record->field($tag)->subfield($subfield);
+#                      warn "for size, I add $tag / $subfield".$record->field($tag)->subfield($subfield);
+               }
+       }
+       # ... and on publisher.
+       ($tag,$subfield) = MARCfind_marc_from_kohafield($dbh,"biblioitems.publishercode","");
+       if ($record->field($tag)) {
+               if ($record->field($tag)->subfields($subfield)) {
+                       push @tags, "'".$tag.$subfield."'";
+                       push @and_or, "and";
+                       push @excluding, "";
+                       push @operator, "=";
+                       push @value, $record->field($tag)->subfield($subfield);
+#                      warn "for publishercode, I add $tag / $subfield".$record->field($tag)->subfield($subfield);
+               }
+       }
+       # ... and on volume.
+       ($tag,$subfield) = MARCfind_marc_from_kohafield($dbh,"biblioitems.volume","");
+       if ($record->field($tag)) {
+               if ($record->field($tag)->subfields($subfield)) {
+                       push @tags, "'".$tag.$subfield."'";
+                       push @and_or, "and";
+                       push @excluding, "";
+                       push @operator, "=";
+                       push @value, $record->field($tag)->subfield($subfield);
+#                      warn "for volume, I add $tag / $subfield".$record->field($tag)->subfield($subfield);
+               }
+       }
+
+       my ($finalresult,$nbresult) = C4::SearchMarc::catalogsearch($dbh,\@tags,\@and_or,\@excluding,\@operator,\@value,0,10);
+       # there is at least 1 result => return the 1st one
+       if ($nbresult) {
+#              warn "$nbresult => ".@$finalresult[0]->{biblionumber},@$finalresult[0]->{bibid},@$finalresult[0]->{title};
+               return @$finalresult[0]->{biblionumber},@$finalresult[0]->{bibid},@$finalresult[0]->{title};
+       }
+       # no result, returns nothing
+       return;
+}
+sub DisplayISBN {
+       my ($isbn)=@_;
+       my $seg1;
+       if(substr($isbn, 0, 1) <=7) {
+               $seg1 = substr($isbn, 0, 1);
+       } elsif(substr($isbn, 0, 2) <= 94) {
+               $seg1 = substr($isbn, 0, 2);
+       } elsif(substr($isbn, 0, 3) <= 995) {
+               $seg1 = substr($isbn, 0, 3);
+       } elsif(substr($isbn, 0, 4) <= 9989) {
+               $seg1 = substr($isbn, 0, 4);
+       } else {
+               $seg1 = substr($isbn, 0, 5);
+       }
+       my $x = substr($isbn, length($seg1));
+       my $seg2;
+       if(substr($x, 0, 2) <= 19) {
+#              if(sTmp2 < 10) sTmp2 = "0" sTmp2;
+               $seg2 = substr($x, 0, 2);
+       } elsif(substr($x, 0, 3) <= 699) {
+               $seg2 = substr($x, 0, 3);
+       } elsif(substr($x, 0, 4) <= 8399) {
+               $seg2 = substr($x, 0, 4);
+       } elsif(substr($x, 0, 5) <= 89999) {
+               $seg2 = substr($x, 0, 5);
+       } elsif(substr($x, 0, 6) <= 9499999) {
+               $seg2 = substr($x, 0, 6);
+       } else {
+               $seg2 = substr($x, 0, 7);
+       }
+       my $seg3=substr($x,length($seg2));
+       $seg3=substr($seg3,0,length($seg3)-1) ;
+       my $seg4 = substr($x, -1, 1);
+       return "$seg1-$seg2-$seg3-$seg4";
+}
+END { }    # module clean-up code here (global destructor)
 
 =back
 
@@ -2217,6 +2681,216 @@ Paul POULAIN paul.poulain@free.fr
 
 # $Id$
 # $Log$
+# Revision 1.121  2005/06/20 14:10:00  tipaul
+# synch'ing 2.2 and head
+#
+# Revision 1.120  2005/06/15 16:09:43  hdl
+# Displaying dashed isbn.
+#
+# Revision 1.119  2005/06/01 20:43:58  genjimoto
+# patch from Genji (Waylon R.) to update subjects in MARC tables when systempref has MARC=OFF
+#
+# Revision 1.118  2005/05/04 15:40:01  tipaul
+# synch'ing 2.2 and head
+#
+# Revision 1.115.2.9  2005/04/07 10:05:25  tipaul
+# adding / to the list of symbols that are replace by spaces for searches
+#
+# Revision 1.115.2.8  2005/03/25 16:23:49  tipaul
+# some improvements :
+# * return immediatly when a subfield is empty
+# * search duplicate on isbn must be done only when there is an isbn ;-)
+#
+# Revision 1.115.2.7  2005/03/10 15:52:28  tipaul
+# * adding glass to opac marc detail.
+# * changing glasses behaviour : It now appears only on subfields that have a "link" value. Avoid useless glasses and removes nothing. **** WARNING **** : if you don't change you MARC parameters, glasses DISAPPEAR, because no subfields have a link value. So you MUST "reactivate" them manually. If you want to enable the search glass on field 225$a (collection in UNIMARC), just put 225a to "link" field (Koha >> parameters >> framework >> 225 field >> subfield >> modify $a >> enter 225a in link input field (without quotes or anything else)
+# * fixing bug with libopac
+#
+# Revision 1.115.2.6  2005/03/09 15:56:01  tipaul
+# Changing MARCmoditem to be like MARCmodbiblio : a modif is a delete & create.
+# Longer, but solves problems with repeated subfields.
+#
+# The previous version was not buggy except under certain circumstances (a repeated subfield, that does not exist usually in items)
+#
+# Revision 1.115.2.5  2005/02/24 13:54:04  tipaul
+# exporting MARCdelsubfield sub. It's used in authority merging.
+# Modifying it too to enable deletion of all subfields from a given tag/subfield or just one.
+#
+# Revision 1.115.2.4  2005/02/17 12:44:25  tipaul
+# bug in acquisition : the title was also stored as subtitle.
+#
+# Revision 1.115.2.3  2005/02/10 13:14:36  tipaul
+# * multiple main authors are now correctly handled in simple (non-MARC) view
+#
+# Revision 1.115.2.2  2005/01/11 16:02:35  tipaul
+# in catalogue, modifs were not stored properly the non-MARC item DB. Affect only libraries without barcodes.
+#
+# Revision 1.115.2.1  2005/01/11 14:45:37  tipaul
+# bugfix : issn were not stored correctly in non-MARC DB on biblio modification
+#
+# Revision 1.115  2005/01/06 14:32:17  tipaul
+# improvement of speed for bulkmarcimport.
+# A sub had been forgotten to use the C4::Context->marcfromkohafield array, that caches DB datas.
+# this is only a little improvement for normal DB modif, but almost x2 the speed of bulkmarcimport... from 6records/seconds to more than 10.
+#
+# Revision 1.114  2005/01/03 10:48:33  tipaul
+# * bugfix for the search on a MARC detail, when you clic on the magnifying glass (caused an internal server error)
+# * partial support of the "linkage" MARC feature : if you enter a "link" on a MARC subfield, the magnifying glass won't search on the field, but on the linked field. I agree it's a partial support. Will be improved, but I need to investigate MARC21 & UNIMARC diffs on this topic.
+#
+# Revision 1.113  2004/12/10 16:27:53  tipaul
+# limiting the number of search term to 8. There was no limit before, but 8 words seems to be the upper limit mySQL can deal with (in less than a second. tested on a DB with 13 000 items)
+# In 2.4, a new DB structure will highly speed things and this limit will be removed.
+# FindDuplicate is activated again, the perf problems were due to this problem.
+#
+# Revision 1.112  2004/12/08 10:14:42  tipaul
+# * desactivate FindDuplicate
+# * fix from Genji
+#
+# Revision 1.111  2004/11/25 17:39:44  tipaul
+# removing useless &branches in package declaration
+#
+# Revision 1.110  2004/11/24 16:00:01  tipaul
+# removing sub branches (commited by chris for MARC=OFF bugfix, but sub branches is already in Acquisition.pm)
+#
+# Revision 1.109  2004/11/24 15:58:31  tipaul
+# * critical fix for acquisition (see RC3 release notes)
+# * critical fix for duplicate finder
+#
+# Revision 1.108  2004/11/19 19:41:22  rangi
+# Shifting branches() from deprecated C4::Catalogue to C4::Biblio
+# Allowing the non marc interface acquisitions to work.
+#
+# Revision 1.107  2004/11/05 10:15:27  tipaul
+# Improving FindDuplicate to find duplicate records on adding biblio
+#
+# Revision 1.106  2004/11/02 16:44:45  tipaul
+# new feature : checking for duplicate biblio.
+#
+# For instance, it's only done on ISBN only. Will be improved soon.
+#
+# When a duplicate is detected, the biblio is not saved, but the user is asked for a confirmations.
+#
+# Revision 1.105  2004/09/23 16:15:37  tipaul
+# indenting diff
+#
+# Revision 1.104  2004/09/16 15:06:46  tipaul
+# enabling # (| still possible too) for repeatable subfields
+#
+# Revision 1.103  2004/09/06 14:17:34  tipaul
+# some commented warning added + 1 major bugfix => drop empty fields, NOT fields containing 0
+#
+# Revision 1.102  2004/09/06 10:00:19  tipaul
+# adding a "location" field to the library.
+# This field is useful when the callnumber contains no information on the room where the item is stored.
+# With this field, we now have 3 levels of informations to find a book :
+# * the branch.
+# * the location.
+# * the callnumber.
+#
+# This should be versatile enough to solve any storing method.
+# This hack is quite simple, due to the nice Biblio.pm API. The MARC => koha db link is automatically managed. Just add the link in the parameters section.
+#
+# Revision 1.101  2004/08/18 16:01:37  tipaul
+# modifs to support frameworkcodes
+#
+# Revision 1.100  2004/08/13 16:37:25  tipaul
+# adding frameworkcode to API in some subs
+#
+# Revision 1.99  2004/07/30 13:54:50  doxulting
+# Beginning of serial commit
+#
+# Revision 1.98  2004/07/15 09:48:10  tipaul
+# * removing useless sub
+# * minor bugfix in moditem (managing homebranch & holdingbranch)
+#
+# Revision 1.97  2004/07/02 15:53:53  tipaul
+# bugfix (due to frameworkcode field)
+#
+# Revision 1.96  2004/06/29 16:07:10  tipaul
+# last sync for 2.1.0 release
+#
+# Revision 1.95  2004/06/26 23:19:59  rangi
+# Fixing modaddauthor, and adding getitemtypes.
+# Also tidying up formatting of code
+#
+# Revision 1.94  2004/06/17 08:16:32  tipaul
+# merging tag & subfield in marc_word for better perfs
+#
+# Revision 1.93  2004/06/11 15:38:06  joshferraro
+# Changes MARCaddword to index words >= 1 char ... needed for more accurate
+# searches using SearchMarc routines.
+#
+# Revision 1.92  2004/06/10 08:29:01  tipaul
+# MARC authority management (continued)
+#
+# Revision 1.91  2004/06/03 10:03:01  tipaul
+# * frameworks and itemtypes are independant
+# * in the MARC editor, showing the + to duplicate a tag only if the tag is repeatable
+#
+# Revision 1.90  2004/05/28 08:25:53  tipaul
+# hidding hidden & isurl constraints into MARC subfield structure
+#
+# Revision 1.89  2004/05/27 21:47:21  rangi
+# Fix for bug 787
+#
+# Revision 1.88  2004/05/18 15:23:49  tipaul
+# framework management : 1 MARC framework for each itemtype
+#
+# Revision 1.87  2004/05/18 11:54:07  tipaul
+# getitemtypes moved in Koha.pm
+#
+# Revision 1.86  2004/05/03 09:19:22  tipaul
+# some fixes for mysql prepare & execute
+#
+# Revision 1.85  2004/04/02 14:55:48  tipaul
+# renaming items.bulk field to items.itemcallnumber.
+# Will be used to store call number for libraries that don't use dewey classification.
+# Note it's related to ITEMS, not biblio.
+#
+# Revision 1.84  2004/03/24 17:18:30  joshferraro
+# Fixes bug 749 by removing the comma on line 1488.
+#
+# Revision 1.83  2004/03/15 14:31:50  tipaul
+# adding a minor check
+#
+# Revision 1.82  2004/03/07 05:47:31  acli
+# Various updates/fixes from rel_2_0
+# Fixes for bugs 721 (templating), 727, and 734
+#
+# Revision 1.81  2004/03/06 20:26:13  tipaul
+# adding seealso feature in MARC searches
+#
+# Revision 1.80  2004/02/12 13:40:56  tipaul
+# deleting subs duplicated by error
+#
+# Revision 1.79  2004/02/11 08:40:09  tipaul
+# synch'ing 2.0.0 branch and head
+#
+# Revision 1.78.2.3  2004/02/10 13:15:46  tipaul
+# removing 2 warnings
+#
+# Revision 1.78.2.2  2004/01/26 10:38:06  tipaul
+# dealing correctly "bulk" field
+#
+# Revision 1.78.2.1  2004/01/13 17:29:53  tipaul
+# * minor html fixes
+# * adding publisher in acquisition process (& ordering basket by publisher)
+#
+# Revision 1.78  2003/12/09 15:57:28  tipaul
+# rolling back to working char_decode sub
+#
+# Revision 1.77  2003/12/03 17:47:14  tipaul
+# bugfixes for biblio deletion
+#
+# Revision 1.76  2003/12/03 01:43:41  slef
+# conflict markers?
+#
+# Revision 1.75  2003/12/03 01:42:03  slef
+# bug 662 fixes securing DBI
+#
+# Revision 1.74  2003/11/28 09:48:33  tipaul
+# bugfix : misusing prepare & execute => now using prepare(?) and execute($var)
+#
 # Revision 1.73  2003/11/28 09:45:25  tipaul
 # bugfix for iso2709 file import in the "notforloan" field.
 #