<?php
/**
 * -----------------------------------------------------------------------------
 *
 * SyL - Web Application Framework for PHP
 *
 * PHP version 4 (>= 4.3.x) or 5
 *
 * Copyright (C) 2006 k.watanabe
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * -----------------------------------------------------------------------------
 * @package   SyL
 * @author    k.watanabe <k.watanabe@syl.jp>
 * @copyright 2006 k.watanabe
 * @license   http://www.opensource.org/licenses/lgpl-license.php
 * @version   CVS: $Id: SyL_Pager.php,v 1.3 2006/12/23 11:13:09 seasonstream Exp $
 * @link      http://www.syl.jp/
 * -----------------------------------------------------------------------------
 */

/**
 *  改ページ操作用クラス
 *
 * @package   SyL
 * @author    k.watanabe <k.watanabe@syl.jp>
 * @copyright 2006 k.watanabe
 * @license   http://www.opensource.org/licenses/lgpl-license.php
 * @version   CVS: $Id: SyL_Pager.php,v 1.3 2006/12/23 11:13:09 seasonstream Exp $
 * @link      http://www.syl.jp/
 */
class SyL_Pager
{
    /**
     * 総件数
     * 
     * @access private
     * @var int
     */
    var $sum = 0;
    /**
     * 1ページの表示件数
     * 
     * @access private
     * @var int
     */
    var $num = 0;
    /**
     * 現在ページ数
     * 
     * @access private
     * @var int
     */
    var $current_page = 1;
    /**
     * 現在参照しているページ
     * 
     * @access private
     * @var int
     */
    var $page = 1;

    /**
     * 改ページ遷移先URL
     * 
     * @access private
     * @var string
     */
    var $url = '';

    /**
     * 改ページ遷移先、パラメータ名（ページ数パラメータ）
     * 
     * @access private
     * @var string
     */
    var $page_parameter_name = 'page';
    /**
     * 改ページ遷移先、パラメータ名（ページ数以外）
     * 
     * @access private
     * @var string
     */
    var $etc_parameters = '';

    /**
     * コンストラクタ
     *
     * @access public
     */
    function SyL_Pager()
    {
        $this->url = $_SERVER['PHP_SELF'];
    }

    /**
     * 1ページの件数をセット
     *
     * @access public
     * @param int 1ページの件数
     */
    function setCount($num)
    {
        if (!is_numeric($num) || ($num < 0)) {
            $num = 0;
        }
        $this->num = $num;
    }

    /**
     * 1ページのレコード数を取得
     *
     * @access public
     * @return int 1ページのレコード数
     */
    function getCount()
    {
        return $this->num;
    }

    /**
     * 総件数をセット
     *
     * @access public
     * @param int 総件数
     */
    function setCountAll($sum)
    {
        if (!is_numeric($sum) || ($sum < 0)) {
            $sum = 0;
        }
        $this->sum = $sum;
    }

    /**
     * データ総数を取得
     *
     * @access public
     *
     * @return int データ総数
     */
    function getCountAll()
    {
        return $this->sum;
    }

    /**
     * 現在のページ数をセット
     *
     * @access public
     * @param int 現在のページ数
     */
    function setPage($current_page)
    {
        if (!is_numeric( $current_page ) || ($current_page < 1)) {
            $current_page = 1;
        }
        $this->current_page = $current_page;
    }

    /**
     * 現在ページ数取得
     *
     * @access public
     * @return int 現在ページ数
     */
    function getPage()
    {
        // 総レコード数0のときはページ数も0
        if ($this->sum <= 0) {
            return 0;
        // 総ページ数以上のページが指定されたら1ページ目へ
        } else if ($this->current_page > $this->getTotalPage()) {
            return 1;
        } else {
            return $this->current_page;
        }
    }

    /**
     * 遷移先URLをセット
     *
     * @access public
     * @param string 遷移先URL
     */
    function setUrl($url)
    {
        $this->url = $url;
    }

    /**
     * 遷移先ページパラメータ名をセット
     *
     * @access public
     * @param string 遷移先ページパラメータ名
     */
    function setPageParameterName($page_parameter_name)
    {
        $this->page_parameter_name = $page_parameter_name;
    }

    /**
     * 遷移先パラメータをセット
     * ※URLエンコード済みとする
     *
     * @access public
     * @param string 遷移先URL
     */
    function setEtcParameter($etc_parameters)
    {
        $this->etc_parameters = $this->getAmp( $etc_parameters );
    }

