#------------------------------------------------------------
# Copyright (C) 2006 RoyaltyShare, Inc.   All Rights Reserved
#------------------------------------------------------------
package RPS::Pagination;

use strict;
use warnings;

use lib '/app/tools/rps/lib';
use Common::FormObject;
use base 'Common::FormObject';

use constant kDefaultPageSize	=> 50;
use constant kDefaultRecordNum	=> 1;

sub _init
{
	my ($self, %args) = @_;

	$self->SUPER::_init(%args);

	return $self->_initWithArgs(%args);
}


sub _initWithArgs
{
	my ($self, %args) = @_;

	my $pageSize = $args{pageSize} || kDefaultPageSize;
	my $recordNum = $args{recordNum};
	my $pageNum = $args{pageNum};
	my $total = $args{total};
	my $pageFraction = 0;

    $recordNum = 1 if( $recordNum && $recordNum < 1 );
    $pageNum   = 1 if( $pageNum && $pageNum < 1 );

    Common::Log::Debug( "PAGE: $pageNum" ) if( $pageNum );

    # Indexing by record number
	if( $recordNum ) {
        $pageNum = int($recordNum / $pageSize) + 1;
		$pageFraction = ($recordNum - 1) % $pageSize ? 1 : 0;

    # Indexing by page number
	} elsif( $pageNum ) {
		$recordNum = (($pageNum - 1) * $pageSize) + 1;

	# Using default
	} else {
        $recordNum = kDefaultRecordNum;
        $pageNum = int($recordNum / $pageSize) + 1;
	}


	my $realPageCount = $total / $pageSize;
	my $totalPages = int($realPageCount);
	$totalPages++ if($realPageCount > $totalPages);

	my $next = ($total > $pageNum*$pageSize) ? $pageNum+1 : undef;
	my $prev = ($pageNum > 1) ? $pageNum-1 : undef;

    my $nextRecord = ( $recordNum + $pageSize );
    my $prevRecord = ( $recordNum - $pageSize );

	$nextRecord = undef if( $nextRecord > $total );
	$prevRecord = undef if( $prevRecord < 1 );

    $prevRecord = $recordNum > 1 ? 1 : undef unless( $prevRecord );

	$pageNum += $pageFraction;
	$totalPages += $pageFraction;

    # !!! Why are we using the Scalar class here?  We don't _set_ these values via cgi...
    #
	$self->{Total}	    	= Common::FormObject::Scalar->new(value => $total);
	$self->{TotalPages}    	= Common::FormObject::Scalar->new(value => $totalPages);
	$self->{PageSize}    	= Common::FormObject::Scalar->new(value => $pageSize);
	$self->{Current}    	= Common::FormObject::Scalar->new(value => $pageNum);
	$self->{Next}    		= Common::FormObject::Scalar->new(value => $next);
	$self->{Previous}    	= Common::FormObject::Scalar->new(value => $prev);
	$self->{CurrentRecord}	= Common::FormObject::Scalar->new(value => $recordNum);
	$self->{NextRecord}	    = Common::FormObject::Scalar->new(value => $nextRecord);
	$self->{PreviousRecord}	= Common::FormObject::Scalar->new(value => $prevRecord);

	return $self;
}


sub inRange
{
	my ($self, $count) = @_;

	return ($count >= ($self->Current()-1)*$self->PageSize() && $count < $self->Current()*$self->PageSize());
}

###
1;#
###
