Clean up before final commits
[koha.git] / cataloguing / addbiblio.pl
1 #!/usr/bin/perl
2
3 # $Id$
4
5 # Copyright 2000-2002 Katipo Communications
6 #
7 # This file is part of Koha.
8 #
9 # Koha is free software; you can redistribute it and/or modify it under the
10 # terms of the GNU General Public License as published by the Free Software
11 # Foundation; either version 2 of the License, or (at your option) any later
12 # version.
13 #
14 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
15 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
16 # A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
17 #
18 # You should have received a copy of the GNU General Public License along with
19 # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
20 # Suite 330, Boston, MA  02111-1307 USA
21
22 use strict;
23 use CGI;
24 use C4::Auth;
25 use C4::Output;
26 use C4::Interface::CGI::Output;
27 use C4::Biblio;
28 use C4::Search; # also includes Biblio.pm, Search is used to FindDuplicate
29 use C4::Context;
30 use C4::Koha; # XXX subfield_is_koha_internal_p
31 use MARC::Record;
32 use MARC::File::USMARC;
33 my $format="USMARC";
34 $format="UNIMARC" if (C4::Context->preference('marcflavour') eq 'UNIMARC');
35 use MARC::File::XML(RecordFormat =>$format);
36 use Encode;
37 use vars qw( $tagslib);
38 use vars qw( $authorised_values_sth);
39 use vars qw( $is_a_modif );
40 my $input = new CGI;
41 my $z3950 = $input->param('z3950');
42 my $logstatus=C4::Context->preference('Activate_log');
43 my $xml;
44 my $itemtype; # created here because it can be used in build_authorized_values_list sub
45
46 ###Find related tags for Z3950 searches- required  by template
47 my($isbntag,$isbnsub)=MARCfind_marc_from_kohafield("isbn","biblios");
48 my($issntag,$issnsub)=MARCfind_marc_from_kohafield("issn","biblios");
49 my($titletag,$titlesub)=MARCfind_marc_from_kohafield("title","biblios");
50 my($authortag,$authorsub)=MARCfind_marc_from_kohafield("author","biblios");
51 =item MARCfindbreeding
52
53     $record = MARCfindbreeding($dbh, $breedingid,$frameworkcode);
54
55 Look up the breeding farm with database handle $dbh, for the
56 record with id $breedingid.  If found, returns the decoded
57 MARC::Record; otherwise, -1 is returned (FIXME).
58 Returns as second parameter the character encoding.
59
60 =cut
61
62 sub MARCfindbreeding {
63         my ($dbh,$id,$oldbiblionumber) = @_;
64         my $sth = $dbh->prepare("select marc,encoding from marc_breeding where id=?");
65         $sth->execute($id);
66         my ($marc,$encoding) = $sth->fetchrow;
67         $sth->finish;
68         if ($marc) {
69                 my $record = MARC::File::USMARC::decode($marc);
70                 if (ref($record) eq undef) {
71                         return -1;
72                 } 
73         if (C4::Context->preference("z3950NormalizeAuthor") and C4::Context->preference("z3950AuthorAuthFields")){
74                                 my ($tag,$subfield) = MARCfind_marc_from_kohafield("author","biblios");
75                                 my $auth_fields = C4::Context->preference("z3950AuthorAuthFields");
76                                 my @auth_fields= split /,/,$auth_fields;
77                                 my $field;
78                                 if ($record->field($tag)){
79                                         foreach my $tmpfield ($record->field($tag)->subfields){
80                                                 my $subfieldcode=shift @$tmpfield;
81                                                 my $subfieldvalue=shift @$tmpfield;
82                                                 if ($field){
83                                                         $field->add_subfields("$subfieldcode"=>$subfieldvalue) if ($subfieldcode ne $subfield);
84                                                 } else {
85                                                         $field=MARC::Field->new($tag,"","",$subfieldcode=>$subfieldvalue) if ($subfieldcode ne $subfield);
86                                                 }
87                                         }
88                                 }
89                                 $record->delete_field($record->field($tag));
90                                 foreach my $fieldtag (@auth_fields){
91                                         next unless ($record->field($fieldtag));
92                                         my $lastname = $record->field($fieldtag)->subfield('a');
93                                         my $firstname= $record->field($fieldtag)->subfield('b');
94                                         my $title = $record->field($fieldtag)->subfield('c');
95                                         my $number= $record->field($fieldtag)->subfield('d');
96                                         if ($title){
97                                                 $field->add_subfields("$subfield"=>ucfirst($title)." ".ucfirst($firstname)." ".$number);
98                                         }else{
99                                                 $field->add_subfields("$subfield"=>ucfirst($firstname).", ".ucfirst($lastname));
100                                         }
101                                 }
102                                 $record->insert_fields_ordered($field);
103                         }
104 ##Delete biblionumber tag in case a similar tag is used in imported MARC ## 
105         my  (  $tagfield,  $tagsubfield )  =MARCfind_marc_from_kohafield("biblionumber","biblios");
106                 my $old_field = $record->field($tagfield);
107                 $record->delete_field($old_field);
108                 ##add the old biblionumber if a modif but coming from breedingfarm
109                 if ($oldbiblionumber){
110                         my $newfield;
111                         if ($tagfield<10){
112                         $newfield = MARC::Field->new($tagfield,  $oldbiblionumber);
113                         }else{
114                         $newfield = MARC::Field->new($tagfield, '', '', "$tagsubfield" => $oldbiblionumber);
115                         }       
116                 $record->insert_fields_ordered($newfield);
117                 }
118         my $xml=  $record->as_xml_record();
119         $xml=Encode::encode('utf8',$xml);
120         my $xmlhash=XML_xml2hash_onerecord($xml);
121                 return $xmlhash,$encoding;
122                 
123         }
124         return -1;
125 }
126
127
128 =item build_authorized_values_list
129
130 =cut
131
132 sub build_authorized_values_list ($$$$$) {
133         my($tag, $subfield, $value, $dbh,$authorised_values_sth) = @_;
134
135         my @authorised_values;
136         my %authorised_lib;
137
138         # builds list, depending on authorised value...
139
140         #---- branch
141         if ($tagslib->{$tag}->{$subfield}->{'authorised_value'} eq "branches" ) {
142         my $sth=$dbh->prepare("select branchcode,branchname from branches order by branchname");
143         $sth->execute;
144         push @authorised_values, ""
145                 unless ($tagslib->{$tag}->{$subfield}->{mandatory});
146
147         while (my ($branchcode,$branchname) = $sth->fetchrow_array) {
148                 push @authorised_values, $branchcode;
149                 $authorised_lib{$branchcode}=$branchname;
150         }
151
152         #----- itemtypes
153         } elsif ($tagslib->{$tag}->{$subfield}->{authorised_value} eq "itemtypes") {
154                 my $sth=$dbh->prepare("select itemtype,description from itemtypes order by description");
155                 $sth->execute;
156                 push @authorised_values, "" unless ($tagslib->{$tag}->{$subfield}->{mandatory});
157         
158                 while (my ($itemtype,$description) = $sth->fetchrow_array) {
159                         push @authorised_values, $itemtype;
160                         $authorised_lib{$itemtype}=$description;
161                 }
162                 $value=$itemtype unless ($value);
163
164         #---- "true" authorised value
165         } else {
166                 $authorised_values_sth->execute($tagslib->{$tag}->{$subfield}->{authorised_value});
167
168                 push @authorised_values, "" unless ($tagslib->{$tag}->{$subfield}->{mandatory});
169         
170                 while (my ($value,$lib) = $authorised_values_sth->fetchrow_array) {
171                         push @authorised_values, $value;
172                         $authorised_lib{$value}=$lib;
173                 }
174     }
175     return CGI::scrolling_list( -name     => 'field_value',
176                                 -values   => \@authorised_values,
177                                 -default  => $value,
178                                 -labels   => \%authorised_lib,
179                                 -override => 1,
180                                 -size     => 1,
181                                 -multiple => 0 );
182 }
183
184 =item create_input
185  builds the <input ...> entry for a subfield.
186 =cut
187 sub create_input () {
188         my ($tag,$subfield,$value,$i,$tabloop,$rec,$authorised_values_sth,$id) = @_;    
189         my $dbh=C4::Context->dbh;
190         $value =~ s/"/&quot;/g;
191         my %subfield_data;
192         $subfield_data{id}=$id;
193         $subfield_data{tag}=$tag;
194         $subfield_data{subfield}=$subfield;
195         $subfield_data{marc_lib}="<span id=\"error$i\">".$tagslib->{$tag}->{$subfield}->{lib}."</span>";
196         $subfield_data{marc_lib_plain}=$tagslib->{$tag}->{$subfield}->{lib};
197         $subfield_data{tag_mandatory}=$tagslib->{$tag}->{mandatory};
198         $subfield_data{mandatory}=$tagslib->{$tag}->{$subfield}->{mandatory};
199         $subfield_data{repeatable}=$tagslib->{$tag}->{$subfield}->{repeatable};
200         $subfield_data{index} = $i;
201         $subfield_data{visibility} = "display:none" if (substr($tagslib->{$tag}->{$subfield}->{hidden},2,1) gt "0") ; #check parity
202         if ($tagslib->{$tag}->{$subfield}->{authorised_value}) {
203                 $subfield_data{marc_value}= build_authorized_values_list($tag, $subfield, $value, $dbh,$authorised_values_sth);
204         # it's an  authority field
205         } elsif ($tagslib->{$tag}->{$subfield}->{authtypecode}) {
206                 
207                 $subfield_data{marc_value}="<input onblur=\"this.style.backgroundColor='#ffffff';\" onfocus=\"this.style.backgroundColor='#ffffff;'\"\" tabindex=\"1\" type=\"text\"   name=\"field_value\" id=\"field_value$id\" value=\"$value\" size=\"40\" maxlength=\"255\" DISABLE READONLY> <a  style=\"cursor: help;\" href=\"javascript:Dopop('../authorities/auth_finder.pl?authtypecode=".$tagslib->{$tag}->{$subfield}->{authtypecode}."&index=$id',$id);\">...</a>";
208         # it's a plugin field
209         } elsif ($tagslib->{$tag}->{$subfield}->{'value_builder'}) {
210                 # opening plugin. Just check wether we are on a developper computer on a production one
211                 # (the cgidir differs)
212                 my $cgidir = C4::Context->intranetdir ."/cgi-bin/value_builder";
213                 unless (opendir(DIR, "$cgidir")) {
214                         $cgidir = C4::Context->intranetdir."/value_builder";
215                 } 
216                 my $plugin=$cgidir."/".$tagslib->{$tag}->{$subfield}->{'value_builder'}; 
217                 require $plugin;
218                 my $extended_param = plugin_parameters($dbh,$rec,$tagslib,$i,$tabloop);
219                 my ($function_name,$javascript) = plugin_javascript($dbh,$rec,$tagslib,$i,$tabloop);
220                 $subfield_data{marc_value}="<input tabindex=\"1\" type=\"text\"  name=\"field_value\" id=\"field_value$id\"  value=\"$value\" size=\"40\" maxlength=\"255\" DISABLE READONLY OnFocus=\"javascript:Focus$function_name($i)\" OnBlur=\"javascript:Blur$function_name($i); \"> <a  style=\"cursor: help;\" href=\"javascript:Clic$function_name($i)\">...</a> $javascript";
221         # it's an hidden field
222         } elsif  ($tag eq '') {
223                 $subfield_data{marc_value}="<input onblur=\"this.style.backgroundColor='#ffffff';\" onfocus=\"this.style.backgroundColor='#ffffff'; \" tabindex=\"1\" type=\"hidden\" name=\"field_value\" id=\"field_value$id\"  value=\"$value\">";
224         } elsif  (substr($tagslib->{$tag}->{$subfield}->{'hidden'},2,1) gt "1") {
225
226                 $subfield_data{marc_value}="<input onblur=\"this.style.backgroundColor='#ffffff';\" onfocus=\"this.style.backgroundColor='#ffffff'; \" tabindex=\"1\" type=\"text\" name=\"field_value\" id=\"field_value$id\"   value=\"$value\" size=\"40\" maxlength=\"255\" >";
227         # it's a standard field
228         } else {
229                 if (length($value) >100) {
230                         $subfield_data{marc_value}="<textarea tabindex=\"1\" name=\"field_value\" id=\"field_value$id\"  cols=\"40\" rows=\"5\" >$value</textarea>";
231                 } else {
232                         $subfield_data{marc_value}="<input onblur=\"this.style.backgroundColor='#ffffff';\" onfocus=\"this.style.backgroundColor='#ffffff'; \" tabindex=\"1\" type=\"text\" name=\"field_value\" id=\"field_value$id\"  value=\"$value\" size=\"50\">"; #"
233                 }
234         }
235         return \%subfield_data;
236 }
237
238 sub build_tabs  ($$$;$){
239     my($template, $xmlhash, $dbh,$addedfield) = @_;
240     # fill arrays
241     my @loop_data =();
242     my $tag;
243     my $i=0;
244 my $id=100;
245         my $authorised_values_sth = $dbh->prepare("select authorised_value,lib
246                 from authorised_values
247                 where category=? order by lib");
248 my $biblio;
249 my $controlfields;
250 my $leader;
251 if ($xmlhash){
252  $biblio=$xmlhash->{'datafield'};
253  $controlfields=$xmlhash->{'controlfield'};
254  $leader=$xmlhash->{'leader'};
255 }
256     my @BIG_LOOP;
257 my %built;
258
259 # loop through each tab 0 through 9
260 for (my $tabloop = 0; $tabloop <= 9; $tabloop++) {
261
262                 my @loop_data = ();
263         foreach my $tag (sort(keys (%{$tagslib}))) {
264                         my $indicator;
265                                 # if MARC::Record is not empty => use it as master loop, then add missing subfields that should be in the tab.
266                                 # if MARC::Record is empty => use tab as master loop.
267                 my @subfields_data;
268                 
269         if ($xmlhash) {
270                         ####
271                 
272                         my %tagdefined;
273                         my %definedsubfields;
274                         my $hiddenrequired;
275                         my ($ind1,$ind2);
276                         
277                  if ($tag>9){
278                         foreach my $data (@$biblio){
279                                         $hiddenrequired=0;
280                                         my @subfields_data;
281                                         undef %definedsubfields;
282                                  if ($data->{'tag'} eq $tag){
283                                         $tagdefined{$tag}=1 ;
284                                            if ($built{$tag}==1){
285                                                 $hiddenrequired=1;
286                                             }
287                                             $ind1="  ";
288                                               $ind2="  ";               
289                                               foreach my $subfieldcode ( $data->{'subfield'}){
290                                                  foreach my $code ( @$subfieldcode){    
291                                                         next if ($tagslib->{$tag}->{$code->{'code'}}->{tab} ne $tabloop);                                               
292                                                         my $subfield=$code->{'code'}  ;
293                                                         my $value=$code->{'content'};
294                                                         $definedsubfields{$tag.$subfield}=1 ;
295                                                          $built{$tag}=1;
296                                                         push(@subfields_data, &create_input($tag,$subfield,$value,$i,$tabloop,$xmlhash,$authorised_values_sth,$id)) ;
297                                                         $i++ ;
298                                                 }
299                                               } ##each subfield
300                                             $ind1=$data->{'ind1'};
301                                             $ind2=      $data->{'ind2'};
302                                           
303                                         if ($hiddenrequired && $#loop_data >=0 && $loop_data[$#loop_data]->{'tag'} eq $tag) {
304                                                 my @hiddensubfields_data;
305                                                 my %tag_data;
306                                                 push(@hiddensubfields_data, &create_input('','','',$i,$tabloop,$xmlhash,$authorised_values_sth,$id));
307                                                 $tag_data{tag} = '';
308                                                 $tag_data{tag_lib} = '';
309                                                 $tag_data{indicator} = '';
310                                                 $tag_data{subfield_loop} = \@hiddensubfields_data;
311                                                 push (@loop_data, \%tag_data);
312                                                 $i++;
313                                         }
314                                         # now, loop again to add parameter subfield that are not in the MARC::Record
315                                         
316                                         foreach my $subfield (sort( keys %{$tagslib->{$tag}})) {
317                                                 next if (length $subfield !=1);
318                                                 next if ($tagslib->{$tag}->{$subfield}->{tab} ne $tabloop);
319                                                 next if ((substr($tagslib->{$tag}->{$subfield}->{hidden},2,1) gt "1")  ); #check for visibility flag
320                                                 next if ($definedsubfields{$tag.$subfield} );
321                                                 push(@subfields_data, &create_input($tag,$subfield,'',$i,$tabloop,$xmlhash,$authorised_values_sth,$id));
322                                                 $definedsubfields{$tag.$subfield}=1;
323                                                 $i++;
324                                         }
325                                         if ($#subfields_data >= 0) {
326                                                 my %tag_data;
327                                                 $tag_data{tag} = $tag;
328                                                 $tag_data{tag_lib} = $tagslib->{$tag}->{lib};
329                                                 $tag_data{repeatable} = $tagslib->{$tag}->{repeatable};
330                                                 $tag_data{indicator} = $ind1.$ind2 if ($tag>=10);
331                                                 $tag_data{subfield_loop} = \@subfields_data;
332                                                 push (@loop_data, \%tag_data);
333                                                 
334                                         }
335                                         $id++;
336                                      }## if tag matches
337                         
338                         }#eachdata
339                 }else{ ## tag <10
340                                 if ($tag eq "000" || $tag eq "LDR"){
341                                         my $subfield="@";
342                                         next if ($tagslib->{$tag}->{$subfield}->{tab} ne $tabloop);
343                                         my @subfields_data;
344                                         my $value=$leader->[0] if $leader->[0];
345                                         $tagdefined{$tag}=1 ;
346                                         push(@subfields_data, &create_input($tag,$subfield,$value,$i,$tabloop,$xmlhash,$authorised_values_sth,$id));                                    
347                                         $i++;
348                                         if ($#subfields_data >= 0) {
349                                                 my %tag_data;
350                                                 $tag_data{tag} = $tag;
351                                                 $tag_data{tag_lib} = $tagslib->{$tag}->{lib};
352                                                 $tag_data{repeatable} = $tagslib->{$tag}->{repeatable};
353                                                 $tag_data{subfield_loop} = \@subfields_data;
354                                                                         $tag_data{fixedfield} = 1;
355                                                 push (@loop_data, \%tag_data);
356                                         }
357                                  }else{
358                                  foreach my $control (@$controlfields){
359                                         my $subfield="@";
360                                         next if ($tagslib->{$tag}->{$subfield}->{tab} ne $tabloop);
361                                         my @subfields_data;
362                                         if ($control->{'tag'} eq $tag){
363                                         $hiddenrequired=0;
364                                         $tagdefined{$tag}=1 ;
365                                          if ($built{$tag}==1){$hiddenrequired=1;}
366                                         my $value=$control->{'content'} ;
367                                         $definedsubfields{$tag.'@'}=1;
368                                         push(@subfields_data, &create_input($tag,$subfield,$value,$i,$tabloop,$xmlhash,$authorised_values_sth,$id));                                    
369                                         $i++;
370                                         
371                                            $built{$tag}=1;
372                                         if ($hiddenrequired && $#loop_data >=0 && $loop_data[$#loop_data]->{'tag'} eq $tag) {
373                                                 my @hiddensubfields_data;
374                                                 my %tag_data;
375                                                 push(@hiddensubfields_data, &create_input('','','',$i,$tabloop,$xmlhash,$authorised_values_sth,$id));
376                                                 $tag_data{tag} = '';
377                                                 $tag_data{tag_lib} = '';
378                                                 $tag_data{subfield_loop} = \@hiddensubfields_data;
379                                                 $tag_data{fixedfield} = 1;
380                                                 push (@loop_data, \%tag_data);
381                                                 $i++;
382                                         }
383                                         if ($#subfields_data >= 0) {
384                                                 my %tag_data;
385                                                 $tag_data{tag} = $tag;
386                                                 $tag_data{tag_lib} = $tagslib->{$tag}->{lib};
387                                                 $tag_data{repeatable} = $tagslib->{$tag}->{repeatable};
388                                                 $tag_data{subfield_loop} = \@subfields_data;
389                                                 $tag_data{fixedfield} = 1;
390                                                 push (@loop_data, \%tag_data);
391                                         }
392                                         $id++;
393                                         }## tag matches
394                                  }# each control
395                                }
396                         }##tag >9
397
398
399                         ##### Any remaining tag
400                                 my @subfields_data;
401                                 # now, loop again to add parameter subfield that are not in the MARC::Record
402                                         foreach my $subfield (sort( keys %{$tagslib->{$tag}})) {
403                                                 next if ($tagdefined{$tag} );
404                                                 next if (length $subfield !=1);
405                                                 next if ($tagslib->{$tag}->{$subfield}->{tab} ne $tabloop);
406                                                 next if ((substr($tagslib->{$tag}->{$subfield}->{hidden},2,1) gt "1")  ); #check for visibility flag
407                                                 
408                                                 push(@subfields_data, &create_input($tag,$subfield,'',$i,$tabloop,$xmlhash,$authorised_values_sth,$id));
409                                                 $tagdefined{$tag.$subfield}=1;
410                                                 $i++;
411                                         }
412                                         if ($#subfields_data >= 0) {
413                                                 my %tag_data;
414                                                 $tag_data{tag} = $tag;
415                                                 $tag_data{tag_lib} = $tagslib->{$tag}->{lib};
416                                                 $tag_data{repeatable} = $tagslib->{$tag}->{repeatable};
417                                                 $tag_data{indicator} = $ind1.$ind2 if ($tag>=10);
418                                                 $tag_data{subfield_loop} = \@subfields_data;
419                                                 if ($tag<10) {
420                                                                         $tag_data{fixedfield} = 1;
421                                                                         }
422
423                                                 push (@loop_data, \%tag_data);
424                                         }
425
426                                         
427                                         if ($addedfield eq $tag) {
428                                                 my %tag_data;
429                                                 my @subfields_data;
430                                                 $id++;
431                                                 $tagdefined{$tag}=1 ;
432                                                 foreach my $subfield (sort( keys %{$tagslib->{$tag}})) {
433                                                 next if (length $subfield !=1);
434                                                 next if ($tagslib->{$tag}->{$subfield}->{tab} ne $tabloop);
435                                                 next if ((substr($tagslib->{$tag}->{$subfield}->{hidden},2,1) gt "1")  ); #check for visibility flag
436                                                 $addedfield=""; 
437                                                 push(@subfields_data, &create_input($tag,$subfield,'',$i,$tabloop,$xmlhash,$authorised_values_sth,$id));
438                                                 $i++;
439                                                         }
440                                                 if ($#subfields_data >= 0) {
441                                                 $tag_data{tag} = $tag;
442                                                 $tag_data{tag_lib} = $tagslib->{$tag}->{lib};
443                                                 $tag_data{repeatable} = $tagslib->{$tag}->{repeatable};
444                                                 $tag_data{indicator} = ' ' if ($tag>=10);
445                                                 $tag_data{subfield_loop} = \@subfields_data;
446                                                         if ($tag<10) {
447                                                                                 $tag_data{fixedfield} = 1;
448                                                                                 }
449                                                 push (@loop_data, \%tag_data);
450                                                                                         
451                                                 }
452                                 
453                                         }
454                                 
455         # if breeding is empty
456                         } else {
457                                 my @subfields_data;
458                                 foreach my $subfield (sort(keys %{$tagslib->{$tag}})) {
459                                         next if (length $subfield !=1);
460                                         next if ((substr($tagslib->{$tag}->{$subfield}->{hidden},2,1) gt "1")  ); #check for visibility flag
461                                         next if ($tagslib->{$tag}->{$subfield}->{tab} ne $tabloop);
462                                         push(@subfields_data, &create_input($tag,$subfield,'',$i,$tabloop,$xmlhash,$authorised_values_sth,$id));
463                                         $i++;
464                                 }
465                                 if ($#subfields_data >= 0) {
466                                         my %tag_data;
467                                         $tag_data{tag} = $tag;
468                                         $tag_data{tag_lib} = $tagslib->{$tag}->{lib};
469                                         $tag_data{repeatable} = $tagslib->{$tag}->{repeatable};
470                                         $tag_data{indicator} = $indicator;
471                                         $tag_data{subfield_loop} = \@subfields_data;
472                                         $tag_data{tagfirstsubfield} = $tag_data{subfield_loop}[0];
473                                         if ($tag<10) {
474                                                 $tag_data{fixedfield} = 1;
475                                         }
476                                         push (@loop_data, \%tag_data);
477                                 }
478                         }
479                 $id++;
480         }
481         if ($#loop_data >=0) {
482             my %big_loop_line;
483             $big_loop_line{number}=$tabloop;
484             $big_loop_line{innerloop}=\@loop_data;
485             push @BIG_LOOP,\%big_loop_line;
486             }   
487                 $template->param(BIG_LOOP => \@BIG_LOOP);
488 }## tab loop
489 }
490
491
492 sub build_hidden_data () {
493     # build hidden data =>
494     # we store everything, even if we show only requested subfields.
495
496     my @loop_data =();
497     my $i=0;
498     foreach my $tag (keys %{$tagslib}) {
499         my $previous_tag = '';
500
501         # loop through each subfield
502         foreach my $subfield (keys %{$tagslib->{$tag}}) {
503             next if ($subfield eq 'lib');
504             next if ($subfield eq 'tab');
505             next if ($subfield eq 'mandatory');
506         next if ($subfield eq 'repeatable');
507             next if ($tagslib->{$tag}->{$subfield}->{'tab'}  ne "-1");
508             my %subfield_data;
509             $subfield_data{marc_lib}=$tagslib->{$tag}->{$subfield}->{lib};
510             $subfield_data{marc_mandatory}=$tagslib->{$tag}->{$subfield}->{mandatory};
511             $subfield_data{marc_repeatable}=$tagslib->{$tag}->{$subfield}->{repeatable};
512             $subfield_data{marc_value}="<input type=\"hidden\"  name=\"field_value[]\">";
513             push(@loop_data, \%subfield_data);
514             $i++
515         }
516     }
517 }
518
519
520 # ======================== 
521 #          MAIN 
522 #=========================
523 my $input = new CGI;
524 my $error = $input->param('error');
525 my $oldbiblionumber=$input->param('oldbiblionumber'); # if bib exists, it's a modif, not a new biblio.
526 my $breedingid = $input->param('breedingid');
527 my $z3950 = $input->param('z3950');
528 my $op = $input->param('op');
529 my $duplicateok = $input->param('duplicateok');
530
531 my $frameworkcode = $input->param('frameworkcode');
532 my $dbh = C4::Context->dbh;
533 my $biblionumber;
534
535 $biblionumber=$oldbiblionumber if $oldbiblionumber;
536
537 $frameworkcode='' if ($frameworkcode eq 'Default');
538 my ($template, $loggedinuser, $cookie)
539     = get_template_and_user({template_name => "cataloguing/addbiblio.tmpl",
540                              query => $input,
541                              type => "intranet",
542                              authnotrequired => 0,
543                              flagsrequired => {editcatalogue => 1},
544                              debug => 1,
545                              });
546
547 #Getting the list of all frameworks
548 my $queryfwk =$dbh->prepare("select frameworktext, frameworkcode from biblios_framework");
549 $queryfwk->execute;
550 my %select_fwk;
551 my @select_fwk;
552 my $curfwk;
553 push @select_fwk,"Default";
554 $select_fwk{"Default"} = "Default";
555 while (my ($description, $fwk) =$queryfwk->fetchrow) {
556         push @select_fwk, $fwk;
557         $select_fwk{$fwk} = $description;
558 }
559 $curfwk=$frameworkcode;
560 my $framework=CGI::scrolling_list( -name     => 'Frameworks',
561                         -id => 'Frameworks',
562                         -default => $curfwk,
563                         -OnChange => 'Changefwk(this);',
564                         -values   => \@select_fwk,
565                         -labels   => \%select_fwk,
566                         -size     => 1,
567                         -multiple => 0 );
568 $template->param( framework => $framework);
569 my $xmlhash;
570 my $xml;
571 #####DO NOT RETRIVE FROM ZEBRA######
572 my $record =XMLgetbiblio($dbh,$biblionumber) if ($biblionumber);
573 $xmlhash=XML_xml2hash_onerecord($record) if ($biblionumber);
574 $frameworkcode=MARCfind_frameworkcode( $dbh, $biblionumber );
575 ###########
576 $tagslib = &MARCgettagslib($dbh,1,$frameworkcode);
577
578 my $encoding="";
579 ($xmlhash,$encoding) = MARCfindbreeding($dbh,$breedingid,$oldbiblionumber) if ($breedingid);
580
581 $is_a_modif=0;
582 $is_a_modif=1 if $oldbiblionumber; 
583 my ($oldbiblionumtagfield,$oldbiblionumtagsubfield);
584 if ($biblionumber  && !$z3950) {
585         $is_a_modif=1;
586         # if it's a modif, retrieve old biblionumber for the future modification of old-DB.
587         ($oldbiblionumtagfield,$oldbiblionumtagsubfield) = &MARCfind_marc_from_kohafield($dbh,"biblionumber","biblios");
588
589         
590 }
591 #------------------------------------------------------------------------------------------------------------------------------
592 if ($op eq "addbiblio") {
593 #------------------------------------------------------------------------------------------------------------------------------
594         # rebuild
595         my @tags = $input->param('tag');
596         my @subfields =$input->param('subfield');
597         my @values=$input->param('field_value');
598         # build indicator hash.
599         my @ind_tag = $input->param('ind_tag');
600         my @indicator = $input->param('indicator');
601         
602         
603         
604 ## check for malformed xml -- non UTF-8 like (MARC8) will break xml without warning
605 ### This usually happens with data coming from other Z3950 servers
606 ## Slows the saving process so comment out at your own risk
607 eval{
608  $xml = MARChtml2xml(\@tags,\@subfields,\@values,\@indicator,\@ind_tag);        
609 };
610  if ($@){
611 warn $@;
612  $template->param(error             =>1,xmlerror=>1,);
613 goto FINAL;
614   };
615 my $xmlhash=XML_xml2hash_onerecord($xml);
616         my ($duplicatebiblionumber,$duplicatetitle) = FindDuplicate($xmlhash) if (($op eq "addbiblio") && (!$is_a_modif) && (!$duplicateok));
617         my $confirm_not_duplicate = $input->param('confirm_not_duplicate');
618         # it is not a duplicate (determined either by Koha itself or by user checking it's not a duplicate)
619         if (!$duplicatebiblionumber or $confirm_not_duplicate) {
620                 # MARC::Record built => now, record in DB
621                 my $oldbibnum;
622                 my $oldbibitemnum;
623                 if ($is_a_modif) {
624                         NEWmodbiblio($dbh,$biblionumber,$xmlhash,$frameworkcode);
625
626                 } else {
627
628                         ($biblionumber) = NEWnewbiblio($dbh,$xmlhash,$frameworkcode);
629
630                 }
631         # now, redirect to additem page
632                 print $input->redirect("additem.pl?biblionumber=$biblionumber&frameworkcode=$frameworkcode");
633                 exit;
634         } else {
635 FINAL:
636         # it may be a duplicate, warn the user and do nothing
637                 build_tabs ($template, $xmlhash, $dbh);
638                 build_hidden_data;
639                 $template->param(
640                         oldbiblionumber             => $oldbiblionumber,
641                         biblionumber                      => $biblionumber,
642                         oldbiblionumtagfield        => $oldbiblionumtagfield,
643                         oldbiblionumtagsubfield     => $oldbiblionumtagsubfield,
644                         duplicatebiblionumber           => $duplicatebiblionumber,
645                         duplicatetitle                          => $duplicatetitle,
646                          );
647         }
648 #------------------------------------------------------------------------------------------------------------------------------
649 } elsif ($op eq "addfield") {
650 #------------------------------------------------------------------------------------------------------------------------------
651         my $addedfield = $input->param('addfield_field');
652         my @tags = $input->param('tag');
653         my @subfields = $input->param('subfield');
654         my @values = $input->param('field_value');
655         # build indicator hash.
656         my @ind_tag = $input->param('ind_tag');
657         my @indicator = $input->param('indicator');
658         my $xml = MARChtml2xml(\@tags,\@subfields,\@values,\@indicator,\@ind_tag);
659         my $xmlhash=XML_xml2hash_onerecord($xml);
660         # adding an empty field
661         build_tabs ($template, $xmlhash, $dbh,$addedfield);
662         build_hidden_data;
663         $template->param(
664                 oldbiblionumber             => $oldbiblionumber,
665                 biblionumber                     => $biblionumber,
666                 oldbiblionumtagfield        => $oldbiblionumtagfield,
667                 oldbiblionumtagsubfield     => $oldbiblionumtagsubfield,
668                  );
669 } elsif ($op eq "delete") {
670 #------------------------------------------------------------------------------------------------------------------------------
671 my $sth=$dbh->prepare("select iss.itemnumber from items i ,issues iss where iss.itemnumber=i.itemnumber and iss.returndate is null and  i.biblionumber=?");
672  $sth->execute($biblionumber);
673 my $onloan=$sth->fetchrow;
674
675         if (!$onloan){  
676         NEWdelbiblio($dbh,$biblionumber);
677 print   $input->redirect("/cgi-bin/koha/catalogue/catalogue-search.pl");
678         exit;
679         }else{
680
681 $template->param(error            => 1, onloan=>1,);
682
683 goto OUT;
684         }
685 #------------------------------------------------------------------------------------------------------------------------------
686 #------------------------------------------------------------------------------------------------------------------------------
687 } else {
688 #------------------------------------------------------------------------------------------------------------------------------
689
690         # If we're in a duplication case, we have to set to "" the  biblionumber
691         # as we'll save the biblio as a new one.
692         if ($op eq "duplicate")
693         {
694                 $biblionumber = "";
695                 $oldbiblionumber= "";
696         $template->param(duplicateok            => 1);
697         }
698         build_tabs ($template, $xmlhash, $dbh);
699         build_hidden_data;
700         $template->param(
701                 oldbiblionumber             => $oldbiblionumber,
702                 biblionumber                       => $biblionumber,
703                 oldbiblionumtagfield        => $oldbiblionumtagfield,
704                 oldbiblionumtagsubfield     => $oldbiblionumtagsubfield                 
705                 );
706 }
707 $template->param(
708                 isbntag             => $isbntag,
709                 isbnsub                       => $isbnsub,
710                 issntag             => $isbntag,
711                 issnsub                       => $issnsub,
712                 titletag             => $titletag,
713                 titlesub                       => $titlesub,
714                 authortag             => $authortag,
715                 authorsub                       => $authorsub,
716                 );
717
718 $template->param(
719                 frameworkcode => $frameworkcode,
720                 itemtype => $frameworkcode, # HINT: if the library has itemtype = framework, itemtype is auto filled !
721                 hide_marc => C4::Context->preference('hide_marc'),
722                 intranetcolorstylesheet => C4::Context->preference("intranetcolorstylesheet"),
723                 intranetstylesheet => C4::Context->preference("intranetstylesheet"),
724                 IntranetNav => C4::Context->preference("IntranetNav"),
725                 advancedMARCEditor => C4::Context->preference("advancedMARCEditor"),
726                 );
727
728 output_html_with_http_headers $input, $cookie, $template->output;