#!/usr/bin/perl

#use utf8;
use strict;
use CGI;
use POSIX qw(
    ceil
    floor
);
use Opals::Context;#use MARC::File::USMARC;
use Opals::MarcXmlParser;
use Opals::RecordInfoHTML qw(
    rinfo_getPageNavForm_search
);
use JSON;
use Opals::SolrIndex qw(
    slr_search
    slr_buildSearchQuery
    slr_buildSearchQuery_ARL
    slr_getSuggestion
    slr_updateIndexDir
    slr_updateIndexFile
    slr_delIndex
    slr_browseSubject_beginWith
    slr_browseSubject_keyword
    slr_browseAuthor_keyword
    slr_buildSNewItemQuery
    slr_buildSReviewItemQuery
    slr_getHiliTems
    slr_getARLMinMax_fieldVal
    slr_getLexileMinMax
    
);
use Opals::BookCover qw(
    bookCover_getUrl
    bookCover_amazon
    bookCover_google
    bookCover_syndetics

);

use Opals::User qw(
    user_getInformationById
    user_permission_1
);

use Opals::Marc21 qw(
    mc21_infoGeneral
);
use Opals::MarcXml qw(
    mxml_delete
);
use Opals::Date qw(
    date_parse
    date_today
    date_text
    date_f005
);

use Opals::Template qw(
    tmpl_read
    tmpl_write
    tmpl_preference
    tmpl_rangedPageList
    tmpl_getSearchFieldList
);
use Opals::Search qw(
    srch_searchRecord
    srch_buildPQF
    srch_zTab
    srch_buildNewItemSQLs
    srch_searchRecordSQL
    srch_zDatabase
);
use Opals::Portal qw(
    portal_getNewItemList
);
use Opals::Rating qw(
    cmntRating_getAvgRating
    cmntRating_numOfRating
);
use Opals::Pathfinder qw(
    pf_getBookRsList_test
    pf_getPathfinderFromRecordId
);
use Opals::ReserveShelf qw(
    rs_getRShelfFromRecordId
);
use Opals::WebServiceClient qw(
    wsc_getCircData
);
use Opals::Locale qw(
    loc_getMsgFile
    loc_write
);

use Opals::Circulation;

    my $dbh = Opals::Context->dbh();
    my $cgi     = CGI->new;
    my $input = $cgi->Vars();
    END { $dbh->disconnect(); }

my ($permission, $cookie, $template) = tmpl_read(
        {
            dbh             => $dbh,
            cgi             => $cgi,
            tmplFile        => 'search/searchPage.tmpl',
        }
);

################################################################################
# Delete Record
if ($permission && $permission->{'marc_edit'} && $ENV{'REQUEST_METHOD'} =~ m/^post$/i && $input->{'op'} eq 'delRec') {
    $template->param(
        remainList  =>  mxml_delete($dbh, $input->{'rid'}),
    );
    slr_delIndex($input->{'rid'});
}
#/Delete Record
################################################################################

my $srchARL=0;
my $msgValMap={} ;

my @cookieList = (@$cookie);

my  $lang = $cgi->cookie('language');
if($lang !~ m/en|fr/i){
    $lang          = 'en';
}

my $iCount = 0;
my $pref = tmpl_preference($dbh);
my $libType = $pref->{'libraryType'} || 'k-12';
# libType = (public| academy | k-12)
my $multilingual        = $pref->{'multilingual'};
my $link1_name          = $pref->{'link1_name'};
my $link1_url           = $pref->{'link1_url'};
my $link2_name          = $pref->{'link2_name'};
my $link2_url           = $pref->{'link2_url'};
my $showARL             = $pref->{'showARL'};
#my $defaultSearchResultSort = $pref->{'defaultSearchResultSortL'};
my $formatMsgMap        =loc_getMsgFile('search/facet.msg',{});
my $initSearch          =0;
my $facetShow={location=>1, language=>1, format=>1, callnumberPrefix=>1, dewey=>1,lccGrp=>0, subject=>1, author=>1, era=>1, genre=>1, bisac=>1,lexileMeasure=>1, fountasPinnell=>1};

