package Opals::Pathfinder;

require Exporter;
@ISA       = qw(Exporter);
#======================================================================
# pathfinder record is defined as follow structure
#
# pathfinder ={ 
#   title=>'title',
#   subjectArea =>'subject area',
#   instroduction=>'instroduction',
#   bookRsList=>arrayOfBookResources,
#   webRsList =>arrayOfWebResеsources,
#  }
# bookResource={
#   pfId =>'pathfinder record id'
#   title=>'title',
#   author=>'author',
#   callNumber=>'callNumber',
#   pubName=>'publisher',
#   pubDate=>'pub date',
#   isbn=>'isbn',
#   pubPlace=>'pub place',
#   }
#
# webResource={
#   pfId =>'pathfinder record id'
#   title=>'title',
#   url=>'url',
#   summary=>'summary',
#   author=>'author',
#   }

#======================================================================
@EXPORT_OK = qw(
    pf_add
    pf_save
    pf_delete
    pf_addBookRs
    pf_addWebRs
    pf_getRecById
    pf_getRecByIdList
    pf_getPfList
    pf_getWebRsList
    pf_getBookRsList
    pf_getSubjectAreaList
    pf_parsePfXml
    pf_getPfListByGrp
    pf_getPfListByField
    pf_getPathfinderFromRecordId

pf_getBookRsList_test
);
# Version number
$VERSION   = 0.01;      

#use utf8;
use strict;
use POSIX qw(
    ceil
    floor
);
use Opals::Session qw(
    SessionHdl_setNote
);
use Opals::MarcXmlParser;
use JSON;
my @RS_TBL_FIELD_MAP=(
    {rsType=>'library',table=>"pf_bookRs", fields=>[qw (pfId groupId rid title author pubName pubPlace pubDate callNumber isbn commentNote)]},
    {rsType=>'web',    table=>"pf_webRs",  fields=>[qw (pfId groupId title author description url)]},
    {rsType=>'file',   table=>"pf_file",   fields=>[qw (pfId groupId title fName fRealName description url)]}
);

#======================================================================
sub pf_add_bk{
    my ($dbh,$pfRec) = @_;
 
    if($pfRec->{'title'} eq ''){
        return 0;
    }

    my $sth = $dbh->prepare("insert into pf_record  set title=?, subjectArea=?,introduction=?,author=?, audience=?, createdDate=now()");
    $sth->execute($pfRec->{'title'},$pfRec->{'subjectArea'},$pfRec->{'introduction'},$pfRec->{'author'},$pfRec->{'audience'});
    my $pfId = $dbh->{'mysql_insertid'};
    $sth->finish;
    if($pfRec->{'bookRsList'}){
        pf_addBookRs($dbh,$pfId,$pfRec->{'bookRsList'});
    }
    if($pfRec->{'webRsList'}){
        pf_addWebRs($dbh,$pfId,$pfRec->{'webRsList'});
    }
    pf_subjectArea($dbh,$pfRec->{'subjectArea'});
    return $pfId


}

#======================================================================
sub pf_save_20161201{
    my ($dbh,$ssid,$pfXml) = @_;
#    my $sth_bk=$dbh->prepare(<<_STH_);
#        update pf_record inner join 
#          (select pfId,compress(concat(now(),"\n",xml,"\n",uncompress(xml_bk))) xml 
#          from pf_record )as t using(pfId) 
#        set xml_bk=t.xml where pfId=?
#_STH_


    my $pfRec =pf_parsePfXml($pfXml);
    if($pfXml eq '' || $pfRec->{'title'} eq ''){
        return 0;
    }


    
    my $sth ;
    if($pfRec->{'pfId'}<1 || $pfRec->{'pfId'} eq ''  ){
        $sth = $dbh->prepare(<<_STH_);
        insert into pf_record  
        set title=?,author=?, audience=?,  createdDate=now()
_STH_
        $sth->execute($pfRec->{'title'}, $pfRec->{'author'},$pfRec->{'audience'});
        $pfRec->{'pfId'} = $dbh->{'mysql_insertid'};

        my $pfId=$pfRec->{'pfId'};
        $pfXml =~ s/<pfId>(.*?)<\/pfId>|<pfId\/>/<pfId>$pfId<\/pfId>/s;

    }
    $sth = $dbh->prepare(<<_STH_);
    update  pf_record
    set     title=?, author=?, audience=? , xml=? 
    where   pfId=?        
_STH_

    $sth->execute($pfRec->{'title'}, $pfRec->{'author'},$pfRec->{'audience'},$pfXml,$pfRec->{'pfId'});
    saveBookRs($dbh,$ssid,$pfRec);
    saveSubject($dbh,$pfRec->{'pfId'},$pfRec->{'subject'});
    $sth->finish;
    return $pfRec->{'pfId'};
 }
