Now, the acqui.simple system...
authortipaul <tipaul>
Wed, 24 Jul 2002 16:24:20 +0000 (16:24 +0000)
committertipaul <tipaul>
Wed, 24 Jul 2002 16:24:20 +0000 (16:24 +0000)
marcimport.pl has been almost completly rewritten, so LOT OF BUGS TO COME !!! You've been warned. It seems to work, but...

As with my former messages, nothing seems to have been changed... but ...
* marcimport now uses HTML::Template.
* marcimport now uses MARC::Record. that means that when you import a record, the old-DB is populated with the data as in version 1.2, but the MARC-DB part is filled with full MARC::Record.

<IMPORTANT NOTE>
to get correct response times, you MUST add an index on isbn, issn and lccn rows in biblioitem table. Note this should be done in 1.2 too...
</IMPORTANT NOTE>

<IMPORTANT NOTE2>
acqui.simple manage biblio, biblioitems and items tables quite properly. Normal acquisition system manages biblio, biblioitems BUT NOT items. That will be done in the near future...
</IMPORTANT NOTE2>

what's next now ?
* bug tracking, of course... Surely a dozen of dozens...
* LOT of developpments, i'll surely write a mail to koha-devel tomorrow (as it's time for dinner in France, and i plan to play NeverwinterNights after dinner ;-) ...

acqui.simple/addbooks.pl
acqui.simple/addbookslccn.pl
acqui.simple/additem.pl
acqui.simple/bulkmarcimport.pl
acqui.simple/isbnsearch.pl
acqui.simple/keywordsearch.pl
acqui.simple/marcimport.pl
acqui.simple/savebiblio.pl
acqui.simple/saveitem.pl
acqui.simple/viewmarc.pl
acqui.simple/websitesearch.pl

index 958cbd4..a892437 100755 (executable)
@@ -1,14 +1,25 @@
 #!/usr/bin/perl
 
 #
+# Modified saas@users.sf.net 12:00 01 April 2001
+# The biblioitemnumber was not correctly initialised
+# The max(barcode) value was broken - koha 'barcode' is a string value!
+# - If left blank, barcode value now defaults to max(biblionumber) 
+
+#
 # TODO
 #
 # Add info on biblioitems and items already entered as you enter new ones
 #
+# Add info on biblioitems and items already entered as you enter new ones
 
+use C4::Database;
 use CGI;
 use strict;
+use C4::Catalogue;
+use C4::Biblio;
 use C4::Output;
+use C4::Circulation::Circ2;
 
 my $input = new CGI;
 my $error   = $input->param('error');
index 04acec2..0f921af 100755 (executable)
@@ -16,7 +16,7 @@
 use C4::Database;
 use CGI;
 use strict;
-use C4::Acquisitions;
+use C4::Catalogue;
 use C4::Biblio;
 use C4::Output;
 use C4::Circulation::Circ2;
index ab064b0..0bf647e 100755 (executable)
@@ -2,7 +2,8 @@
 
 use CGI;
 use strict;
-use C4::Acquisitions;
+use C4::Catalogue;
+use C4::Biblio;
 use C4::Output;
 
 my $input = new CGI;
index e54d224..59120b2 100755 (executable)
@@ -31,7 +31,7 @@ use C4::Database;
 use CGI;
 use DBI;
 #use strict;
-use C4::Acquisitions;
+use C4::Catalogue;
 use C4::Biblio;
 use C4::Output;
 my $dbh=C4Connect;
index 55adb6d..ab111f4 100755 (executable)
@@ -2,7 +2,8 @@
 
 use CGI;
 use strict;
-use C4::Acquisitions;
+use C4::Catalogue;
+use C4::Biblio;
 use C4::Search;
 use C4::Output;
 
index fef1a13..07a88da 100755 (executable)
@@ -2,7 +2,8 @@
 
 use CGI;
 use strict;
-use C4::Acquisitions;
+use C4::Catalogue;
+use C4::Biblio;
 use C4::Search;
 use C4::Output;
 
index f943975..874f8ff 100755 (executable)
@@ -1,13 +1,15 @@
 #!/usr/bin/perl
 
+# $Id$
+
 # Script for handling import of MARC data into Koha db
 #   and Z39.50 lookups
 
 # Koha library project  www.koha.org
 
 # Licensed under the GPL
+
 use strict;
-#use strict;
 
 # standard or CPAN modules used
 use CGI;
@@ -17,100 +19,39 @@ use DBI;
 use C4::Database;
 use C4::Acquisitions;
 use C4::Output;
-
 use C4::Input;
 use C4::Biblio;
+use C4::SimpleMarc;
+use C4::Z3950;
+use MARC::File::USMARC;
+use HTML::Template;
 
 #------------------
 # Constants
 
