<?php

Goweb::loadClass('Goweb_Db_Model');

/**
 * Goweb Sitemanager 5 Framework
 * @version    5.0.0
 * @category   Frontoffice
 * @package    Form
 * @subpackage Model
 * @author     I&D <dev@goweb.pt>, Pedro Pinto <ppinto@goweb.pt>
 * @copyright  2009 (c) Goweb (http://www.goweb.pt)
*/
class Form_Model_Element extends Goweb_Db_Model {
    
    /**
     * Nome da Tabela
     *
     * @var string
    */
    protected $_table = 'form_element';
    
    /**
     * Chave Primaria
     * 
     * @var string
    */
    protected $_primary = 'id';
    
    /**
     * Campo que sera retornado se um
     * echo do objecto for chamado
     *
     * @var string
    */
    protected $_toString = 'label';
    
    /**
     * Tipos de elementos disponiveis
     *
     * @var array
    */
    protected $_elements = array('text'      => 'Texto',
                                 'textarea'  => '&Aacute;rea de texto',
                                 'radio'     => 'Radio',                                 
                                 'checkbox'  => 'Checkbox',
                                 'select'    => 'Select',
                                 'combo'     => 'Combo-box',
                                 'file'      => 'File',
                                 'separator' => 'Separador');
    
    /**
     * Tipo de validadores disponiveis
     *
     * @var array
    */
    protected $_validators = array('Email'   => 'Email',
                                   'Integer' => 'N&uacute;mero inteiro',
                                   'Date'    => 'Data');
    
    /**
     * Metodo obrigatorio. Informa a definicao da tabela
     * referente ao Model em questao.
    */
    protected function _setup() {
        $this->initLang();
        $this->setSyncCols(array('form_id', 'element', 'size', 'rows', 'cols', 'multiple', 'ordem', 'validators', 'required'));
        $this->form_id     = $this->ForeignKey(array('model' => 'Form_Model_Form', 'alias' => 'form', 'label' => translate('Formul&aacute;rio'), 'show' => false));        
        $this->label       = $this->Char(array('size' => '20', 'maxlength' => '200', 'notnull' => false, 'default' => '', 'label' => translate('T&iacute;tulo')));
        $this->element     = $this->Char(array('maxlength' => 20, 'notnull' => true, 'label' => translate('Tipo de Campo'), 'options' => $this->_elements));
        $this->size        = $this->Char(array('size' => '3', 'maxlength' => '3', 'label' => translate('Tamanho em caracteres')));
        $this->rows        = $this->Char(array('size' => '2', 'maxlength' => '2', 'label' => translate('N&uacute;mero de linhas')));
        $this->cols        = $this->Char(array('size' => '2', 'maxlength' => '2', 'label' => translate('N&uacute;mero de colunas')));
        $this->options     = $this->Text(array('label' => translate('Op&ccedil;&otilde;es'), 'help' => translate('Lista das op&ccedil;&otilde;es, uma por linha')));
        $this->multiple    = $this->Boolean(array('default' => '0', 'label' => translate('Escolha m&uacute;ltipla')));
        $this->ordem       = $this->Integer(array('on_insert' => '_lastOrderPlus', 'label' => translate('Ordem')));
        $this->validators  = $this->Text(array('label' => translate('Validadores')));
        $this->email       = $this->Boolean(array('default' => '0', 'label' => translate('Enviar C&oacute;pia do formul&aacute;rio para este email'), 'help' => translate('Este campo, se preenchido, deve ter o Validador de Email')));
        $this->required    = $this->Boolean(array('label' => translate('Campo obrigat&oacute;rio')));
        
        $this->db_type          = $this->Char(array('label' => translate('Tipo de BD')));
        $this->db_host          = $this->Char(array('label' => translate('Host')));
        $this->db_user          = $this->Char(array('label' => translate('Username')));
        $this->db_pass          = $this->Char(array('label' => translate('Password')));
        $this->db_name          = $this->Char(array('label' => translate('Nome da BD')));
        $this->db_table         = $this->Char(array('label' => translate('Nome da Tabela')));
        $this->db_table_value   = $this->Char(array('label' => translate('Campo 1 da Tabela')));
        $this->db_table_desc    = $this->Char(array('label' => translate('Campo 2 da Tabela')));
        $this->clausulas_extras = $this->Text(array('label' => translate('Cl&aacute;usulas Extras')));
        
        $this->actualizado = $this->Datetime(array('on_update' => '_currentDatetime', 'label' => translate('Actualizado em')));
        $this->criado      = $this->Datetime(array('on_insert' => '_currentDatetime', 'label' => translate('Criado em')));
        $this->ip          = $this->IpAddress(array('on_update' => '_remoteAddress'));
    }

    /**
     * Actualizar a ordem dos elementos
     *
     * @return int
     */
    protected function _lastOrderPlus() {
        $adapter = $this->getAdapter();
        if (!$this->ordem) {
            $sql = "SELECT (MAX(ordem) + 1) as neworder FROM " . $this->getTableName();
            $sql .= " WHERE form_id = '" . $this->form_id . "'";
            
            $result = $adapter->fetchAll($sql);
            
            if (count($result) > 0) {
                if ((array_key_exists('neworder', $result[0])) && ($result[0]['neworder'])) {
                    return $result[0]['neworder'];
                } else {
                    return "1";
                }
            } else {
                return "1";
            }
        } else {
            $sql_update = "UPDATE " . $this->getTableName() . " SET ordem = ordem + 1 ";
            $sql_update .= " WHERE ordem >= '" . $this->ordem . "'";
            $sql_update .= " AND form_id = '" . $this->form_id . "'";
            
            $adapter->query($sql_update);
            
            return $this->ordem;
        }
    }
    
    /**
     * Devolve o tipo de elemento
     *
     * @return string
    */
    public function getElementsTypes() {
        return array_map(create_function('$string', 'return html_entity_decode(translate($string), ENT_QUOTES, CHARSET);'), $this->_elements);
    }

    /**
     * Devolve o tipo de validacao
     *
     * @return string
    */
    public function getValidators() {
        return array_map(create_function('$string', 'return html_entity_decode(translate($string), ENT_QUOTES, CHARSET);'), $this->_validators);
    }
}