#======================================================================
sub pf_save{
    my ($dbh,$pfRec) = @_;
    my $pfId=$pfRec->{'pfId'};
    if($pfRec->{'title'} eq ''){
        return 0;
    }
    my @recData=();
    my @recField=();
    foreach my $f(qw(title author authPosition introduction audience expiryDate iconUrl)){
        push @recData,$pfRec->{$f};
        push @recField,"$f=?";
    }
    if(!$pfId ||$pfId eq ''){
        $dbh->do("insert into pf_record set createdDate=now()," . join(",",@recField),undef,@recData) ;
        $pfId=$dbh->{'mysql_insertid'};
        $pfRec->{'pfId'} = $pfId;
    }
    else{
        $dbh->do("update pf_record set " . join(",",@recField) . " where pfId=$pfId",undef,@recData);
    }
    #update resources
    my $sth_grp=$dbh->prepare("insert into pf_group set rsType=?, pfId=?,groupId=?, header=?,description=?");
    my $sth_bookRs=$dbh->prepare("insert into pf_bookRs set pfId=?, rid=?, title=?,author=?,pubName=?,pubPlace=?,pubDate=?,callNumber=?,isbn=?");
    my $groupId=1;

    $dbh->do("delete from pf_group where pfId=$pfId");
    $dbh->do("delete from pf_bookRs where pfId=$pfId");
    $dbh->do("delete from pf_webRs where pfId=$pfId");
    $dbh->do("delete from pf_file where pfId=$pfId");
    $dbh->do("delete from pf_subject where pfId=$pfId");
    foreach my $sbj(@{$pfRec->{'subject'}}){
        $dbh->do("insert into pf_subject set pfId=?,subject=?",undef,$pfId,$sbj);
    }
    foreach my $rsDef(@RS_TBL_FIELD_MAP){
        $groupId=1;
        my $rsType=$rsDef->{'rsType'};
        foreach my $rs(@{$pfRec->{$rsType ."RsList"}}){
            $sth_grp->execute($rsType, $pfId,$groupId,$rs->{'header'},$rs->{'description'});            
            my @rsField=();
            foreach my $f(@{$rsDef->{'fields'}}){
                    push @rsField,"$f=?";
            }
            my $sth_rs=$dbh->prepare("insert into $rsDef->{'table'} set " . join(",",@rsField));
            foreach my $item(@{$rs->{'rsList'}}){
                $item->{'pfId'}=$pfId;
                $item->{'groupId'}=$groupId;
                my @rsData=();
                foreach my $f(@{$rsDef->{'fields'}}){
                    push @rsData,$item->{$f};
                }
                $sth_rs->execute(@rsData);
            }
            $groupId++;

        }
    }
    return $pfId;
}
 