+my %configfile;
+open (KC, "/etc/koha.conf");
+while (<KC>) {
+ chomp;
+ (next) if (/^\s*#/);
+ if (/(.*)\s*=\s*(.*)/) {
+   my $variable=$1;
+   my $value=$2;
+   # Clean up white space at beginning and end
+   $variable=~s/^\s*//g;
+   $variable=~s/\s*$//g;
+   $value=~s/^\s*//g;
+   $value=~s/\s*$//g;
+   $configfile{$variable}=$value;
+ }
+}
+my $includes=$configfile{'includes'};
+($includes) || ($includes="/usr/local/www/hdl/htdocs/includes");
+
 # HTML colors for alternating lines
 my $lc1='#dddddd';
 my $lc2='#ddaaaa';
 
-my %tagtext = (
-    '001' => 'Control number',
-    '003' => 'Control number identifier',
-    '005' => 'Date and time of latest transaction',
-    '006' => 'Fixed-length data elements -- additional material characteristics',
-    '007' => 'Physical description fixed field',
-    '008' => 'Fixed length data elements',
-    '010' => 'LCCN',
-    '015' => 'LCCN Cdn',
-    '020' => 'ISBN',
-    '022' => 'ISSN',
-    '037' => 'Source of acquisition',
-    '040' => 'Cataloging source',
-    '041' => 'Language code',
-    '043' => 'Geographic area code',
-    '050' => 'Library of Congress call number',
-    '060' => 'National Library of Medicine call number',
-    '082' => 'Dewey decimal call number',
-    '100' => 'Main entry -- Personal name',
-    '110' => 'Main entry -- Corporate name',
-    '130' => 'Main entry -- Uniform title',
-    '240' => 'Uniform title',
-    '245' => 'Title statement',
-    '246' => 'Varying form of title',
-    '250' => 'Edition statement',
-    '256' => 'Computer file characteristics',
-    '260' => 'Publication, distribution, etc.',
-    '263' => 'Projected publication date',
-    '300' => 'Physical description',
-    '306' => 'Playing time',
-    '440' => 'Series statement / Added entry -- Title',
-    '490' => 'Series statement',
-    '500' => 'General note',
-    '504' => 'Bibliography, etc. note',
-    '505' => 'Formatted contents note',
-    '508' => 'Creation/production credits note',
-    '510' => 'Citation/references note',
-    '511' => 'Participant or performer note',
-    '520' => 'Summary, etc. note',
-    '521' => 'Target audience note (ie age)',
-    '530' => 'Additional physical form available note',
-    '538' => 'System details note',
-    '586' => 'Awards note',
-    '600' => 'Subject added entry -- Personal name',
-    '610' => 'Subject added entry -- Corporate name',
-    '650' => 'Subject added entry -- Topical term',
-    '651' => 'Subject added entry -- Geographic name',
-    '656' => 'Index term -- Occupation',
-    '700' => 'Added entry -- Personal name',
-    '710' => 'Added entry -- Corporate name',
-    '730' => 'Added entry -- Uniform title',
-    '740' => 'Added entry -- Uncontrolled related/analytical title',
-    '800' => 'Series added entry -- Personal name',
-    '830' => 'Series added entry -- Uniform title',
-    '852' => 'Location',
-    '856' => 'Electronic location and access',
-);
-
-# tag, subfield, field name, repeats, striptrailingchars
-my %tagmap=(
-    '010'=>{'a'=>{name=> 'lccn',       rpt=>0  }},
-    '015'=>{'a'=>{name=> 'lccn',       rpt=>0  }},
-    '020'=>{'a'=>{name=> 'isbn',       rpt=>0  }},
-    '022'=>{'a'=>{name=> 'issn',       rpt=>0  }},
-    '082'=>{'a'=>{name=> 'dewey',      rpt=>0  }},
-    '100'=>{'a'=>{name=> 'author',     rpt=>0, striptrail=>',:;/-'     }},
-    '245'=>{'a'=>{name=> 'title',      rpt=>0, striptrail=>',:;/'      },
-            'b'=>{name=> 'subtitle',   rpt=>0, striptrail=>',:;/'      }},
-    '260'=>{'a'=>{name=> 'place',      rpt=>0, striptrail=>',:;/-'     },
-            'b'=>{name=> 'publisher',  rpt=>0, striptrail=>',:;/-'     },
-            'c'=>{name=> 'year' ,      rpt=>0, striptrail=>'.,:;/-'    }},
-    '300'=>{'a'=>{name=> 'pages',      rpt=>0, striptrail=>',:;/-'     },
-            'c'=>{name=> 'size',       rpt=>0, striptrail=>',:;/-'     }},
-    '362'=>{'a'=>{name=> 'volume-number',      rpt=>0  }},
-    '440'=>{'a'=>{name=> 'seriestitle',        rpt=>0, striptrail=>',:;/'      },
-            'v'=>{name=> 'volume-number',rpt=>0        }},
-    '490'=>{'a'=>{name=> 'seriestitle',        rpt=>0, striptrail=>',:;/'      },
-            'v'=>{name=> 'volume-number',rpt=>0        }},
-    '700'=>{'a'=>{name=> 'addtional-author-illus',rpt=>1, striptrail=>',:;/'   }},
-    '5xx'=>{'a'=>{name=> 'notes',      rpt=>1  }},
-    '65x'=>{'a'=>{name=> 'subject',    rpt=>1, striptrail=>'.,:;/-'    }},
-);
-
 #-------------
 #-------------
 # Initialize
@@ -122,14 +63,22 @@ my $dbh=C4Connect;
 
 #-------------
 # Display output
-print $input->header;
-print startpage();
-print startmenu('acquisitions');
+#print $input->header;
+#print startpage();
+#print startmenu('acquisitions');
+
 #-------------
 # Process input parameters
+
 my $file=$input->param('file');
 my $menu = $input->param('menu');
 
+#
+#
+# TODO : parameter decoding and function call is quite dirty.
+# should be rewritten...
+#
+#
 if ($input->param('z3950queue')) {
        AcceptZ3950Queue($dbh,$input);
 } 
@@ -141,38 +90,35 @@ if ($input->param('uploadmarc')) {
 if ($input->param('insertnewrecord')) {
     # Add biblio item, and set up menu for adding item copies
     my ($biblionumber,$biblioitemnumber)=AcceptBiblioitem($dbh,$input);
-    ItemCopyForm($dbh,$input,$biblionumber,$biblioitemnumber);
-    print endmenu();
-    print endpage();
     exit;
 }
 
-
 if ($input->param('newitem')) {
     # Add item copy
     &AcceptItemCopy($dbh,$input);
+    exit;
 } # if newitem
 
+
 if ($file) {
     ProcessFile($dbh,$input);
 } else {
-SWITCH:
+  SWITCH:
     {
        if ($menu eq 'z3950') { z3950menu($dbh,$input); last SWITCH; }
-       if ($menu eq 'uploadmarc') { uploadmarc(); last SWITCH; }
+       if ($menu eq 'uploadmarc') { uploadmarc($dbh); last SWITCH; }
        if ($menu eq 'manual') { manual(); last SWITCH; }
        mainmenu();
     }
-
 }
-print endmenu();
-print endpage();
+#print endmenu();
+#print endpage();
 
 
+# Process a MARC file : show list of records, of 1 record detail, if numrecord exists
 sub ProcessFile {
     # A MARC file has been specified; process it for review form
     use strict;
-
     # Input params
     my (
        $dbh,
@@ -186,209 +132,91 @@ sub ProcessFile {
     );
 
     my $debug=0;
-    my $splitchar=chr(29);
 
     requireDBI($dbh,"ProcessFile");
 
-    print "<a href=$ENV{'SCRIPT_NAME'}>Main Menu</a><hr>\n";
-    my $qisbn=$input->param('isbn');
-    my $qissn=$input->param('issn');
-    my $qlccn=$input->param('lccn');
-    my $qcontrolnumber=$input->param('controlnumber');
-
     # See if a particular result item was specified
-    if ($qisbn || $qissn || $qlccn || $qcontrolnumber) {
-       print "<a href=$ENV{'SCRIPT_NAME'}>New File</a><hr>\n";
-       #open (F, "$file");
-       #my $data=<F>;
-       my $data;
-
-       if ($file=~/Z-(\d+)/) {
-           my $id=$1;
-           my $resultsid=$input->param('resultsid');
-           my $sth=$dbh->prepare("select results from z3950results where id=$resultsid");
-           $sth->execute;
-           ($data) = $sth->fetchrow;
-       } else {
-           my $sth=$dbh->prepare("select marc from uploadedmarc where id=$file");
-           $sth->execute;
-           ($data) = $sth->fetchrow;
-       }
-
-       my @records;
-
-RECORD:
-       foreach $record (split(/$splitchar/, $data)) {
-
-           my (
-               $bib,           # hash ref to named fields
-               $fieldlist,     # list ref
-               $lccn, $isbn, $issn, $dewey, 
-               $publisher, $publicationyear, $volume, 
-               $number, @subjects, $notes, $additionalauthors, 
-               $copyrightdate, $seriestitle,
-               $origisbn, $origissn, $origlccn, $origcontrolnumber,
-               $subtitle,
-               $controlnumber,
-               $cleanauthor,
-               $subject,
-                $volumedate,
-                $volumeddesc,
-               $itemtypeselect,
-           );
-           my ($lccninput, $isbninput, $issninput, $deweyinput, $authorinput, $titleinput, 
-               $placeinput, $publisherinput, $publicationyearinput, $volumeinput, 
-               $numberinput, $notesinput, $additionalauthorsinput, 
-               $illustratorinput, $copyrightdateinput, $seriestitleinput,
-                $subtitleinput,
-                $copyrightinput,
-                $volumedateinput,
-                $volumeddescinput,
-                $subjectinput,
-                $noteinput,
-                $subclassinput,
-                $pubyearinput,
-                $pagesinput,
-                $sizeinput,
-               $marcinput,
-               $fileinput,
-           );
-
-
-           my $marctext;
-
-           my $marc=$record;
-
-           ($fieldlist)=parsemarcfileformat($record );
-
-           $bib=extractmarcfields($fieldlist );
-
-           print "Title=$bib->{title}\n" if $debug;
-
-           $marctext=FormatMarcText($fieldlist);
-
-               $controlnumber          =$bib->{controlnumber};
-               $lccn                   =$bib->{lccn};
-               $isbn                   =$bib->{isbn};
-               $issn                   =$bib->{issn};
-               $publisher              =$bib->{publisher};
-               $publicationyear        =$bib->{publicationyear};
-               $copyrightdate          =$bib->{copyrightdate};
-               
-               $volume                 =$bib->{volume};
-               $number                 =$bib->{number};
-               $seriestitle            =$bib->{seriestitle};
-               $additionalauthors      =$bib->{additionalauthors};
-               $notes                  =$bib->{notes};
-
-           $titleinput=$input->textfield(-name=>'title', -default=>$bib->{title}, -size=>40);
-           $marcinput=$input->hidden(-name=>'marc', -default=>$marc);
-           $subtitleinput=$input->textfield(-name=>'subtitle', -default=>$bib->{subtitle}, -size=>40);
-           $authorinput=$input->textfield(-name=>'author', -default=>$bib->{author});
-           $illustratorinput=$input->textfield(-name=>'illustrator', 
-               -default=>$bib->{illustrator});
-           $additionalauthorsinput=$input->textarea(-name=>'additionalauthors', -default=>$additionalauthors, -rows=>4, -cols=>20);
-
-           my $subject='';
-           foreach ( @{$bib->{subject} } ) {
-               $subject.="$_\n";
-               print "<PRE>form subject=$subject</PRE>\n" if $debug;
-           }
-           $subjectinput=$input->textarea(-name=>'subject', 
-                       -default=>$subject, -rows=>4, -cols=>40);
-
-           $noteinput=$input->textarea(-name=>'notes', 
-                       -default=>$notes, -rows=>4, -cols=>40, -wrap=>'physical');
-           $copyrightinput=$input->textfield(-name=>'copyrightdate', -default=>$copyrightdate);
-           $seriestitleinput=$input->textfield(-name=>'seriestitle', -default=>$seriestitle);
-           $volumeinput=$input->textfield(-name=>'volume', -default=>$volume);
-           $volumedateinput=$input->textfield(-name=>'volumedate', -default=>$volumedate);
-           $volumeddescinput=$input->textfield(-name=>'volumeddesc', -default=>$volumeddesc);
-           $numberinput=$input->textfield(-name=>'number', -default=>$number);
-           $isbninput=$input->textfield(-name=>'isbn', -default=>$isbn);
-           $issninput=$input->textfield(-name=>'issn', -default=>$issn);
-           $lccninput=$input->textfield(-name=>'lccn', -default=>$lccn);
-           $isbninput=$input->textfield(-name=>'isbn', -default=>$isbn);
-           $deweyinput=$input->textfield(-name=>'dewey', -default=>$bib->{dewey});
-           $cleanauthor=$bib->{author};
-           $cleanauthor=~s/[^A-Za-z]//g;
-           $subclassinput=$input->textfield(-name=>'subclass', -default=>uc(substr($cleanauthor,0,3)));
-           $publisherinput=$input->textfield(-name=>'publishercode', -default=>$publisher);
-           $pubyearinput=$input->textfield(-name=>'publicationyear', -default=>$publicationyear);
-           $placeinput=$input->textfield(-name=>'place', -default=>$bib->{place});
-           $pagesinput=$input->textfield(-name=>'pages', -default=>$bib->{pages});
-           $sizeinput=$input->textfield(-name=>'size', -default=>$bib->{size});
-           $fileinput=$input->hidden(-name=>'file', -default=>$file);
-           $origisbn=$input->hidden(-name=>'origisbn', -default=>$isbn);
-           $origissn=$input->hidden(-name=>'origissn', -default=>$issn);
-           $origlccn=$input->hidden(-name=>'origlccn', -default=>$lccn);
-           $origcontrolnumber=$input->hidden(-name=>'origcontrolnumber', -default=>$controlnumber);
-
-           #print "<PRE>getting itemtypeselect</PRE>\n";
-           $itemtypeselect=&getkeytableselectoptions(
-               $dbh, 'itemtypes', 'itemtype', 'description', 1);
-           #print "<PRE>it=$itemtypeselect</PRE>\n";
-
-           ($qissn) || ($qissn='NIL');
-           ($qlccn) || ($qlccn='NIL');
-           ($qisbn) || ($qisbn='NIL');
-           ($qcontrolnumber) || ($qcontrolnumber='NIL');
-           $controlnumber=~s/\s+//g;
-
-           unless (($isbn eq $qisbn) || ($issn eq $qissn) || ($lccn eq $qlccn) || ($controlnumber eq $qcontrolnumber)) {
-               #print "<PRE>Skip record $isbn $issn $lccn </PRE>\n";
-               next RECORD;
-           }
-
-           print << "EOF";
-           <center>
-           <h1>New Record</h1>
-           Full MARC Record available at bottom
-           <form method=post>
-             <table border=1>
-               <tr><td>Title</td><td>$titleinput</td></tr>
-               <tr><td>Subtitle</td><td>$subtitleinput</td></tr>
-               <tr><td>Author</td><td>$authorinput</td></tr>
-               <tr><td>Additional Authors</td><td>$additionalauthorsinput</td></tr>
-               <tr><td>Illustrator</td><td>$illustratorinput</td></tr>
-               <tr><td>Copyright</td><td>$copyrightinput</td></tr>
-               <tr><td>Series Title</td><td>$seriestitleinput</td></tr>
-               <tr><td>Volume</td><td>$volumeinput</td></tr>
-               <tr><td>Number</td><td>$numberinput</td></tr>
-               <tr><td>Volume Date</td><td>$volumedateinput</td></tr>
-               <tr><td>Volume Description</td><td>$volumeddescinput</td></tr>
-               <tr><td>Subject</td><td>$subjectinput</td></tr>
-               <tr><td>Notes</td><td>$noteinput</td></tr>
-               <tr><td>Item Type</td><td><select name=itemtype>$itemtypeselect</select></td></tr>
-               <tr><td>ISBN</td><td>$isbninput</td></tr>
-               <tr><td>ISSN</td><td>$issninput</td></tr>
-               <tr><td>LCCN</td><td>$lccninput</td></tr>
-               <tr><td>Dewey</td><td>$deweyinput</td></tr>
-               <tr><td>Subclass</td><td>$subclassinput</td></tr>
-               <tr><td>Publication Year</td><td>$pubyearinput</td></tr>
-               <tr><td>Publisher</td><td>$publisherinput</td></tr>
-               <tr><td>Place</td><td>$placeinput</td></tr>
-               <tr><td>Pages</td><td>$pagesinput</td></tr>
-               <tr><td>Size</td><td>$sizeinput</td></tr>
-             </table>
-             <input type=submit>
-             <input type=hidden name=insertnewrecord value=1>
-             $fileinput
-             $marcinput
-             $origisbn
-             $origissn
-             $origlccn
-             $origcontrolnumber
-           </form>
-           $marctext
-EOF
-       } # foreach record
+    my $numrecord = $input->param('numrecord');
+    if ($numrecord) {
+       ProcessRecord($dbh,$input,$numrecord);
     } else {
-        # No result item specified, list results
+       # No result item specified, list results
        ListFileRecords($dbh,$input);
     } # if
 } # sub ProcessFile
 
+# show 1 record from the MARC file
+sub ProcessRecord {
+    my ($dbh, $input,$numrecord) = @_;
+    # local vars
+    my (
+       $sth,
+       $record,
+       $data,
+    );
+       
+    if ($file=~/Z-(\d+)/) {
+       my $id=$1;
+       my $resultsid=$input->param('resultsid');
+       my $sth=$dbh->prepare("select results from z3950results where id=$resultsid");
+       $sth->execute;
+       ($data) = $sth->fetchrow;
+    } else {
+       my $sth=$dbh->prepare("select marc from uploadedmarc where id=$file");
+       $sth->execute;
+       ($data) = $sth->fetchrow;
+    }
+    
+    my $file=MARC::File::USMARC->indata ($data);
+    my $oldkoha;
+    for (my $i==1;$i<$numrecord;$i++) {
+       $record = $file->next;
+    }
+    if ($record) {
+       $oldkoha=MARCmarc2koha($dbh,$record);
+    }
+    my $templatebase="marcimport/marcimportdetail.tmpl";
+    my $theme=picktemplate($includes, $templatebase);
+    my $template = HTML::Template->new(filename => "$includes/templates/$theme/$templatebase", die_on_bad_params => 0, path => [$includes]);
+    $oldkoha->{additionalauthors} =~ s/ \| /\n/g;
+    $oldkoha =~ s/\|/\n/g;
+    $template->param($oldkoha);
+#---- build MARC array for template
+    my @loop = ();
+    my $tagmeaning = &MARCgettagslib($dbh,1);
+    my @fields = $record->fields();
+    my $color=0;
+    my $lasttag="";
+    foreach my $field (@fields) {
+       my @subfields=$field->subfields();
+       foreach my $subfieldcount (0..$#subfields) {
+           my %row_data;
+           if ($lasttag== $field->tag()) {
+               $row_data{tagid}   = "";
+           } else {
+               $row_data{tagid}   = $field->tag();
+           }
+           $row_data{subfield} = $subfields[$subfieldcount][0];
+           $row_data{tagmean} = $tagmeaning->{$field->tag()}->{$subfields[$subfieldcount][0]};
+           $row_data{tagvalue}= $subfields[$subfieldcount][1];
+           if ($color ==0) {
+               $color=1;
+               $row_data{color} = $lc1;
+           } else {
+               $color=0;
+               $row_data{color} = $lc2;
+           }
+           push(@loop,\%row_data);
+           $lasttag=$field->tag();
+       }
+    }
+    $template->param(MARC => \@loop);
+    $template->param(numrecord => $numrecord);
+    $template->param(file => $data);
+    print "Content-Type: text/html\n\n", $template->output;
+}    
+
+# lists all records from the MARC file
 sub ListFileRecords {
     use strict;
 
@@ -408,47 +236,37 @@ sub ListFileRecords {
        $serverdb,
     );
 
-       my $z3950=0;
-       my $recordsource;
-       my $record;
-       my ($numrecords,$resultsid,$data,$startdate,$enddate);
-
+    my $z3950=0;
+    my $recordsource;
+    my $record;
+    my ($numrecords,$resultsid,$data,$startdate,$enddate);
+    
     requireDBI($dbh,"ListFileRecords");
 
-       # File can be z3950 search query or uploaded MARC data
-
-       # if z3950 results
-       if ($file=~/Z-(\d+)/) {
-           # This is a z3950 search 
-           $recordsource='';
-       } else {
-           # This is a Marc upload
-           $sth=$dbh->prepare("select marc,name from uploadedmarc where id=$file");
-           $sth->execute;
-           ($data, $name) = $sth->fetchrow;
-           $recordsource="from $name";
-       }
-
-       print << "EOF";
-         <center>
-         <p>
-         <a href=$ENV{'SCRIPT_NAME'}?menu=$menu>Select a New File</a>
-         <p>
-         <table border=0 cellpadding=10 cellspacing=0>
-         <tr><th bgcolor=black>
-           <font color=white>Select a Record to Import $recordsource</font>
-         </th></tr>
-         <tr><td bgcolor=#dddddd>
-EOF
-
-       if ($file=~/Z-(\d+)/) {
-           # This is a z3950 search 
+    my $templatebase="marcimport/ListFileRecords.tmpl";
+    my $theme=picktemplate($includes, $templatebase);
+    my $template = HTML::Template->new(filename => "$includes/templates/$theme/$templatebase", die_on_bad_params => 0, path => [$includes]);
 
-           my $id=$1;          # search query id number
-           my $serverstring;
-           my $starttimer=time();
+    # File can be z3950 search query or uploaded MARC data
+    
+    # if z3950 results
+    if (not $file=~/Z-(\d+)/) {
+       # This is a Marc upload
+       $sth=$dbh->prepare("select marc,name from uploadedmarc where id=$file");
+       $sth->execute;
+       ($data, $name) = $sth->fetchrow;
+       $template->param(IS_MARC => 1);
+       $template->param(recordsource => $name);
+    }
 
-           $sth=$dbh->prepare("
+    if ($file=~/Z-(\d+)/) {
+       # This is a z3950 search 
+       $template->param(IS_Z3950 =>1);
+       my $id=$1;              # search query id number
+       my $serverstring;
+       my $starttimer=time();
+       
+       $sth=$dbh->prepare("
                select z3950results.numrecords,z3950results.id,z3950results.results,
                        z3950results.startdate,z3950results.enddate,server 
                from z3950queue left outer join z3950results 
@@ -456,16 +274,16 @@ EOF
                where z3950queue.id=?
                order by server  
            ");
-           $sth->execute($id);
-           if ( $sth->rows ) {
-             # loop through all servers in search results
-             while ( ($numrecords,$resultsid,$data,
-                       $startdate,$enddate,$serverstring) = $sth->fetchrow ) {
+       $sth->execute($id);
+       if ( $sth->rows ) {
+           # loop through all servers in search results
+           while ( ($numrecords,$resultsid,$data,
+                    $startdate,$enddate,$serverstring) = $sth->fetchrow ) {
                my ($srvid, $server, $database, $auth) = split(/\//, $serverstring, 4);
-               #print "server=$serverstring\n";
                if ( $server ) {
-                   print "<a name=SERVER-$srvid></a> " .
-                       &z3950servername($dbh,$srvid,"$server/$database") . "\n";
+                       my $srvname=&z3950servername($dbh,$srvid,"$server/$database");
+                       $template->parram(srvid => $srvid);
+                       $template->param(srvname => $srvname);
                } # if $server
                my $startrecord=$input->param("ST-$srvid");
                ($startrecord) || ($startrecord='0');
@@ -478,6 +296,7 @@ EOF
                    $serverplaceholder.="\&ST-$serverid=$place";
                }
                if ($numrecords) {
+                   $template->param(HAS_NUMRECORDS => 1);
                    my $previous='';
                    my $next='';
                    if ($startrecord>0) {
@@ -489,17 +308,18 @@ EOF
                    if ($numrecords>$startrecord+10) {
                        $next="<a href=".$ENV{'SCRIPT_NAME'}."?file=Z-$id&menu=z3950$serverplaceholder\&ST-$srvid=$highest#SERVER-$srvid>Next</a>";
                    }
-                   print "<font size=-1>[Viewing ".($startrecord+1)." to ".$highest." of $numrecords records]  $previous | $next </font><br>\n";
+                   $template->param(startrecord => $startrecord+1);
+                   $template->param(highest => $highest);
+                   $template->param(numrecords => $numrecords);
+                   $template->param(previous => $previous);
+                   $template->param(next => $next);
                    my $stj=$dbh->prepare("update z3950results 
                        set highestseen=? where id=?");
                    $stj->execute($startrecord+10,$resultsid);
-               } else {
-                   print "<br>\n";
                }
-               print "<ul>\n";
 
                if (! $server ) {
-                   print "<font color=red>Search still pending...</font>";
+                   $template->param(PENDING => 1);
                } elsif ($enddate == 0) {
                    my $now=time();
                    my $elapsed=$now-$startdate;
@@ -509,343 +329,96 @@ EOF
                    } else {
                        $elapsedtime=sprintf "%d seconds",$elapsed;
                    }
-                   print "<font color=red>processing... ($elapsedtime)</font>";
+                   $template->param(elapsedtime => $elapsedtime);
                } elsif ($numrecords) {
-                   my @records=parsemarcfileformat($data);
-                   my $i;
-                   for ($i=$startrecord; $i<$startrecord+10; $i++) {
-                       $data.=$records[$i].$splitchar;
-                   }
-                   @records=parsemarcdata($data);
-                   my $counter=0;
-                   foreach $record (@records) {
-                       $counter++;
-                       #(next) unless ($counter>=$startrecord && $counter<=$startrecord+10);
-                       my ($lccn, $isbn, $issn, $dewey, $author, $title, $place, $publisher, $publicationyear, $volume, $number, @subjects, $notes, $controlnumber);
-                       foreach $field (@$record) {
-                           if ($field->{'tag'} eq '001') {
-                               $controlnumber=$field->{'indicator'};
-                           }
-                           if ($field->{'tag'} eq '010') {
-                               $lccn=$field->{'subfields'}->{'a'};
-                               $lccn=~s/^\s*//;
-                               ($lccn) = (split(/\s+/, $lccn))[0];
-                           }
-                           if ($field->{'tag'} eq '015') {
-                               $lccn=$field->{'subfields'}->{'a'};
-                               $lccn=~s/^\s*//;
-                               $lccn=~s/^C//;
-                               ($lccn) = (split(/\s+/, $lccn))[0];
-                           }
-                           if ($field->{'tag'} eq '020') {
-                               $isbn=$field->{'subfields'}->{'a'};
-                               ($isbn=~/ARRAY/) && ($isbn=$$isbn[0]);
-                               $isbn=~s/[^\d]*//g;
-                           }
-                           if ($field->{'tag'} eq '022') {
-                               $issn=$field->{'subfields'}->{'a'};
-                               $issn=~s/^\s*//;
-                               ($issn) = (split(/\s+/, $issn))[0];
-                           }
-                           if ($field->{'tag'} eq '100') {
-                               $author=$field->{'subfields'}->{'a'};
-                           }
-                           if ($field->{'tag'} eq '245') {
-                               $title=$field->{'subfields'}->{'a'};
-                               $title=~s/ \/$//;
-                               $subtitle=$field->{'subfields'}->{'b'};
-                               $subtitle=~s/ \/$//;
-                           }
-                       }
-                       my $q_isbn=$dbh->quote((($isbn) || ('NIL')));
-                       my $q_issn=$dbh->quote((($issn) || ('NIL')));
-                       my $q_lccn=$dbh->quote((($lccn) || ('NIL')));
-                       my $q_controlnumber=$dbh->quote((($controlnumber) || ('NIL')));
-                       my $sth=$dbh->prepare("select * from marcrecorddone where isbn=$q_isbn or issn=$q_issn or lccn=$q_lccn or controlnumber=$q_controlnumber");
-                       $sth->execute;
-                       my $donetext='';
-                       if ($sth->rows) {
-                           $donetext="DONE";
-                       }
-                       $sth=$dbh->prepare("select * from biblioitems where isbn=$q_isbn or issn=$q_issn or lccn=$q_lccn");
-                       $sth->execute;
-                       if ($sth->rows) {
-                           $donetext="DONE";
-                       }
-                       ($author) && ($author="by $author");
-                       if ($isbn) {
-                           print "<li><a href=$ENV{'SCRIPT_NAME'}?file=$file&resultsid=$resultsid&isbn=$isbn>$title $subtitle $author</a> $donetext<br>\n";
-                       } elsif ($lccn) {
-                           print "<li><a href=$ENV{'SCRIPT_NAME'}?file=$file&resultsid=$resultsid&lccn=$lccn>$title $subtitle $author</a> $donetext<br>\n";
-                       } elsif ($issn) {
-                           print "<li><a href=$ENV{'SCRIPT_NAME'}?file=$file&resultsid=$resultsid&issn=$issn>$title $subtitle $author</a><br> $donetext\n";
-                       } elsif ($controlnumber) {
-                           print "<li><a href=$ENV{'SCRIPT_NAME'}?file=$file&resultsid=$resultsid&controlnumber=$controlnumber>$title $subtitle $author</a><br> $donetext\n";
-                       } else {
-                           print "Error: Contact steve regarding $title by $author<br>\n";
-                       }
+                   my @loop = ();
+                   my $z3950file=MARC::File::USMARC->indata ($data);
+                   while (my $record=$z3950file->next) {
+                       my $oldkoha = MARCmarc2koha($dbh,$record);
+                       my %row = ResultRecordLink($dbh,$oldkoha,$resultsid);
+                       push(@loop,\%row);
                    }
-                   print "<p>\n";
-               } else {
-                       if ( $records[$i] ) {
-                         &PrintResultRecordLink($dbh,$records[$i],$resultsid);
-                       } # if record
-                   } # for records
-                   print "<p>\n";
+                   $template->param(LINES => \@loop);
                } else {
-                   print "No records returned.<p>\n";
                }
-               print "</ul>\n";
+#              print "</ul>\n";
            } # foreach server
            my $elapsed=time()-$starttimer;
-           print "<hr>It took $elapsed seconds to process this page.\n";
+#          print "<hr>It took $elapsed seconds to process this page.\n";
            } else {
-               print "<b>No results found for query $id</b>\n";
+               $template->param(NO_RECORDS =>1);
+               $template->param(id => $id);
            } # if rows
-       } else {
-           # This is an uploaded Marc record   
 
-           my @records=parsemarcfileformat($data);
-           foreach $record (@records) {
-               &PrintResultRecordLink($dbh,$record,'');
-           } # foreach record
+       } else {
+#
+# This is an uploaded Marc record   
+#
+           my @loop = ();
+           my $MARCfile = MARC::File::USMARC->indata($data);
+           my $num = 0;
+           while (my $record=$MARCfile->next) {
+               $num++;
+               my $oldkoha = MARCmarc2koha($dbh,$record);
+               my %row = ResultRecordLink($dbh,$oldkoha,'',$num);
+               push(@loop,\%row);
+           }
+           $template->param(LINES => \@loop);
        } # if z3950 or marc upload
-       print "</td></tr></table>\n";
+       print "Content-Type: text/html\n\n", $template->output;
 } # sub ListFileRecords
 
 #--------------
-sub z3950servername {
-    # inputs
-    my (
-       $dbh,
-       $srvid,         # server id number 
-       $default,
-    )=@_;
-    # return
-    my $longname;
-    #----
-
-    requireDBI($dbh,"z3950servername");
-
-       my $sti=$dbh->prepare("select name 
-               from z3950servers 
-               where id=?");
-       $sti->execute($srvid);
-       if ( ! $sti->err ) {
-           ($longname)=$sti->fetchrow;
-       }
-       if (! $longname) {
-           $longname="$default";
-       }
-       return $longname;
-} # sub z3950servername
 
-sub PrintResultRecordLink {
+sub ResultRecordLink {
     use strict;
-    my ($dbh,$record,$resultsid)=@_;   # input
-
+    my ($dbh,$oldkoha,$resultsid, $num)=@_;    # input
     my (
        $sth,
        $bib,   # hash ref to named fields
        $searchfield, $searchvalue,
        $donetext,
        $fieldname,
-    );
-       
+       );
+    my %row = ();
     requireDBI($dbh,"PrintResultRecordLink");
 
-       $bib=extractmarcfields($record);
+#    $bib=extractmarcfields($record);
 
-       $sth=$dbh->prepare("select * 
+    $sth=$dbh->prepare("select * 
          from biblioitems 
-         where isbn=?  or issn=?  or lccn=? ");
-       $sth->execute($bib->{isbn},$bib->{issn},$bib->{lccn});
-       if ($sth->rows) {
-           $donetext="DONE";
-       } else {
-           $donetext="";
-       }
-       ($bib->{author}) && ($bib->{author}="by $bib->{author}");
-
-       $searchfield="";
-       foreach $fieldname ( "controlnumber", "lccn", "issn", "isbn") {
-           if ( defined $bib->{$fieldname} ) {
-               $searchfield=$fieldname;
-               $searchvalue=$bib->{$fieldname};
-           } # if defined fieldname
-       } # foreach
-
-       if ( $searchfield ) {
-           print "<a href=$ENV{'SCRIPT_NAME'}?file=$file" . 
-               "&resultsid=$resultsid" .
-               "&$searchfield=$searchvalue" .
-               "&searchfield=$searchfield" .
-               "&searchvalue=$searchvalue" .
-               ">$bib->{title} $bib->{author}</a>" .
-               " $donetext <BR>\n";
-       } else {
-           print "Error: Problem with $bib->{title} $bib->{author}<br>\n";
-       } # if searchfield
-} # sub PrintResultRecordLink
-
-#------------------
-sub extractmarcfields {
-    use strict;
-    # input
-    my (
-       $record,        # pointer to list of MARC field hashes.
-                       # Example: $record->[0]->{'tag'} = '100' # Author
-                       #       $record->[0]->{'subfields'}->{'a'} = subfieldvalue
-    )=@_;
-
-    # return 
-    my $bib;           # pointer to hash of named output fields
-                       # Example: $bib->{'author'} = "Twain, Mark";
-
-    my $debug=0;
-
-    my (
-       $field,         # hash ref
-       $value, 
-       $subfield,      # Marc subfield [a-z]
-       $fieldname,     # name of field "author", "title", etc.
-       $strip,         # chars to remove from end of field
-       $stripregex,    # reg exp pattern
-    );
-    my ($lccn, $isbn, $issn,    
-       $publicationyear, @subjects, $subject,
-       $controlnumber, 
-       $notes, $additionalauthors, $illustrator, $copyrightdate, 
-       $s, $subdivision, $subjectsubfield,
-    );
-
-    print "<PRE>\n" if $debug;
-
-    if ( ref($record) eq "ARRAY" ) {
-        foreach $field (@$record) {
-
-           # Check each subfield in field
-           foreach $subfield ( keys %{$field->{subfields}} ) {
-               # see if it is defined in our Marc to koha mapping table
-               if ( $fieldname=$tagmap{ $field->{'tag'} }->{$subfield}->{name} ) {
-                   # Yes, so keep the value
-                   if ( ref($field->{'subfields'}->{$subfield} ) eq 'ARRAY' ) {
-                       # if it was an array, just keep first element.
-                       $bib->{$fieldname}=$field->{'subfields'}->{$subfield}[0];
-                   } else {
-                       $bib->{$fieldname}=$field->{'subfields'}->{$subfield};
-                   } # if array
-                   print "$field->{'tag'} $subfield $fieldname=$bib->{$fieldname}\n" if $debug;
-                   # see if this field should have trailing chars dropped
-                   if ($strip=$tagmap{ $field->{'tag'} }->{$subfield}->{striptrail} ) {
-                       $strip=~s//\\/; # backquote each char
-                       $stripregex='[ ' . $strip . ']+$';  # remove trailing spaces also
-                       $bib->{$fieldname}=~s/$stripregex//;
-                   } # if strip
-                   print "Found subfield $field->{'tag'} $subfield " .
-                       "$fieldname = $bib->{$fieldname}\n" if $debug;
-               } # if tagmap exists
-
-           } # foreach subfield
-
-
-           if ($field->{'tag'} eq '001') {
-               $bib->{controlnumber}=$field->{'indicator'};
-           }
-           if ($field->{'tag'} eq '015') {
-               $bib->{lccn}=$field->{'subfields'}->{'a'};
-               $bib->{lccn}=~s/^\s*//;
-               $bib->{lccn}=~s/^C//;
-               ($bib->{lccn}) = (split(/\s+/, $bib->{lccn}))[0];
-           }
-
-
-               if ($field->{'tag'} eq '260') {
-
-                   $publicationyear=$field->{'subfields'}->{'c'};
-                   if ($publicationyear=~/c(\d\d\d\d)/) {
-                       $copyrightdate=$1;
-                   }
-                   if ($publicationyear=~/[^c](\d\d\d\d)/) {
-                       $publicationyear=$1;
-                   } elsif ($copyrightdate) {
-                       $publicationyear=$copyrightdate;
-                   } else {
-                       $publicationyear=~/(\d\d\d\d)/;
-                       $publicationyear=$1;
-                   }
-               }
-               if ($field->{'tag'} eq '700') {
-                   my $name=$field->{'subfields'}->{'a'};
-                   if ($field->{'subfields'}->{'e'}!~/ill/) {
-                       $additionalauthors.="$name\n";
-                   } else {
-                       $illustrator=$name;
-                   }
-               }
-               if ($field->{'tag'} =~/^5/) {
-                   $notes.="$field->{'subfields'}->{'a'}\n";
-               }
-               if ($field->{'tag'} =~/65\d/) {
-                   my $sub;
-                   my $subject=$field->{'subfields'}->{'a'};
-                   $subject=~s/\.$//;
-                   print "Subject=$subject\n" if $debug;
-                   foreach $subjectsubfield ( 'x','y','z' ) {
-                     if ($subdivision=$field->{'subfields'}->{$subjectsubfield}) {
-                       if ( ref($subdivision) eq 'ARRAY' ) {
-                           foreach $s (@$subdivision) {
-                               $s=~s/\.$//;
-                               $subject.=" -- $s";
-                           } # foreach subdivision
-                       } else {
-                           $subdivision=~s/\.$//;
-                           $subject.=" -- $subdivision";
-                       } # if array
-                     } # if subfield exists
-                   } # foreach subfield
-                   print "Subject=$subject\n" if $debug;
-                   push @subjects, $subject;
-               } # if tag 65x
-
-
-        } # foreach field
-       ($publicationyear       ) && ($bib->{publicationyear}=$publicationyear  );
-       ($copyrightdate         ) && ($bib->{copyrightdate}=$copyrightdate  );
-       ($additionalauthors     ) && ($bib->{additionalauthors}=$additionalauthors  );
-       ($illustrator           ) && ($bib->{illustrator}=$illustrator  );
-       ($notes                 ) && ($bib->{notes}=$notes  );
-       ($#subjects             ) && ($bib->{subject}=\@subjects  );
-
-       # Misc cleanup
-       $bib->{dewey}=~s/\///g; # drop any slashes
-
-       ($bib->{lccn}) = (split(/\s+/, $bib->{lccn}))[0]; # only keep first word
-
-       $bib->{isbn}=~s/[^\d]*//g;      # drop non-digits
-
-       $bib->{issn}=~s/^\s*//;
-       ($bib->{issn}) = (split(/\s+/, $bib->{issn}))[0];
-
-       if ( $bib->{'volume-number'} ) {
-           if ($bib->{'volume-number'}=~/(\d+).*(\d+)/ ) {
-               $bib->{'volume'}=$1;
-               $bib->{'number'}=$2;
-           } else {
-               $bib->{volume}=$bib->{'volume-number'};
-           }
-           delete $bib->{'volume-number'};
-       } # if volume-number
-
+         where (isbn=? and isbn!='')  or (issn=? and issn!='')  or (lccn=? and lccn!='') ");
+    $sth->execute($oldkoha->{isbn},$oldkoha->{issn},$oldkoha->{lccn});
+    if ($sth->rows) {
+       $donetext="DONE";
     } else {
-       print "Error: extractmarcfields: input ref $record is " .
-               ref($record) . " not ARRAY. Contact sysadmin.\n";
+       $donetext="";
     }
-    print "</PRE>\n" if $debug;
-
-    return $bib;
+    ($oldkoha->{author}) && ($oldkoha->{author}="by $oldkoha->{author}");
+    
+    $searchfield="";
+    foreach $fieldname ( "controlnumber", "lccn", "issn", "isbn") {
+       if ( defined $oldkoha->{$fieldname} && $oldkoha->{$fieldname} ) {
+           $searchfield=$fieldname;
+           $searchvalue=$oldkoha->{$fieldname};
+       } # if defined fieldname
+    } # foreach
+    if ( $searchfield ) {
+       $row{SCRIPT_NAME} = $ENV{'SCRIPT_NAME'};
+       $row{donetext}    = $donetext;
+       $row{file}        = $file;
+#      $row{resultsid}   = $resultsid;
+#      $row{searchfield} = $searchfield;
+#      $row{searchvalue} = $searchvalue;
+       $row{numrecord}   = $num;
+       $row{title}       = $oldkoha->{title};
+       $row{author}      = $oldkoha->{author};
+    } else {
+       $row{title} = "Error: Problem with <br>$bib->{title} $bib->{author}<br>";
+    } # if searchfield
+    return %row;
+} # sub PrintResultRecordLink
 
-} # sub extractmarcfields
 #---------------------------------
 
 sub z3950menu {
@@ -1000,32 +573,25 @@ sub uploadmarc {
 
     requireDBI($dbh,"uploadmarc");
 
-    print "<a href=$ENV{'SCRIPT_NAME'}>Main Menu</a><hr>\n";
+    my $templatebase="marcimport/uploadmarc.tmpl";
+    my $theme=picktemplate($includes, $templatebase);
+    my $template = HTML::Template->new(filename => "$includes/templates/$theme/$templatebase", die_on_bad_params => 0, path => [$includes]);
+    $template->param(SCRIPT_NAME => $ENV{'SCRIPT_NAME'});
+#    print "<a href=$ENV{'SCRIPT_NAME'}>Main Menu</a><hr>\n";
     my $sth=$dbh->prepare("select id,name from uploadedmarc");
     $sth->execute;
-    print "<h2>Select a set of MARC records</h2>\n<ul>";
+#    print "<h2>Select a set of MARC records</h2>\n<ul>";
+    my @marc_loop = ();
     while (my ($id, $name) = $sth->fetchrow) {
-       print "<li><a href=$ENV{'SCRIPT_NAME'}?file=$id&menu=$menu>$name</a><br>\n";
+       my %row;
+       $row{id} = $id;
+       $row{name} = $name;
+       push(@marc_loop, \%row);
+#      print "<li><a href=$ENV{'SCRIPT_NAME'}?file=$id&menu=$menu>$name</a><br>\n";
     }
-    print "</ul>\n";
-    print "<p>\n";
-    print "<table border=1 bgcolor=#dddddd><tr><th bgcolor=#bbbbbb
-    colspan=2>Upload a set of MARC records</th></tr>\n";
-    print "<tr><td>Upload a set of MARC records:</td><td>";
-    print $input->start_multipart_form();
-    print $input->filefield('uploadmarc');
-    print << "EOF";
-    </td></tr>
-    <tr><td>
-    <input type=hidden name=menu value=$menu>
-    Name this set of MARC records:</td><td><input type=text
-    name=name></td></tr>
-    <tr><td colspan=2 align=center>
-    <input type=submit>
-    </td></tr>
-    </table>
-    </form>
-EOF
+    $template->param(marc => \@marc_loop);
+    print "Content-Type: text/html\n\n", $template->output;
+
 }
 
 sub manual {
@@ -1033,114 +599,13 @@ sub manual {
 
 
 sub mainmenu {
-    print << "EOF";
-<h1>Main Menu</h1>
-<ul>
-<li><a href=$ENV{'SCRIPT_NAME'}?menu=z3950>Z39.50 Search</a>
-<li><a href=$ENV{'SCRIPT_NAME'}?menu=uploadmarc>Upload MARC Records</a>
-</ul>
-EOF
+       my $templatebase="marcimport/mainmenu.tmpl";
+       my $theme=picktemplate($includes, $templatebase);
+       my $template = HTML::Template->new(filename => "$includes/templates/$theme/$templatebase", die_on_bad_params => 0, path => [$includes]);
+       $template->param(SCRIPT_NAME => $ENV{'SCRIPT_NAME'});
+       print "Content-Type: text/html\n\n", $template->output;
 } # sub mainmenu
 
-
-#--------------------------
-# Parse MARC data in file format with control-character separators
-#   May be multiple records.
-sub parsemarcfileformat {
-    use strict;
-    # Input is one big text string
-    my $data=shift;
-    # Output is list of records.  Each record is list of field hashes
-    my @records;
-
-    my $splitchar=chr(29);
-    my $splitchar2=chr(30);
-    my $splitchar3=chr(31);
-    my $debug=0;
-    my $record;
-    foreach $record (split(/$splitchar/, $data)) {
-       my @record;
-       my $directory=0;
-       my $tagcounter=0;
-       my %tag;
-       my $field;
-
-       my $leader=substr($record,0,24);
-       print "<tr><td>Leader:</td><td>$leader</td></tr>\n" if $debug;
-       push (@record, {
-               'tag' => 'Leader',
-               'indicator' => $leader ,
-       } );
-
-       $record=substr($record,24);
-       foreach $field (split(/$splitchar2/, $record)) {
-           my %field;
-           my $tag;
-           my $indicator;
-           unless ($directory) {
-               $directory=$field;
-               my $itemcounter=1;
-               my $counter2=0;
-               my $item;
-               my $length;
-               my $start;
-               while ($item=substr($directory,0,12)) {
-                   $tag=substr($directory,0,3);
-                   $length=substr($directory,3,4);
-                   $start=substr($directory,7,6);
-                   $directory=substr($directory,12);
-                   $tag{$counter2}=$tag;
-                   $counter2++;
-               }
-               $directory=1;
-               next;
-           }
-           $tag=$tag{$tagcounter};
-           $tagcounter++;
-           $field{'tag'}=$tag;
-           my @subfields=split(/$splitchar3/, $field);
-           $indicator=$subfields[0];
-           $field{'indicator'}=$indicator;
-           my $firstline=1;
-           unless ($#subfields==0) {
-               my %subfields;
-               my @subfieldlist;
-               my $i;
-               for ($i=1; $i<=$#subfields; $i++) {
-                   my $text=$subfields[$i];
-                   my $subfieldcode=substr($text,0,1);
-                   my $subfield=substr($text,1);
-                   # if this subfield already exists, do array
-                   if ($subfields{$subfieldcode}) {
-                       my $subfieldlist=$subfields{$subfieldcode};
-                       if ( ref($subfieldlist) eq 'ARRAY' ) {
-                            # Already an array, add on to it
-                           print "$tag Adding to array $subfieldcode -- $subfield<br>\n" if $debug;
-                           @subfieldlist=@$subfieldlist;
-                           push (@subfieldlist, $subfield);
-                       } else {
-                            # Change simple value to array
-                           print "$tag Arraying $subfieldcode -- $subfield<br>\n" if $debug;
-                           @subfieldlist=($subfields{$subfieldcode}, $subfield);
-                       }
-                       # keep new array
-                       $subfields{$subfieldcode}=\@subfieldlist;
-                   } else {
-                       # subfield doesn't exist yet, keep simple value
-                       $subfields{$subfieldcode}=$subfield;
-                   }
-               }
-               $field{'subfields'}=\%subfields;
-           }
-           push (@record, \%field);
-       } # foreach field in record
-       push (@records, \@record);
-       # $counter++;
-    }
-    print "</pre>" if $debug;
-    return @records;
-} # sub parsemarcfileformat
-
 #----------------------------
 # Accept form results to add query to z3950 queue
 sub AcceptZ3950Queue {
@@ -1153,6 +618,7 @@ sub AcceptZ3950Queue {
     )=@_;
 
     my @serverlist;
+    my $error;
 
     requireDBI($dbh,"AcceptZ3950Queue");
 
@@ -1175,8 +641,33 @@ sub AcceptZ3950Queue {
           }
         }
 
-       addz3950queue($dbh,$input->param('query'), $input->param('type'), 
+       $error=addz3950queue($dbh,$input->param('query'), $input->param('type'), 
                $input->param('rand'), @serverlist);
+       if ( $error ) {
+           print qq|
+<table border=1 cellpadding=5 cellspacing=0 align=center>
+<tr><td bgcolor=#99cc33 background=/images/background-acq.gif colspan=2><font color=red><b>Error</b></font></td></tr>
+<tr><td colspan=2>
+<b>$error</b><p>
+|;
+           if ( $error =~ /daemon/i ) {
+               print qq|
+There is a launcher for the Z39.50 client daemon in your intranet installation<br>
+directory under <b>./scripts/z3950daemon/z3950-daemon-launch.sh</b>.  This<br>
+script should be run as root, and it will start up the program running with the<br>
+privileges of your apache user.  Ideally, this script should be started from a<br>
+system init directory so that is running after the machine starts up.
+|;
+       
+           } # if daemon
+           print qq|
+</td></tr>
+</table>
+
+<table border
+
+|;
+       } # if error
     } else {
        print "<font color=red size=+1>$query is not a valid ISBN
        Number</font><p>\n";
@@ -1222,48 +713,52 @@ sub AcceptBiblioitem {
     my $biblionumber=0;
     my $biblioitemnumber=0;
     my $sth;
+    my $record;
 
     requireDBI($dbh,"AcceptBiblioitem");
 
-    my $isbn=$input->param('isbn');
-    my $issn=$input->param('issn');
-    my $lccn=$input->param('lccn');
-    my $q_origisbn=$dbh->quote($input->param('origisbn'));
-    my $q_origissn=$dbh->quote($input->param('origissn'));
-    my $q_origlccn=$dbh->quote($input->param('origlccn'));
-    my $q_origcontrolnumber=$dbh->quote($input->param('origcontrolnumber'));
-    my $q_isbn=$dbh->quote((($isbn) || ('NIL')));
-    my $q_issn=$dbh->quote((($issn) || ('NIL')));
-    my $q_lccn=$dbh->quote((($lccn) || ('NIL')));
-    my $file=$input->param('file');
-
-    #my $sth=$dbh->prepare("insert into marcrecorddone values ($q_origisbn, $q_origissn, $q_origlccn, $q_origcontrolnumber)");
-    #$sth->execute;
+#    my $isbn=$input->param('isbn');
+#    my $issn=$input->param('issn');
+#    my $lccn=$input->param('lccn');
+#    my $q_origisbn=$dbh->quote($input->param('origisbn'));
+#    my $q_origissn=$dbh->quote($input->param('origissn'));
+#    my $q_origlccn=$dbh->quote($input->param('origlccn'));
+#    my $q_origcontrolnumber=$dbh->quote($input->param('origcontrolnumber'));
+    my $title=$input->param('title');
 
-    print "<center>\n";
-    print "<a href=$ENV{'SCRIPT_NAME'}?file=$file>New Record</a> | <a href=marcimport.pl>New File</a><br>\n";
+#    my $q_isbn=$dbh->quote((($isbn) || ('NIL')));
+#    my $q_issn=$dbh->quote((($issn) || ('NIL')));
+#    my $q_lccn=$dbh->quote((($lccn) || ('NIL')));
+    my $file= MARC::File::USMARC->indata($input->param('file'));
+    my $numrecord = $input->param('numrecord');
+    if ($numrecord) {
+       for (my $i==1;$i<$numrecord;$i++) {
+           $record=$file->next;
+       }
+    } else {
+       print STDERR "Error in marcimport.pl/Acceptbiblioitem : numrecord not defined\n";
+       print "Error in marcimport.pl/Acceptbiblioitem : numrecord not defined : contact administrator\n";
+    }
+    my $templatebase="marcimport/AcceptBiblioitem.tmpl";
+    my $theme=picktemplate($includes, $templatebase);
+    my $template = HTML::Template->new(filename => "$includes/templates/$theme/$templatebase", die_on_bad_params => 0, path => [$includes]);
 
+    my $oldkoha = MARCmarc2koha($dbh,$record);
     # See if it already exists
     my $sth=$dbh->prepare("select biblionumber,biblioitemnumber 
        from biblioitems 
-       where issn=$q_issn or isbn=$q_isbn or lccn=$q_lccn");
-    $sth->execute;
+       where isbn=? or issn=? or lccn=?");
+    $sth->execute($oldkoha->{isbn},$oldkoha->{issn},$oldkoha->{lccn});
     if ($sth->rows) {
        # Already exists
+
        ($biblionumber, $biblioitemnumber) = $sth->fetchrow;
-       my $title=$input->param('title');
-       print << "EOF";
-       <table border=0 width=50% cellpadding=10 cellspacing=0>
-         <tr><th bgcolor=black><font color=white>Record already in database</font>
-         </th></tr>
-         <tr><td bgcolor=#dddddd>$title is already in the database with 
-               biblionumber $biblionumber and biblioitemnumber $biblioitemnumber
-         </td></tr>
-       </table>
-       <p>
-EOF
-    } else {
+       $template->param(title => $title);
+       $template->param(biblionumber => $biblionumber);
+       $template->param(biblioitemnumber => $biblioitemnumber);
+       $template->param(BIBLIO_EXISTS => 1);
 
+    } else {
        # It doesn't exist; add it.
 
        my $error;
@@ -1275,7 +770,7 @@ EOF
        my @subjectheadings=split(/[\r\n]+/,$subjectheadings);
   
        my $additionalauthors=$input->param('additionalauthors');
-       my @additionalauthors=split(/[\r\n]+/,uc($additionalauthors));
+       my @additionalauthors=split(/[\r\n]+|\|/,uc($additionalauthors));
   
        # Use individual assignments to hash buckets, in case
        #  any of the input parameters are empty or don't exist
@@ -1305,51 +800,28 @@ EOF
        $biblioitem{place}              =$input->param('place');
        $biblioitem{lccn}               =$input->param('lccn');
        $biblioitem{marc}               =$input->param('marc');
-       #print "<PRE>subjects=@subjectheadings</PRE>\n";
-       #print "<PRE>auth=@additionalauthors</PRE>\n";
-               
+#      print STDERR $record->as_formatted();
+#      die;
        ($biblionumber, $biblioitemnumber, $error)=
-         newcompletebiblioitem($dbh,
-               \%biblio,
-               \%biblioitem,
-               \@subjectheadings,
-               \@additionalauthors
-       );
+           ALLnewbiblio($dbh,$record,\%biblio,\%biblioitem);
+#          (1,2,0);
+#        newcompletebiblioitem($dbh,
+#              \%biblio,
+#              \%biblioitem,
+#              \@subjectheadings,
+#              \@additionalauthors
+#      );
   
        if ( $error ) {
            print "<H2>Error adding biblio item</H2> $error\n";
        } else { 
-
-         my $title=$input->param('title');
-         print << "EOF";
-           <table cellpadding=10 cellspacing=0 border=0 width=50%>
-           <tr><th bgcolor=black><font color=white>Record entered into database</font></th></tr>
-           <tr><td bgcolor=#dddddd>$title has been entered into the database with biblionumber
-           $biblionumber and biblioitemnumber $biblioitemnumber</td></tr>
-         </table>
-EOF
+           $template->param(title => $title);
+           $template->param(biblionumber => $biblionumber);
+           $template->param(biblioitemnumber => $biblioitemnumber);
+           $template->param(BIBLIO_CREATE => 1);
        } # if error
     } # if new record
-
-    return $biblionumber,$biblioitemnumber;
-} # sub AcceptBiblioitem
-
-sub ItemCopyForm {
-    use strict;
-    my (
-       $dbh,
-       $input,         # CGI input object
-       $biblionumber,
-       $biblioitemnumber,
-    )=@_;
-
-    my $sth;
     my $barcode;
-    requireDBI($dbh,"ItemCopyForm");
-
-    my $title=$input->param('title');
-    my $file=$input->param('file');
 
     # Get next barcode, or pick random one if none exist yet
     $sth=$dbh->prepare("select max(barcode) from items");
@@ -1359,37 +831,11 @@ sub ItemCopyForm {
     if ($barcode==1) {
        $barcode=int(rand()*1000000);
     }
-
     my $branchselect=getkeytableselectoptions(
                $dbh, 'branches', 'branchcode', 'branchname', 0);
-
-    print << "EOF";
-    <table border=0 cellpadding=10 cellspacing=0>
-      <tr><th bgcolor=black>
-       <font color=white> Add a New Item for $title </font>
-      </th></tr>
-      <tr><td bgcolor=#dddddd>
-      <form>
-        <input type=hidden name=newitem value=1>
-        <input type=hidden name=biblionumber value=$biblionumber>
-        <input type=hidden name=biblioitemnumber value=$biblioitemnumber>
-        <input type=hidden name=file value=$file>
-        <table border=0>
-          <tr><td>BARCODE</td><td><input name=barcode size=10 value=$barcode>
-          Home Branch: <select name=homebranch> $branchselect </select>
-         </td></tr>
-          <tr><td>Replacement Price:</td>
-         <td><input name=replacementprice size=10></td></tr>
-          <tr><td>Notes</td>
-         <td><textarea name=notes rows=4 cols=40 wrap=physical></textarea>
-         </td></tr>
-        </table>
-        <p>
-        <input type=submit value="Add Item">
-      </form>
-      </td></tr>
-    </table>
-EOF
+    $template->param(barcode => $barcode);
+    $template->param(branchselect => $branchselect);
+    print "Content-Type: text/html\n\n", $template->output;
 
 } # sub ItemCopyForm
 
@@ -1399,6 +845,10 @@ sub AcceptItemCopy {
     use strict;
     my ( $dbh, $input )=@_;
 
+    my $templatebase="marcimport/AcceptItemCopy.tmpl";
+    my $theme=picktemplate($includes, $templatebase);
+    my $template = HTML::Template->new(filename => "$includes/templates/$theme/$templatebase", die_on_bad_params => 0, path => [$includes]);
+
     my $error;
 
     requireDBI($dbh,"AcceptItemCopy");
@@ -1411,235 +861,31 @@ sub AcceptItemCopy {
        where barcode=?");
     $sth->execute($barcode);
     if ($sth->rows) {
-       print "<font color=red>Barcode '$barcode' has already been assigned.</font><p>\n";
+       $template->param(BARCODE_EXISTS => 1);
+       $template->param(barcode => $barcode);
     } else {
           # Insert new item into database
-           $error=&newitems(
-                { biblionumber=> $input->param('biblionumber'),
-                  biblioitemnumber=> $input->param('biblioitemnumber'),
-                  itemnotes=> $input->param('notes'),
-                  homebranch=> $input->param('homebranch'),
-                  replacementprice=> $replacementprice,
-                },
-                $barcode
-            );
+           $error=&ALLnewitem($dbh,
+                              { biblionumber=> $input->param('biblionumber'),
+                                biblioitemnumber=> $input->param('biblioitemnumber'),
+                                itemnotes=> $input->param('notes'),
+                                homebranch=> $input->param('homebranch'),
+                                replacementprice=> $replacementprice,
+                                barcode => $barcode
+                                }
+                              );
             if ( $error ) {
-               print "<font color=red>Error: $error </font><p>\n";
+               $template->param(ITEM_ERROR => 1);
+               $template->param(error => $error);
            } else {
-
-               print "<table border=1 align=center cellpadding=10>
-                       <tr><td bgcolor=yellow>
-                       Item added with barcode $barcode
-                       </td></tr></table>\n";
+               $template->param(ITEM_CREATED => 1);
+               $template->param(barcode => $barcode);
             } # if error
     } # if barcode exists
+    print "Content-Type: text/html\n\n", $template->output;
 } # sub AcceptItemCopy
 
-#---------------
-# Create an HTML option list for a <SELECT> form tag by using
-#    values from a DB file
-sub getkeytableselectoptions {
-       use strict;
-       # inputs
-       my (
-               $dbh,           # DBI handle
-               $tablename,     # name of table containing list of choices
-               $keyfieldname,  # column name of code to use in option list
-               $descfieldname, # column name of descriptive field
-               $showkey,       # flag to show key in description
-       )=@_;
-       my $selectclause;       # return value
-
-       my (
-               $sth, $query, 
-               $key, $desc, $orderfieldname,
-       );
-       my $debug=0;
-
-       requireDBI($dbh,"getkeytableselectoptions");
-
-       if ( $showkey ) {
-               $orderfieldname=$keyfieldname;
-       } else {
-               $orderfieldname=$descfieldname;
-       }
-       $query= "select $keyfieldname,$descfieldname
-               from $tablename
-               order by $orderfieldname ";
-       print "<PRE>Query=$query </PRE>\n" if $debug; 
-       $sth=$dbh->prepare($query);
-       $sth->execute;
-       while ( ($key, $desc) = $sth->fetchrow) {
-           if ($showkey) { $desc="$key - $desc"; }
-           $selectclause.="<option value='$key'>$desc\n";
-           print "<PRE>Sel=$selectclause </PRE>\n" if $debug; 
-       }
-       return $selectclause;
-} # sub getkeytableselectoptions
-
-#---------------------------------
-# Add a biblioitem and related data
-sub newcompletebiblioitem {
-       use strict;
-
-       my ( $dbh,              # DBI handle
-         $biblio,              # hash ref to biblio record
-         $biblioitem,          # hash ref to biblioitem record
-         $subjects,            # list ref of subjects
-         $addlauthors,         # list ref of additional authors
-       )=@_ ;
-
-       my ( $biblionumber, $biblioitemnumber, $error);         # return values
-
-       my $debug=0;
-       my $sth;
-       my $subjectheading;
-       my $additionalauthor;
-
-       #--------
-       requireDBI($dbh,"newcompletebiblioitem");
-
-       print "<PRE>Trying to add biblio item Title=$biblio->{title} " .
-               "ISBN=$biblioitem->{isbn} </PRE>\n" if $debug;
-
-       # Make sure master biblio entry exists
-       ($biblionumber,$error)=getoraddbiblio($dbh, $biblio);
-
-        if ( ! $error ) { 
-
-         $biblioitem->{biblionumber}=$biblionumber;
-         $biblioitemnumber=newbiblioitem($biblioitem);
-
-         $sth=$dbh->prepare("insert into bibliosubject 
-               (biblionumber,subject)
-               values (?, ? )" );
-         foreach $subjectheading (@{$subjects} ) {
-             $sth->execute($biblionumber, $subjectheading) 
-                       or $error.=$sth->errstr ;
-       
-         } # foreach subject
-
-         $sth=$dbh->prepare("insert into additionalauthors 
-               (biblionumber,author)
-               values (?, ? )");
-         foreach $additionalauthor (@{$addlauthors} ) {
-           $sth->execute($biblionumber, $additionalauthor) 
-                       or $error.=$sth->errstr ;
-         } # foreach author
-
-       } else {
-         # couldn't get biblio
-         $biblionumber='';
-         $biblioitemnumber='';
-
-       } # if no biblio error
-
-       return ( $biblionumber, $biblioitemnumber, $error);
-
-} # sub newcompletebiblioitem
-#---------------------------------------
-# Find a biblio entry, or create a new one if it doesn't exist.
-sub getoraddbiblio {
-       use strict;             # in here until rest cleaned up
-       # input params
-       my (
-         $dbh,         # db handle
-         $biblio,      # hash ref to fields
-       )=@_;
-
-       # return
-       my $biblionumber;
-
-       my $debug=0;
-       my $sth;
-       my $error;
-       
-       #-----
-       requireDBI($dbh,"getoraddbiblio");
-
-       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
-       }
-
-       return $biblionumber,$error;
-
-} # sub getoraddbiblio
 #---------------------------------------
-sub addz3950queue {
-    use strict;
-    # input
-    my (
-       $dbh,           # DBI handle
-       $query,         # value to look up
-       $type,          # type of value ("isbn", "lccn", etc).
-       $requestid,
-       @z3950list,     # list of z3950 servers to query
-    )=@_;
-
-    my (
-       @serverlist,
-       $server,
-       $failed,
-    );
-    
-    requireDBI($dbh,"addz3950queue");
-
-       # list of servers: entry can be a fully qualified URL-type entry
-        #   or simply just a server ID number.
-
-        my $sth=$dbh->prepare("select host,port,db,userid,password 
-         from z3950servers 
-         where id=? ");
-        foreach $server (@z3950list) {
-           if ($server =~ /:/ ) {
-               push @serverlist, $server;
-           } else {
-               $sth->execute($server);
-               my ($host, $port, $db, $userid, $password) = $sth->fetchrow;
-               push @serverlist, "$server/$host\:$port/$db/$userid/$password";
-           }
-       }
-
-       my $serverlist='';
-       foreach (@serverlist) {
-           $serverlist.="$_ ";
-       } # foreach
-       chop $serverlist;
-
-       # Don't allow reinsertion of the same request number.
-       my $sth=$dbh->prepare("select identifier from z3950queue 
-               where identifier=?");
-       $sth->execute($requestid);
-       unless ($sth->rows) {
-           $sth=$dbh->prepare("insert into z3950queue 
-               (term,type,servers, identifier) 
-               values (?, ?, ?, ?)");
-           $sth->execute($query, $type, $serverlist, $requestid);
-       }
-} # sub addz3950queue
-
-#--------------------------------------
 sub FormatMarcText {
     use strict;
 
@@ -1648,55 +894,86 @@ sub FormatMarcText {
        $fields,        # list ref to MARC fields
     )=@_;
     # Return
+    my $marctext;
 
     my (
-        $marctext,
        $color,
        $field,
        $tag,
        $label,
+       $indicator,
        $subfieldcode,$subfieldvalue,
        @values, $value
     );
+    my $debug=0;
 
-       #return "MARC text here";
+    #-----------------------------------------
 
-    $marctext="<table border=0 cellspacing=0>
-       <tr><th colspan=3 bgcolor=black>
-               <font color=white>MARC RECORD</font>
+    $marctext="<table border=0 cellspacing=1>
+       <tr><th colspan=4 background=/images/background-acq.gif>
+               MARC RECORD
        </th></tr>\n";
 
     foreach $field ( @$fields ) {
+
+       # Swap colors on alternating lines
        ($color eq $lc1) ? ($color=$lc2) : ($color=$lc1);
+
        $tag=$field->{'tag'};
-       $label=$tagtext{$tag};
-       if ( $tag eq 'Leader' ) {
+       $label=taglabel($tag);
+
+       if ( $tag eq 'LDR' ) {
                $tag='';
                $label="Leader:";
        }
+       print "<pre>Format tag=$tag label=$label</pre>\n" if $debug;
+
        $marctext.="<tr><td bgcolor=$color valign=top>$label</td> \n" .
                "<td bgcolor=$color valign=top>$tag</td> \n";
-       if ( ! $field->{'subfields'} )  {
-           $marctext.="<td bgcolor=$color valign=top>$field->{'indicator'}</td>";
+
+       $indicator=$field->{'indicator'};
+       $indicator=~s/ +$//;    # drop trailing blanks
+
+       # Third table column has indicator if it is short.
+       # Fourth column has embedded table of subfields, and indicator
+       #  if it is long (leader or fixed-position fields)
+
+       print "<pre>Format indicator=$indicator" .
+               " length=" . length( $indicator ) .  "</pre>\n" if $debug;
+       if ( length( $indicator <= 3 ) ) {
+           $marctext.="<td bgcolor=$color valign=top><pre>" .
+               "$indicator</pre></td>" .
+               "<td bgcolor=$color valign=top>" ;
        } else {
+           $marctext.="<td bgcolor=$color valign=top></td>" .
+               "<td bgcolor=$color valign=top>" .
+               "$indicator ";
+       } # if length
+
+       # Subfields
+       if ( $field->{'subfields'} )  {
            # start another table for subfields
-           $marctext.="<td bgcolor=$color valign=top>\n " .
-               "  <table border=0 cellspacing=0>\n";
+           $marctext.= "<table border=0 cellspacing=2>\n";
            foreach $subfieldcode ( sort( keys %{ $field->{'subfields'} }   )) {
                $subfieldvalue=$field->{'subfields'}->{$subfieldcode};
                if (ref($subfieldvalue) eq 'ARRAY' ) {
-                   # if it's a pointer to array, get the values
+                   # if it's a pointer to array, get all the values
                    @values=@{$subfieldvalue};
                } else {
+                   # otherwise get the one value
                    @values=( $subfieldvalue );
                } # if subfield array
                foreach $value ( @values ) {
-                 $marctext.="<tr><td>$subfieldcode </td>" .
+                 $marctext.="<tr><td><strong>$subfieldcode</strong></td>" .
                    "<td>$value</td></tr>\n";
                } # foreach value
            } # foreach subfield
-           $marctext.="</table></td>\n";
+           $marctext.="</table>\n";
        } # if subfields
+       # End of indicator and subfields column
+       $marctext.="</td>\n";
+
+       # End of columns
        $marctext.="</tr>\n";
 
     } # foreach field
@@ -1706,3 +983,55 @@ sub FormatMarcText {
     return $marctext;
 
 } # sub FormatMarcText
+
+
+#---------------
+# $Log$
+# Revision 1.12  2002/07/24 16:24:20  tipaul
+# Now, the acqui.simple system...
+# marcimport.pl has been almost completly rewritten, so LOT OF BUGS TO COME !!! You've been warned. It seems to work, but...
+#
+# As with my former messages, nothing seems to have been changed... but ...
+# * marcimport now uses HTML::Template.
+# * marcimport now uses MARC::Record. that means that when you import a record, the old-DB is populated with the data as in version 1.2, but the MARC-DB part is filled with full MARC::Record.
+#
+# <IMPORTANT NOTE>
+# to get correct response times, you MUST add an index on isbn, issn and lccn rows in biblioitem table. Note this should be done in 1.2 too...
+# </IMPORTANT NOTE>
+#
+# <IMPORTANT NOTE2>
+# acqui.simple manage biblio, biblioitems and items tables quite properly. Normal acquisition system manages biblio, biblioitems BUT NOT items. That will be done in the near future...
+# </IMPORTANT NOTE2>
+#
+# what's next now ?
+# * bug tracking, of course... Surely a dozen of dozens...
+# * LOT of developpments, i'll surely write a mail to koha-devel tomorrow (as it's time for dinner in France, and i plan to play NeverwinterNights after dinner ;-) ...
+#
+# Revision 1.6.2.32  2002/06/29 17:33:47  amillar
+# Allow DEFAULT as input to addz3950search.
+# Check for existence of pid file (cat crashed otherwise).
+# Return error messages in addz3950search.
+#
+# Revision 1.6.2.31  2002/06/28 18:50:46  tonnesen
+# Got rid of white text on black, replaced with black on background-acq.gif
+#
+# Revision 1.6.2.30  2002/06/28 18:07:27  tonnesen
+# marcimport.pl will print an error message if it can not signal the
+# processz3950queue program.  The message contains instructions for starting the
+# daemon.
+#
+# Revision 1.6.2.29  2002/06/27 18:35:01  tonnesen
+# $deweyinput was always defined (it's an HTML input field).  Check against
+# $bib->{dewey} instead.
+#
+# Revision 1.6.2.28  2002/06/27 17:41:26  tonnesen
+# Applying patch from Matt Kraai to pick F or NF based on presense of a dewey
+# number when adding a book via marcimport.pl
+#
+# Revision 1.6.2.27  2002/06/26 15:52:55  amillar
+# Fix display of marc tag labels and indicators
+#
+# Revision 1.6.2.26  2002/06/26 14:28:35  amillar
+# Removed subroutines now existing in modules: extractmarcfields,
+#  parsemarcfileformat, addz3950queue, getkeytableselectoptions
+#
index 005c98d..ffd456c 100755 (executable)
@@ -2,7 +2,8 @@
 
 use CGI;
 use strict;
-use C4::Acquisitions;
+use C4::Catalogue;
+use C4::Biblio;
 
 my $input = new CGI;
 my $biblio = {
index cea1e77..370d199 100755 (executable)
@@ -2,7 +2,8 @@
 
 use CGI;
 use strict;
-use C4::Acquisitions;
+use C4::Catalogue;
+use C4::Biblio;
 
 my $input            = new CGI;
 my $barcode          = $input->param('barcode');
index b12aa23..b64989e 100755 (executable)
@@ -11,7 +11,7 @@ my $starttime=gettime();
 use C4::Database;
 use CGI;
 use strict;
-use C4::Acquisitions;
+use C4::Catalogue;
 use C4::Biblio;
 use C4::Output;
 
index f106381..1e3e0c0 100755 (executable)
@@ -2,7 +2,8 @@
 
 use CGI;
 use strict;
-use C4::Acquisitions;
+use C4::Catalogue;
+use C4::Biblio;
 use C4::Output;
 
 my $input    = new CGI;