package Opals::Utility;

require Exporter;
@ISA       = qw(Exporter);
# Symbols to be exported by default
#@EXPORT    = qw(
#    opl_
#);
# Symbols to be exported on request
@EXPORT_OK = qw(
    util_formatBarcode
    util_removeChar
    util_filterMarcXml
    util_ieFix
    util_html_to_char
    util_getTimeout_min
    util_restoreLiteral
    util_escapeXml
    util_resizeImg
    util_recordPath
    util_getXmlRecord
    
);

use POSIX qw(ceil floor);
use GD;
# Version number
$VERSION   = 0.01;      


#use utf8;
use strict;
#use Opals::_Some_Module_;
#########################################################################
sub util_formatBarcode{
    my ($num) = @_;

    return sprintf("%0.12d", $num);
}

#########################################################################
sub util_removeChar {
    my ($string) = @_;

    return unless $string;

    $string =~ s/[\ \:\;\,\/\\]+$//g;
    $string =~ s/(&lt|&gt|&amp)([^\;]|$)/$1\;$2/g;
    $string =~ s/([^A-Z])[\.]+$/$1/g;

    return $string;
}

#########################################################################
sub util_filterMarcXml {
    my ($string) = @_;

    return unless $string;

    my $retStr;
    my $is852=0;
    while ($string =~ s/(.*\n)(.*)/$2/){
        my $line= $1;
        if($line =~ m/tag="([\d]+)"/){
            $is852 =($1 eq '852')?1:0;
        }
        if(!$is852){
            $line =~ s/|||//g;
            $line =~ s/[\:\;\,\/\\]+<\/subfield>/<\/subfield>/g;
            $line =~ s/(&lt|&gt|&amp)([^\;]|$)/$1\;$2/g;
            $line =~ s/([^A-Z])[\.]+$/$1/g;
        }
        $retStr .= $line;
    }

    return $retStr;
}

#########################################################################
sub util_ieFix {
    my ($str) = @_;

    return unless $str;

    $str =~ s/&apos;/&#39;/g;
    $str =~ s/&quot;/&#34;/g;
    $str =~ s/&amp;/&#38;/g;

    return $str;
}

#########################################################################
# Deprecated: this subroutine should not be used.
sub util_html_to_char {
    my ($str) = @_;

    return unless $str;

    $str =~ s/&apos;/'/g;
    $str =~ s/&quot;/"/g;
    $str =~ s/&amp;/&/g;

    return $str;
}

#########################################################################
sub util_getTimeout_min {
    my ($timeout)= @_;
        $timeout =~ s/([\d]+)([smhdMY])//;
    my ($num,$unit)  = ($1,$2);
    my $retval;
    if ($unit eq 'h') {
        $retval = $num * 60;
    }
    elsif ($unit eq 'd') {
        $retval = $num * 1440;
    }
    elsif ($unit eq 'M') {
        $retval = $num * 43200;   
    }    
    elsif ($unit eq 'y') {
        $retval = $num * 525600;
    }
    else {
        $retval = $num ;
    }

    return $retval;
}

######################################################################
sub util_restoreLiteral {
    my ($str) = @_;

    return "" unless $str;
    
    $str =~ s/&amp;/&/g;
    $str =~ s/&lt;/</g;
    $str =~ s/&gt;/>/g;
    $str =~ s/&apos;/'/g;
    $str =~ s/&quot;/"/g;

    return $str;
}
######################################################################
sub util_escapeXml {
    my ($str) = @_;

    return "" unless $str;
    
    $str =~ s/&/&amp;/g;
    $str =~ s/</&lt;/g;
    $str =~ s/>/&gt;/g;
    $str =~ s/'/&apos;/g;
    $str =~ s/"/&quot;/g;

    return $str;
}

######################################################################
sub util_resizeImg{
    my ($srcImgData,$newW,$newH)=@_;
    my $newImage=_resizeImg($srcImgData,$newW,$newH);
    if($newImage){
        return $newImage->jpeg();
    }
    else{
        return $srcImgData;
    }

}
######################################################################
sub _resizeImg{
    my ($srcImgData,$newW,$newH)=@_;
    my   $srcImage = GD::Image->new($srcImgData);
    if (!$srcImage) {
        return;
    }
    my ($width,$height) = $srcImage->getBounds();
    if($newW >$width || $newH > $height){
        return $srcImage;
    }

    my $srcHW_ratio=$height/$width;
    my $desHW_ratio=$newH/$newW;

    if($srcHW_ratio >$desHW_ratio){
        $newW =ceil($newH /$srcHW_ratio );
    }
    else{
        $newH= ceil($newW * $srcHW_ratio);
    }
    my   $newImage = new GD::Image($newW,$newH,1);
    $newImage->copyResampled($srcImage,0,0,0,0,$newW,$newH,$width,$height);
    return $newImage;

}


######################################################################
sub util_recordPath {
    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;
}


######################################################################
sub util_getXmlRecord {
    my ($rid) = @_;

    my $file = util_recordPath($rid) . '/' . $rid . '.xml';

    if (! -r $file) {
        print "ERROR: $file not found/unreadable.\n";
        return;
    }

    my $record = '';
    open MARCXML, "<$file";
    while (<MARCXML>) {
        $record .= $_;
    }
    close MARCXML;

    return $record;
}





1;