#======================================================================
sub saveBookRs{
    my($dbh,$ssid, $pfRec)= @_;
    my $pfId=$pfRec->{'pfId'};

    my $sth = $dbh->prepare("delete from pf_ridMap where pfId=?");
    $sth->execute($pfId);
    $sth = $dbh->prepare("insert into pf_ridMap set rid=?,  pfId=?");
    foreach my $rs (@{$pfRec->{'libraryRsList'}}){
        foreach my $b (@{$rs->{'bookList'}}){
            $sth->execute($b->{'rid'}, $pfId);
            SessionHdl_setNote($dbh, $ssid, "addRsPathfinder",$b->{'rid'},"$pfId");
        }
    }
    $sth->finish;


}
#======================================================================
sub saveSubject{
    my ($dbh,$pfId,$sbjList)= @_;
    my $sth = $dbh->prepare("delete from pf_subject where pfId=?");
    $sth->execute($pfId);
    $sth = $dbh->prepare("insert into pf_subject set pfId=?, subject= ?");

    foreach my $sbj(@$sbjList){
        next if($sbj->{'item'} eq '');
        $sth->execute($pfId,$sbj->{'item'}) ;
    }
    $sth->finish;
}

#======================================================================
sub pf_delete{
    my ($dbh,$pfId) = @_;
    my $row = $dbh->do("delete from  pf_record where pfId=?",undef,$pfId); 
    if(defined $row && $row>0){       
        $dbh->do("delete from pf_group where pfId=$pfId");
        $dbh->do("delete from pf_bookRs where pfId=$pfId");
        $dbh->do("delete from pf_webRs where pfId=$pfId");
        $dbh->do("delete from pf_file where pfId=$pfId");
        $dbh->do("delete from pf_subject where pfId=$pfId");
        return 1;
    }
    return 0;
}
#======================================================================
sub pf_subjectArea{
    my ($dbh,$subject) = @_;
    my $sth = $dbh->prepare(<<_STH_);
    select subjectArea from pf_sbjAreaList where subjectArea=?
_STH_
    $sth->execute($subject);
    my $s=$sth->fetchrow_hashref;
    if(!$s){
        $sth =$dbh->prepare('insert into pf_sbjAreaList set subjectArea=?');
        $sth->execute($subject);
    }
    $sth->finish;
  
}
#======================================================================
sub pf_deleteRs{
    my ($dbh,$pfId) = @_;
    pf_deleteBookRs($dbh,$pfId);
    pf_deleteWebRs($dbh,$pfId);
    pf_deleteFileRs($dbh,$pfId);
}
#======================================================================
sub pf_deleteBookRs{
    my ($dbh,$pfId) = @_;
    my $sth = $dbh->prepare(<<_STH_);
    delete from  pf_bookRs
    where pfId=?        
_STH_
    $sth->execute($pfId);
    $sth->finish;
    
}
#======================================================================
sub pf_deleteWebRs{
    my ($dbh,$pfId) = @_;
    my $sth = $dbh->prepare(<<_STH_);
    delete from  pf_webRs
    where pfId=?        
_STH_
    $sth->execute($pfId);
    $sth->finish;
}
#======================================================================
sub pf_deleteFileRs{
    my ($dbh,$pfId) = @_;
    my $sth = $dbh->prepare(<<_STH_);
    delete from  pf_file
    where pfId=?        
_STH_
    $sth->execute($pfId);
    $sth->finish;
}

#======================================================================
sub pf_addBookRs{
    my ($dbh,$pfId,$bookRsList) = @_;
    my $sth = $dbh->prepare(<<_STH_);
    insert into pf_bookRs 
    set pfId        =?,
        title       =?,
        author      =?,
        pubName     =?,
        pubDate     =?,
        pubPlace    =?,
        isbn        =?,
        callNumber  =?,
        rid         =?,
        subHeading  =?,
        description =?

_STH_
    
    foreach my $bookRs(@{$bookRsList}){
        $sth->execute($pfId,$bookRs->{'title'}, 
                            $bookRs->{'author'},
                            $bookRs->{'pubName'},
                            $bookRs->{'pubDate'},
                            $bookRs->{'pubPlace'},
                            $bookRs->{'isbn'},
                            $bookRs->{'callNumber'},
                            $bookRs->{'rid'},
                            $bookRs->{'subHeading'},
                            $bookRs->{'description'}
                      );

    }
    $sth->finish;

}

