<?php

/**
 * Goweb Sitemanager 5 Framework
 * 
 * @version    5.0.0
 * @category   Goweb
 * @package    Goweb_Db
 * @subpackage Model
 * @author     I&D <dev@goweb.pt>, Pedro Pinto <ppinto@goweb.pt>
 * @copyright  2009 (c) Goweb (http://www.goweb.pt)
 */

/**
 * Goweb_Db_Model_Row
 */
Goweb::loadClass('Goweb_Db_Model_Row');


/**
 * Classe que implementa o Iterator e guarda uma lista de
 * objecto do tipo Goweb_Db_Model_Row.
 *
 * @version    5.0.0
 * @category   Goweb
 * @package    Goweb_Db
 * @subpackage Model
 * @author     I&D <dev@goweb.pt>, Pedro Pinto <ppinto@goweb.pt>
 * @copyright  2009 (c) Goweb (http://www.goweb.pt)
 */
class Goweb_Db_Model_Rowset implements Iterator {

    /**
     * Array com a lista de objectos do tipo Goweb_Db_Model_Row.
     *
     * @var  array
     */
    protected $_rows = array();

    /**
     * Flag que indica se o apontador se encontra no fim ou inicio da lista.
     *
     * @var  bool
     */
    protected $_valid = true;

    /**
     * Constructor
     */
    public function __construct() {
        $this->_rows = new ArrayObject();
    }

    /**
     * Retorna os dados da lista de Goweb_Db_Model_Row em formato array.
     *
     * @return  array  Os dados da lista de Goweb_Db_Model_Row em formato array
     */
    public function toArray() {
        $rows = array();
        foreach ($this->_rows as $key => $row) {
            $rows[$key] = $row->toArray();
        }
    	return $rows;
    }

    /**
     * Retorna o nemero total de elementos na lista.
     *
     * @return  O nemero total de elementos na lista
     */
    public function count() {
        return count($this->_rows);
    }

    /**
     * Adiciona um elemento do tipo Goweb_Db_Model_Row e lista.
     * 
     * @param  Goweb_Db_Model_Row  $row  Elemento a adicionar e lista
     */    
    public function add(Goweb_Db_Model_Row $row) {
        $this->_rows[] = $row;
    }

    /**
     * Coloca o apontador no inicio da lista.
     */
    public function rewind() {
        $this->_valid = (false !== reset($this->_rows));
    }

    /**
     * Coloca o apontador no fim da lista.
     */    
    public function end() {
        $this->_valid = (false !== end($this->_rows));
    }

    /**
     * Retorna o elemento Goweb_Db_Model_Row com o apontador corrente.
     *
     * @return  Goweb_Db_Model_Row  O elemento Goweb_Db_Model_Row com o apontador corrente
     */
    public function current() {
        return current($this->_rows);
    }
    
    /**
     * Retorna a chave da lista do apontador corrente.
     *
     * @return  int  Chave da lista do apontador corrente
     */
    public function key() {
        return key($this->_rows);
    }

    /**
     * Coloca o apontador no preximo elemento.
     *
     * @return  bool  Retorn FALSE se chegou ao fim da lista
     */
    public function next() {
        $this->_valid = (false !== next($this->_rows));
        return $this->_valid;
    }

    /**
     * Coloca o apontador no elemento anterior.
     *
     * @return  bool  Retorn FALSE se chegou ao inicio da lista
     */
    public function prev() {
        $this->_valid = (false !== prev($this->_rows));
        return $this->_valid;
    }

    /**
     * Retorna se o apontador se encontra no fim ou inicio da lista.
     * @var  bool
     */    
    public function valid() {
        return $this->_valid;
    }

    /**
     * Verifica se a lista este vazia.
     *
     * @return  bool  Retorna TRUE se a lista estiver vazia
     */    
    public function isEmpty() {
        return ($this->count() > 0) ? false : true;
    }    
}