my $isLccSystem=0;
if($pref->{'classificationSystem'} eq 'LCC'){
    $facetShow->{'dewey'}=0;
    $facetShow->{'lccGrp'}=1;
    $isLccSystem=1;
}
$template->param(
        link1_name=>$link1_name ,
        link1_url =>$link1_url ,
        link2_name=>$link2_name , 
        link2_url =>$link2_url , 
        libType   =>$libType,
   );
    my $hideDbList=0;
    my $hs=keys %$input;
    if($hs ==0 || ($hs ==1  && $input->{'srchPage'} eq 'arl' )){
        $initSearch=1;
    }
    if($initSearch==1){
        $template->param(initSearch=>1);
        $hideDbList=1;
    }
    my $zid = $input->{'zid'};
    my $sortAllow=($zid==0)?1:0;
    my $listingType=$input->{'srchPage'};
    ($zid && $zid =~ m/^[\d]+$/ && $zid >= 0) || ($zid = 0);
   
    my $sortAttr    = $input->{'sortAttr'};
    my $sortOrder   = $input->{'sortOrder'};
    if(!$sortAttr  &&  $input->{'sf0'} eq '5006'){
        $input->{'sortAttr'}= $sortAttr='4';
    }
    elsif($listingType =~ m/^newItem$|^review$/){
         if(!defined $input->{'range'}){
             $input->{'range'}=$listingType eq'review'?'0':'365';
         };
        if(!defined $sortAttr || $sortAttr eq '' ) { 
            $sortAttr = ($listingType eq 'newItem')?9002:9001; 
            $sortOrder =1;
        }
        $input->{'sortAttr'}=$sortAttr;
        $input->{'sortOrder'}=$sortOrder;
    }
    my $selRange=$input->{'range'};
    writeSortParam2tmpl($input);
    # searchfilter fields
    setSearchFormFilter();
    #setPageNavForm($cgi);
 
   

     
 #---------------------- SEARCH --------------------
    my  $showLocation =Opals::Context->preference('showLocation');
    my $uid = $template->param('curUserId');

        my $pRange = 10;
    my $pSize   = 20;
    my $curPage = $input->{'pNum'};
    ($curPage && $curPage >= 1) || ($curPage = 1);
    my $offset      = ($curPage - 1) * $pSize ;
    my $rs=undef;
    my $pageReq=$input->{'srchPage'};
    $pageReq = "searchPage" if(!$pageReq || $pageReq eq "");
    my  $viewStyle = "list";