#======================================================================
sub pf_addWebRs{
    my ($dbh,$pfId,$webRsList) = @_;
    my $sth = $dbh->prepare(<<_STH_);
    insert  into pf_webRs
    set     pfId=?, title=?, author=?, url=?, subHeading  =?, description=?
_STH_
    foreach my $webRs(@{$webRsList}){
        $sth->execute($pfId,$webRs->{'title'}, 
                            $webRs->{'author'},
                            $webRs->{'url'},
                            $webRs->{'subHeading'},
                            $webRs->{'description'}
                      );
    }
    $sth->finish;
}
#======================================================================
sub pf_getPfList{
   my ($dbh,$pfIdList,$sortField,$sortDir,$offset,$numOfRec) = @_;
   my $pfList=[];
    $sortField="title" if(!defined $sortField || $sortField eq '');
    $sortDir="ASC" if(!defined $sortDir || $sortDir eq '');
    my $sql= "select * from pf_record ";
    if(defined $pfIdList && $pfIdList ne""){
        my @idArr=();
        foreach my $id(split(",",$pfIdList)){
            push @idArr,$id if($id=~ m/^\d+$/);
        }
        if(scalar(@idArr)>0){
            $sql .= " where pfId in(" . join(",",@idArr) . ") "; 
        }
    }
    if($sortField eq 'title'){
        $sql .= " order by " . $sortField . " " . $sortDir . ", subjectArea " .  $sortDir ;
    }
    else{
        $sql .= " order by " . $sortField . " " . $sortDir . ", title " .         $sortDir  ;
    }
    if($offset && $offset>0 && $numOfRec && $numOfRec){
        $sql .= "limit $offset,$numOfRec";
    }
    my $sth = $dbh->prepare($sql);
    $sth->execute(); 
    my $i=0; 
    while(my $rec= $sth->fetchrow_hashref){
        push @$pfList,pf_getRecById($dbh,$rec->{'pfId'});
    }

   return $pfList;
}

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

sub pf_getRecById{
    my ($dbh,$pfId) = @_;
   my $rec =$dbh->selectrow_hashref("select pfId,title, author, authPosition, introduction, audience,createdDate, expiryDate, iconUrl from pf_record where pfId=?",undef,$pfId);
   my $sth_grp=$dbh->prepare("select groupId,header,description from pf_group where rsType=? && pfId=? order by groupId");
   my $sth_sbj=$dbh->prepare("select subject from pf_subject where pfId=?");
   if($rec){
       $sth_sbj->execute($pfId);
       $rec->{'subject'}=[];
       while(my ($sbj)=$sth_sbj->fetchrow_array){
           push @{$rec->{'subject'}},$sbj;
       }
       foreach my $rsDef(@RS_TBL_FIELD_MAP){
           my $rsType=$rsDef->{'rsType'};
           $rec->{$rsType ."RsList"}=[];
           $sth_grp->execute($rsType,$pfId);
           my $sth_rs=$dbh->prepare("select * from " . $rsDef->{'table'} . " where pfId=? && groupId=? order by id");
           while(my $rs=$sth_grp->fetchrow_hashref){
               $sth_rs->execute($pfId,$rs->{"groupId"});
               $rs->{'rsList'}=[];
               while(my $rsItem=$sth_rs->fetchrow_hashref){
                    push @{$rs->{'rsList'}},$rsItem;
               }
               push @{$rec->{$rsType ."RsList"}},$rs;
           }
       }
   }
   return $rec;
}
#======================================================================

