(bug #2929) permit to define "fine days" in issuing rules
[koha.git] / admin / systempreferences.pl
index b96137b..ef53715 100755 (executable)
@@ -1,7 +1,7 @@
 #!/usr/bin/perl
 
-#script to administer the systempref table
-#written 20/02/2002 by paul.poulain@free.fr
+# script to administer the systempref table
+# written 20/02/2002 by paul.poulain@free.fr
 # This software is placed under the gnu General Public License, v2 (http://www.gnu.org/licenses/gpl.html)
 
 # Copyright 2000-2002 Katipo Communications
@@ -45,19 +45,38 @@ use CGI;
 use C4::Auth;
 use C4::Context;
 use C4::Koha;
-use C4::Languages;
+use C4::Languages qw(getTranslatedLanguages);
+use C4::ClassSource;
+use C4::Log;
 use C4::Output;
-use C4::Context;
+
+# use Smart::Comments;
 
 
 # FIXME, shouldnt we store this stuff in the systempreferences table? 
 
+# FIXME: This uses hash in a backwards way.  What we really want is:
+#       $tabsysprefs{key} = $array_ref;
+#               like
+#       $tabsysprefs{Cataloguing} = [qw(autoBarcode ISBD marc ...)];
+#
+#   Because some things *should* be on more than one tab.
+#   And the tabname is the unique part (the key).
+
 my %tabsysprefs;
 # Acquisitions
     $tabsysprefs{acquisitions}="Acquisitions";
     $tabsysprefs{gist}="Acquisitions";
+    $tabsysprefs{emailPurchaseSuggestions}="Acquisitions";
+    $tabsysprefs{RenewSerialAddsSuggestion}="Acquisitions";
+
 # Admin
-    $tabsysprefs{dateformat}="Admin";
+    $tabsysprefs{singleBranchMode}="Admin";
+    $tabsysprefs{staffClientBaseURL}="Admin";
+    $tabsysprefs{Version}="Admin";
+    $tabsysprefs{OpacMaintenance}="Admin";
+    $tabsysprefs{FrameworksLoaded}="Admin";
+    $tabsysprefs{libraryAddress}="Admin";
     $tabsysprefs{delimiter}="Admin";
     $tabsysprefs{IndependantBranches}="Admin";
     $tabsysprefs{insecure}="Admin";
@@ -68,33 +87,39 @@ my %tabsysprefs;
     $tabsysprefs{Intranet_includes}="Admin";
     $tabsysprefs{AutoLocation}="Admin";
     $tabsysprefs{DebugLevel}="Admin";
+    $tabsysprefs{SessionStorage}="Admin";
+    $tabsysprefs{noItemTypeImages}="Admin";
+    $tabsysprefs{OPACBaseURL}="Admin";
+    $tabsysprefs{GranularPermissions}="Admin";
 
 # Authorities
     $tabsysprefs{authoritysep}="Authorities";
     $tabsysprefs{AuthDisplayHierarchy}="Authorities";
-# Catalogue
-    $tabsysprefs{advancedMARCEditor}="Catalogue";
-    $tabsysprefs{autoBarcode}="Catalogue";
-    $tabsysprefs{hide_marc}="Catalogue";
-    $tabsysprefs{IntranetBiblioDefaultView} = "Catalogue";
-    $tabsysprefs{ISBD}="Catalogue";
-    $tabsysprefs{itemcallnumber}="Catalogue";
-    $tabsysprefs{kohaspsuggest} = "Catalogue";
-    $tabsysprefs{LabelMARCView}="Catalogue";
-    $tabsysprefs{marc}="Catalogue";
-    $tabsysprefs{marcflavour}="Catalogue";
-    $tabsysprefs{serialsadditems}="Catalogue";
-    $tabsysprefs{sortbynonfiling}="Catalogue";
-    $tabsysprefs{MARCOrgCode}="Catalogue";
-    $tabsysprefs{z3950AuthorAuthFields}="Catalogue";
-    $tabsysprefs{z3950NormalizeAuthor}="Catalogue";
-    $tabsysprefs{Stemming}="Catalogue";
-    $tabsysprefs{WeightFields}="Catalogue";
-    $tabsysprefs{expandedSearchOption}="Catalogue";
-    $tabsysprefs{NoZebra}="Catalogue";
-    $tabsysprefs{NoZebraIndexes}="Catalogue";
-    $tabsysprefs{ReceiveBackIssues}="Catalogue";
-    
+    $tabsysprefs{dontmerge}="Authorities";
+    $tabsysprefs{BiblioAddsAuthorities}="Authorities";
+# Cataloguing
+    $tabsysprefs{advancedMARCEditor}="Cataloguing";
+    $tabsysprefs{autoBarcode}="Cataloguing";
+    $tabsysprefs{hide_marc}="Cataloguing";
+    $tabsysprefs{IntranetBiblioDefaultView} = "Cataloguing";
+    $tabsysprefs{ISBD}="Cataloguing";
+    $tabsysprefs{itemcallnumber}="Cataloguing";
+    $tabsysprefs{LabelMARCView}="Cataloguing";
+    $tabsysprefs{marc}="Cataloguing";
+    $tabsysprefs{marcflavour}="Cataloguing";
+    $tabsysprefs{MARCOrgCode}="Cataloguing";
+    $tabsysprefs{z3950AuthorAuthFields}="Cataloguing";
+    $tabsysprefs{z3950NormalizeAuthor}="Cataloguing";
+    $tabsysprefs{Stemming}="Cataloguing";
+    $tabsysprefs{WeightFields}="Cataloguing";
+    $tabsysprefs{NoZebra}="Cataloguing";
+    $tabsysprefs{NoZebraIndexes}="Cataloguing";
+    $tabsysprefs{ReceiveBackIssues}="Cataloguing";
+    $tabsysprefs{DefaultClassificationSource}="Cataloguing";
+    $tabsysprefs{RoutingSerials}="Cataloguing";
+    $tabsysprefs{'item-level_itypes'}="Cataloguing";
+    $tabsysprefs{OpacSuppression}="Cataloguing"; 
+
 # Circulation
     $tabsysprefs{maxoutstanding}="Circulation";
     $tabsysprefs{maxreserves}="Circulation";
@@ -110,40 +135,119 @@ my %tabsysprefs;
     $tabsysprefs{useDaysMode}="Circulation";
     $tabsysprefs{ReservesNeedReturns}="Circulation";
     $tabsysprefs{CircAutocompl}="Circulation";
+    $tabsysprefs{AllowRenewalLimitOverride}="Circulation";
+    $tabsysprefs{canreservefromotherbranches}="Circulation";
+    $tabsysprefs{finesMode}="Circulation";
+    $tabsysprefs{emailLibrarianWhenHoldIsPlaced}="Circulation";
+    $tabsysprefs{globalDueDate}="Circulation";
+    $tabsysprefs{holdCancelLength}="Circulation";
+    $tabsysprefs{itemBarcodeInputFilter}="Circulation";
+    $tabsysprefs{WebBasedSelfCheck}="Circulation";
+    $tabsysprefs{CircControl}="Circulation";
+    $tabsysprefs{finesCalendar}="Circulation";
+    $tabsysprefs{previousIssuesDefaultSortOrder}="Circulation";
+    $tabsysprefs{todaysIssuesDefaultSortOrder}="Circulation";
+    $tabsysprefs{HomeOrHoldingBranch}="Circulation";
+    $tabsysprefs{RandomizeHoldsQueueWeight}="Circulation";
+    $tabsysprefs{StaticHoldsQueueWeight}="Circulation";
+    $tabsysprefs{AllowOnShelfHolds}="Circulation";
+    $tabsysprefs{AllowHoldsOnDamagedItems}="Circulation";
+
+# Staff Client
+    $tabsysprefs{TemplateEncoding}="StaffClient";
+    $tabsysprefs{template}="StaffClient";
+    $tabsysprefs{intranetstylesheet}="StaffClient";
+    $tabsysprefs{IntranetNav}="StaffClient";
+    $tabsysprefs{intranetcolorstylesheet}="StaffClient";
+    $tabsysprefs{intranetuserjs}="StaffClient";
+    $tabsysprefs{yuipath}="StaffClient";
+    $tabsysprefs{IntranetmainUserblock}="StaffClient";
+    
+# Patrons
+    $tabsysprefs{autoMemberNum}="Patrons";
+    $tabsysprefs{checkdigit}="Patrons";
+    $tabsysprefs{intranetreadinghistory}="Patrons";
+    $tabsysprefs{NotifyBorrowerDeparture}="Patrons";
+    $tabsysprefs{memberofinstitution}="Patrons";
+    $tabsysprefs{ReadingHistory}="Patrons";
+    $tabsysprefs{BorrowerMandatoryField}="Patrons";
+    $tabsysprefs{borrowerRelationship}="Patrons";
+    $tabsysprefs{BorrowersTitles}="Patrons";    
+    $tabsysprefs{patronimages}="Patrons";
+    $tabsysprefs{MinPasswordLength}="Patrons";
+    $tabsysprefs{uppercasesurnames}="Patrons";
+    $tabsysprefs{NoReturnSetLost}="Patrons";
+    $tabsysprefs{MaxFine}="Patrons";
+    $tabsysprefs{NotifyBorrowerDeparture}="Patrons";
+    $tabsysprefs{AddPatronLists}="Patrons";
+    $tabsysprefs{PatronsPerPage}="Patrons";
+    $tabsysprefs{ExtendedPatronAttributes}="Patrons";
+    $tabsysprefs{AutoEmailOpacUser}="Patrons";
+    $tabsysprefs{AutoEmailPrimaryAddress}="Patrons";
+    $tabsysprefs{EnhancedMessagingPreferences}="Patrons";
+    $tabsysprefs{'SMSSendDriver'}             = 'Patrons';
+
+# I18N/L10N
+    $tabsysprefs{dateformat}="I18N/L10N";
+    $tabsysprefs{opaclanguages}="I18N/L10N";
+    $tabsysprefs{opacthemes}="I18N/L10N";
+    $tabsysprefs{language}="I18N/L10N";
 
-# Intranet
-    $tabsysprefs{TemplateEncoding}="Intranet";
-    $tabsysprefs{template}="Intranet";
-    $tabsysprefs{intranetstylesheet}="Intranet";
-    $tabsysprefs{IntranetNav}="Intranet";
-    $tabsysprefs{intranetcolorstylesheet}="Intranet";
-    $tabsysprefs{intranetuserjs}="Intranet";
-# Members
-    $tabsysprefs{automembernum}="Members";
-    $tabsysprefs{checkdigit}="Members";
-    $tabsysprefs{intranetreadinghistory}="Members";
-    $tabsysprefs{NotifyBorrowerDeparture}="Members";
-    $tabsysprefs{memberofinstitution}="Members";
-    $tabsysprefs{ReadingHistory}="Members";
-    $tabsysprefs{BorrowerMandatoryField}="Members";
-    $tabsysprefs{borrowerRelationship}="Members";
-    $tabsysprefs{BorrowersTitles}="Members";    
-    $tabsysprefs{patronimages}="Members";
-    $tabsysprefs{MinPasswordLength}="Members";
-    $tabsysprefs{uppercasesurnames}="Members";
-    $tabsysprefs{NoReturnSetLost}="Members";
-    $tabsysprefs{MaxFine}="Members";
+# Searching
+    $tabsysprefs{defaultSortField}="Searching";
+    $tabsysprefs{defaultSortOrder}="Searching";
+    $tabsysprefs{numSearchResults}="Searching";
+    $tabsysprefs{OPACdefaultSortField}="Searching";
+    $tabsysprefs{OPACdefaultSortOrder}="Searching";
+    $tabsysprefs{OPACItemsResultsDisplay}="Searching";
+    $tabsysprefs{OPACnumSearchResults}="Searching";
+    $tabsysprefs{QueryFuzzy}="Searching";
+    $tabsysprefs{QueryStemming}="Searching";
+    $tabsysprefs{QueryWeightFields}="Searching";
+    $tabsysprefs{expandedSearchOption}="Searching";
+    $tabsysprefs{sortbynonfiling}="Searching";
+    $tabsysprefs{QueryAutoTruncate}="Searching";
+    $tabsysprefs{QueryRemoveStopwords}="Searching";
+    $tabsysprefs{AdvancedSearchTypes}="Searching";
+
+# EnhancedContent
+   $tabsysprefs{AmazonContent}="EnhancedContent";
+   $tabsysprefs{AWSAccessKeyID}="EnhancedContent";
+   $tabsysprefs{AmazonLocale}="EnhancedContent";
+   $tabsysprefs{AmazonAssocTag}="EnhancedContent";
+   $tabsysprefs{AmazonSimilarItems}="EnhancedContent";
+   $tabsysprefs{OPACAmazonContent}="EnhancedContent";
+   $tabsysprefs{OPACAmazonSimilarItems}="EnhancedContent";
+
+# Baker & Taylor 
+   $tabsysprefs{BakerTaylorBookstoreURL} = 'EnhancedContent';
+   $tabsysprefs{BakerTaylorEnabled}      = 'EnhancedContent';
+   $tabsysprefs{BakerTaylorPassword}     = 'EnhancedContent';
+   $tabsysprefs{BakerTaylorUsername}     = 'EnhancedContent';
+# FRBR    
+   $tabsysprefs{FRBRizeEditions}="EnhancedContent";
+   $tabsysprefs{XISBN}="EnhancedContent";
+   $tabsysprefs{OCLCAffiliateID}="EnhancedContent";
+   $tabsysprefs{XISBNDailyLimit}="EnhancedContent";
+   $tabsysprefs{PINESISBN}="EnhancedContent";
+   $tabsysprefs{ThingISBN}="EnhancedContent";
+   $tabsysprefs{OPACFRBRizeEditions}="EnhancedContent";
+# Tags
+   $tabsysprefs{TagsEnabled}            = 'EnhancedContent';
+   $tabsysprefs{TagsExternalDictionary} = 'EnhancedContent';
+   $tabsysprefs{TagsInputOnDetail}      = 'EnhancedContent';
+   $tabsysprefs{TagsInputOnList}        = 'EnhancedContent';
+   $tabsysprefs{TagsShowOnDetail}       = 'EnhancedContent';
+   $tabsysprefs{TagsShowOnList}         = 'EnhancedContent';
+   $tabsysprefs{TagsModeration}         = 'EnhancedContent';
+   $tabsysprefs{GoogleJackets}          = 'EnhancedContent';
+   $tabsysprefs{AuthorisedValueImages}  = "EnhancedContent";
 
 # OPAC
-    $tabsysprefs{AmazonAssocTag}="OPAC";
-    $tabsysprefs{AmazonContent}="OPAC";
-    $tabsysprefs{AmazonDevKey}="OPAC";
     $tabsysprefs{BiblioDefaultView}="OPAC";
     $tabsysprefs{LibraryName}="OPAC";
     $tabsysprefs{opaccolorstylesheet}="OPAC";
     $tabsysprefs{opaccredits}="OPAC";
-    $tabsysprefs{opaclanguages}="OPAC";
-    $tabsysprefs{opaclargeimage}="OPAC";
     $tabsysprefs{opaclayoutstylesheet}="OPAC";
     $tabsysprefs{OpacNav}="OPAC";
     $tabsysprefs{opacsmallimage}="OPAC";
@@ -152,35 +256,59 @@ my %tabsysprefs;
     $tabsysprefs{opacuserjs}="OPAC";
     $tabsysprefs{SubscriptionHistory}="OPAC";
     $tabsysprefs{opacheader}="OPAC";
-    
-# OPACFeatures
-    $tabsysprefs{Disable_Dictionary}="OPACFeatures";
-    $tabsysprefs{hidelostitems}="OPACFeatures";
-    $tabsysprefs{opacbookbag}="OPACFeatures";
-    $tabsysprefs{opaclanguagesdisplay}="OPACFeatures";
-    $tabsysprefs{OpacPasswordChange}="OPACFeatures";
-    $tabsysprefs{opacreadinghistory}="OPACFeatures";
-    $tabsysprefs{virtualshelves}="OPACFeatures";
-    $tabsysprefs{RequestOnOpac}="OPACFeatures";
-    $tabsysprefs{reviewson}="OPACFeatures";
-    $tabsysprefs{OpacTopissues}="OPACFeatures";
-    $tabsysprefs{OpacAuthorities}="OPACFeatures";
-    $tabsysprefs{OpacCloud}="OPACFeatures";
-    $tabsysprefs{opacuserlogin}="OPACFeatures";
-    $tabsysprefs{AnonSuggestions}="OPACFeatures";
-    $tabsysprefs{suggestion}="OPACFeatures";
-    $tabsysprefs{OpacTopissue}="OPACFeatures";
-    $tabsysprefs{OpacBrowser}="OPACFeatures";
+    $tabsysprefs{noOPACUserLogin}="OPAC";
+    $tabsysprefs{hideBiblioNumber}="OPAC";
+    $tabsysprefs{OPACDisplayExtendedSubInfo}="OPAC";
+    $tabsysprefs{OpacMainUserBlock}="OPAC";
+    $tabsysprefs{OPACSubscriptionDisplay}="OPAC";
+    $tabsysprefs{OPACURLOpenInNewWindow}="OPAC";
+    $tabsysprefs{OPACUserCSS}="OPAC";
+    $tabsysprefs{OPACHighlightedWords}="OPAC";
+    $tabsysprefs{OPACViewOthersSuggestions}="OPAC";
+    $tabsysprefs{URLLinkText}="OPAC";
+    $tabsysprefs{OPACShelfBrowser}="OPAC";
+
+# OPAC
+    $tabsysprefs{SearchMyLibraryFirst}="OPAC";
+    $tabsysprefs{hidelostitems}="OPAC";
+    $tabsysprefs{opacbookbag}="OPAC";
+    $tabsysprefs{opaclanguagesdisplay}="OPAC";
+    $tabsysprefs{OpacPasswordChange}="OPAC";
+    $tabsysprefs{opacreadinghistory}="OPAC";
+    $tabsysprefs{virtualshelves}="OPAC";
+    $tabsysprefs{RequestOnOpac}="OPAC";
+    $tabsysprefs{reviewson}="OPAC";
+    $tabsysprefs{OpacTopissues}="OPAC";
+    $tabsysprefs{OpacAuthorities}="OPAC";
+    $tabsysprefs{OpacCloud}="OPAC";
+    $tabsysprefs{opacuserlogin}="OPAC";
+    $tabsysprefs{AnonSuggestions}="OPAC";
+    $tabsysprefs{suggestion}="OPAC";
+    $tabsysprefs{OpacTopissue}="OPAC";
+    $tabsysprefs{OpacBrowser}="OPAC";
+    $tabsysprefs{kohaspsuggest} = "OPAC";
+    $tabsysprefs{OpacRenewalAllowed} = "OPAC";
+    $tabsysprefs{OPACItemHolds} = "OPAC";
+    $tabsysprefs{OPACGroupResults}="OPAC";
+    $tabsysprefs{XSLTDetailsDisplay}="OPAC";
+    $tabsysprefs{XSLTResultsDisplay}="OPAC";
 
 # LOGFeatures
-    $tabsysprefs{CataloguingLog}  = "LOGFeatures";
-    $tabsysprefs{BorrowersLog}    = "LOGFeatures";
-    $tabsysprefs{SubscriptionLog} = "LOGFeatures";
-    $tabsysprefs{IssueLog}        = "LOGFeatures";
-    $tabsysprefs{ReturnLog}       = "LOGFeatures";
-    $tabsysprefs{LetterLog}       = "LOGFeatures";
-    $tabsysprefs{FinesLog}        = "LOGFeatures";
+    $tabsysprefs{CataloguingLog}  = "Logs";
+    $tabsysprefs{BorrowersLog}    = "Logs";
+    $tabsysprefs{SubscriptionLog} = "Logs";
+    $tabsysprefs{IssueLog}        = "Logs";
+    $tabsysprefs{ReturnLog}       = "Logs";
+    $tabsysprefs{LetterLog}       = "Logs";
+    $tabsysprefs{FinesLog}        = "Logs";
     
+# OAI-PMH variables
+   $tabsysprefs{'OAI-PMH'}           = "OAI-PMH";
+   $tabsysprefs{'OAI-PMH:archiveID'} = "OAI-PMH";
+   $tabsysprefs{'OAI-PMH:MaxCount'}  = "OAI-PMH";
+   $tabsysprefs{'OAI-PMH:Set'}       = "OAI-PMH";
+   $tabsysprefs{'OAI-PMH:Subset'}    = "OAI-PMH";
+
 sub StringSearch  {
     my ($searchstring,$type)=@_;
     my $dbh = C4::Context->dbh;
@@ -189,15 +317,31 @@ sub StringSearch  {
     my $count=@data;
     my @results;
     my $cnt=0;
-    if ($type){
-        foreach my $syspref (sort keys %tabsysprefs){
+
+    # used for doing a plain-old sys-pref search
+    if ($type eq 'all' ){
+        my $sth=$dbh->prepare("SELECT * FROM systempreferences 
+                WHERE variable LIKE ? OR explanation LIKE ? 
+                ORDER BY VARIABLE");
+        $sth->execute("%$searchstring%", "%$searchstring%");
+        while (my $data=$sth->fetchrow_hashref){
+            $data->{value} =~ s/</&lt;/g;
+            $data->{value} =~ s/>/&gt;/g;
+            $data->{value}=substr($data->{value},0,60)."..." if length($data->{value}) >60;
+            push(@results,$data);
+            $cnt++;
+        }
+        $sth->finish;
+
+    }  elsif ($type){
+        foreach my $syspref (sort { lc $a cmp lc $b } keys %tabsysprefs){
             if ($tabsysprefs{$syspref} eq $type){
                 my $sth=$dbh->prepare("Select variable,value,explanation,type,options from systempreferences where (variable like ?) order by variable");
                 $sth->execute($syspref);
                 while (my $data=$sth->fetchrow_hashref){
                     $data->{value} =~ s/</&lt;/g;
                     $data->{value} =~ s/>/&gt;/g;
-                    $data->{value}=substr($data->{value},0,100)."..." if length($data->{value}) >100;
+                    $data->{value}=substr($data->{value},0,60)."..." if length($data->{value}) >60;
                     push(@results,$data);
                     $cnt++;
                 }
@@ -214,7 +358,7 @@ sub StringSearch  {
         my $sth=$dbh->prepare($strsth);
         $sth->execute();
         while (my $data=$sth->fetchrow_hashref){
-            $data->{value}=substr($data->{value},0,100);
+            $data->{value}=substr($data->{value},0,60);
             push(@results,$data);
             $cnt++;
         }
@@ -224,8 +368,9 @@ sub StringSearch  {
 }
 
 my $input = new CGI;
-my $searchfield=$input->param('searchfield');
-my $offset=$input->param('offset');
+my $searchfield = $input->param('searchfield');
+my $Tvalue = $input->param('Tvalue');
+my $offset = $input->param('offset');
 my $script_name="/cgi-bin/koha/admin/systempreferences.pl";
 
 my ($template, $borrowernumber, $cookie)
@@ -291,12 +436,16 @@ if ($op eq 'update_and_reedit') {
             my $sth=$dbh->prepare("update systempreferences set value=?,explanation=?,type=?,options=? where variable=?");
             $sth->execute($value, $input->param('explanation'), $input->param('variable'), $input->param('preftype'), $input->param('prefoptions'));
             $sth->finish;
+            warn "logaction !! mod ";
+            logaction('SYSTEMPREFERENCE','MODIFY',undef, $input->param('variable') . " | " . $value );
         }
     } else {
         unless (C4::Context->config('demo') eq 1) {
             my $sth=$dbh->prepare("insert into systempreferences (variable,value,explanation) values (?,?,?,?,?)");
             $sth->execute($input->param('variable'), $input->param('value'), $input->param('explanation'), $input->param('preftype'), $input->param('prefoptions'));
             $sth->finish;
+            warn "logaction !! add ";
+            logaction('SYSTEMPREFERENCE','ADD',undef, $input->param('variable') . " | " . $input->param('value') );
         }
     }
     $sth->finish;
@@ -316,6 +465,8 @@ if ($op eq 'add_form') {
         $data=$sth->fetchrow_hashref;
         $sth->finish;
         $template->param(modify => 1);
+        # save tab to return to if user cancels edit
+        $template->param(return_tab => $tabsysprefs{$searchfield});
     }
 
     my @options;
@@ -358,26 +509,43 @@ if ($op eq 'add_form') {
             push @options, { option => $theme, counter => $counter };
             $counter++;
         }
-    } elsif ($data->{'type'} eq 'Languages') {
+    } elsif ($data->{'type'} eq 'ClassSources') {
         $template->param('type-choice' => 1);
         my $type='';
         @options=();
-        my $currently_selected_languages;
+        my $sources = GetClassSources();
         my $counter=0;
+        foreach my $cn_source (sort keys %$sources) {
+            if ($cn_source eq $data->{'value'}) {
+                push @options, { option => $cn_source, counter => $counter, selected => 1 };
+            } else {
+                push @options, { option => $cn_source, counter => $counter };
+            }
+            $counter++; 
+        }
+    } elsif ($data->{'type'} eq 'Languages') {
+    my $currently_selected_languages;
         foreach my $language (split /\s+/, $data->{'value'}) {
-            next if $language eq 'images';
-            push @options, { option => $language, counter => $counter };
             $currently_selected_languages->{$language}=1;
-            $counter++;
-        }
-               my $langavail = getTranslatedLanguages();
-        foreach my $language (@$langavail) {
-            my $selected='0';
-            next if $currently_selected_languages->{$language->{'language_code'}};
-                       #FIXME: could add language_name and language_locale_name for better display
-            push @options, { option => $language->{'language_code'}, counter => $counter };
-            $counter++;
         }
+    # current language
+        my $lang = $template->param('lang');
+        my $theme;
+    my $interface;
+    if ($data->{'variable'} =~ /opac/) {
+        # this is the OPAC
+        $interface = 'opac';
+            $theme = C4::Context->preference('opacthemes');
+    }
+    else {
+        # this is the staff client  
+        $interface = 'intranet';
+        $theme = C4::Context->preference('template');
+    }
+    my $languages_loop = getTranslatedLanguages($interface,$theme,$lang,$currently_selected_languages);
+
+        $template->param('languages_loop' => $languages_loop);
+        $template->param('type-langselector' => 1);
     } else {
         $template->param('type-free' => 1);
         $template->param('fieldlength' => $data->{'options'}>0?$data->{'options'}:60);
@@ -396,17 +564,28 @@ if ($op eq 'add_form') {
     my $dbh = C4::Context->dbh;
     my $sth=$dbh->prepare("select * from systempreferences where variable=?");
     $sth->execute($input->param('variable'));
+    # to handle multiple values
+    my $value;
+    # handle multiple value strings (separated by ',')
+    my $params = $input->Vars;
+    my @values = split("\0",$params->{'value'}) if $params->{'value'};
+    for my $vl (@values) {
+        $value .= "$vl,";
+    }
+    $value =~ s/,$//;
     if ($sth->rows) {
         unless (C4::Context->config('demo') eq 1) {
             my $sth=$dbh->prepare("update systempreferences set value=?,explanation=?,type=?,options=? where variable=?");
-            $sth->execute($input->param('value'), $input->param('explanation'), $input->param('preftype'), $input->param('prefoptions'), $input->param('variable'));
+            $sth->execute($value, $input->param('explanation'), $input->param('preftype'), $input->param('prefoptions'), $input->param('variable'));
             $sth->finish;
+            logaction('SYSTEMPREFERENCE','MODIFY',undef, $input->param('variable') . " | " . $value );
         }
     } else {
         unless (C4::Context->config('demo') eq 1) {
             my $sth=$dbh->prepare("insert into systempreferences (variable,value,explanation,type,options) values (?,?,?,?,?)");
-            $sth->execute($input->param('variable'), $input->param('value'), $input->param('explanation'), $input->param('preftype'), $input->param('prefoptions'));
+            $sth->execute($input->param('variable'), $value, $input->param('explanation'), $input->param('preftype'), $input->param('prefoptions'));
             $sth->finish;
+            logaction('SYSTEMPREFERENCE','ADD',undef, $input->param('variable') . " | " . $value );
         }
     }
     $sth->finish;
@@ -431,13 +610,16 @@ if ($op eq 'add_form') {
     my $dbh = C4::Context->dbh;
     my $sth=$dbh->prepare("delete from systempreferences where variable=?");
     $sth->execute($searchfield);
+    my $logstring =  $searchfield . " | " . $Tvalue ;
+    logaction('SYSTEMPREFERENCE','DELETE',undef,$logstring);
     $sth->finish;
+
                                                     # END $OP eq DELETE_CONFIRMED
 ################## DEFAULT ##################################
 } else { # DEFAULT
     #Adding tab management for system preferences
     my $tab=$input->param('tab');
-    
+    $template->param($tab => 1);
     my ($count,$results)=StringSearch($searchfield,$tab);
     my $toggle=0;
     my @loop_data = ();
@@ -450,15 +632,15 @@ if ($op eq 'add_form') {
         my %row_data;  # get a fresh hash for the row data
         $row_data{variable} = $results->[$i]{'variable'};
         $row_data{value} = $results->[$i]{'value'};
-               $row_data{yes} = 1 if ($results->[$i]{'value'} == 1);
-               $row_data{yesno} = 1 if ($results->[$i]{'type'} eq 'YesNo');
+        $row_data{yes} = 1 if ($results->[$i]{'value'} == 1);
+        $row_data{yesno} = 1 if ($results->[$i]{'type'} eq 'YesNo');
         $row_data{explanation} = $results->[$i]{'explanation'};
         $row_data{toggle} = $toggle;
         $row_data{edit} = "$script_name?op=add_form&amp;searchfield=".$results->[$i]{'variable'};
         $row_data{delete} = "$script_name?op=delete_confirm&amp;searchfield=".$results->[$i]{'variable'};
         push(@loop_data, \%row_data);
     }
-    $tab=($tab?$tab:"Others");
+    $tab=($tab?$tab:"Local Use");
     $template->param(loop => \@loop_data, $tab => 1);
     if ($offset>0) {
         my $prevpage = $offset-$pagesize;