#   search for local database
    if($listingType eq 'newItem'){
        $rs = getNewItems($dbh,$input, $curPage, $pSize);
        $hideDbList=1;
        $pageReq="newItemPage";
        $viewStyle='gallery' ;
        if($cgi->cookie('viewStyle_newItem') && $cgi->cookie('viewStyle_newItem') eq 'list'){
            $viewStyle='list';
        }
    }
    elsif($listingType eq 'review'){
        $rs  = getReviewedItems($dbh, $input, $curPage, $pSize);
        $hideDbList=1;
        $pageReq="reviewPage";
        $viewStyle='gallery' ;
        if($cgi->cookie('viewStyle_review') && $cgi->cookie('viewStyle_review') eq 'list'){
            $viewStyle='list';
        }

    }
    elsif($listingType eq 'ebook'){
        if((!defined $sortOrder || $sortOrder eq '' ) && $sortAttr eq 31){ $sortOrder =1;}
         $viewStyle='gallery';
        if($cgi->cookie('viewStyle_ebook') && $cgi->cookie('viewStyle_ebook') eq 'list'){
            $viewStyle='list';
        }
        
        $pageReq="ebookPage";
        if($input->{'kw0'} eq ''){
            $input->{'sf0'}='1016' ;
            $input->{'kw0'}='*' ;
            $input->{'recType'}='ebook';
        }
        $rs = search_localDb();
         
    }
    elsif($listingType eq 'arl'){
        my $arlMsgMap            =loc_getMsgFile('search/arl.msg');
        loc_write($template,$arlMsgMap);
        my $fpLevels = [{'level'=>'A'}, {'level'=>'B'}, {'level'=>'C'}, {'level'=>'D'}, 
                {'level'=>'E'}, {'level'=>'F'}, {'level'=>'G'}, {'level'=>'H'}, 
                {'level'=>'I'}, {'level'=>'J'}, {'level'=>'K'}, {'level'=>'L'},{'level'=>'LB'},
                {'level'=>'M'}, {'level'=>'N'}, {'level'=>'O'}, {'level'=>'P'}, 
                {'level'=>'Q'}, {'level'=>'R'}, {'level'=>'S'}, {'level'=>'T'}, 
                {'level'=>'U'}, {'level'=>'V'}, {'level'=>'W'}, {'level'=>'WB'},
                {'level'=>'X'}, {'level'=>'Y'}, {'level'=>'Z'}, {'level'=>'Z+'}];
        $template->param(fpLevels            => $fpLevels,);   
        $rs = search_ARL();
        $srchARL=1;
        $template->param(srchARL=>1,
                         selectedTab => $input->{'tab'},
    program => $input->{'program'},

    readingLevelFrom => $input->{'readingLevelFrom'},
    readingLevelTo =>   $input->{'readingLevelTo'},
    pointvalueFrom =>   $input->{'pointvalueFrom'},
    pointvalueTo =>     $input->{'pointvalueTo'},
    interestLevel =>    $input->{'interestLevel'}
                         );
        my($minAR_readingLevel,$maxAR_readingLevel)=slr_getARLMinMax_fieldVal('accelerated reader','AR_readingLevel');
        my($minRC_readingLevel,$maxRC_readingLevel)=slr_getARLMinMax_fieldVal('reading counts','RC_readingLevel');

        my($minAR_pointValue,$maxAR_pointValue)=slr_getARLMinMax_fieldVal('accelerated reader','AR_pointValue');
        my($minRC_pointValue,$maxRC_pointValue)=slr_getARLMinMax_fieldVal('reading counts','RC_pointValue');

        my($min_lexileValue,$max_lexileValue)=slr_getLexileMinMax();

        $template->param(
            minAR_readingLevel  =>$minAR_readingLevel,
            maxAR_readingLevel  =>$maxAR_readingLevel,
            minRC_readingLevel  =>$minRC_readingLevel,
            maxRC_readingLevel  =>$maxRC_readingLevel,
            minAR_pointValue    =>$minAR_pointValue,
            maxAR_pointValue    =>$maxAR_pointValue,
            minRC_pointValue    =>$minRC_pointValue,
            maxRC_pointValue    =>$maxRC_pointValue,

            min_lexileValue     =>$min_lexileValue,
            max_lexileValue     =>$max_lexileValue,
        );
    }
    else{
        if((!defined $sortOrder || $sortOrder eq '' ) && $sortAttr eq 31){ $sortOrder =1;}
        if($cgi->cookie('viewStyle_search') && $cgi->cookie('viewStyle_search') eq 'gallery'){
            $viewStyle='gallery';
        }

        if($zid == 0){
            $rs = search_localDb();
        }
        else{
            $rs= search_z3950();
        }
    }
    my $pageNavForm =getPageNavParam($cgi);
    $template->param(pageNavFormParam=>to_json($pageNavForm));

    my $rs_json={};
    my ($hits,$recList) = ($rs->{'hits'},$rs->{'recordList'});
    if($hits >0){
        getBookCover($recList);
        #getRating($recList);
        if ($hits - $offset + 1 <= 0) {
            my $availRange = $hits % $pSize;
            $availRange = $pSize if ($availRange == 0); 
            $offset = $hits - $availRange + 1;
            $curPage = ($offset - 1) / $pSize + 1;
        }
        my $recRsPos =$offset;                
        my $bkShelfMidCallno="";
        my $bkShelfMidRecId=0;
        my $titleFm ='';my $subtitleFm ='';
        my $loanList =undef;
        foreach my $rec(@$recList){
            $rec->{'callnumber'} =~ s/[\s]+/<br>/g; 
            $rec->{'recRsPos'}=$recRsPos++; 
                
            if($bkShelfMidCallno eq '' && $rec->{'callNum1St'} ne '' ){
                $bkShelfMidCallno = $rec->{'callNum1St'};
                $bkShelfMidRecId = $rec->{'rid'};
            }             
            $titleFm = $rec->{'title'};
            $titleFm=~ s/[\:]+$//g;
            $titleFm=~ s/[\/]+$//g;
            $rec->{'titleFm'} = $titleFm;
            $rec->{'titleSubTitle'}=$titleFm;
            if($rec->{'subtitle'} && $rec->{'subtitle'} ne ''){
                $subtitleFm = $rec->{'subtitle'};
                $subtitleFm=~ s/[\/]+$//g;
                $rec->{'subtitleFm'} = $subtitleFm;
                $rec->{'titleSubTitle'} .=  ": " . $subtitleFm;
            }
            if($zid == 0){
                # PATHFINDER
                my $pf = pf_getPathfinderFromRecordId($dbh,$rec->{'rid'});
                $rec->{'pf'} = $pf;
                # RESERVESHELF
                $rec->{'reserveShelf'} = rs_getRShelfFromRecordId($dbh,$rec->{'rid'});
                # genreList
                $rec->{'genreList'} = getRelGenreList($dbh,$rec->{'rid'});
                
            }
            eval{ # ebook condition
                if(defined  $rec->{'bid'} && $rec->{'bid'} >0){
                    $rec->{'addable'} =1;
                    if($rec->{'ebookLicType'} eq 'free'){
                        $rec->{'readable'}=1;
                    }
                    else{
                        $rec->{'readable'}=Opals::Circulation::eCirc_isOnLoanTo($dbh,$uid,$rec->{'bid'});
                        if($rec->{'readable'}){
                            $rec->{'returnable'} =1;
                        }
                        elsif($rec->{'available'}>0){
                            $rec->{'loanable'} = 1;
                        }
                        elsif(!Opals::Circulation::eCirc_isReserveTo($dbh,$uid,$rec->{'bid'})){
                            $rec->{'reserveable'} =1;  
                        }

                    }
                }
            };warn if $@;
            
        }

        my @rangedPageList = tmpl_rangedPageList($hits, $curPage, $pSize, $pRange);
        my $recTo =  $offset  + $pSize ;
        if($recTo > $hits) {
            $recTo = $hits;
        }
        $rs_json  ={zid=>$zid,
                    recList=>$recList, 
                    hits=>$hits,
                    pNum=>$curPage,
                    pSize=>$pSize,
                    pRange=>$pRange,
                    bkShelfMidCallno    =>$bkShelfMidCallno,
                    bkShelfMidRecId     =>$bkShelfMidRecId,
                    recFrom             => $offset +1,
                    recTo               => $recTo ,
                    "sortAttr_$sortAttr"=>1 , 
                    range               =>$selRange,
                    sortAllow           =>$sortAllow  ,
                    facet=>   $rs->{'facet'}     
                    
                    };
       
       
        $template->param(galleryView =>1) if($viewStyle eq 'gallery');
        my $highlightTerms =slr_getHiliTems($input);
        my $hiliArr=[];
        foreach my $e(@$highlightTerms){
            push @$hiliArr,$e->{'term'};
        }
        
        $template->param(highlightTerms =>to_json($hiliArr));
        foreach my $var (qw(facet generalInfo circData inclCircData studentILL)){
            if(defined $rs->{$var}){
                $template->param($var=>$rs->{$var});
               # $rs_json  ={$var=>$rs->{$var}};
            }
        }
      }
    else{
        #if($rs->{'suggestion'} && $rs->{'suggestion'}->{'term'} ne ''){
                $template->param(
                        suggestion=>$rs->{'suggestion'}->{'term'}  ,
                        sugField  =>$rs->{'suggestion'}->{'field'}
                );
        #}
        $rs_json  ={suggestion=>$rs->{'suggestion'}->{'term'},
                    sugField  =>$rs->{'suggestion'}->{'field'}};
    }

    $template->param("$pageReq"          =>1,pageReq             =>$pageReq);

    $template->param(listRs =>1) if(scalar(@$recList) || $pageReq =~ m/newItemPage|reviewPage/ );
    $template->param(hideDbList          =>$hideDbList,
                     hlpUrl      => Opals::Constant->getHlpUrl('marc_edit'));

    my ($userInfo, $guardian) =(undef,undef);
    ($userInfo,$guardian) =user_getInformationById($dbh, $uid) if (defined $uid && $uid>0);
       my $pageInfo =to_json({
                    pageReq  =>$pageReq,
                    initSearch=>$initSearch,
                    srchARL   =>$srchARL,
                    link1_name=>$link1_name ,
                    link1_url =>$link1_url ,
                    link2_name=>$link2_name , 
                    link2_url =>$link2_url , 
                    showLocation=>($showLocation eq '1')?1:0,
                    showARL   =>$showARL,
                    loginUid  =>(defined $uid && $uid>0)? $uid:0,
                    loginEmail=> $userInfo->{'email'},
                    loginPhone=> $userInfo->{'phone'}            
                });
        $template->param(pageInfo =>$pageInfo,
                         rs_json  => to_json($rs_json,{pretty=>1}));