sub pf_getRecById_bk{
   my ($dbh,$pfId)=@_;
   my $pf=undef;
   my $pfArr= pf_getRecByIdList($dbh,$pfId);
   if($pfArr && scalar(@$pfArr)==1){
       $pf=$pfArr->[0];
   }
   return $pf;
}
#======================================================================
sub pf_getRecByIdList{
   my ($dbh,$pfIdList,$sortField,$sortDir,$offset,$numOfRec) = @_;
    $pfIdList=~ s/^,+|,+$//g;
    $pfIdList=~ s/,+/,/g;
    if(!defined $pfIdList || $pfIdList eq "" || $pfIdList eq "undefined"){
        return;
    }

    my $pfList=[];
    $sortField="title" if(!defined $sortField || $sortField eq '');
    $sortDir="ASC" if(!defined $sortDir || $sortDir eq '');   
    my $sql ="select * from pf_record where pfId in($pfIdList) ";    
    if($sortField eq 'title'){
        $sql .= " order by " . $sortField . " " . $sortDir . ", subjectArea " .  $sortDir ;
    }
    else{
        $sql .= " order by " . $sortField . " " . $sortDir . ", title " .         $sortDir  ;
    }
    if($offset && $offset>0 && $numOfRec && $numOfRec){
        $sql .= "limit $offset,$numOfRec";
    }

    my $sth = $dbh->prepare($sql);
    $sth->execute(); 
    my $i=0; 
    while(my $rec= $sth->fetchrow_hashref){
        my $subjList = pf_getSubjectAreaList($dbh,$rec->{'pfId'});
        $rec->{'subjects'} =$subjList;
        $rec->{'createdDate'} = substr($rec->{'createdDate'},0,10);
        $rec->{'cssrow'} =$i%2 == 1 ? 'odd' : 'even'  ;
        $i++;
        push @$pfList,$rec;

    }
    return $pfList;
    
}
#======================================================================
sub pf_getPfListByGrp{
    my ($dbh,$grp,$offset,$numOfRec) = @_;
    my $pfList={};
    my @pfArr=();
    my $sql;
    if($grp eq 'titleApl'){
        $sql= "select ucase(left(title,1)) `group`,pfId, title,audience,author from pf_record r order by title ";
    }
    elsif($grp eq 'subject'){
        $sql= "select subject `group`, pfId,title,audience,author from pf_record r 
                left outer join pf_subject s using(pfId)
              order by subject, title ";
    }
    else{
        return \@pfArr;
    }
    if(defined $numOfRec && $numOfRec>0){
        if(!$offset){
            $offset =0;
        }
        $sql .= " limit $offset,$numOfRec";
    }
    my $sth = $dbh->prepare($sql);  

    $sth->execute(); 
    
    while(my $rec= $sth->fetchrow_hashref){
        $rec->{'group'}= uc(substr($rec->{'group'},0,1)) . substr($rec->{'group'},1);
        push @{$pfList->{$rec->{'group'}}},$rec;

    }

    foreach my $key (sort keys %$pfList){
        push @pfArr,{group=>$key,pfRecList=>$pfList->{$key}};
    } 

    return \@pfArr;
}

#======================================================================
sub pf_getPfListByField{
    my ($dbh,$sField,$sVal) = @_;
    my $pfList={};
    my @pfArr=();
    my $sql= "select pfId,title,audience,author,createdDate ,modDate,expiryDate from pf_record r  ";
    if($sField &&  $sVal && $sField ne'' &&  $sVal ne ''){
        if($sField  =~ m/createdDate|modDate/s){
            $sql .= " where $sField  regexp  ?   order by title";
        }
        else{
            $sql .= " where $sField = ?   order by title ";
        }
    }
    else{
        return \@pfArr;
    }
    my $sth = $dbh->prepare($sql);
    $sth->execute($sVal); 

    while(my $rec= $sth->fetchrow_hashref){
        my $subjList = pf_getSubjectAreaList($dbh,$rec->{'pfId'});
        $rec->{'subjects'} = $subjList;
        $rec->{'createdDate'} = substr($rec->{'createdDate'},0,10);
        push @{$pfList->{$rec->{$sField}}},$rec;
    }

    foreach my $key (sort keys %$pfList){
        push @pfArr,{group=>$key,pfRecList=>$pfList->{$key}};
    } 

    return \@pfArr;
    
  }

