Bug 3638 Self Check Should Capture Hold Items
[koha.git] / opac / opac-search.pl
index 87d2890..5f3ad86 100755 (executable)
@@ -1,7 +1,8 @@
 #!/usr/bin/perl
 
-# Copyright 2008 Garry Collum and the Koha Koha Development team
+# Copyright 2008 Garry Collum and the Koha Development team
 # Copyright 2010 BibLibre
+# Copyright 2011 KohaAloha, NZ
 #
 # This file is part of Koha.
 #
@@ -36,10 +37,13 @@ use C4::Biblio;  # GetBiblioData
 use C4::Koha;
 use C4::Tags qw(get_tags);
 use C4::Branch; # GetBranches
+use C4::SocialData;
+use C4::Ratings;
+
 use POSIX qw(ceil floor strftime);
 use URI::Escape;
 use Storable qw(thaw freeze);
-
+use Business::ISBN;
 
 my $DisplayMultiPlaceHold = C4::Context->preference("DisplayMultiPlaceHold");
 # create a new CGI object
@@ -88,6 +92,14 @@ if ($template_name eq 'opac-results.tmpl') {
    $template->param('COinSinOPACResults' => C4::Context->preference('COinSinOPACResults'));
 }
 
+# get biblionumbers stored in the cart
+my @cart_list;
+
+if($cgi->cookie("bib_list")){
+    my $cart_list = $cgi->cookie("bib_list");
+    @cart_list = split(/\//, $cart_list);
+}
+
 if ($format eq 'rss2' or $format eq 'opensearchdescription' or $format eq 'atom') {
     $template->param($format => 1);
     $template->param(timestamp => strftime("%Y-%m-%dT%H:%M:%S-00:00", gmtime)) if ($format eq 'atom'); 
@@ -103,6 +115,9 @@ elsif (C4::Context->preference("marcflavour") eq "MARC21" ) {
 $template->param( 'AllowOnShelfHolds' => C4::Context->preference('AllowOnShelfHolds') );
 $template->param( 'OPACNoResultsFound' => C4::Context->preference('OPACNoResultsFound') );
 
+$template->param(
+    OpacStarRatings => C4::Context->preference("OpacStarRatings") );
+
 if (C4::Context->preference('BakerTaylorEnabled')) {
     $template->param(
         BakerTaylorEnabled  => 1,
@@ -111,6 +126,7 @@ if (C4::Context->preference('BakerTaylorEnabled')) {
         BakerTaylorBookstoreURL => C4::Context->preference('BakerTaylorBookstoreURL'),
     );
 }
+
 if (C4::Context->preference('TagsEnabled')) {
     $template->param(TagsEnabled => 1);
     foreach (qw(TagsShowOnList TagsInputOnList)) {
@@ -157,40 +173,47 @@ $template->param(search_languages_loop => $languages_limit_loop,);
 my $itemtypes = GetItemTypes;
 # the index parameter is different for item-level itemtypes
 my $itype_or_itemtype = (C4::Context->preference("item-level_itypes"))?'itype':'itemtype';
-my @itemtypesloop;
-my $selected=1;
+my @advancedsearchesloop;
 my $cnt;
-my $advanced_search_types = C4::Context->preference("AdvancedSearchTypes");
-
-if (!$advanced_search_types or $advanced_search_types eq 'itemtypes') {
-    foreach my $thisitemtype ( sort {$itemtypes->{$a}->{'description'} cmp $itemtypes->{$b}->{'description'} } keys %$itemtypes ) {
-        my %row =(  number=>$cnt++,
-        ccl => "$itype_or_itemtype,phr",
+my $advanced_search_types = C4::Context->preference("AdvancedSearchTypes") || "itemtypes";
+my @advanced_search_types = split(/\|/, $advanced_search_types);
+
+foreach my $advanced_srch_type (@advanced_search_types) {
+   if ($advanced_srch_type eq 'itemtypes') {
+   # itemtype is a special case, since it's not defined in authorized values
+        my @itypesloop;
+       foreach my $thisitemtype ( sort {$itemtypes->{$a}->{'description'} cmp $itemtypes->{$b}->{'description'} } keys %$itemtypes ) {
+           my %row =(  number=>$cnt++,
+               ccl => "$itype_or_itemtype,phr",
                 code => $thisitemtype,
-                selected => $selected,
                 description => $itemtypes->{$thisitemtype}->{'description'},
-                count5 => $cnt % 4,
                 imageurl=> getitemtypeimagelocation( 'opac', $itemtypes->{$thisitemtype}->{'imageurl'} ),
             );
-        $selected = 0; # set to zero after first pass through
-        push @itemtypesloop, \%row;
-    }
-} else {
-    my $advsearchtypes = GetAuthorisedValues($advanced_search_types, '', 'opac');
-    for my $thisitemtype (@$advsearchtypes) {
-        my %row =(
-                number=>$cnt++,
-                ccl => $advanced_search_types,
+           push @itypesloop, \%row;
+       }
+        my %search_code = (  advanced_search_type => $advanced_srch_type,
+                             code_loop => \@itypesloop );
+        push @advancedsearchesloop, \%search_code;
+    } else {
+    # covers all the other cases: non-itemtype authorized values
+       my $advsearchtypes = GetAuthorisedValues($advanced_srch_type, '', 'opac');
+        my @authvalueloop;
+       for my $thisitemtype (@$advsearchtypes) {
+               my %row =(
+                               number=>$cnt++,
+                               ccl => $advanced_srch_type,
                 code => $thisitemtype->{authorised_value},
-                selected => $selected,
-                description => $thisitemtype->{'lib'},
-                count5 => $cnt % 4,
-                imageurl=> getitemtypeimagelocation( 'opac', $thisitemtype->{'imageurl'} ),
-            );
-        push @itemtypesloop, \%row;
+                description => $thisitemtype->{'lib_opac'} || $thisitemtype->{'lib'},
+                imageurl => getitemtypeimagelocation( 'opac', $thisitemtype->{'imageurl'} ),
+                );
+               push @authvalueloop, \%row;
+       }
+        my %search_code = (  advanced_search_type => $advanced_srch_type,
+                             code_loop => \@authvalueloop );
+        push @advancedsearchesloop, \%search_code;
     }
 }
-$template->param(itemtypeloop => \@itemtypesloop);
+$template->param(advancedsearchesloop => \@advancedsearchesloop);
 
 # # load the itypes (Called item types in the template -- just authorized values for searching)
 # my ($itypecount,@itype_loop) = GetCcodes();
@@ -389,7 +412,7 @@ my @results;
 my $lang = C4::Templates::getlanguage($cgi, 'opac');
 ( $error,$query,$simple_query,$query_cgi,$query_desc,$limit,$limit_cgi,$limit_desc,$stopwords_removed,$query_type) = buildQuery(\@operators,\@operands,\@indexes,\@limits,\@sort_by, 0, $lang);
 
-sub _input_cgi_parse ($) { 
+sub _input_cgi_parse {
     my @elements;
     for my $this_cgi ( split('&',shift) ) {
         next unless $this_cgi;
@@ -497,8 +520,13 @@ for (my $i=0;$i<@servers;$i++) {
         # in order to avoid problems generated by the default size value in TT
         foreach my $line (@newresults) {
             if ( not exists $line->{'size'} ) { $line->{'size'} = "" }
+            # while we're checking each line, see if item is in the cart
+            if ( grep {$_ eq $line->{'biblionumber'}} @cart_list) {
+                $line->{'incart'} = 1;
+            }
         }
 
+
         my $tag_quantity;
         if (C4::Context->preference('TagsEnabled') and
             $tag_quantity = C4::Context->preference('TagsShowOnList')) {
@@ -509,13 +537,39 @@ for (my $i=0;$i<@servers;$i++) {
                                         limit=>$tag_quantity });
             }
         }
+
         if (C4::Context->preference('COinSinOPACResults')) {
             foreach (@newresults) {
                 my $record = GetMarcBiblio($_->{'biblionumber'});
                 $_->{coins} = GetCOinSBiblio($record);
+                if ( C4::Context->preference( "Babeltheque" ) and $_->{normalized_isbn} ) {
+                    my $isbn = Business::ISBN->new( $_->{normalized_isbn} );
+                    next if not $isbn;
+                    $isbn = $isbn->as_isbn13->as_string;
+                    $isbn =~ s/-//g;
+                    my $social_datas = C4::SocialData::get_data( $isbn );
+                    next if not $social_datas;
+                    for my $key ( keys %$social_datas ) {
+                        $_->{$key} = $$social_datas{$key};
+                        if ( $key eq 'score_avg' ){
+                            $_->{score_int} = sprintf("%.0f", $$social_datas{score_avg} );
+                        }
+                    }
+                }
+            }
+        }
+
+
+        if ( C4::Context->preference('OpacStarRatings') eq 'all' ) {
+            foreach my $res (@newresults) {
+                my $rating = GetRating( $res->{'biblionumber'}, $borrowernumber );
+                $res->{'rating_value'}  = $rating->{'rating_value'};
+                $res->{'rating_total'}  = $rating->{'rating_total'};
+                $res->{'rating_avg'}    = $rating->{'rating_avg'};
+                $res->{'rating_avg_int'} = $rating->{'rating_avg_int'};
             }
         }
-      
+
         if ($results_hashref->{$server}->{"hits"}){
             $total = $total + $results_hashref->{$server}->{"hits"};
         }
@@ -613,8 +667,12 @@ for (my $i=0;$i<@servers;$i++) {
             }
             $template->param(stopwords_removed => "@$stopwords_removed") if $stopwords_removed;
             $template->param(results_per_page =>  $results_per_page);
-            $template->param(SEARCH_RESULTS => \@newresults,
-                                OPACItemsResultsDisplay => (C4::Context->preference("OPACItemsResultsDisplay") eq "itemdetails"?1:0),
+            my $hide = C4::Context->preference('OpacHiddenItems');
+            $hide = ($hide =~ m/\S/) if $hide; # Just in case it has some spaces/new lines
+            $template->param(
+                SEARCH_RESULTS => \@newresults,
+                OPACItemsResultsDisplay => (C4::Context->preference("OPACItemsResultsDisplay") eq "itemdetails"?1:0),
+                suppress_result_number => $hide,
                             );
            if (C4::Context->preference("OPACLocalCoverImages")){
                $template->param(OPACLocalCoverImages => 1);
@@ -679,7 +737,13 @@ for (my $i=0;$i<@servers;$i++) {
         }
         # no hits
         else {
-            $template->param(searchdesc => 1,query_desc => $query_desc,limit_desc => $limit_desc);
+            $template->param(
+                searchdesc => 1,
+                query_desc => $query_desc,
+                limit_desc => $limit_desc,
+                query_cgi  => $query_cgi,
+                limit_cgi  => $limit_cgi
+            );
         }
     } # end of the if local
     # asynchronously search the authority server
@@ -718,24 +782,14 @@ if ($query_desc || $limit_desc) {
 
 # VI. BUILD THE TEMPLATE
 # Build drop-down list for 'Add To:' menu...
-my $session = get_session($cgi->cookie("CGISESSID"));
-my @addpubshelves;
-my $pubshelves = $session->param('pubshelves');
-my $barshelves = $session->param('barshelves');
-foreach my $shelf (@$pubshelves) {
-    next if ( ($shelf->{'owner'} != ($borrowernumber ? $borrowernumber : -1)) && ($shelf->{'category'} < 3) );
-    push (@addpubshelves, $shelf);
-}
-
-if (@addpubshelves) {
-    $template->param( addpubshelves     => scalar (@addpubshelves));
-    $template->param( addpubshelvesloop => \@addpubshelves);
-}
-
-if (defined $barshelves) {
-    $template->param( addbarshelves     => scalar (@$barshelves));
-    $template->param( addbarshelvesloop => $barshelves);
-}
+my ($totalref, $pubshelves, $barshelves)=
+       C4::VirtualShelves::GetSomeShelfNames($borrowernumber,'COMBO',1);
+$template->param(
+       addbarshelves     => $totalref->{bartotal},
+       addbarshelvesloop => $barshelves,
+       addpubshelves     => $totalref->{pubtotal},
+       addpubshelvesloop => $pubshelves,
+       );
 
 my $content_type = ($format eq 'rss' or $format eq 'atom') ? $format : 'html';
 
@@ -744,4 +798,5 @@ if (C4::Context->preference('GoogleIndicTransliteration')) {
         $template->param('GoogleIndicTransliteration' => 1);
 }
 
+    $template->param( borrowernumber    => $borrowernumber);
 output_with_http_headers $cgi, $cookie, $template->output, $content_type;