#Mon, Nov 30, 2009 @ 09:04:13 EST
#
my $stdMsgMap  =loc_getMsgFile('search/standard.msg',$msgValMap);
loc_write($template,$stdMsgMap);
if ($zid) {
    my $infoMsgMap = loc_getMsgFile('record/bib_info.msg');
    loc_write($template, $infoMsgMap);
}
my $eInfoMsgMap = loc_getMsgFile('ebook.msg');
    loc_write($template, $eInfoMsgMap);

my @zdbList = srch_zTab($dbh, $zid);
my $extDbList=getExtDbList($dbh);
my @dbList=( @zdbList,@$extDbList);
$template->param(
    zid => $zid,
    dbList=>to_json(\@dbList, {pretty=>1}),
);
my $msgValMap={};
    my $reserveMsgMap =loc_getMsgFile('circ/reserve.msg',$msgValMap);
    loc_write($template,$reserveMsgMap);

tmpl_write($dbh, $cgi, \@cookieList, $template);

#======================================================================================
sub getExtDbList{
    my($dbh)=@_;
    my @extDbList=();
    my $sth=$dbh->prepare("select * from opl_extDatabase where page='searchPage' && hidden=0 order by rank, name, id asc");
    $sth->execute();
    while(my $rec=$sth->fetchrow_hashref){
        $rec->{"description"}=$rec->{"name"};
        $rec->{'VRC'}=1 if($rec->{'name'} eq 'VRC');
        $rec->{'active'}=1 if($ENV{'SCRIPT_NAME'} =~ m/\/vrc$/);
        push @extDbList,$rec;
    }
    return \@extDbList;
}
#======================================================================================
sub setSearchFormFilter{

    my $formatMsgMap  =loc_getMsgFile('search/facet.msg',{});
    my $refineFilter=[];
    my @fieldArr =qw(language format author subject dewey lccGrp era genre callnumberPrefix lexileMeasure fountasPinnell);
    foreach my $f(@fieldArr){
        if($input->{$f .'Filter'} ne ''){
            my $fTxt = $formatMsgMap->{$f};
            my $fVal=$input->{$f .'Filter'};
            $fVal= $formatMsgMap->{$fVal} if($f =~ m/language|format/gi);
            $fVal=uc $fVal if($f eq 'lccGrp');
            push @$refineFilter,{field=>$fTxt,value=>$fVal ,filter=>$f .'Filter'};
        }
    }
    $template->param(refineFilter => to_json($refineFilter));
}
   
