<?
class MContainer extends MContainerControl
{
    /* disposition of the content: horizontal|none or vertical */
    public $disposition;

    /*  se label deve ser exibido junto com os campos
     *  Esse atributo foi modificado para private para forçar a 
     *  utilização o do método setShowLabel. Esta modificação foi
     *  necessária para os casos em que o programador necessite
     *  que os labels dos conteúdos fossem exibidos
     */
    public $showLabel;

    /*   esta propriedade controla a exibição ou não do label dos
     *   conteúdos de um container. É necessário utilizar o método
     *   setShowChildLabel para modificar esta propriedade.
     */
    public $showChildLabel = true; 

    /*   esta propriedade indica se algum dos conteúdos do container
     *   possui label. Se possuir, todos os controles devem ter
     *   um label na $disposition=horizontal para que fiquem alinhados
     */
    public $hasLabel = false; 

    public function __construct($name = NULL, $controls = NULL, $disposition = 'none', $formMode = MFormControl::FORM_MODE_SHOW_ABOVE)
    {
        parent::__construct($name);
        $this->formMode = $formMode;
        $controls = (($controls != '') && is_array($controls)) ? $controls : array();
        $this->showLabel = false;
        $this->setControls($controls);
        $this->setDisposition($disposition);
    }

    /* sobrepoe o método ancestral apenas para verificar o o controle tem label != '' */
    public function addControl($control)
    {
        if ($control instanceof MFormControl)
        {
            $this->hasLabel |= ($control->label != '');
        }
        parent::addControl($control);
    }

    public function setDisposition($disposition)
    {
        $this->disposition = ($disposition == 'none') ? 'horizontal' : $disposition;
    }

    public function isShowLabel()
    {
        return $this->showLabel;
    }

    public function isShowChildLabel()
    {
        return $this->showChildLabel;
    }

    public function setShowChildLabel( $visible=true, $recursive=true )
    {
        $this->showChildLabel = $visible;
        $controls = $this->getControls();
        $this->setControls($controls,$recursive);
    }

    public function setShowLabel( $visible=true, $recursive=true )
    {
        $this->showLabel = $visible;

        if( $recursive )
        {
            $this->setShowChildLabel( $visible, $recursive );
        }
    }

    public function setControls($controls,$recursive=false)
    {
        $this->clearControls();

        foreach ( $controls as $c )
        {
            if ( $recursive && ($c instanceof MContainer) )
            {
                $c->setShowChildLabel($this->showChildLabel,true);
            }
            if( is_object($c) )  //acrescentado devido ao erro!
            {
                if ($c instanceof MFormControl)
                {
                    $c->showLabel = $this->showChildLabel;
                }
                $this->addControl($c);
            }
        }
    }

    public function generateInner()
    {
        $float = false;
        $t = array();

        $controls = $this->getControls();

        foreach ($controls as $control)
        {
            $c = clone $control;
            if ($c instanceof MInputControl)
            {
                $c->setAutoPostBack($this->autoPostBack || $c->autoPostBack);
            }
            if ( $c->showLabel )
            {
               $c->formMode = $this->formMode;
            }

            if ($this->disposition == 'horizontal')
            {
                /* verifica se é necessário acrescentar um label para manter o alinhamento dos controles */
                if (($c instanceof MFormControl) && ($c->label == '') && ($this->hasLabel))
                {
                    $c->label = '&nbsp;';
                }
                    
                $c = ($c instanceof MDiv) ? $c : new MDiv('_div_'.$c->getId(),$c);
                $c->setClass('mContainerHorizontal');
                $float = true;
            }
            else
            {
                if ( $this->formMode == MFormControl::FORM_MODE_SHOW_SIDE )
                {
                    $c = MForm::generateLayoutField($c);
                }
                else
                {
                    $c = ($c instanceof MDiv) ? $c : new MDiv('_div_'.$c->getId(),$c);
                    $c->setClass('mContainerVertical');
                }
            }

            $t[] = MHtmlPainter::generateToString($c);
        }

        if ($float)
        {
            $t[] = new MSpacer();
        }

        $this->inner = $t;
    }
}

class MVContainer extends MContainer
{
    public function __construct($name = NULL, $controls = NULL, $formMode = MFormControl::FORM_MODE_SHOW_ABOVE)
    {
        parent::__construct($name, $controls, 'vertical', $formMode);
    }
}

class MHContainer extends MContainer
{
    public function __construct($name = NULL, $controls = NULL)
    {
        parent::__construct($name, $controls, 'horizontal');
    }
}
?>