Authorities framework Bug fixing
[koha.git] / authorities / authorities.pl
index dc41e46..ce476eb 100755 (executable)
@@ -1,6 +1,5 @@
 #!/usr/bin/perl
 
-# $Id$
 
 # Copyright 2000-2002 Katipo Communications
 #
@@ -36,41 +35,6 @@ use vars qw( $is_a_modif );
 
 my $itemtype; # created here because it can be used in build_authorized_values_list sub
 our($authorised_values_sth,$is_a_modif,$usedTagsLib,$mandatory_z3950);
-=item find_value
-
-    ($indicators, $value) = find_value($tag, $subfield, $record,$encoding);
-
-Find the given $subfield in the given $tag in the given
-MARC::Record $record.  If the subfield is found, returns
-the (indicators, value) pair; otherwise, (undef, undef) is
-returned.
-
-=cut
-
-sub find_value {
-    my ($tagfield,$insubfield,$record,$encoding) = @_;
-    my @result;
-    my $indicator;
-    if ($tagfield <10) {
-        if ($record->field($tagfield)) {
-            push @result, $record->field($tagfield)->data();
-        } else {
-            push @result,"";
-        }
-    } else {
-        foreach my $field ($record->field($tagfield)) {
-            my @subfields = $field->subfields();
-            foreach my $subfield (@subfields) {
-                if (@$subfield[0] eq $insubfield) {
-                    push @result,@$subfield[1];
-                    $indicator = $field->indicator(1).$field->indicator(2);
-                }
-            }
-        }
-    }
-    return($indicator,@result);
-}
-
 
 =item build_authorized_values_list
 