#=======================================================
sub setPageNavForm{
    my ($cgi)=@_;
    my $input=$cgi->Vars();
    my @recType     = $cgi->param('recType');
    my $navFormInput=[];
    foreach my $iName(keys %$input){
        push @$navFormInput,{name=>$iName, value=>$input->{$iName}};
    }
    my @recType     = $cgi->param('recType');
    foreach my $rType(@recType){
        push @$navFormInput,{name=>'recType', value=>$rType};
    }
    my @fieldArr =qw(languageFilter formatFilter authorFilter subjectFilter deweyFilter lccGrpFilter eraFilter genreFilter callnumberPrefixFilter lexileMeasureFilter fountasPinnellFilter);
    foreach my $f(@fieldArr){
        if(!defined $input->{$f}){
            push @$navFormInput,{name=>$f, value=>''};
        }
    }
    if(!defined $input->{'pNum'}){
        push @$navFormInput,{name=>'pNum', value=>1 };
    }
    $template->param(navFormInput => $navFormInput);
}
#=======================================================
sub search_localDb{
    my @recType     = $cgi->param('recType');
    my $filter;
    my $locationSel = $input->{'location'};
    $filter->{'recType'}=\@recType;
    if(defined $input->{'location'} && $locationSel ne ""){
        $filter->{'location'} = [$locationSel];
    }
    $rs =searchSolr($input,$filter);
    my $suggestion=undef;
    my $sfCount=0;
    if($rs->{'hits'}>0){
        mapFacetMsg($rs->{'facet'});  
        addToggleAnchor2FacetList($rs->{'facet'});
    }
    else{
        foreach my $cgiInput (keys %$input) {
            $sfCount++ if ($cgiInput =~ m/^sf[\d]+/);
        }
        if ($sfCount ==1 ) {
            my $fieldSrch = $input->{'sf0'};
            ($fieldSrch && $fieldSrch ne '')||($fieldSrch = 'title');

            my $s= slr_getSuggestion($fieldSrch ,$input->{'kw0'});

            if($s ne ""){ 
                $suggestion={field=>$fieldSrch,term=>$s};
            }
        }

    }
    return { hits           =>$rs->{'hits'},
             recordList     =>$rs->{'recordList'},
             highlightTerms =>$rs->{'highlightTerms'},
             suggestion     =>$suggestion,
             facet          =>$rs->{'facet'},
           };
}
#=======================================================
sub search_z3950{

    my $zdb = srch_zDatabase($dbh, $zid);
    my ($hits,$recordList) =searchPQF($input,$cgi,$zid);
    my $retVal={ hits=>$hits};
    my $generalInfo=[];
    my $ridList = '';
    my $marcXmlParser=Opals::MarcXmlParser->new();
    foreach my $record (@$recordList) {
        $ridList .= $record->{'rid'} . ',';
    }
        $ridList =~ s/[^,\d]//g;
    $ridList =~ s/(^,+|,+$)//g;
    $ridList =~ s/,+/,/g;
       
    my($circData,$inclCircData,$studentILL)=(undef,0,0);
    if ($ridList) {
        $inclCircData=$zdb->{'circData'};
        #### my $uid = $template->param('curUserId');
        $studentILL = ($zdb->{'studentILL'} && $uid)?1:0;

        # 1. send request to union
        if ($zdb->{'circData'}) {
            $circData = wsc_getCircData($zdb->{'host'}, $ridList);
        }
        # 2. append results from union
        foreach my $rec (@{$recordList}) {
            my $rid = $rec->{'rid'};
            foreach my $sf852a (@{$rec->{'stat852a'}}) {
                my $sf852a_value = $sf852a->{'code852a'};
                foreach my $sf852b (@{$sf852a->{'list852b'}}) {
                    my $sf852b_value = $sf852b->{'code852b'};
                    my $location = $sf852b->{'location'};

                    foreach my $k (keys %{$circData->{$rid}->{$location}}) {
                        $sf852b->{$k} = 
                            $circData->{$rid}->{$location}->{$k};

                        if ($circData->{$rid}->{$location}->{'unionId'} eq 
                                $zdb->{'locationId'}) {
                            $sf852b->{'isLocal'} = 1;
                        }
                    }
                }
            }
        }
    }
    foreach my $record (@$recordList) {
        my $gi =$marcXmlParser->getRecInfoGeneral($record->{'xml'});
        $gi->{'rid'} = $record->{'rid'};
        $gi->{'stat852a'}=$record->{'stat852a'};
        $gi->{'uriList'} =mapURI($gi->{'uriList'})if($gi->{'uriList'} && ref($gi->{'uriList'} ) eq 'ARRAY');

        push @$generalInfo, $gi;
    }
# open debug,">/tmp/ss"; print debug to_json($recordList,{pretty=>1}); close debug;
    $retVal->{'recordList'}=$generalInfo; 
    $retVal->{'inclCircData'}=$inclCircData; 
    $retVal->{'studentILL'}=$studentILL; 
    $retVal->{'circData'}=$inclCircData; 
    return $retVal;
}


