<?php
/* vim: set expandtab tabstop=4 shiftwidth=4: */
// +----------------------------------------------------------------------+
// | PHP version 4.0                                                      |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997, 1998, 1999, 2000, 2001 The PHP Group             |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.0 of the PHP license,       |
// | that is bundled with this package in the file LICENSE, and is        |
// | available at through the world-wide-web at                           |
// | http://www.php.net/license/2_02.txt.                                 |
// | If you did not receive a copy of the PHP license and are unable to   |
// | obtain it through the world-wide-web, please send a note to          |
// | license@php.net so we can mail you a copy immediately.               |
// +----------------------------------------------------------------------+
// | Authors: Nishina <jj@suke.ne.jp>                                     |
// +----------------------------------------------------------------------+

// define
/**
 * 出力タイプ
 * @const JJ_BATCH_DATE 日付
 */
define("JJ_BATCH_DATE", 0);

/**
 * 出力タイプ
 * @const JJ_BATCH_NUMBER 数値
 */
define("JJ_BATCH_NUMBER", 1);

/**
 * 出力クラス
 *
 * @author Nishina <jj@suke.ne.jp>
 * @copyright Copyright &copy; 2003, JJ.Nishina
 * @since Rev. 1.0 - 10-23-2003
 * @version $Id: Output.php,v 1.1.1.1 2003/12/13 11:04:19 jjlehto Exp $
 * @package jj_util
 */
class Util_Output
{
    /**
     * @var string $__start 開始値
     */
    var $__start;

    /**
     * @var string $__end 終了値
     */
    var $__end;

    /**
     * @var string $__interval 出力間隔
     */
    var $__interval;

    /**
     * @var intager $__mode 処理モード
     */
    var $__mode;

    /**
     * @var intager $__current_pos 現在の位置
     */
    var $__current_pos = 0;

    /**
     * @var array $__all_data 出力データ
     */
    var $__all_data = array();

    /**
     * コンストラクタ
     * 
     * @param string 開始値
     * @param string 終了値
     * @param intager 出力タイプ
     * @param string 出力間隔
     * @return void
     * @access public
     */
    function Util_Output ($start, $end, $mode, $interval = 1)
    {
        $this->__start    = $start;
        $this->__end      = $end;
        $this->__mode     = $mode;
        $this->__interval = $interval;
        $this->__setArrayData();
    }

    /**
     * 出力値を全て配列に格納します
     * 
     * @return void
     * @access private
     */
    function __setArrayData ()
    {
        switch ($this->__mode) {
        case JJ_BATCH_DATE:
            $date = $this->__start;
            while (($date = $this->__nextDate($date)) <= $this->__end) {
                array_push ($this->__all_data, $date);
            }
            break;
        case JJ_BATCH_NUMBER:
            for ($num = $this->__start; $num <= $this->__end; $num++) {
                array_push ($this->__all_data, $num);
            }
            break;
        }
    }

    /**
     * 引数で指定した日付を指定した間隔足した日付を返します。
     * 
     * @param $string 処理対象日付
     * @return 引数で指定した日付を指定した間隔足した日付
     * @access private
     */
    function __nextDate ($date)
    {
        return date("Y-m-d", strtotime("+{$this->__interval} day", strtotime($date)));
    }

    /**
     * 出力値を引数で区切り全て表示します
     * 
     * @param $string 値と値の間に入れる区切り文字を指定します
     * @return 全ての出力値
     * @access public
     */
    function printAll ($br = "<BR>")
    {
        foreach ($this->__all_data as $data) {
            echo $data."$br";
        }
    }

    /**
     * 次の出力値が存在するか判定します
     * 
     * @return boolean true=次の出力値がある / false=次の出力値が無い
     * @access public
     */
    function hasNext ()
    {
        return isset($this->__all_data[$this->__current_pos]);
    }

    /**
     * 次の出力値を返します。
     * 次の出力値が無い場合はnullを返します。
     * 
     * @return string 次の出力値
     * @access public
     */
    function next ()
    {
        $ret = null;

        if ($this->hasNext()) {
            $ret = $this->__all_data[$this->__current_pos];
            $this->__current_pos++;
        }

        return $ret;
    }

    /**
     * 出力位置を変更します
     * 
     * @param integer $pos 出力位置
     * @access public
     */
    function setPos ($pos)
    {
        $this->__current_pos = $pos;
    }
}

?>