#======================================================================
sub pf_getPfList_bk{
    my ($dbh,$sortField,$sortDir,$offset,$numOfRec) = @_;
    my $pfList=[];
    $sortField="title" if(!defined $sortField || $sortField eq '');
    $sortDir="ASC" if(!defined $sortDir || $sortDir eq '');
    my $sql= "select * from pf_record ";
    if($sortField eq 'title'){
        $sql .= " order by " . $sortField . " " . $sortDir . ", subjectArea " .  $sortDir ;
    }
    else{
        $sql .= " order by " . $sortField . " " . $sortDir . ", title " .         $sortDir  ;
    }
    if($offset && $offset>0 && $numOfRec && $numOfRec){
        $sql .= "limit $offset,$numOfRec";
    }


    my $sth = $dbh->prepare($sql);
    $sth->execute(); 
    my $i=0; 
    while(my $rec= $sth->fetchrow_hashref){
        my $subjList = pf_getSubjectAreaList($dbh,$rec->{'pfId'});
         $rec->{'subjects'} =$subjList;
        $rec->{'createdDate'} = substr($rec->{'createdDate'},0,10);
        $rec->{'cssrow'} =$i%2 == 1 ? 'odd' : 'even'  ;
        $i++;
        push @$pfList,$rec;

    }

    return $pfList;
}

#======================================================================
sub pf_getBookRsList_test{
    my ($dbh) = @_;
    my $sth = $dbh->prepare(<<_STH_);
    select pfId from pf_record  order by pfId
_STH_
    my $pfId_rid={};
    my $rid_pfId={};
    $sth->execute();
    while( my ($pfId) = $sth->fetchrow_array){
        if($pfId && $pfId>0){
            my $pf=pf_getRecById($dbh,$pfId);
            if($pf){
                my $pfRec=pf_parsePfXml($pf->{'xml'});
                my $indexConfFile  = Opals::Context->config('sIndexConfig');
                my $marcXmlParser=Opals::MarcXmlParser->new($indexConfFile) ;
                my $rid=0;
                $pfRec->{'title_pf'}=$pfRec->{'title'};
                foreach my $bookRs(@{$pfRec->{'libraryRsList'}}){
                    foreach my $b (@{$bookRs->{'bookList'}}){
                        if($b->{'rid'}>0 ){
                            $rid=$b->{'rid'};
                            my $fname=getRecFilePath($rid);
                            $b=$marcXmlParser->getRecInfoGeneral_file($fname);
                            if(defined $b && $b->{'title'}){
                                push @{$pfId_rid->{$pfId}},$rid;
                                push @{$rid_pfId->{$rid}},{pfId=>$pfId,pfTitle=>$pfRec->{'title_pf'}};
                            }
                        }
                    }
                }
            } #END:if($pf)
        }        
    }
    return ($pfId_rid,$rid_pfId);
}
#======================================================================================
#Thu, May 10, 2012 @ 08:43:42 EDT
#
sub pf_getPathfinderFromRecordId{
    my ($dbh,$rid) = @_;
    my $pfList =[];
my  $sth = $dbh->prepare(<<_STH_);
   select distinct r.pfId ,r.title pfTitle from pf_bookRs m inner join pf_record r using (pfId) where rid=?
_STH_

    $sth->execute($rid); 
    while (my $pf =$sth->fetchrow_hashref){
        push @$pfList,$pf;
    }
    $sth->finish;
    return $pfList;
}

#========================================================================
sub getRecFilePath {
    my ($rid) = @_;
    
    my $zRoot   = Opals::Context->config('zRoot');
    my $zPort   = Opals::Context->config('zPort');
    my $zDatabase = Opals::Context->config('zDatabase');
    my $dir     = "$zRoot/$zPort/record/$zDatabase/" . ceil($rid/1000);

    return "$dir/$rid.xml";
}