#=======================================================
sub getNewItemList{
    my ($dbh)=@_;
    my $newItemList="";
    my $pid =0;
    $pid =$dbh->selectrow_array("select pid from opl_portlet where type='newItemList'");
    if ($pid){$pid=35;

        my $prop = getPortletProp($dbh,$pid);
        my ($nItemShow,$fieldsShow , $showBookCover);
        foreach my $p(@$prop){
            $nItemShow       = $p->{'val'} if($p->{'var'} eq 'nItemShow');
            $fieldsShow      = $p->{'val'} if($p->{'var'} eq 'fieldsShow');
            $showBookCover   = $p->{'val'} if($p->{'var'} eq 'showBookCover');
        }
        $newItemList=portal_getNewItemList($dbh,$nItemShow,$fieldsShow,$showBookCover,'searchPage');

    my $self = $ENV{'SCRIPT_NAME'};#(caller(0))[1];
    }
    return ($pid,$newItemList);
}   
#=======================================================
sub getPortletProp{
  my($dbh,$pid)=@_;
    my $prop=[];
    
    my $sth = $dbh->prepare("select var,val from opl_portletProp where pid=?");
    $sth->execute($pid); 
    while( my ($var,$val) = $sth->fetchrow_array){
        push @$prop,{var=>$var,val=>$val};
    }
    $sth->finish;
    return $prop;

}

#=======================================================
sub searchSolr{
    my ($input,$filter) =@_;

    my $rs=undef;
    my $rating =Opals::Context->preference('rating');
    my $lQuery=slr_buildSearchQuery($input,$filter);
    my $param={lQuery=>$lQuery,recFormat=>'brief',
                             sortAttr=>$sortAttr,sortDir=>$sortOrder,
                             offset=>$offset,size=>$pSize,
                             incCircStatus=>1,
                             isLccSystem=>$isLccSystem};
    if ($rating eq '2'){
        $input->{'incRating'}=1 ;
        $param->{'incRating'}=1;
    }
    if($lQuery ne ''){
        $rs = slr_search($param);  
    }
    return $rs;
}

#=======================================================
sub searchPQF{ 
    my($input,$cgi,$zid)=@_;
    my $zdb = srch_zDatabase($dbh, $zid);
    $input->{'searchScope'} = $zdb->{'filter'};
    my $pqf =srch_buildPQF($input,$cgi,$zid);
    my ($resultSize, $result)=(0,undef);
    if($pqf){
        ($resultSize, $result) = srch_searchRecord($dbh, $zid, 'b', $pqf, $offset, $pSize);
    }
    return ($resultSize, $result);
}

#=======================================================
sub getBookCover{
    my($recList,$size,$caption)=@_;
    my  $awsId =Opals::Context->preference('amazonId');
    my  $awsSecretKey =Opals::Context->preference('amazonSecreteKey');
    my  $syndeticsId =Opals::Context->preference('syndeticsId');
    if($syndeticsId ne''){
        bookCover_syndetics($recList);
    }
    elsif($awsId ne '' && $awsSecretKey ne ''){
        bookCover_amazon($recList,$awsId,$awsSecretKey);
    }
    else{
        $size='m' if($size eq 'mc');
        bookCover_google($recList,'l');
    }

}