@@ -156,6 +120,14 @@ sub create_input {
 
     $value =~ s/"/&quot;/g;
 
+    # determine maximum length; 9999 bytes per ISO 2709 except for leader and MARC21 008
+    my $max_length = 9999;
+    if ($tag eq '000') {
+        $max_length = 24;
+    } elsif ($tag eq '008' and C4::Context->preference('marcflavour') eq 'MARC21')  {
+        $max_length = 40;
+    }
+
     # if there is no value provided but a default value in parameters, get it
     unless ($value) {
         $value = $tagslib->{$tag}->{$subfield}->{defaultvalue};
@@ -213,7 +185,6 @@ sub create_input {
     value=\"$value\"
     class=\"input_marceditor\"
     tabindex=\"1\"                     
-    disabled=\"disabled\"
         readonly=\"readonly\" \/>
     <span class=\"buttonDot\"
         onclick=\"Dopop('/cgi-bin/koha/authorities/auth_finder.pl?authtypecode=".$tagslib->{$tag}->{$subfield}->{authtypecode}."&index=$subfield_data{id}','$subfield_data{id}')\">...</span>
@@ -225,12 +196,15 @@ sub create_input {
         # opening plugin. Just check wether we are on a developper computer on a production one
         # (the cgidir differs)
         my $cgidir = C4::Context->intranetdir . "/cgi-bin/cataloguing/value_builder";
-        unless ( opendir( DIR, "$cgidir" ) ) {
+        unless (-r $cgidir and -d $cgidir) {
             $cgidir = C4::Context->intranetdir . "/cataloguing/value_builder";
         }
         my $plugin = $cgidir . "/" . $tagslib->{$tag}->{$subfield}->{'value_builder'};
         do $plugin || die "Plugin Failed: ".$plugin;
-        my $extended_param = plugin_parameters( $dbh, $rec, $tagslib, $subfield_data{id}, $tabloop );
+        my $extended_param;
+        eval{
+            $extended_param = plugin_parameters( $dbh, $rec, $tagslib, $subfield_data{id}, $tabloop );
+        };
         my ( $function_name, $javascript ) = plugin_javascript( $dbh, $rec, $tagslib, $subfield_data{id}, $tabloop );
 #         my ( $function_name, $javascript,$extended_param );
         
@@ -239,14 +213,13 @@ sub create_input {
                     type=\"text\"
                     id=\"".$subfield_data{id}."\"
                     size=\"67\"
-                    maxlength=\"255\" 
+                    maxlength=\"$max_length\"
                     name=\"".$subfield_data{id}."\"
                     value=\"$value\"
                     class=\"input_marceditor\"
                     onfocus=\"Focus$function_name($index_tag)\"
                     onblur=\"Blur$function_name($index_tag); \" \/>
-                    <span class=\"buttonDot\"
-                    onclick=\"Clic$function_name('$subfield_data{id}')\">...</a>
+                    <a href=\"#\" class=\"buttonDot\" onclick=\"Clic$function_name('$subfield_data{id}'); return false;\" title=\"Tag Editor\">...</a>
                     $javascript";
         # it's an hidden field
     }
@@ -257,7 +230,7 @@ sub create_input {
                     id=\"".$subfield_data{id}."\"
                     name=\"".$subfield_data{id}."\"
                     size=\"67\"
-                    maxlength=\"255\" 
+                    maxlength=\"$max_length\"
                     value=\"$value\" \/>
             ";
     }
@@ -269,7 +242,7 @@ sub create_input {
                     class=\"input_marceditor\"
                     tabindex=\"1\"
                     size=\"67\"
-                    maxlength=\"255\" 
+                    maxlength=\"$max_length\"
                     value=\"$value\"
             \/>";
 
@@ -281,8 +254,8 @@ sub create_input {
             or
             ( C4::Context->preference("marcflavour") eq "UNIMARC" && $tag >= 300
                 and $tag < 400 && $subfield eq 'a' )
-            or (    $tag >= 500
-                and $tag < 600
+            or (    $tag >= 600
+                and $tag < 700
                 && C4::Context->preference("marcflavour") eq "MARC21" )
         )
         {
@@ -294,7 +267,7 @@ sub create_input {
                         class=\"input_marceditor\"
                         tabindex=\"1\"
                         size=\"67\"
-                        maxlength=\"255\" 
+                        maxlength=\"$max_length\"
                         >$value</textarea>
                 ";
         }
@@ -306,7 +279,7 @@ sub create_input {
                         value=\"$value\"
                         tabindex=\"1\"
                         size=\"67\"
-                        maxlength=\"255\" 
+                        maxlength=\"$max_length\"
                         class=\"input_marceditor\"
                 \/>
                 ";
@@ -316,6 +289,21 @@ sub create_input {
     return \%subfield_data;
 }
 
+=item format_indicator
+
+Translate indicator value for output form - specifically, map
+indicator = ' ' to ''.  This is for the convenience of a cataloger
+using a mouse to select an indicator input.
+
+=cut
+
+sub format_indicator {
+    my $ind_value = shift;
+    return '' if not defined $ind_value;
+    return '' if $ind_value eq ' ';
+    return $ind_value;
+}
+
 =item CreateKey
 
     Create a random value to set it into the input name
@@ -358,7 +346,7 @@ sub build_tabs ($$$$$) {
         foreach my $tag (sort @tab_data) {
             $i++;
             next if ! $tag;
-            my $indicator;
+            my ($indicator1, $indicator2);
             my $index_tag = CreateKey;
 
             # if MARC::Record is not empty =>use it as master loop, then add missing subfields that should be in the tab.
@@ -440,12 +428,14 @@ sub build_tabs ($$$$$) {
                             index         => $index_tag,
                             tag_lib       => $tagslib->{$tag}->{lib},
                             repeatable       => $tagslib->{$tag}->{repeatable},
+                            mandatory       => $tagslib->{$tag}->{mandatory},
                             subfield_loop => \@subfields_data,
                             fixedfield    => ($tag < 10)?(1):(0),
                             random        => CreateKey,
                         );
-                        if ($tag >= 010){ # no indicator for theses tag
-                        $tag_data{indicator} = $field->indicator(1).$field->indicator(2);
+                        if ($tag >= 10){ # no indicator for theses tag
+                            $tag_data{indicator1} = format_indicator($field->indicator(1)),
+                            $tag_data{indicator2} = format_indicator($field->indicator(2)),
                         }
                         push( @loop_data, \%tag_data );
                     }
@@ -475,7 +465,9 @@ sub build_tabs ($$$$$) {
                         index            => $index_tag,
                         tag_lib          => $tagslib->{$tag}->{lib},
                         repeatable       => $tagslib->{$tag}->{repeatable},
-                        indicator        => $indicator,
+                        mandatory       => $tagslib->{$tag}->{mandatory},
+                        indicator1       => $indicator1,
+                        indicator2       => $indicator2,
                         subfield_loop    => \@subfields_data,
                         tagfirstsubfield => $subfields_data[0],
                         fixedfield       => ($tag < 10)?(1):(0)
@@ -590,7 +582,7 @@ if ($op eq "add") {
     # it is not a duplicate (determined either by Koha itself or by user checking it's not a duplicate)
     if (!$duplicateauthid or $confirm_not_duplicate) {
         if ($is_a_modif ) {    
-            ModAuthority($authid,$record,$authtypecode,1);
+            ModAuthority($authid,$record,$authtypecode);
         } else {
             ($authid) = AddAuthority($record,$authid,$authtypecode);
         }
@@ -607,7 +599,7 @@ if ($op eq "add") {
     }
 } elsif ($op eq "delete") {
 #------------------------------------------------------------------------------------------------------------------------------
-        &AUTHdelauthority($authid);
+        &DelAuthority($authid);
         if ($nonav){
             print $input->redirect("auth_finder.pl");
         }else{