#======================================================================
sub pf_getBookRsList{
    my ($dbh,$pfId) = @_;
    my $sth = $dbh->prepare(<<_STH_);
   select b.*,m.deleted from pf_bookRs b left outer join opl_marcRecord m using(rid)
   where pfId=? order by callNumber
_STH_
    my @rsList=();
    $sth->execute($pfId);
    while(my $bookRs=$sth->fetchrow_hashref){
        next if($bookRs->{'deleted'} ==1);
        push @rsList,$bookRs;
        
    }
    return \@rsList;

    
}
#======================================================================
sub pf_getWebRsList{
    my ($dbh,$pfId) = @_;  
    my $sth = $dbh->prepare(<<_STH_);
   select * from pf_webRs where pfId=?
_STH_
    my @rsList=();
    $sth->execute($pfId);
    while(my $webRs=$sth->fetchrow_hashref){
        push @rsList,$webRs;
    }
    return \@rsList;

}
#======================================================================
sub pf_getSubjectAreaList{
    my ($dbh,$pfId) = @_;  
    my $sth = $dbh->prepare(<<_STH_);
   select * from pf_subject where pfId =? 
_STH_
    my @sbjList=();
    $sth->execute($pfId);
    while(my $sbj=$sth->fetchrow_hashref){
        push @sbjList,$sbj;
    }
    return \@sbjList;

}
#======================================================================
sub pf_parsePfXml{
    my ($xml) =@_;
    my $ret={};
    $xml =~ s/<([a-zA-Z_0-9]+)\/>/<$1><\/$1>/g;
    my $tmpXml="$xml";
    my $fields=[{name=>'pfId',          rep=>0}, #rep: 1=>repeatable, 0=>non-repeatable
                {name=>'title',         rep=>0},
                {name=>'author' ,       rep=>0},
                {name=>'audience' ,     rep=>0},
                {name=>'createdDate',   rep=>0},
                {name=>'subject',       rep=>1},
                {name=>'intro',         rep=>1}
              ];
    foreach my $f(@$fields){
	   $tmpXml =~ s/<$f->{'name'} \/>/<$f->{'name'}><\/$f->{'name'}>/g;
    }

    $tmpXml =~ s/<libraryRs>(.*)<\/libraryRs>//;
    $tmpXml =~ s/<internetRs>(.*)<\/internetRs>//;
    $tmpXml =~ s/<wSheetRs>(.*)<\/wSheetRs>//;
    foreach my $f(@$fields){
        if($f->{'rep'}==1){
            $ret->{$f->{'name'}}=[] ;
        }
        else{
            $ret->{$f->{'name'}}="";
        }
       if(!$f->{'rep'} && $tmpXml =~ m/<$f->{'name'}>(.*?)<\/$f->{'name'}>/s){
           $ret->{$f->{'name'}}=$1;           
       }
       else{
           while($tmpXml =~ m/<$f->{'name'}>(.*?)<\/$f->{'name'}>(.*)/s){
                $tmpXml=$2;
                push @{$ret->{$f->{'name'}}},{item=>$1};
           }
       }
    }
  
#for resource fields 
    my $rs=undef;
    foreach my $rsName(qw(libraryRs internetRs wSheetRs)){
        $tmpXml=$xml;
        my $count=0;
        while($tmpXml =~ m/<$rsName>(.*?)<\/$rsName>(.*)/s){
            next if($1 eq '');
            if($rsName eq 'libraryRs'){
                $rs=_getLibRs($1);
            }
            elsif($rsName eq 'internetRs'){
                $rs= _getWebRs($1);
            }
            elsif($rsName eq 'wSheetRs'){
                $rs= _getWorksheetRs($1);
            }
            $rs->{"rsId"}="$rsName" ."_"  . $count++;
            push @{$ret->{$rsName . "List"}},$rs if(defined $rs);
            $tmpXml=$2;    
        }
    }
    
    return $ret;
}
#======================================================================
sub  _getLibRs{
    my ($xml) =@_;
    my $libRs=undef;
    my $tmpXml=$xml;
    $tmpXml =~ s/<book>(.*)<\/book>//;
    if($tmpXml =~ m/<header>(.*?)<\/header>/s){
        $libRs->{'header'} =$1 if($1 ne'');
    }
    if($tmpXml =~ m/<description>(.*?)<\/description>/s){
        $libRs->{'description'} =$1 if($1 ne'');
    }
    $tmpXml=$xml;
    while($tmpXml =~ m/<book>(.*?)<\/book>(.*)/s){
        my $book =_getBookItem($1);
        if(defined $book){
            $libRs->{'bookList'} =[] if(!defined $libRs->{'bookList'});    
            push @{$libRs->{'bookList'}},$book;
        }
        $tmpXml=$2;  
    }
    return $libRs; 

}
#======================================================================
sub _getBookItem{
   my ($xml) =@_;
   my $ret=undef;
   my @fields =qw(title author pubName pubPlace pubDate isbnList callNumber rid commentNote);
   foreach my $f(@fields){
       if($xml =~ m/<$f>(.*?)<\/$f>/s){
           $ret->{$f}=$1 if($1 ne '');
       }
   }
   return $ret;
}
#======================================================================
sub  _getWebRs{
    my ($xml) =@_;
    my $webRs=undef;
    my $tmpXml=$xml;
    $tmpXml =~ s/<internet>(.*)<\/internet>//;
    if($tmpXml =~ m/<header>(.*?)<\/header>/s){
        $webRs->{'header'} =$1 if($1 ne'');
    }
    if($tmpXml =~ m/<description>(.*?)<\/description>/s){
        $webRs->{'description'} =$1 if($1 ne'');
    }
 
    $tmpXml=$xml;
    while($tmpXml =~ m/<internet>(.*?)<\/internet>(.*)/s){
        my $web =_getWebItem($1);
        if(defined $web){
            $webRs->{'webList'} =[] if(!defined $webRs->{'webList'});
            push @{$webRs->{'webList'}},$web ;
        }
        $tmpXml=$2;  
    }
    return $webRs; 

}