#////////////////////////////////////////////////////////////////////////////
sub getRating{
    my ($recList)=@_;
    my  $rating =Opals::Context->preference('rating');
    if($rating && $rating ==2 ){
        foreach my $rec(@$recList){
            my $noReview  = cmntRating_numOfRating($dbh,$rec->{'rid'});
            my $avgRating = cmntRating_getAvgRating($dbh,$rec->{'rid'});
            my $numOfStars =floor($avgRating);
            my $fraction= $avgRating - $numOfStars ;
            if($fraction >0.25 && $fraction<0.75){
                $numOfStars += 0.5;
            }
            elsif($fraction >0.75){
                $numOfStars += 1;
            }

            my $avgRating = sprintf("%.2f", $avgRating);
            $rec->{'rateRec'} = $avgRating;
            $rec->{'numReview'} = $noReview;
            $rec->{'numOfStars'} = $numOfStars;
           }
    }
}
#=======================================================
sub mapFacetMsg{
    my ($facet)=@_;

    foreach my $fa(@$facet){
        $fa->{'show'}=$facetShow->{$fa->{'field'}};
        $fa->{'fieldTxt'} =$formatMsgMap->{$fa->{'field'}};
        $fa->{'hasIcon'}=1 if($fa->{'field'} eq 'format');
        foreach my $item(@{$fa->{'facetList'}}){
            if($fa->{'field'} =~ m/format|language/){
               $item->{'facetTxt'}=$formatMsgMap->{$item->{'facet'}};
               if($item->{'facetTxt'} eq ''){
                    $item->{'facetTxt'}="undefined" ;
                    #$item->{'facet'}='undef';
               }
            }
            else{
                $item->{'facetTxt'}=$item->{'facet'};
                if($fa->{'field'} eq 'dewey'){
                    $item->{'facetDesc'} =getDeweyDesc($item->{'facet'});
                }
                if($fa->{'field'} eq 'lccGrp'){
                    $item->{'facetTxt'}=uc $item->{'facetTxt'};
                    $item->{'facetDesc'} =getLccDesc($item->{'facet'});
                }
            }
        }
        @{$fa->{'facetList'}} =sort{$a->{'facetTxt'} cmp $b->{'facetTxt'}} @{$fa->{'facetList'}};
    }
    
}
#=======================================================
sub getDeweyDesc{
    my ($d)=@_;
    my $deweyDesc=undef;
    if($d =~ m/(^[0-9]+(\.[0-9]+){0,1}).*/){
        my $dewey=$1;
        my($dewey_100,$dewey_10,$dewey_int)=(floor($dewey/100)*100,floor($dewey/10)*10,floor($dewey));
        my $sth=$dbh->prepare(<<_SQL_);
        select description from opl_deweyDesc 
        where dewey=? 
             or(dewey_decimal=0 && dewey <=? && (dewey_100=? or dewey_10=? or dewey_int=? )) 
       order by dewey desc limit 1 ;
_SQL_
        $sth->execute($dewey,$dewey_int,$dewey_100,$dewey_10,$dewey_int);
        if(my ($desc)=$sth->fetchrow_array){
            $deweyDesc=$desc;
        }
        $sth->finish;
    }
    return $deweyDesc;
}
#=======================================================
sub getLccDesc{
    my ($lccGrp)=@_;
    my $lccDesc=undef;
    my $sth=$dbh->prepare("select description from opl_lcc  where lccGrp=?");
    $sth->execute($lccGrp);
    if(my ($desc)=$sth->fetchrow_array){
        $lccDesc=$desc;
    }
    $sth->finish;
    return $lccDesc;
}
#
#=======================================================
sub addToggleAnchor2FacetList{
    my ($facet)=@_;
    my $facetToggleId=0; 
    foreach my $fa(@$facet){
        if(scalar(@{$fa->{'facetList'}}>16) ){
            splice @{$fa->{'facetList'}}, 10, 0, {facet=>"",
                                                  toggleMore=>1,
                                                  facetToggleId=>$facetToggleId};
            push @{$fa->{'facetList'}},{facet=>"",
                                        toggleLess=>1,
                                        facetToggleId=>$facetToggleId};
            $facetToggleId++;
        }
    }

}
#=======================================================
# Fri, Oct 24, 2008 @ 09:16:19 EDT

sub writeSortParam2tmpl{
    my ($input) =@_;
    my $sortAttr  = $input->{'sortAttr'};
    my $sortOrder = $input->{'sortOrder'};
    if(!$sortAttr &&  $input->{'sf0'} eq '5006'){
        $sortAttr=4;
    }
    $input->{'sortAttr'}=$sortAttr;
    $input->{'sortOrder'}=$sortOrder;
    $template->param(
    sortOrder           => $sortOrder,
    sortAttr            => $sortAttr,
    sortCallNum1st      => ($sortAttr == 5001)              ? 1 : 0,
    sort852c            => ($sortAttr == 8008)              ? 1 : 0,
    sortTitle           => ($sortAttr == 4)                 ? 1 : 0,
    sortAuthor          => ($sortAttr == 1003)              ? 1 : 0,
    sortPubDateSort     => ($sortAttr == 31)                ? 1 : 0,
    sortOrderReverse    => ($sortOrder && $sortOrder == 1)  ? 2 : 1,
    sortDown            => ($sortOrder && $sortOrder == 1)  ? 1 : 0,
    );

}