    /**
     * データ取得時の最初のレコードを取得
     * ※最初のレコードは0とする。
     *
     * @access public
     * @return int データ取得時の最初のレコード
     */
    function getStartRecord()
    {
        $offset = $this->getCount() * ($this->getPage() - 1);
        return (($offset < 0) ? 0 : $offset);
    }

    /**
     * ページ総数取得
     *
     * @access public
     * @return int ページ総数
     */
    function getTotalPage()
    {
        // 合計レコード数、または1ページ件数が0以下なら0ページ
        return ((($this->sum <= 0) || ($this->num <= 0)) ? 0 : ceil( $this->sum / $this->num ));
    }

    /**
     * 次ページリンク取得
     *
     * @access public
     * @param string リンクメッセージ（リンクあり時）
     * @param string リンクメッセージ（リンク無し時）
     * @return string 次ページリンクタグ
     */
    function getNextLink($active_link_message, $noactive_link_message='')
    {
        // 総レコード数0、次ページがない、または現在MAXページ目状態
        if (($this->sum <= 0) || ($this->getTotalPage() == 1) || ($this->current_page >= $this->getTotalPage())) {
            return (($noactive_link_message == '') ? $active_link_message : $noactive_link_message);
        // 総ページ数以上のページが指定されたら1ページ目リンクへ
        } else if ($this->current_page > $this->getTotalPage()) {
            return '<a href="' . $this->url . '?' . $this->page_parameter_name . '=2' . $this->etc_parameters . '">' . $active_link_message . '</a>';
        } else {
            return '<a href="' . $this->url . '?' . $this->page_parameter_name . '=' . ($this->current_page + 1) . $this->etc_parameters . '">' . $active_link_message . '</a>';
        }
    }

    /**
     * 前ページリンク取得
     *
     * @access public
     * @param string リンクメッセージ（リンクあり時）
     * @param string リンクメッセージ（リンク無し時）
     * @return string 前ページリンクタグ
     */
    function getPrevLink($active_link_message, $noactive_link_message='')
    {
        // 総レコード数0、次ページがない、または現在1ページ目状態
        if (($this->sum <= 0) || ($this->getTotalPage() == 1) || ($this->current_page == 1)) {
            return (($noactive_link_message == '') ? $active_link_message : $noactive_link_message);
        // 総ページ数以上のページが指定されたら1ページ目リンクへ
        } else if ($this->current_page > $this->getTotalPage()) {
            return (($noactive_link_message == '') ? $active_link_message : $noactive_link_message);
        } else {
            return '<a href="' . $this->url . '?' . $this->page_parameter_name . '=' . ($this->current_page - 1) . $this->etc_parameters . '">' . $active_link_message . '</a>';
        }
    }

    /**
     * 全ページリンク取得
     *
     * @access public
     * @param string リンクメッセージ（リンクあり時）
     * @return string 全ページリンクタグ
     */
    function getLinkAll()
    {
        static $page = null;
        if ($page == null) {
            $page = 1;
        }
        // MAXページ数を超えたら終了
        if ($page > $this->getTotalPage()) {
            $page = null;
            return false;
        }
        if ($this->current_page != $page) {
            $link_message = '<a href="' . $this->url . '?' . $this->page_parameter_name . '=' . $page . $this->etc_parameters . '">' . $page . '</a>';
        } else {
            $link_message = $page;
        }

        $page++;
        return $link_message;
    }

    /**
     * 全ページSelectタグのオプション取得
     *
     * @access public
     * @return string 全ページSelectタグのオプション
     */
    function getSelectOption()
    {
        // 総ページ数取得
        $max_page = $this->getTotalPage();

        $options = '';
        for ($i=1; $i<=$max_page; $i++) {
            $active = ($i == $this->current_page) ? 'selected' : '';
            $options .= '<option value="' . $this->url . '?' . $this->page_parameter_name . '=' . $i . $this->etc_parameters . '" ' . $active . '>&nbsp;' . $i . '/' . $max_page . "\r\n";
        }

        return $options;
    }

    /**
     * URLパラメータに対して「&」を追加する
     *
     * @access public
     * @return string 「&」追加後文字列
     */
    function getAmp($str)
    {
        if (($str != '') && (substr($str, 0, 1) != '&')) {
            $str = '&' . $str;
        }
        return $str;
    }
}

?>