#======================================================================
sub _getWebItem{
   my ($xml) =@_;
   my $ret=undef;
   my @fields =qw(title author url description);
   my $fVal="";
   foreach my $f(@fields){
       $fVal="";
       if($xml =~ m/<$f>(.*?)<\/$f>/s){
           $fVal= $1;
           my $fName =($f eq 'description')?"$f" ."_webRs":$f;
           if($f eq 'url' && $fVal !~ /^((http|https|ftp):\/\/)/ ){
              $fVal ="http://" . $fVal; 
           }
           $ret->{$fName}=$fVal if($fVal ne '');
       }
   }
  return $ret;
}
#======================================================================
sub _getWorksheetRs{
    my ($xml) =@_;
    my $wsRs=undef;
    my $tmpXml=$xml;
    $tmpXml =~ s/<worksheet>(.*)<\/worksheet>//;
    $wsRs->{'header'} ="";
    if($tmpXml =~ m/<header>(.*?)<\/header>/s){
        $wsRs->{'header'} =$1 if($1 ne'');
    }
    $wsRs->{'description'} ="";
    if($tmpXml =~ m/<description>(.*?)<\/description>/s){
        $wsRs->{'description'} =$1 if($1 ne'');
    }
    $tmpXml=$xml;
    while($tmpXml =~ m/<worksheet>(.*?)<\/worksheet>(.*)/s){
        my $ws = _getWsItem($1);
        if(defined $ws){
            $wsRs->{'wsList'} =[] if(!defined $wsRs->{'wsList'});    
            push @{$wsRs->{'wsList'}},$ws;
        }
        $tmpXml=$2;  
    }
    return $wsRs;
}
#======================================================================
sub _getWsItem{
   my ($xml) =@_;
   my $ret=undef;
   
   my @fields =qw(title description fileName fRealName file_url );
   my $imgIcon='shim';
   foreach my $f(@fields){
       my $fName =($f eq 'description')?"$f" ."_wsRs":$f;
       $ret->{$fName}=""; 
       if($xml =~ m/<$f>(.*?)<\/$f>/s){
           $ret->{$fName}=$1 if($1 ne'');
       }
   }
  return $ret;
}

#======================================================================
    
1;