################################################################################
sub mapURI{
    my ($uriList)=@_;
    my $uriMap=undef;
    if($pref->{'learn360ClientKey'}){
        foreach my $u(@$uriList){
            if($u->{'uri'} =~ m/http:\/\/www.learn360.com/g){
                $u->{'uri'} ="/bin/search/learn360?uri=" . $u->{'uri'} ;
            }
        }
    }
    if($pref->{'ebrary'}){
        my $mhost = $pref->{'ebrary'};
        foreach my $u(@$uriList){
            $u->{'uri'} =~ s/http:\/\/site.ebrary.com\/(.*)/$mhost\/$1/g;
        }
    }
    return $uriList;
}
################################################################################
sub getNewItems{
    my ($dbh,$input, $curPage, $pSize) = @_;
    
    my $offset = ($curPage - 1) * $pSize ;
    my $periodDays = 365;
    if (scalar ($input->{'range'}>=0)){
      $periodDays =$input->{'range'};   
    }
    else{
        $input->{'range'}=$periodDays ;  
    }
    my $lQuery=slr_buildSNewItemQuery($input);
    my $rs=undef;
    $rs = slr_search({lQuery=>$lQuery,recFormat=>'briefNewItem',
                             sortAttr=>$sortAttr,sortDir=>$sortOrder,
                             offset=>$offset,size=>$pSize,
                             incCircStatus=>1,
                             isLccSystem=>$isLccSystem});  

    if($rs->{'hits'}>0){
        mapFacetMsg($rs->{'facet'});  
        addToggleAnchor2FacetList($rs->{'facet'});
    }


    return $rs;
}
#=======================================================
sub search_ARL{
    my @recType     = $cgi->param('recType');
    my $filter;
    $filter->{'recType'}=\@recType;
    $rs =searchSolr_ARL($input,$filter);
    my $suggestion=undef;
    my $sfCount=0;

    if($rs->{'hits'}>0){
        mapFacetMsg($rs->{'facet'});  
        addToggleAnchor2FacetList($rs->{'facet'});
    }
    else{
        foreach my $cgiInput (keys %$input) {
            $sfCount++ if ($cgiInput =~ m/^sf[\d]+/);
        }
        if ($sfCount ==1 ) {
            my $fieldSrch = $input->{'sf0'};
            ($fieldSrch && $fieldSrch ne '')||($fieldSrch = 'title');

        }

    }
    return { hits=>$rs->{'hits'},
             recordList=>$rs->{'recordList'},
             facet=>$rs->{'facet'}
           };
}
#=======================================================
sub searchSolr_ARL{
    my ($input,$filter) =@_;
    my $lQuery=slr_buildSearchQuery_ARL($input,$filter);
    open debug,">/tmp/dd"; print debug $lQuery; close debug;
    my $rs=undef;
    if($lQuery ne ''){
        $rs = slr_search({lQuery    =>$lQuery,  recFormat   =>'brief',
                          sortAttr  =>$sortAttr,sortDir     =>$sortOrder,
                          offset    =>$offset,  size        =>$pSize,
                          incCircStatus=>1});  
    }
     return $rs;
}

################################################################################
sub getReviewedItems{
    my ($dbh,$input, $curPage, $pSize) = @_;
    
    my $offset = ($curPage - 1) * $pSize ;
    my $periodDays = 365;

    if (scalar ($input->{'range'}>=0)){
      $periodDays =$input->{'range'};   

    }
    else{
        $input->{'range'}=$periodDays ;  
    }
 
    my $lQuery=slr_buildSReviewItemQuery($input);
    my $rs=undef;
    $rs = slr_search({lQuery=>$lQuery,recFormat=>'briefReviewItem',
                             sortAttr=>$sortAttr,sortDir=>$sortOrder,
                             offset=>$offset,size=>$pSize,
                             incCircStatus=>1,
                             isLccSystem=>$isLccSystem});  
    if($rs->{'hits'}>0){
        mapFacetMsg($rs->{'facet'});  
        addToggleAnchor2FacetList($rs->{'facet'});
    }

    return $rs;
}
#===========================================================
sub getRelGenreList{
    my ($dbh,$rid)=@_;
    my $gList=[];
    my $sth=$dbh->prepare("select  distinct gId,title,author,introduction from opl_genre g inner join opl_genreItems i using(gId) where rid=?");
    $sth->execute($rid);
    while(my $g=$sth->fetchrow_hashref){
        push @$gList,$g;
    }
    return $gList;
}
#===========================================================
sub getPageNavParam{
    my ($cgi)=@_;
    my $input=$cgi->Vars();
    my $locationSel   = $input->{'location'};
    my @recType     = $cgi->param('recType');
    my $navFormInput=[];
    foreach my $iName(keys %$input){
        next if($iName eq 'op' && $input->{$iName} eq 'delRec');
        push @$navFormInput,{name=>$iName, value=>$input->{$iName}} if($iName ne'recType');
    }
    my @recType     = $cgi->param('recType');
    foreach my $rType(@recType){
        push @$navFormInput,{name=>'recType', value=>$rType};
    }
    my @fieldArr =qw(languageFilter formatFilter authorFilter subjectFilter deweyFilter eraFilter genreFilter callnumberPrefixFilter);
    foreach my $f(@fieldArr){
        if(!defined $input->{$f}){
            push @$navFormInput,{name=>$f, value=>''};
        }
    }
    if(!defined $input->{'pNum'}){
        push @$navFormInput,{name=>'pNum', value=>1 };
    }
    
    
      
    return $navFormInput;
}

#===========================================================
