<?php

Goweb::loadClass('Index_Controller', ADMIN_PATH);

/**
 * Goweb Sitemanager 5 Framework
 * @version    5.0.19.2
 * @category   Backoffice
 * @package    Catalogo
 * @author     I&D <dev@goweb.pt>, Pedro Pinto <ppinto@goweb.pt>
 * @copyright  2010 (c) Goweb (http://www.goweb.pt)
*/
class Catalogo_GenericController extends Index_Controller {

    /**
     * Titulo do Modulo
     * @var string
     */
    protected $_title;

    /**
     * Controller do Modulo
     * @var string
    */
    protected $_controller = 'catalogo';

    /**
     * Seccoes do Modulo
     * @var array
    */
    protected $_sections;

    /**
     * Objecto Catalogo_Model_Produto
     * @var Catalogo_Model_Produto
    */
    protected $_produtoModel = null;

    /**
     * Objecto Catalogo_Model_Categoria
     * @var Catalogo_Model_Categoria
    */
    protected $_categoriaModel = null;

    /**
     * Objecto Catalogo_Model_Imagem
     * @var Catalogo_Model_Imagem
    */
    protected $_imagemModel = null;

    /**
     * Objecto Catalogo_Model_Ficheiro
     * @var Catalogo_Model_Ficheiro
    */
    protected $_ficheiroModel = null;

    /**
     * Objecto Catalogo_Model_Relacao
     * @var Catalogo_Model_Relacao
    */
    protected $_relacaoModel = null;

    /**
     * Objecto Catalogo_Model_Ficha
     * @var Catalogo_Model_Ficha
    */
    protected $_fichaModel = null;

    /**
     * Objecto Catalogo_Model_Element
     * @var Catalogo_Model_Element
    */
    protected $_elementModel = null;

    /**
     * Objecto Goweb_Db_Model_Adapter
     * @var Goweb_Db_Model_Adapter
    */
    protected $_dbAdapter = null;

    /**
     * Parametros para a criacao da arvore
     *
     * @var array
    */
    protected $_categoriasTreeParams = array('target'         => null,
                                             'folderLinks'    => true,
                                             'useSelection'   => true,
                                             'useCookies'     => false,
                                             'useLines'       => true,
                                             'useIcons'       => true,
                                             'useStatusText'  => false,
                                             'closeSameLevel' => false,
                                             'inOrder'        => false);

    /**
     * Parametros para a criacao dos n&oacute;s da arvore
     *
     * @var array
    */
    protected $_categoriasNodesParams = array('rootName'   => 'Raiz',
                                              'id'         => 'id',
                                              'pid'        => 'pai_id',
                                              'name'       => 'titulo',
                                              'url'        => '/catalogo/list_produto/categoria_id/',
                                              'urlId'      => 'id',
                                              'target'     => null,
                                              'title'      => null,
                                              'icon'       => null,
                                              'iconOpen'   => null,
                                              'open'       => null,
                                              'url_1'      => '/catalogo/edit/section/categorias/id/',
                                              'url_1_icon' => '/media/images/icon_edit.png',
                                              'url_2'      => '/catalogo/delete/section/categorias/id/',
                                              'url_2_icon' => '/media/images/icon_delete.gif',
                                              'url_3'      => '/catalogo/add/section/categorias/pai_id/',
                                              'url_3_icon' => '/media/images/icon_add.png');

    /**
     * @var array
    */
    protected $_rootCategoriasNodeParams = null;

    /**
     * Mensagem de Erro
     * @var string
    */
    protected $_error = null;

    /**
     * Mensagem de Sucesso
     * @var string
    */
    protected $_message = null;

    /**
     * Construtor da classe
    */
    public function init() {
		if ($this->_getParam('section') && strcmp($this->_getParam('section'), 'catalogo') === 0) $this->_forward('listProduto');
        
        $this->_title = translateAdmin('Gest&atilde;o de Cat&aacute;logo');

        $this->_sections[] = array('title'   => translateAdmin('Produtos'),
                                   'section' => 'produtos',
                                   'link'    => '/catalogo/list_produto/');
        $this->_sections[] = array('title'   => translateAdmin('Fichas de Produtos'),
                                   'section' => 'fichas',
                                   'link'    => '/catalogo/list_fichas/');

        parent::init();
        $this->_moduleConfig 	= new Goweb_Config(Goweb_Config_Ini::load(APPLICATION_PATH . DIRECTORY_SEPARATOR . 'Catalogo' . DIRECTORY_SEPARATOR . 'config.ini', 'base'));
        $this->view->setViewsPath(GENERIC_VIEWS_PATH);
        $this->_paginatorParams = array('rows_per_page' => 20, 'links_per_page' => 10);
        $this->_initDefaultLinks();
        $this->_produtoModel = Goweb::getModelInstance('Catalogo_Model_Produto', 'db');
        $this->_categoriaModel = Goweb::getModelInstance('Catalogo_Model_Categoria', 'db');
        $this->_rootCategoriasNodeParams =  $this->_categoriasNodesParams;
        $this->_rootCategoriasNodeParams['url_1'] = null;
        $this->_rootCategoriasNodeParams['url_1_icon'] = null;
        $this->_rootCategoriasNodeParams['url_2'] = null;
        $this->_rootCategoriasNodeParams['url_2_icon'] = null;
        $this->view->title    = $this->_title;
        if($this->_moduleConfig->cambios->activo){
        	$this->_cambioModel      = Goweb::getModelInstance('Catalogo_Model_Cambio', 'db');
        	$this->_sections[] = array('title'   => translateAdmin('Cambios'), // Cambio
                                       'section' => 'cambios',
                                       'link'    => '/catalogo/list_cambios/');
        }
        $this->view->sections = $this->_sections;
    }
    /**
     * Metodo chamado quando nenhuma action &eacute; fornecida
    */
    public function indexAction() {
        $this->listProdutoAction();
    }
    
    /**
     * Produtos
     */

    /**
     * Listagem dos produtos de uma categoria
     *
     * @param integer
    */
    public function listProdutoAction($categoriaId = 0) {
        if ($categoriaId == 0) {
            $categoriaId = $this->_getParam('categoria_id');
        }

        $fichaId = 0;
        $this->_links['list'] = '/catalogo/list_produto/';
        if ($this->_validateId($categoriaId) && $this->_categoriaModel->find($categoriaId)) {
            $this->_links['add'] = '/catalogo/addProduto/categoria_id/' . $categoriaId .'/';
            $this->_links['list'] .= 'categoria_id/' . $categoriaId . '/';
            $fichaId = $this->_categoriaModel->ficha_id;
        } else {
            $this->_links['add'] = '/catalogo/addProduto/categoria_id/0/';
        }

        $this->_links['edit'] = '/catalogo/editProduto/id/';
        $this->_links['imagens'] = '/catalogo/list_imagens/produto_id/';
        $this->_links['ficheiros'] = '/catalogo/list_ficheiros/produto_id/';
        $this->_links['delete'] = '/catalogo/deleteProduto/id/';
        $this->_links['deletelist'] = '/catalogo/deletelistProduto/';

        Goweb::loadClass('Goweb_Admin_Section');
        $section = new Goweb_Admin_Section();
        $section->setTitle(translateAdmin('Produtos'));
        $section->setTitleSingular(translateAdmin('Produto'));
        $section->setModel($this->_produtoModel);
        $section->setListCols(array('titulo', 'referencia', 'imagem', 'destaque', 'activo', 'criado'));
        $section->setSearchCols(array('titulo'));
        $section->setOrdering('ordem');
        $tree = $this->_getTreeObject(true);
        if ($tree instanceof Goweb_Js_Dhtmlx_Tree && $categoriaId > 0){
            $this->_categoriaModel->loadForeigns(false);
            $cats = $this->_categoriaModel->getPais($categoriaId);
            $cats = array_reverse($cats, true);
            $this->_categoriaModel->loadForeigns(true);
            $tree->setOpenTo($cats);
        } else {
            $tree->setOpenTo($categoriaId);
        }
        $section->setTreeObject($tree);

        $this->_fichaModel = Goweb::getModelInstance('Catalogo_Model_Ficha', 'db');
        $this->_fichaModel->order('titulo');

        $this->view->ficha_id = $fichaId;
        $this->view->fichas = $this->_fichaModel->fetchAll();
        $this->view->links  = $this->_links;
        $this->view->action = translateAdmin('Listagem');

        if ($this->_getParam('message')) {
            $this->view->message = $this->_getParam('message');
        }

        $this->view->title  = $this->_title;
        $this->view->setViewsPath(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'views');
        $this->view->output = $this->_listGeneric($section,
                                                   $this->view,
                                                   false,
                                                   'list.tpl',
                                                   'categoria_id',
                                                   $categoriaId);
        $this->view->setViewsPath(GENERIC_VIEWS_PATH);
        $this->_helper->viewRenderer->setRender('base');
    }

    /**
     * Adiciona um novo produto
     *
     * @param boolean
    */
    public function addProdutoAction($cleanValues = false) {
        $categoriaId = $this->_getParam('categoria_id');
        $this->_links['save'] = '/catalogo/saveProduto/';

        $this->_fichaModel = Goweb::getModelInstance('Catalogo_Model_Ficha', 'db');
        $this->_elementModel = Goweb::getModelInstance('Catalogo_Model_Element', 'db');
        $ficha = null;

        if ($this->_validateId($this->_request->ficha_id) && $this->_fichaModel->find($this->_request->ficha_id)) {
            $this->_links['save'] .= 'ficha_id/' . $this->_request->ficha_id . '/';
            $ficha = $this->_getFichaForm($this->_request->ficha_id);
            $ficha->render();
        } else {
            $this->_links['save'] .= 'ficha_id/0/';
        }

        $ivaId = null;
        if ($this->_validateId($categoriaId) && $this->_categoriaModel->find($categoriaId)) {
            $ivaId = $this->_categoriaModel->iva_id;
        }

        Goweb::loadClass('Goweb_Admin_Section');
        $section = new Goweb_Admin_Section();
        $section->setTitle(translateAdmin('Produtos'));
        $section->setTitleSingular(translateAdmin('Produtos'));
        $section->setModel($this->_produtoModel);

        $this->view->ficha = $ficha;
        $this->view->links = $this->_links;
        $this->view->action  = translateAdmin('Inser&ccedil;&atilde;o');
        $this->view->setViewsPath(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'views');
        $this->view->output = $this->_addGeneric($section, $this->view, 'categoria_id', $categoriaId, $cleanValues, false, false, 'form.tpl', array('iva_id' => $ivaId));
        $this->view->setViewsPath(GENERIC_VIEWS_PATH);
        $this->_helper->viewRenderer->setRender('base');
    }

    /**
     * Edita um produto
    */
    public function editProdutoAction() {
        $this->_fichaModel = Goweb::getModelInstance('Catalogo_Model_Ficha', 'db');
        $this->_elementModel = Goweb::getModelInstance('Catalogo_Model_Element', 'db');

        $id = $this->_getParam('id');

        if (!$this->_validateId($id) || !$this->_produtoModel->find($id)) {
            return $this->listProdutoAction();
        }

        $ficha = null;

        if ($this->_produtoModel->ficha_id > 0) {
            $fichaId = $this->_produtoModel->ficha_id;
            $model = $this->_getFichaModel($fichaId);
            $ficha = $this->_getFichaForm($fichaId);
            $db = Goweb::registry('db');
            $tables = $db->listTables();
            if (in_array($model->getTableName(), $tables)) {
                if ($model->findBy('produto_id', $id)) {
                    $this->view->fichaModel = $model;
                    foreach ($ficha->getElementsNames() as $element) {
                        if (strpos($model->{$element}, 'a:') === 0) {
                            $ficha->{$element}->value = unserialize($model->{$element});
                        } else {
                            $ficha->{$element}->value = $model->{$element};
                        }
                    }
                }
                $ficha->render();
            }
        }

        $this->_links['save'] = '/catalogo/saveProduto/id/' . $id . '/';
        $this->_links['delete'] = '/catalogo/deleteProduto/id/' . $id . '/';

        Goweb::loadClass('Goweb_Admin_Section');
        $section = new Goweb_Admin_Section();
        $section->setTitle(translateAdmin('Produtos'));
        $section->setTitleSingular(translateAdmin('Produtos'));
        $section->setModel($this->_produtoModel);

        $this->view->ficha = $ficha;
        $this->view->id = $id;
        $this->view->links = $this->_links;
        $this->view->delete_link = $this->_links['delete'];
        $this->view->action  = translateAdmin('Edi&ccedil;&atilde;o');
        $this->view->setViewsPath(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'views');
        $this->view->output = $this->_editGeneric($section, $this->view, 'categoria_id', $this->_produtoModel->categoria_id);
        $this->view->setViewsPath(GENERIC_VIEWS_PATH);
        $this->_helper->viewRenderer->setRender('base');
    }

    /**
     * Salva o produto na bd
    */
    public function saveProdutoAction() {
        $this->_fichaModel   = Goweb::getModelInstance('Catalogo_Model_Ficha', 'db');
        $this->_elementModel = Goweb::getModelInstance('Catalogo_Model_Element', 'db');

        $id      = $this->_getParam('id');
        $fichaId = $this->_getParam('ficha_id');
        $ficha   = null;

        $this->_links['save'] = '/catalogo/saveProduto/';

        if ($this->_validateId($id) && $this->_produtoModel->find($id)) {
            $this->_links['delete'] = '/catalogo/deleteProduto/id/' . $id . '/';
            $this->view->delete_link = $this->_links['delete'];
            $this->view->id = $id;
            $fichaId = $this->_produtoModel->ficha_id;
            $ficha   = $this->_getFichaForm($this->_produtoModel->ficha_id);
        } elseif ($this->_validateId($fichaId) && $this->_fichaModel->find($fichaId)) {
            $this->_links['save'] .= 'ficha_id/' . $fichaId . '/';
            $ficha = $this->_getFichaForm($fichaId);
            $this->_produtoModel->ficha_id = $fichaId;
        } elseif ($fichaId === '0') {
            $this->_links['save'] .= 'ficha_id/0/';
        } else {
            return $this->listProdutoAction();
        }

        Goweb::loadClass('Goweb_Admin_Section');
        $section = new Goweb_Admin_Section();
        $section->setTitle(translateAdmin('Produtos'));
        $section->setTitleSingular(translateAdmin('Produtos'));
        $section->setModel($this->_produtoModel);

        $this->view->action  = translateAdmin('Gravar');
        if ($ficha) {
            if (!$ficha->validate()) {
                if (count($ficha->getErrorMessages()) > 1) {
                    $this->_error = translateAdmin('Corrija por favor os erros no formul&aacute;rio') . 'Ficha';
                    $this->_message = null;
                } else {
                    $this->_error = translateAdmin('Corrija por favor o erro no formul&aacute;rio') . 'Ficha';
                    $this->_message = null;
                }
            }
        }

        if ($ficha) {
            $ficha->render();
        }

        $this->view->ficha = $ficha;
        $this->view->setViewsPath(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'views');
        $output = $this->_saveGeneric($section, $this->view);
        $this->view->setViewsPath(GENERIC_VIEWS_PATH);

        $id = $this->_produtoModel->id;

        if ($fichaId > 0) {
            if (is_null($this->_error) && $ficha) {
                $model = $this->_getFichaModel($fichaId);
                $model->findBy('produto_id', $id);
                $model = $this->_formModelValues($ficha, $model);
                
                $model->ficha_id = $fichaId;
                $model->produto_id = $id;
                $model->save();
            }
        }
        if (is_bool($output)) {
            if ($this->_request->submit) {
                $modelAux = null;
                $modelAux = $this->_produtoModel;
                $modelAux->find($id);
                $this->_request->setParam('categoria_id', $modelAux->categoria_id);
                return $this->listProdutoAction();
            }
            if ($this->_request->submit_and_new) {
                return $this->addProdutoAction(true);
            }
            if ($this->_request->submit_and_continue) {
                $model = $this->_produtoModel;
                if (!$this->_getParam($model->getPrimary())){
                    $this->_request->setParam($model->getPrimary(), $model->{$model->getPrimary()});
                    $this->_links['save'] .= $model->getPrimary() . '/' . $model->{$model->getPrimary()} . '/';
                }
                return $this->editProdutoAction();
            }
            
        }

        $this->view->ficha = $ficha;
        $this->view->links = $this->_links;
        $this->view->output = $output;
        $this->_helper->viewRenderer->setRender('base');

    }

    /**
     * Remove um produto da bd
    */
    public function deleteProdutoAction() {
        $produtoId = $this->_getParam('id');
        if (!$this->_validateId($produtoId) || !$this->_produtoModel->find($produtoId)) {
            return $this->listProdutoAction();
        }

        $categoriaId = $this->_produtoModel->categoria_id;
        $fichaId = $this->_produtoModel->ficha_id;

        $this->_imagemModel = Goweb::getModelInstance('Catalogo_Model_Imagem', 'db');
        $this->_ficheiroModel = Goweb::getModelInstance('Catalogo_Model_Ficheiro', 'db');
        $this->_elementModel = Goweb::getModelInstance('Catalogo_Model_Element', 'db');

        // imagens
        $this->_imagemModel->where('produto_id=' . $produtoId);
        $rowset = $this->_imagemModel->fetchAll();
        if ($rowset) {
            if (strpos($this->_imagemModel->getColParam('imagem', 'target'), '/', 0) === 0) {
                $uploadPath = WWW_PATH . DIRECTORY_SEPARATOR . trim($this->_imagemModel->getColParam('imagem', 'target'), '/') . DIRECTORY_SEPARATOR;
            } else {
                $uploadPath = WWW_PATH . DIRECTORY_SEPARATOR . 'www' . DIRECTORY_SEPARATOR . 'uploads' . DIRECTORY_SEPARATOR . trim($this->_imagemModel->getColParam('imagem', 'target'), '/') . DIRECTORY_SEPARATOR;
            }
            foreach ($rowset as $row) {
                $filename = $row->imagem;
                if (strlen($filename)) {
                    if (file_exists($uploadPath . $filename) && is_writable($uploadPath . $filename))
                        unlink($uploadPath . $filename);
                    $sizes = $this->_imagemModel->getColParam('imagem', 'sizes');
                    foreach ($sizes as $size){
                        if (file_exists($uploadPath . $size . '_' . $filename) && is_writable($uploadPath . $size . '_' . $filename)) {
                            unlink($uploadPath . $size . '_' . $filename);
                        }
                    }
                }
            }
            $this->_imagemModel->deleteWhere('produto_id=' . $produtoId);
        }

        // ficheiros
        $rowset = $this->_ficheiroModel->fetchAll();
        if ($rowset) {
            if (strpos($this->_ficheiroModel->getColParam('ficheiro', 'target'), '/', 0) === 0) {
                $uploadPath = WWW_PATH . DIRECTORY_SEPARATOR . trim($this->_ficheiroModel->getColParam('ficheiro', 'target'), '/') . DIRECTORY_SEPARATOR;
            } else {
                $uploadPath = WWW_PATH . DIRECTORY_SEPARATOR . 'www' . DIRECTORY_SEPARATOR . 'uploads' . DIRECTORY_SEPARATOR . trim($this->_ficheiroModel->getColParam('ficheiro', 'target')) . DIRECTORY_SEPARATOR;
            }
            foreach ($rowset as $row) {
                $filename = $row->ficheiro;
                $this->_ficheiroModel->delete($row->id);
                if (strlen($filename)) {
                    if (file_exists($uploadPath . $filename) && is_writable($uploadPath . $filename))
                        unlink($uploadPath . $filename);
                    $sizes = $this->_ficheiroModel->getColParam('ficheiro', 'sizes');
                    foreach ($sizes as $size){
                        if (file_exists($uploadPath . $size . '_' . $filename) && is_writable($uploadPath . $size . '_' . $filename)) {
                            unlink($uploadPath . $size . '_' . $filename);
                        }
                    }
                }
            }
            $this->_ficheiroModel->deleteWhere('produto_id=' . $produtoId);
        }

        if ($fichaId > 0) {
            $model = $this->_getFichaModel($fichaId);
            $model->deleteWhere('produto_id=' . $produtoId);
        }

        $this->_message = translateAdmin('O Produto foi removido com sucesso.');
        $this->_produtoModel->find($produtoId);
        foreach ($this->_produtoModel->getCols() as $key => $col) {
            if ($col->getParam('type') == 'Image' || $col->getParam('type') == 'File') {
                
                $filename = $this->_produtoModel->{$key};
                $uploadPath = WWW_PATH . DIRECTORY_SEPARATOR . trim($col->getParam('target'), '/') . DIRECTORY_SEPARATOR;
                if (strlen($filename)) {
                    try {
                        if (file_exists($uploadPath . $filename) && is_writable($uploadPath . $filename))
                        unlink($uploadPath . $filename);
                        $sizes = $col->getParam('sizes');
                        foreach ($sizes as $size){
                            if (file_exists($uploadPath . $size . '_' . $filename) && is_writable($uploadPath . $size . '_' . $filename)) {
                                unlink($uploadPath . $size . '_' . $filename);
                            }
                        }
                    } catch (Exception $e) {
                    }
                }

            }
        }
        $this->_produtoModel->delete($produtoId);
        $this->listProdutoAction($categoriaId);
    }

    /**
     * Remove uma lista de produtos da bd
    */
    public function deletelistProdutoAction() {
        $ids = $this->_request->ids;
        if (!is_array($ids) || count($ids) == 0) {
            return $this->listProdutoAction();
        }

        $this->_imagemModel = Goweb::getModelInstance('Catalogo_Model_Imagem', 'db');
        $this->_ficheiroModel = Goweb::getModelInstance('Catalogo_Model_Ficheiro', 'db');
        $this->_elementModel = Goweb::getModelInstance('Catalogo_Model_Element', 'db');

        foreach ($ids as $id) {
            if ($this->_produtoModel->find($id)) {
                // fichas
                if ($this->_produtoModel->ficha_id > 0) {
                    $model = $this->_getFichaModel($this->_produtoModel->ficha_id);
                    $model->deleteWhere('produto_id=' . $id);
                }
                // imagens
                $this->_imagemModel->where('produto_id=' . $id);
                $rowset = $this->_imagemModel->fetchAll();
                if ($rowset) {
                    if (strpos($this->_imagemModel->getColParam('imagem', 'target'), '/', 0) === 0) {
                        $uploadPath = WWW_PATH . DIRECTORY_SEPARATOR . trim($this->_imagemModel->getColParam('imagem', 'target'), '/') . DIRECTORY_SEPARATOR;
                    } else {
                        $uploadPath = WWW_PATH . DIRECTORY_SEPARATOR . 'www' . DIRECTORY_SEPARATOR . 'uploads' . DIRECTORY_SEPARATOR . trim($this->_imagemModel->getColParam('imagem', 'target'), '/') . DIRECTORY_SEPARATOR;
                    }
                    foreach ($rowset as $row) {
                        $filename = $this->_imagemModel->imagem;
                        if (strlen($filename) && is_writable($uploadPath . $filename)) {
                            unlink($uploadPath . $filename);
                            if (file_exists($uploadPath . 'small_' . $filename)) {
                                unlink($uploadPath . 'small_' . $filename);
                            }

                            if (file_exists($uploadPath . 'medium_' . $filename)) {
                                unlink($uploadPath . 'medium_' . $filename);
                            }

                            if (file_exists($uploadPath . 'big_' . $filename)) {
                                unlink($uploadPath . 'big_' . $filename);
                            }
                        }
                    }
                    $this->_imagemModel->deleteWhere('produto_id=' . $id);
                }

                // ficheiros
                $rowset = $this->_ficheiroModel->fetchAll();
                if ($rowset) {
                    if (strpos($this->_ficheiroModel->getColParam('ficheiro', 'target'), '/', 0) === 0) {
                        $uploadPath = WWW_PATH . DIRECTORY_SEPARATOR . trim($this->_ficheiroModel->getColParam('ficheiro', 'target'), '/') . DIRECTORY_SEPARATOR;
                    } else {
                        $uploadPath = WWW_PATH . DIRECTORY_SEPARATOR . 'www' . DIRECTORY_SEPARATOR . 'uploads' . DIRECTORY_SEPARATOR . trim($this->_ficheiroModel->getColParam('ficheiro', 'target')) . DIRECTORY_SEPARATOR;
                    }
                    foreach ($rowset as $row) {
                         $filename = $this->_ficheiroModel->ficheiro;
                        $this->_ficheiroModel->delete($row->id);
                        if (strlen($filename) && is_writable($uploadPath . $filename)) {
                            unlink($uploadPath . $filename);
                            if (file_exists($uploadPath . 'small_' . $filename)) {
                                unlink($uploadPath . 'small_' . $filename);
                            }

                            if (file_exists($uploadPath . 'medium_' . $filename)) {
                                unlink($uploadPath . 'medium_' . $filename);
                            }

                            if (file_exists($uploadPath . 'big_' . $filename)) {
                                unlink($uploadPath . 'big_' . $filename);
                            }
                        }
                    }
                    $this->_ficheiroModel->deleteWhere('produto_id=' . $id);
                }
                $this->_produtoModel->delete($id);
                $categoriaId = $this->_produtoModel->categoria_id;
            }
        }
        $this->_message = translateAdmin('O Produto foi removido com sucesso.');
        $this->listProdutoAction($categoriaId);
    }

    /**
     * Lista as Imagens de Produtos
     *
     * @param integer
    */
    public function listImagensAction($produtoId = null) {
        if (is_null($produtoId)) {
            $produtoId = $this->_getParam('produto_id');
            if (!$this->_validateId($produtoId) || !$this->_produtoModel->find($produtoId)) {
                return $this->listProdutoAction();
            }
        }
        $this->_links['list'] = '/catalogo/list_imagens/produto_id/' . $produtoId .'/';
        $this->_links['add'] = '/catalogo/add_imagem/produto_id/' . $produtoId .'/';
        $this->_links['edit'] = '/catalogo/edit_imagem/id/';
        $this->_links['delete'] = '/catalogo/delete_imagem/id/';
        $this->_links['deletelist'] = '/catalogo/deletelist_imagens/';

        $this->_imagemModel = Goweb::getModelInstance('Catalogo_Model_Imagem', 'db');
        Goweb::loadClass('Goweb_Admin_Section');
        $section = new Goweb_Admin_Section();
        $section->setTitle(translateAdmin('Imagens de Produtos'));
        $section->setTitleSingular(translateAdmin('Imagens de Produto'));
        $this->_imagemModel->where('produto_id=?', $produtoId);
        $section->setModel($this->_imagemModel);
        $section->setListCols(array('imagem', 'titulo', 'actualizado', 'criado'));
        $section->setSearchCols(array('titulo'));
        $section->setOrdering('criado');
        $this->view->links  = $this->_links;
        $this->view->action = translateAdmin('Listagem');
        $this->view->title  = $this->_title;
        $this->view->output = $this->_listGeneric($section, $this->view, false);
        $this->_helper->viewRenderer->setRender('base');
    }

    /**
     * Adiciona uma imagem ao produto
     *
     * @param boolean
    */
    public function addImagemAction($cleanValues = false) {
        if (!$this->_validateId($this->_getParam('produto_id')) || !$this->_produtoModel->find($this->_getParam('produto_id'))) {
            return $this->listProdutoAction();
        }
        $this->_links['save'] = '/catalogo/save_imagem/produto_id/' . $this->_getParam('produto_id') . '/';

        Goweb::loadClass('Goweb_Admin_Section');
        $section = new Goweb_Admin_Section();
        $section->setTitle(translateAdmin('Imagem de Produtos'));
        $section->setTitleSingular(translateAdmin('Imagem de Produto: {{titulo}}', $this->_produtoModel->titulo));
        $this->_imagemModel = Goweb::getModelInstance('Catalogo_Model_Imagem', 'db');
        $this->_imagemModel->setColParam('imagem', 'notnull', true);
        $section->setModel($this->_imagemModel);
        $this->view->links = $this->_links;
        $this->view->action  = translateAdmin('Inser&ccedil;&atilde;o');
        $this->view->output = $this->_addGeneric($section, $this->view);
        $this->_helper->viewRenderer->setRender('base');
    }

    /**
     * Edita uma Imagens do Produto
    */
    public function editImagemAction() {
        $id = $this->_getParam('id');
        $this->_imagemModel = Goweb::getModelInstance('Catalogo_Model_Imagem', 'db');
        if (!$this->_validateId($id) || !$this->_imagemModel->find($id)) {
            return $this->listProdutoAction();
        }

        $this->_links['save'] = '/catalogo/save_imagem/id/' . $id . '/';
        $this->_links['delete'] = '/catalogo/delete_imagem/id/' . $id . '/';

        Goweb::loadClass('Goweb_Admin_Section');
        $section = new Goweb_Admin_Section();
        $section->setTitle(translateAdmin('Imagens de Produtos'));
        $section->setTitleSingular(translateAdmin('Imagem de Produto'));
        $section->setModel($this->_imagemModel);
        $this->view->id = $id;
        $this->view->links = $this->_links;
        $this->view->delete_link = $this->_links['delete'];
        $this->view->action  = translateAdmin('Edi&ccedil;&atilde;o');
        $this->view->output = $this->_editGeneric($section, $this->view, 'produto_id', $this->_imagemModel->produto_id);
        $this->_helper->viewRenderer->setRender('base');
    }

    /**
     * Salva uma Imagens do Produto
    */
    public function saveImagemAction() {
        $id = $this->_getParam('id');
        $this->_imagemModel = Goweb::getModelInstance('Catalogo_Model_Imagem', 'db');
        $this->_links['delete'] = '/catalogo/delete_imagem/id/';
        if ($id > 0) {
            if (!$this->_validateId($id) || !$this->_imagemModel->find($id)) {
                return $this->listProdutoAction();
            }
            $this->view->delete_link = $this->_links['delete'] . $id . '/';
            $this->view->id = $id;
            $tituloProduto = $this->_imagemModel->produto->titulo;
            $produtoId = $this->_imagemModel->produto_id;
            $this->_links['save'] = '/catalogo/save_imagem/produto_id/' . $this->_imagemModel->produto_id . '/';
        } else {
            $id = 0;
            if (!$this->_validateId($this->_getParam('produto_id')) || !$this->_produtoModel->find($this->_getParam('produto_id'))) {
                return $this->listProdutoAction();
            }
            $produtoId = $this->_getParam('produto_id');
            $tituloProduto = $this->_produtoModel->titulo;
            $this->_links['save'] = '/catalogo/save_imagem/produto_id/' . $this->_getParam('produto_id') . '/';

        }
        


        Goweb::loadClass('Goweb_Admin_Section');
        $section = new Goweb_Admin_Section();
        $section->setTitle(translateAdmin('Imagem de Produtos'));
        $section->setTitleSingular(translateAdmin('Imagem de Produto: {{titulo}}', $tituloProduto));
        $section->setModel($this->_imagemModel);
        $this->view->action  = translateAdmin('Gravar');
        $output = $this->_saveGeneric($section, $this->view, 'produto_id', $produtoId);

        if (is_bool($output)) {
            if ($this->_request->submit) {
                return $this->listImagensAction($produtoId);
            }
            if ($this->_request->submit_and_new) {
                return $this->addImagemAction(true);
            }
        }

        $this->view->links = $this->_links;
        $this->view->output = $output;
        $this->_helper->viewRenderer->setRender('base');
    }

    /**
     * Remove imagem do produto
    */
    public function deleteImagemAction() {
        $this->_imagemModel = Goweb::getModelInstance('Catalogo_Model_Imagem', 'db');
        if (!$this->_validateId($this->_getParam('id')) || !$this->_imagemModel->find($this->_getParam('id'))) {
            return $this->listProdutoAction();
        }
        $produtoId = $this->_imagemModel->produto_id;
        $this->_message = translateAdmin('A Imagem de Produto foi removida com sucesso.');
        Goweb::loadClass('Goweb_Admin_Section');
        $section = new Goweb_Admin_Section();
        $section->setTitle(translateAdmin('Imagens do Produtos'));
        $section->setTitleSingular(translateAdmin('Imagem do Produto'));
        $section->setModel($this->_imagemModel);
        $this->_deleteGeneric($section, $this->view, 'produto_id', $this->_imagemModel->produto_id);
        $this->listImagensAction($produtoId);
    }

    /**
     * Remove varias imagens do produto
    */
    public function deletelistImagensAction() {
        $this->_imagemModel = Goweb::getModelInstance('Catalogo_Model_Imagem', 'db');
        $ids = $this->_request->ids;
        if (count($ids) == 0) {
            return $this->listProdutoAction();
        }
        $firstId = $ids[0];
        if (!$this->_validateId($firstId) || !$this->_imagemModel->find($firstId)) {
            return $this->listProdutoAction();
        }
        $produtoId = $this->_imagemModel->produto_id;
        $this->_message = translateAdmin('As Imagens de Produto seleccionadas foram removidas com sucesso.');
        Goweb::loadClass('Goweb_Admin_Section');
        $section = new Goweb_Admin_Section();
        $section->setTitle(translateAdmin('Imagens do Produtos'));
        $section->setTitleSingular(translateAdmin('Imagem do Produto'));
        $section->setModel($this->_imagemModel);
        $this->_deletelistGeneric($section, $this->view, 'produto_id', $this->_imagemModel->produto_id);
        $this->listImagensAction($produtoId);
    }

    /**
     * Listagem dos ficheiros do produto
     *
     * @param integer
    */
    public function listFicheirosAction($produtoId = null) {
        if (is_null($produtoId)) {
            $produtoId = $this->_getParam('produto_id');
            if (!$this->_validateId($produtoId) || !$this->_produtoModel->find($produtoId)) {
                return $this->listProdutoAction();
            }
        }
        $this->_links['list'] = '/catalogo/list_ficheiros/produto_id/' . $produtoId .'/';
        $this->_links['add'] = '/catalogo/add_ficheiro/produto_id/' . $produtoId .'/';
        $this->_links['edit'] = '/catalogo/edit_ficheiro/id/';
        $this->_links['delete'] = '/catalogo/delete_ficheiro/id/';
        $this->_links['deletelist'] = '/catalogo/deletelist_ficheiros/';

        $this->_ficheiroModel = Goweb::getModelInstance('Catalogo_Model_Ficheiro', 'db');
        Goweb::loadClass('Goweb_Admin_Section');
        $section = new Goweb_Admin_Section();
        $section->setTitle(translateAdmin('Ficheiros de Produtos'));
        $section->setTitleSingular(translateAdmin('Ficheiros de Produto'));
        $this->_ficheiroModel->where('produto_id=?', $produtoId);
        $section->setModel($this->_ficheiroModel);
        $section->setListCols(array('ficheiro', 'titulo', 'actualizado', 'criado'));
        $section->setSearchCols(array('titulo'));
        $section->setOrdering('criado');
        $this->view->links  = $this->_links;
        $this->view->action = translateAdmin('Listagem');
        $this->view->title  = $this->_title;
        $this->view->output = $this->_listGeneric($section, $this->view, false);
        $this->_helper->viewRenderer->setRender('base');
    }

    /**
     * Adiciona um ficheiro a um produto
     *
     * @param boolean
    */
    public function addFicheiroAction($cleanValues = false) {
        if (!$this->_validateId($this->_getParam('produto_id')) || !$this->_produtoModel->find($this->_getParam('produto_id'))) {
            return $this->listProdutoAction();
        }
        $this->_links['save'] = '/catalogo/save_ficheiro/produto_id/' . $this->_getParam('produto_id') . '/';

        Goweb::loadClass('Goweb_Admin_Section');
        $section = new Goweb_Admin_Section();
        $section->setTitle(translateAdmin('Ficheiro de Produtos'));
        $section->setTitleSingular(translateAdmin('Ficheiro de Produto: {{titulo}}', $this->_produtoModel->titulo));
        $this->_ficheiroModel = Goweb::getModelInstance('Catalogo_Model_Ficheiro', 'db');
        $this->_ficheiroModel->setColParam('ficheiro', 'notnull', true);
        $section->setModel($this->_ficheiroModel);
        $this->view->links = $this->_links;
        $this->view->action  = translateAdmin('Inser&ccedil;&atilde;o');
        $this->view->output = $this->_addGeneric($section, $this->view);
        $this->_helper->viewRenderer->setRender('base');
    }

    /**
     * Edita Ficheiro do Produto
    */
    public function editFicheiroAction() {
        $id = $this->_getParam('id');
        $this->_ficheiroModel = Goweb::getModelInstance('Catalogo_Model_Ficheiro', 'db');
        if (!$this->_validateId($id) || !$this->_ficheiroModel->find($id)) {
            return $this->listProdutoAction();
        }

        $this->_links['save'] = '/catalogo/save_ficheiro/id/' . $id . '/';
        $this->_links['delete'] = '/catalogo/delete_ficheiro/id/' . $id . '/';

        Goweb::loadClass('Goweb_Admin_Section');
        $section = new Goweb_Admin_Section();
        $section->setTitle(translateAdmin('Ficheiros de Produtos'));
        $section->setTitleSingular(translateAdmin('Ficheiro de Produto'));
        $section->setModel($this->_ficheiroModel);
        $this->view->id = $id;
        $this->view->links = $this->_links;
        $this->view->delete_link = $this->_links['delete'];
        $this->view->action  = translateAdmin('Edi&ccedil;&atilde;o');
        $this->view->output = $this->_editGeneric($section, $this->view, 'produto_id', $this->_ficheiroModel->produto_id);
        $this->_helper->viewRenderer->setRender('base');
    }

    /**
     * Salva Ficheiro do Produto
    */
    public function saveFicheiroAction() {
        $id = $this->_getParam('id');
        $this->_ficheiroModel = Goweb::getModelInstance('Catalogo_Model_Ficheiro', 'db');
        $this->_links['delete'] = '/catalogo/delete_ficheiro/id/';
        if ($id > 0) {
            if (!$this->_validateId($id) || !$this->_ficheiroModel->find($id)) {
                return $this->listProdutoAction();
            }
            $this->view->delete_link = $this->_links['delete'] . $id . '/';
            $this->view->id = $id;
            $tituloProduto = $this->_ficheiroModel->produto->titulo;
            $produtoId = $this->_ficheiroModel->produto_id;
            $this->_links['save'] = '/catalogo/save_ficheiro/produto_id/' . $this->_ficheiroModel->produto_id . '/id/' . $id . '/';
        } else {
            $id = 0;
            if (!$this->_validateId($this->_getParam('produto_id')) || !$this->_produtoModel->find($this->_getParam('produto_id'))) {
                return $this->listProdutoAction();
            }
            $produtoId = $this->_getParam('produto_id');
            $tituloProduto = $this->_produtoModel->titulo;
            $this->_links['save'] = '/catalogo/save_ficheiro/produto_id/' . $this->_getParam('produto_id') . '/';

        }
        
        Goweb::loadClass('Goweb_Admin_Section');
        $section = new Goweb_Admin_Section();
        $section->setTitle(translateAdmin('Ficheiro de Produtos'));
        $section->setTitleSingular(translateAdmin('Ficheiro de Produto: {{titulo}}', $tituloProduto));
        $section->setModel($this->_ficheiroModel);
        $this->view->action  = translateAdmin('Gravar');
        $output = $this->_saveGeneric($section, $this->view, 'produto_id', $produtoId);

        if (is_bool($output)) {
            if ($this->_request->submit) {
                return $this->listFicheirosAction($produtoId);
            }
            if ($this->_request->submit_and_new) {
                return $this->addFicheiroAction(true);
            }
        }

        $this->view->links = $this->_links;
        $this->view->output = $output;
        $this->_helper->viewRenderer->setRender('base');
    }

    /**
     * Remove Ficheiro do Produto
    */
    public function deleteFicheiroAction() {
        $this->_ficheiroModel = Goweb::getModelInstance('Catalogo_Model_Ficheiro', 'db');
        if (!$this->_validateId($this->_getParam('id')) || !$this->_ficheiroModel->find($this->_getParam('id'))) {
            return $this->listProdutoAction();
        }
        $produtoId = $this->_ficheiroModel->produto_id;
        $this->_message = translateAdmin('A Ficheiro de Produto foi removida com sucesso.');
        Goweb::loadClass('Goweb_Admin_Section');
        $section = new Goweb_Admin_Section();
        $section->setTitle(translateAdmin('Ficheiros do Produtos'));
        $section->setTitleSingular(translateAdmin('Ficheiro do Produto'));
        $section->setModel($this->_ficheiroModel);
        $this->_deleteGeneric($section, $this->view, 'produto_id', $this->_ficheiroModel->produto_id);
        $this->listFicheirosAction($produtoId);
    }

    /**
     * Remove varios Ficheiros do Produto
    */
    public function deletelistFicheirosAction() {
        $this->_ficheiroModel = Goweb::getModelInstance('Catalogo_Model_Ficheiro', 'db');
        $ids = $this->_request->ids;
        if (count($ids) == 0) {
            return $this->listProdutoAction();
        }
        $firstId = $ids[0];
        if (!$this->_validateId($firstId) || !$this->_ficheiroModel->find($firstId)) {
            return $this->listProdutoAction();
        }
        $produtoId = $this->_ficheiroModel->produto_id;
        $this->_message = translateAdmin('As Ficheiros de Produto seleccionadas foram removidas com sucesso.');
        Goweb::loadClass('Goweb_Admin_Section');
        $section = new Goweb_Admin_Section();
        $section->setTitle(translateAdmin('Ficheiros do Produtos'));
        $section->setTitleSingular(translateAdmin('Ficheiro do Produto'));
        $section->setModel($this->_ficheiroModel);
        $this->_deletelistGeneric($section, $this->view, 'produto_id', $this->_ficheiroModel->produto_id);
        $this->listFicheirosAction($produtoId);
    }

    /**
     * Listagem das fichas do catalogo
    */
    public function listFichasAction() {
        $this->_links['list']       = '/catalogo/list_fichas/ficha_id/'; 
        $this->_links['elements']   = '/catalogo/list_elements/ficha_id/';
        $this->_links['edit']       = '/catalogo/edit_ficha/id/';
        $this->_links['add']        = '/catalogo/add_ficha/';
        $this->_links['delete']     = '/catalogo/delete_ficha/id/';
        $this->_links['deletelist'] = '/catalogo/deletelist_fichas/';

        $this->_fichaModel = Goweb::getModelInstance('Catalogo_Model_Ficha', 'db');

        Goweb::loadClass('Goweb_Admin_Section');
        $section = new Goweb_Admin_Section();
        $section->setTitle(translateAdmin('Fichas de Produtos'));
        $section->setTitleSingular(translateAdmin('Ficha de Produto'));
        $section->setModel($this->_fichaModel);
        $section->setListCols(array('titulo', 'criado'));
        $section->setSearchCols(array('titulo'));
        $section->setOrdering('titulo');

        $this->view->sections = $this->_sections;
        $this->view->links = $this->_links;
        $this->view->action  = translateAdmin('Listagem');
        $this->view->setViewsPath(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'views');
        $this->view->output = $this->_listGeneric($section, $this->view, false, 'list_fichas.tpl');
        $this->view->setViewsPath(GENERIC_VIEWS_PATH);
        $this->view->section_title = $section->getTitle();
        $this->_helper->viewRenderer->setRender('base');
    }

    /**
     * Adiciona fichas ao catalogo
     *
     * @param boolean
    */
    public function addFichaAction($cleanValues = false) {
        $this->_links['save'] = '/catalogo/save_ficha/';

        $this->_fichaModel = Goweb::getModelInstance('Catalogo_Model_Ficha', 'db');
        $this->_elementModel = Goweb::getModelInstance('Catalogo_Model_Element', 'db');

        Goweb::loadClass('Goweb_Admin_Section');
        $section = new Goweb_Admin_Section();
        $section->setTitle(translateAdmin('Fichas de Produtos'));
        $section->setTitleSingular(translateAdmin('Ficha de Produto'));
        $section->setModel($this->_fichaModel);

        $this->view->sections = $this->_sections;
        $this->view->links = $this->_links;
        $this->view->action  = translateAdmin('Inser&ccedil;&atilde;o');
        $this->view->output = $this->_addGeneric($section, $this->view, null, null, $cleanValues, true, false);
        $this->view->section_title = $section->getTitle();
        $this->_helper->viewRenderer->setRender('base');
    }

    /**
     * Edita fichas do catalogo
    */
    public function editFichaAction() {
        $this->_links['save'] = '/catalogo/save_ficha/id/' . $this->_getParam('id') . '/';

        $this->_fichaModel = Goweb::getModelInstance('Catalogo_Model_Ficha', 'db');
        $this->_elementModel = Goweb::getModelInstance('Catalogo_Model_Element', 'db');

        if (!$this->_validateId($this->_getParam('id')) || !$this->_fichaModel->find($this->_getParam('id'))) {
            return $this->listProdutoAction();
        }

        Goweb::loadClass('Goweb_Admin_Section');
        $section = new Goweb_Admin_Section();
        $section->setTitle(translateAdmin('Fichas de Produtos'));
        $section->setTitleSingular(translateAdmin('Ficha de Produto'));
        $section->setModel($this->_fichaModel);

        $this->view->sections = $this->_sections;
        $this->view->links = $this->_links;
        $this->view->action  = translateAdmin('Edi&ccedil;&atilde;o');
        $this->view->output = $this->_editGeneric($section, $this->view);
        $this->view->section_title = $section->getTitle();
        $this->_helper->viewRenderer->setRender('base');
    }

    /**
     * Salva fichas do catalogo
    */
    public function saveFichaAction() {
        $this->_links['save'] = '/catalogo/save_ficha/';
        if ($this->_getParam('id') > 0) {
            $this->_links['save'] .= 'id/' . $this->_getParam('id') . '/';
        }

        $this->_fichaModel = Goweb::getModelInstance('Catalogo_Model_Ficha', 'db');
        $this->_elementModel = Goweb::getModelInstance('Catalogo_Model_Element', 'db');

        Goweb::loadClass('Goweb_Admin_Section');
        $section = new Goweb_Admin_Section();
        $section->setTitle(translateAdmin('Fichas de Produtos'));
        $section->setTitleSingular(translateAdmin('Ficha de Produto'));
        $section->setModel($this->_fichaModel);
        $this->view->action  = translateAdmin('Gravar');
        $createFlag = false;
        if (!$this->_fichaModel->find($this->_getParam('id'))) {
            $createFlag = true;
        }
        $output = $this->_saveGeneric($section, $this->view);
        if ($createFlag) {
            $this->_createTable($this->_fichaModel->id);
        }
        if (is_bool($output)) {
            if ($this->_request->submit) {
                return $this->listFichasAction();
            }
            if ($this->_request->submit_and_new) {
                return $this->addFichaAction(true);
            }
        }

        $this->view->sections = $this->_sections;
        $this->view->links = $this->_links;
        $this->view->output = $output;
        $this->view->section_title = $section->getTitle();
        $this->_helper->viewRenderer->setRender('base');
    }

    /**
     * Remove uma ficha do catalogo
    */
    public function deleteFichaAction() {
        $id = $this->_getParam('id');
        $this->_fichaModel = Goweb::getModelInstance('Catalogo_Model_Ficha', 'db');
        $this->_elementModel = Goweb::getModelInstance('Catalogo_Model_Element', 'db');
        if (!$this->_validateId($id) || !$this->_fichaModel->find($id)) {
            return $this->listProdutoAction();
        }

        $db = $this->_produtoModel->getAdapter();
        $query = 'SELECT COUNT(*) FROM ' . $this->_produtoModel->getTableName() . ' WHERE ficha_id=?';
        if ($db->fetchOne($query, $id) > 0) {
            $this->_error = translateAdmin('A Ficha n&atilde;o pode ser removida porque tem Produtos associados.');
            return $this->listFichasAction();
        }

        $this->_message = translateAdmin('A Ficha de Produto foi removida com sucesso.');
        // apaga a tabela de fichas
        $this->_dropTable($this->_fichaModel->id);
        // apaga todos elementos com o ID da ficha
        $this->_elementModel->deleteWhere("ficha_id='$id'");
        // apaga a ficha
        $this->_fichaModel->delete();
        $this->listFichasAction();
    }

    /**
     * Remove varias fichas do catalogo
    */
    public function deletelistFichasAction() {
        $ids = $this->_request->ids;
        $this->_fichaModel = Goweb::getModelInstance('Catalogo_Model_Ficha', 'db');
        $this->_elementModel = Goweb::getModelInstance('Catalogo_Model_Element', 'db');
        if (count($ids) == 0) {
            return $this->listProdutoAction();
        }

        $db = $this->_produtoModel->getAdapter();
        $query = 'SELECT COUNT(*) FROM ' . $this->_produtoModel->getTableName() . ' WHERE ficha_id=?';

        foreach ($ids as $id) {
            if ($this->_fichaModel->find($id)) {
                if ($db->fetchOne($query, $id) > 0) {
                    $this->_error = translateAdmin('A Ficha n&atilde;o pode ser removida porque tem Produtos associados.');
                    return $this->listFichasAction();
                }
                // apaga a tabela de fichas
                $this->_dropTable($this->_fichaModel->id);
                // apaga todos elementos com o ID da ficha
                $this->_elementModel->deleteWhere("ficha_id='$id'");
                // apaga a ficha
                $this->_fichaModel->delete();
            }
        }
        $this->_message = translateAdmin('As Fichas de Produto seleccionadas foram removidas com sucesso.');
        $this->listFichasAction();
    }

    /**
     * Listagem dos campos das fichas dos produtos
     *
     * @param integer
    */
    public function listElementsAction($fichaId = null) {
        if (!$fichaId) {
            $fichaId = $this->_getParam('ficha_id');
        }

        $this->_fichaModel = Goweb::getModelInstance('Catalogo_Model_Ficha', 'db');
        $this->_elementModel = Goweb::getModelInstance('Catalogo_Model_Element', 'db');

        $this->_links['add'] = '/catalogo/add_element/ficha_id/' . $fichaId . '/';
        $this->_links['edit'] = '/catalogo/edit_element/id/';
        $this->_links['delete'] = '/catalogo/delete_element/id/';
        $this->_links['deletelist'] = '/catalogo/deletelist_elements/';
        $this->_links['list'] = '/catalogo/list_elements/ficha_id/' . $fichaId . '/';
        $this->_links['save_ordem'] = 'gowebSubmitListOrder("'.$this->view->link("/catalogo/save-elements-ordem/").'");';
        if (!$this->_validateId($fichaId) || !$this->_fichaModel->find($fichaId)) {
            return $this->listProdutoAction();
        }
        $this->_elementModel->where($this->_elementModel->getTableName() . '.ficha_id=?', $fichaId);
        $this->view->elements_types = $this->_elementModel->getElementsTypes();
        Goweb::loadClass('Goweb_Admin_Section');
        $section = new Goweb_Admin_Section();
        $section->setTitle(translateAdmin('Campos'));
        $section->setTitleSingular(translateAdmin('Campo'));
        $section->setModel($this->_elementModel);
        $section->setListCols(array('label', 'ficha', 'actualizado', 'criado'));
        $section->setSearchCols(array('titulo'));
        $section->setOrdering(array('ordem', '-criado'));

        $this->view->sections = $this->_sections;
        $this->view->links = $this->_links;
        $this->view->action  = translateAdmin('Listagem');
        $this->view->setViewsPath(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'views');
        $this->view->output = $this->_listGeneric($section, $this->view, false, 'list_elements.tpl');
        $this->view->setViewsPath(GENERIC_VIEWS_PATH);
        $this->view->section_title = $section->getTitle();
        $this->_helper->viewRenderer->setRender('base');
    }

    /**
     * Gravar a ordem dos elementos
     *
     * @return null
     */
    public function saveElementsOrdemAction(){
        $this->_helper->viewRenderer->setNoRender();
        if (!$this->_request->isAjax()) return false;
        $this->_elementModel = Goweb::getModelInstance('Catalogo_Model_Element', 'db');
        parse_str($this->_request->data, $ordemList);
        foreach (current($ordemList) as $ordem => $id){
            if ($this->_validateId($id) && $this->_elementModel->find($id)){
                $this->_elementModel->ordem = $ordem;
                $this->_elementModel->save();
            }
        }
    }

    /**
     * Adiciona campos a ficha de produto
     *
     * @param integer
     * @param integer
    */
    public function addElementAction($fichaId = null, $element = null) {
        if (!$fichaId) {
            $fichaId = $this->_getParam('ficha_id');
        }
        if (!$element) {
            $element = $this->_request->element;
            if (!$element) $element = $this->_getParam('element');
        }

        $this->_fichaModel = Goweb::getModelInstance('Catalogo_Model_Ficha', 'db');
        $this->_elementModel = Goweb::getModelInstance('Catalogo_Model_Element', 'db');

        $this->_links['save'] = '/catalogo/save_element/ficha_id/' . $fichaId . '/';
        if (!$this->_validateId($fichaId) || !$this->_fichaModel->find($fichaId)) {
            return $this->listProdutoAction();
        }
        $elementsTypes = $this->_elementModel->getElementsTypes();
        if (!$element || !array_key_exists($element, $elementsTypes)) {
            return $this->listProdutoAction();
        }
        $elementForm = 'Form_' . ucfirst($element);
        Goweb::loadClass($elementForm, ADMIN_PATH . DIRECTORY_SEPARATOR . 'Catalogo');
        $form = new $elementForm($this->_section, Goweb::link($this->_links['save']));
        $form->setModel($this->_elementModel);
        $form->setup();
        $form->addHidden('element', $element);
        $form->render();


        $this->view->sections = $this->_sections;
        $this->view->links = $this->_links;
        $this->view->error = $this->_error;
        $this->view->message = $this->_message;
        $this->view->model = $this->_elementModel;
        $this->view->form = $form;
        $this->view->action  = translateAdmin('Inser&ccedil;&atilde;o');
        $this->view->title   = $this->_title;
        $this->view->section = translateAdmin('Campos');
        $this->view->section_singular = translateAdmin('Campo');
        $this->view->output = $this->view->render('form.tpl');
        $this->view->section_title = translateAdmin('Campos');
        $this->_helper->viewRenderer->setRender('base');
    }

    /**
     * Edita campos da ficha do produto
    */
    public function editElementAction() {
        $id = $this->_getParam('id');

        $this->_fichaModel = Goweb::getModelInstance('Catalogo_Model_Ficha', 'db');
        $this->_elementModel = Goweb::getModelInstance('Catalogo_Model_Element', 'db');

        $this->_links['save'] = '/catalogo/save_element/id/' . $id . '/';
        if (!$this->_validateId($id) || !$this->_elementModel->find($id)) {
            return $this->listProdutoAction();
        }
        $elementForm = 'Form_' . ucfirst($this->_elementModel->element);
        Goweb::loadClass($elementForm, ADMIN_PATH . DIRECTORY_SEPARATOR . 'Catalogo');
        $form = new $elementForm($this->_section, Goweb::link($this->_links['save']));
        $form->setModel($this->_elementModel);
        $form->setup();
        $form->label->value = $this->_elementModel->label;
        $form->ordem->value = $this->_elementModel->ordem;
        if ($form->elementExists('required')){
            $form->required->value = $this->_elementModel->required;
        }
        
        if ($this->_elementModel->element == 'text') {
            $form->size->value = $this->_elementModel->size;
            if (strlen($this->_elementModel->validators)) {
                $validators = unserialize($this->_elementModel->validators);
                $form->validators->value = $validators;
            }
        }
        if ($this->_elementModel->element == 'textarea') {
            $form->cols->value = $this->_elementModel->cols;
            $form->rows->value = $this->_elementModel->rows;
        }
        if ($this->_elementModel->element == 'select') {
            $form->multiple->value = $this->_elementModel->multiple;
            $form->rows->value = $this->_elementModel->rows;
        }
        if (strlen($this->_elementModel->options)) {
            $options = strpos($this->_elementModel->options, 'a:') === 0 ? unserialize($this->_elementModel->options) : $this->_elementModel->options;
            if (is_array($options)) {
                $form->options->value = implode("\n", $options);
            } elseif (strlen($options)) {
                $form->options->value = $options;
            }
        }

        $this->view->sections = $this->_sections;
        $this->view->links = $this->_links;
        $this->view->error = $this->_error;
        $this->view->message = $this->_message;
        $form->render();
        $this->view->model = $this->_elementModel;
        $this->view->form = $form;
        $this->view->action  = translateAdmin('Edi&ccedil;&atilde;o');
        $this->view->title   = $this->_title;
        $this->view->section = translateAdmin('Campos');
        $this->view->section_singular = translateAdmin('Campo');
        $this->view->output = $this->view->render('form.tpl');
        $this->view->section_title = translateAdmin('Campos');
        $this->_helper->viewRenderer->setRender('base');
    }

    /**
     * Salva campos da ficha do produto
    */
    public function saveElementAction() {
        $id = $this->_getParam('id');
        $fichaId = $this->_getParam('ficha_id');

        $this->_fichaModel = Goweb::getModelInstance('Catalogo_Model_Ficha', 'db');
        $this->_elementModel = Goweb::getModelInstance('Catalogo_Model_Element', 'db');

        $elementsTypes = $this->_elementModel->getElementsTypes();
        $element = $this->_request->element;
        $action = translateAdmin('Inser&ccedil;&atilde;o');
        if ($this->_validateId($id) && $this->_elementModel->find($id)) {
            $this->_links['save'] = '/catalogo/save_element/id/' . $id . '/';
            $element = $this->_elementModel->element;
            $action = translateAdmin('Edi&ccedil;&atilde;o');
        } elseif (!$this->_validateId($fichaId) || !$this->_fichaModel->find($fichaId) || !$element || !array_key_exists($element, $elementsTypes)) {
            return $this->listProdutoAction();
        } else {
            $this->_links['save'] = '/catalogo/save_element/form_id/' . $fichaId . '/';
            $this->_elementModel->ficha_id = $fichaId;
            $this->_elementModel->element = $element;
        }
        $elementForm = 'Form_' . ucfirst($element);
        Goweb::loadClass($elementForm, ADMIN_PATH . DIRECTORY_SEPARATOR . 'Catalogo');
        $form = new $elementForm($this->_section, Goweb::link($this->_links['save']));
        $form->setModel($this->_elementModel);
        $form->setup();
        $form->addHidden('element', $element);

        if (!$form->validate()) {
            if (count($form->getErrorMessages()) > 1) {
                $this->_error = translateAdmin('Corrija por favor os erros no formul&aacute;rio');
            } else {
                $this->_error = translateAdmin('Corrija por favor o erro no formul&aacute;rio');
            }
        } else {
            $this->_elementModel->label = $form->label->value;
            $this->_elementModel->ordem = $form->ordem->value;
            if ($element != 'separator') {
                $this->_elementModel->required = $form->required->value;
            }
            if ($element == 'text') {
                $this->_elementModel->size = $form->size->value;
                $validators = serialize($form->validators->value);
                $this->_elementModel->validators = serialize($form->validators->value);
                if ($this->_elementModel->colExists('email') && $form->elementExists('email')){
                    $this->_elementModel->email = $form->email->value;
                }
            }
            if ($element == 'textarea') {
                $this->_elementModel->cols = $form->cols->value;
                $this->_elementModel->rows = $form->rows->value;
            }
            if ($element == 'select') {
                $this->_elementModel->multiple = $form->multiple->value;
                $this->_elementModel->rows = $form->rows->value;
                $this->_elementModel->options = trim($form->options->value);
            }
            if ($element == 'combo') {
                $this->_elementModel->db_type          = $form->db_type->value;
                $this->_elementModel->db_host          = $form->db_host->value;
                $this->_elementModel->db_user          = $form->db_user->value;
                $this->_elementModel->db_pass          = $form->db_pass->value;
                $this->_elementModel->db_name          = $form->db_name->value;
                $this->_elementModel->db_table         = $form->db_table->value;
                $this->_elementModel->db_table_value   = $form->db_table_value->value;
                $this->_elementModel->db_table_desc    = $form->db_table_desc->value;
                $this->_elementModel->clausulas_extras = $form->clausulas_extras->value;
            }
            if ($element == 'checkbox') {
                $this->_elementModel->multiple = $form->multiple->value;
                $this->_elementModel->options = trim($form->options->value);
            }
            if ($element == 'radio') {
                $this->_elementModel->options = trim($form->options->value);
            }
            $this->_elementModel->save();
            if ($this->_validateId($id)) {
                $this->_message = translateAdmin('O Campo foi actualizado com sucesso.');
            } else {
                $this->_addCol();
                $this->_message = translateAdmin('O Campo foi inserido com sucesso.');
            }
            if ($this->_request->submit) {
                return $this->listElementsAction($this->_elementModel->ficha_id);
            }
            if ($this->_request->submit_and_new) {
                //return $this->addElementAction(true, $this->_elementModel->ficha_id, $this->_elementModel->element);
                
                $this->_request->setParam('ficha_id', $this->_elementModel->ficha_id);
                $this->_request->setParam('element', $this->_elementModel->element);
                return $this->addElementAction();
            }

            $form->setAction('/catalogo/save_element/id/' . $this->_elementModel->id . '/');
        }
        $form->render();

        $this->view->sections = $this->_sections;
        $this->view->links = $this->_links;
        $this->view->error = $this->_error;
        $this->view->message = $this->_message;
        $this->view->model = $this->_elementModel;
        $this->view->form = $form;
        $this->view->action  = $action;
        $this->view->title   = $this->_title;
        $this->view->section = translateAdmin('Campos');
        $this->view->section_singular = translateAdmin('Campo');
        $this->view->error = $this->_error;
        $this->view->message = $this->_message;
        $this->view->output = $this->view->render('form.tpl');
        $this->view->section_title = translateAdmin('Campos');
        $this->_helper->viewRenderer->setRender('base');
    }

    /**
     * Remove um campo da ficha do produto
    */
    public function deleteElementAction() {
        $id = $this->_getParam('id');

        $this->_elementModel = Goweb::getModelInstance('Catalogo_Model_Element', 'db');

        if (!$this->_validateId($id) || !$this->_elementModel->find($id)) {
            return $this->listProdutoAction();
        }
        $this->_message = translateAdmin('O Campo foi removido com sucesso.');
        $fichaId = $this->_elementModel->ficha_id;
        $this->_dropCol();
        $this->_elementModel->delete();
        return $this->listElementsAction($fichaId);
    }

    /**
     * Remove varios campos da ficha do produto
    */
    public function deletelistElementsAction() {
        $ids = $this->_request->ids;
        $this->_elementModel = Goweb::getModelInstance('Catalogo_Model_Element', 'db');
        if (count($ids) == 0) {
            return $this->listProdutoAction();
        }
        $firstId = $ids[0];
        if (!$this->_validateId($firstId) || !$this->_elementModel->find($firstId)) {
            return $this->listProdutoAction();
        }
        $fichaId = $this->_elementModel->ficha_id;
        $this->_message = translateAdmin('Os campos da Ficha de Produto seleccionadas foram removidos com sucesso.');

        foreach ($ids as $id) {
            if ($this->_elementModel->find($id)) {
                $this->_dropCol();
                $this->_elementModel->delete();
            }
        }
        return $this->listElementsAction($fichaId);
    }

    /**
     * Cria uma tabela para a nova ficha do produto
     *
     * @param integer
     */
    protected function _createTable($fichaId) {
        $model = $this->_getFichaModel($fichaId);
        $sql = $model->createTableSql();
        foreach ($model->getLangs() as $lang) {
            $lang = preg_replace('/([^a-z0-9_])/i', '_', $lang);
            $tables = $model->getAdapter()->listTables();
            if (!in_array('catalogo_ficha_id_' . $fichaId . '_' . $lang, $tables)) {
                $tableName = 'catalogo_ficha_id_' . $fichaId . '_' . $lang;
                $model->getAdapter()->query($sql[$tableName]['sql']);
                if (array_key_exists('indexes', $sql[$tableName])) {
                    foreach ($sql[$tableName]['indexes'] as $index) {
                        $model->getAdapter()->query($index);
                    }
                }
            }
        }
    }

    /**
     * Remove uma tabela da bd
     *
     * @param integer
    */
    protected function _dropTable($fichaId) {
        $db = $this->_elementModel->getAdapter();
        if (!$this->_dbAdapter) {
            $adapterType = 'Goweb_Db_Model_Adapter_' . ucfirst(substr(get_class($db), strrpos(get_class($db), '_')+1));
            Goweb::loadClass($adapterType);
            $this->_dbAdapter = new $adapterType();
        }
        $tables = $db->listTables();
        foreach ($this->_fichaModel->getLangs() as $lang) {
            $lang = preg_replace('/([^a-z0-9_])/i', '_', $lang);
            if (in_array('catalogo_ficha_id_' . $this->_elementModel->ficha_id . '_' . $lang, $tables)) {
                $sql = $this->_dbAdapter->getDropTable(true) . ' catalogo_ficha_id_' . $fichaId . '_' . $lang;
                $db->query($sql);
            }
        }
    }

    /**
     * Adiciona uma coluna a uma tabela
    */
    protected function _addCol() {
        $db = $this->_elementModel->getAdapter();
        if (!$this->_dbAdapter) {
            $adapterType = 'Goweb_Db_Model_Adapter_' . ucfirst(substr(get_class($db), strrpos(get_class($db), '_')+1));
            Goweb::loadClass($adapterType);
            $this->_dbAdapter = new $adapterType();
        }

        $params = array('notnull' => null,
                        'default' => null,
                        'maxlength' => null);
        $colType = '';
        if ($this->_elementModel->element == 'text'     ||
            $this->_elementModel->element == 'checkbox' ||
            $this->_elementModel->element == 'radio'    ||
            $this->_elementModel->element == 'select'   ||
            $this->_elementModel->element == 'combo'    ||
            $this->_elementModel->element == 'file'     ||
            $this->_elementModel->element == 'image'     ||
            $this->_elementModel->element == 'separator') {
            $method = 'getChar';
            $params['maxlength'] = '255';
        } elseif ($this->_elementModel->element == 'textarea') {
            $method = 'getText';
        }
        $params['notnull'] = false;
        $tables = $db->listTables();
        foreach ($this->_elementModel->getLangs() as $lang) {
            $lang = preg_replace('/([^a-z0-9_])/i', '_', $lang);
            if (!in_array('catalogo_ficha_id_' . $this->_elementModel->ficha_id . '_' . $lang, $tables)) {
                $this->_createTable($this->_elementModel->ficha_id);
            }
            if (!array_key_exists('element_' . $this->_elementModel->id, $db->describeTable('catalogo_ficha_id_' . $this->_elementModel->ficha_id . '_' . $lang))) {
                $sql = $this->_dbAdapter->getAddCol('catalogo_ficha_id_' . $this->_elementModel->ficha_id . '_' . $lang);
                $sql .= ' element_' . $this->_elementModel->id . ' ' . $this->_dbAdapter->{$method}($params);
                $db->query($sql);
            }
        }
    }

    /**
     * Remove uma coluna da tabela
    */
    protected function _dropCol() {
        $db = $this->_elementModel->getAdapter();
        if (!$this->_dbAdapter) {
            $adapterType = 'Goweb_Db_Model_Adapter_' . ucfirst(substr(get_class($db), strrpos(get_class($db), '_')+1));
            Goweb::loadClass($adapterType);
            $this->_dbAdapter = new $adapterType();
        }
        $tables = $db->listTables();
        foreach ($this->_elementModel->getLangs() as $lang) {
            $lang = preg_replace('/([^a-z0-9_])/i', '_', $lang);
            if (!in_array('catalogo_ficha_id_' . $this->_elementModel->ficha_id . '_' . $lang, $tables)) {
                $this->_createTable($this->_elementModel->ficha_id);
            }
            if (array_key_exists('element_' . $this->_elementModel->id, $db->describeTable('catalogo_ficha_id_' . $this->_elementModel->ficha_id . '_' . $lang))) {
                $sql = $this->_dbAdapter->getDropCol('catalogo_ficha_id_' . $this->_elementModel->ficha_id . '_' . $lang) . ' element_' . $this->_elementModel->id;
                $db->query($sql);
            }

        }
    }

    /**
     * Devolve o Model referente a uma determinada ficha do produto
     *
     * @param integer
     *
     * @return Catalogo_Model_Barebone
     */
    protected function _getFichaModel($fichaId) {
        Goweb::loadModel('Catalogo_Model_Barebone');
        $bareboneModel = new Catalogo_Model_Barebone($this->_elementModel->getAdapter());  
        if (!$bareboneModel instanceof Goweb_Form_Generic_Model_Barebone){
                return $this->_getFichaModelOld($fichaId);  
        }
        $bareboneModel->setup($fichaId);
        return $bareboneModel;
    }

    /**
     * Devolve o Model referente a uma determinada ficha do produto
     *
     * @param integer
     * @deprecated manter para compatibilidade com versões antigas
     *
     * @return Catalogo_Model_Barebone
     */
    protected function _getFichaModelOld($fichaId) {
        $bareboneModel = Goweb::getModelInstance('Catalogo_Model_Barebone', 'db');
        $bareboneModel->setTableName('catalogo_ficha_id_' . $fichaId . '_' . $bareboneModel->getLang());
        $bareboneModel->setTablePrefix('catalogo_ficha_id_' . $fichaId);
        $this->_elementModel->where($this->_elementModel->getTableName() . '.ficha_id=?', $fichaId);
        if ($this->_elementModel->colExists('ordem')){
            $this->_elementModel->order('ordem');
        }
        $rowset = $this->_elementModel->fetchAll();
        if (!$rowset) {
            return $bareboneModel;
        }
        foreach ($rowset as $row) {
            $params = array();
            $nome = 'element_' . $row->id;
            $params['label'] = $row->label;
            $params['notnull'] = false;
            if ($row->element == 'text') {
                if ($row->size > 0) {
                    $params['maxlength'] = $row->size;
                }
                $bareboneModel->{$nome} = $bareboneModel->Char($params);
            } elseif ($row->element == 'textarea') {
                $bareboneModel->{$nome} = $bareboneModel->Text($params);
            } else {
                // no caso de ser checkbox, radio ou select é guardado apenas o valor
                $params['maxlength'] = '200';
                $bareboneModel->{$nome} = $bareboneModel->Char($params);
            }
        }
        return $bareboneModel;
    }

    /**
     * Devolve um formulario de uma determinada ficha
     *
     * @param integer
     * @param integer
     * 
     * @return Goweb_Form
    */
    protected function _getFichaForm($fichaId) {
        Goweb::loadClass('Form_Barebone', dirname(__FILE__));
        $form = new Form_Barebone();
        if (!($form instanceof Goweb_Form_Generic_Barebone)){
            return $this->_getFichaFormOld($fichaId);
        }
        $form->setup($fichaId);
        $form->clearDecorators();
        return $form;
    }

    /**
     * Obtem o formulario de uma determinada ficha
     *
     * @param integer
     * @deprecated este método deve ser mantido até à proxima versão
     *
     * @return Goweb_Form
    */
    protected function _getFichaFormOld($fichaId) {
        $this->_elementModel->loadForeigns(false);
        $this->_elementModel->where($this->_elementModel->getTableName() . '.ficha_id=?', $fichaId);
        if ($this->_elementModel->colExists('ordem')){
            $this->_elementModel->order('ordem');
        }
        $elements = $this->_elementModel->fetchAll();
        Goweb::loadClass('Form_Barebone', dirname(__FILE__));
        $form = new Form_Barebone('ficha', '');
        $form->setup();
        if ($elements) {
            $availableValidators = $this->_elementModel->getValidators();
            foreach ($elements as $element) {
                $name = 'element_' . $element->id;
                $elementType = ucfirst($element->element);
                $form->{$name} = $form->{$elementType == 'Checkbox' ? 'MultiCheckbox' : $elementType}();
                $form->{$name}->label = $element->label;
                if ($element->element == 'text') {
                    if ($element->size > 0) {
                        $form->{$name}->size = $element->size;
                    }
                } elseif ($element->element == 'textarea') {
                    if ($element->rows > 0) {
                        $form->{$name}->rows = $element->rows;
                    }
                    if ($element->cols > 0) {
                        $form->{$name}->cols = $element->cols;
                    }
                } elseif ($element->element == 'checkbox' || $element->element == 'radio') {
                    if (strlen($element->options)) {
                        $options = strpos($this->_elementModel->options, 'a:') === 0 ? unserialize($this->_elementModel->options) : $this->_elementModel->options;
                        if (is_array($options)) {
                            $elementOptions = array();
                            foreach ($options as $option) {
                                $elementOptions[$option] = $option;
                            }
                            $form->{$name}->options = $elementOptions;
                        }
                    }
                } elseif ($element->element == 'select') {
                    if (strlen($element->options)) {
                        $options = strpos($this->_elementModel->options, 'a:') === 0 ? unserialize($this->_elementModel->options) : $this->_elementModel->options;
                        if (is_array($options)) {
                            $elementOptions = array();
                            foreach ($options as $option) {
                                $elementOptions[$option] = $option;
                            }
                            $form->{$name}->options = $elementOptions;
                        }
                    }
                    if ($element->multiple > 0) {
                        $form->{$name}->multiple = true;
                    }
                    if ($element->rows > 0) {
                        $form->{$name}->size = $element->rows;
                    }
                }
                // campo obrigatório
                if ($element->required > 0) {
                    $form->{$name}->validators->Required(translateAdmin('O campo <b>{{campo}}</b> &eacute; de preenchimento obrigat&oacute;rio.', $form->{$name}->label));
                }
                // validadores
                if (strlen($element->validators)) {
                    $validators = unserialize($element->validators);
                    if (is_array($validators)) {
                        foreach ($validators as $validator) {
                            if (array_key_exists($validator, $availableValidators)) {
                                $form->{$name}->validators->{$validator}(translateAdmin('O campo <b>{{campo}}</b> n&atilde;o &eacute; do tipo {{validator}}.', $form->{$name}->label, $availableValidators[$validator]));
                            }
                        }
                    }
                }
            }
        }
        $form->clearDecorators();
        return $form;
    }

    /**
     * Métodos Privados
     */
    protected function _getTreeObject($cleanModelParts = true) {
        if (is_dir(WWW_PATH.'/admin/media/js/dhtmlx/')){
            Goweb::loadClass('Goweb_Js_Dhtmlx_Tree');
            $tree = new Goweb_Js_Dhtmlx_Tree('categorias');
            $tree->setLink('/catalogo/treeDhtmlx/');
            $tree->setTitle(translateAdmin('Categorias'));
            goweb::loadCss('/admin/media/js/dhtmlx/dhtmlx.css');
            goweb::loadCss('/admin/media/css/dhtmlx.css');
            goweb::loadJavascript('/admin/media/js/dhtmlx/dhtmlx.js');
            goweb::loadJavascript('/admin/media/js/dhtmlx/connector.js');
            return $tree;
        }
        goweb::loadCss('/admin/media/css/dtree.css');
        goweb::loadJavascript('/admin/media/js/dtree.js');
        // cria o objecto Goweb_Js_Tree
        Goweb::loadClass('Goweb_Js_Tree');
        $tree = new Goweb_Js_Tree('categorias');
        $tree->setTitle(translateAdmin('Categorias'));

        // adiciona os parâmetros
        foreach ($this->_categoriasTreeParams as $param => $value) {
            $tree->{$param} = $value;
        }

        $nodesParams = $this->_categoriasNodesParams;

        // valida se foram passados os campos necessário para o node
        if (!array_key_exists('id', $nodesParams)) {
            throw new Goweb_Exception("O campo 'id' &eacute; necess&aacute;rio nos par&aacute;metros dos nodes.");
        }
        if (!array_key_exists('pid', $nodesParams)) {
            throw new Goweb_Exception("O campo 'pid' &eacute; necess&aacute;rio nos par&aacute;metros dos nodes.");
        }
        if (!array_key_exists('name', $nodesParams)) {
            throw new Goweb_Exception("O campo 'name' &eacute; necess&aacute;rio nos par&aacute;metros dos nodes.");
        }
        if (!array_key_exists('urlId', $nodesParams)) {
            throw new Goweb_Exception("O campo 'urlId' &eacute; necess&aacute;rio nos par&aacute;metros dos nodes.");
        }

        $idCol = $nodesParams['id'];
        $pidCol = $nodesParams['pid'];
        $nameCol = $nodesParams['name'];
        // $this->_categoriaModel->order($nameCol);
        $this->_categoriaModel->order('ordem');

        // não carregar as chaves estrangeiras
        $this->_categoriaModel->loadForeigns(false);
        // limpa todas as partes do SELECT
        if ($cleanModelParts) {
            $this->_categoriaModel->cleanParts();
        }

        $this->_categoriaModel->order('ordem');
        $fetchCols = array($idCol, $pidCol, $nameCol);
        if ($this->_categoriaModel->colExists('activo')){
            $fetchCols[] = 'activo';
        }
        $rowset = $this->_categoriaModel->fetchAll($fetchCols);

        unset($nodesParams['id']);
        unset($nodesParams['pid']);
        unset($nodesParams['name']);
        $urlBase = Zend_Controller_Front::getInstance()->getRequest()->getBaseUrl();
        if (strpos($nodesParams['url'], $urlBase) === false) $nodesParams['url'] = $urlBase . $nodesParams['url'];
        $node = new Goweb_Js_Tree_Node('0', '-1', '', $nodesParams['url'] . '0/');
        if (array_key_exists('rootName', $nodesParams)) {
            $node->name = $nodesParams['rootName'];
            unset($nodesParams['rootName']);
        }

        if ($this->_rootCategoriasNodeParams) {
            $rootNodeParams = $this->_rootCategoriasNodeParams;
        } else {
            $rootNodeParams = $nodesParams;
        }
        if (strpos($rootNodeParams['url'], $urlBase) === false) $rootNodeParams['url'] = $urlBase . $rootNodeParams['url'];
        
        // configura os links e icons extra
        for ($i=1; $i<=5; $i++) {
            $param = 'url_' . $i . '_icon';
            if  (array_key_exists($param, $rootNodeParams) && $rootNodeParams[$param]) {
                if (strpos($rootNodeParams[$param], str_replace('/index.php', '', $urlBase)) === false) {
                    $rootNodeParams[$param] = str_replace('/index.php', '', $urlBase) . $rootNodeParams[$param];
                }
                $node->{$param} = $rootNodeParams[$param];
                $param = 'url_' . $i;
                if (array_key_exists($param, $rootNodeParams) && $rootNodeParams[$param]) {
                    if (strpos($rootNodeParams[$param], $urlBase) === false) $rootNodeParams[$param] = $urlBase . $rootNodeParams[$param];
                    $node->{$param} = $rootNodeParams[$param] . '0/';
                }
            }
        }

        $tree->addNode($node);
        if ($rowset) {
            if (strpos($nodesParams['url'], $urlBase) === false) $nodesParams['url'] = $urlBase . $nodesParams['url'];
            foreach ($rowset as $row) {
                $titulo = $row->{$nameCol};
                if ($this->_categoriaModel->colExists('activo') && !$row->activo){
                    $titulo = '<span class="disabled_page">' . $titulo . '</span>';
                }
                $node = new Goweb_Js_Tree_Node($row->{$idCol},
                                               $row->{$pidCol},
                                               $titulo,
                                               $nodesParams['url'] . $row->{$idCol} . '/',
                                               $nodesParams['urlId'],
                                               $nodesParams['target'],
                                               $nodesParams['title'],
                                               $nodesParams['icon'],
                                               $nodesParams['iconOpen'],
                                               $nodesParams['open']);

                // configura os links e icons extra
                for ($i=1; $i<=5; $i++) {
                    $param = 'url_' . $i . '_icon';
                    if  (array_key_exists($param, $nodesParams) && $nodesParams[$param]) {
                        if (strpos($nodesParams[$param], str_replace('/index.php', '', $urlBase)) === false) {
                            $nodesParams[$param] = str_replace('/index.php', '', $urlBase) . $nodesParams[$param];
                        }
                        $node->{$param} = $nodesParams[$param];
                        $param = 'url_' . $i;
                        if (array_key_exists($param, $nodesParams) && $nodesParams[$param]) {
                            if (strpos($nodesParams[$param], $urlBase) === false) $nodesParams[$param] = $urlBase . $nodesParams[$param];
                            $node->{$param} = $nodesParams[$param] . $row->{$idCol} . '/';
                        }
                    }
                }

                // adiciona o node
                $tree->addNode($node);
            }
        }

        // retorna o Goweb_Js_Tree
        return $tree;
    }

    /**
    * ******************************************************* *
    * CAMBIOS    -    CAMBIOS    -    CAMBIOS    -    CAMBIOS *
    * ******************************************************* *
    */

    /**
     * Listagem dos Cambios moedas
    */
    public function listCambiosAction() {

        $this->_links['list']   = '/catalogo/list_cambios/';
        unset($this->_links['add']);
        Goweb::loadClass('Goweb_Admin_Section');
        $section = new Goweb_Admin_Section();
        $section->setTitle(translateAdmin('Cambios'));
        $section->setTitleSingular(translateAdmin('Cambio'));

        $array_moedas = array();
        if($this->_moduleConfig->cambios->activo){
       		// Goweb::dump($this->_moduleConfig->cambios);
       		 $moedas = explode('::', $this->_moduleConfig->cambios->moedas);
       		 foreach ($moedas as $moeda) {
       		 	$moeda_temp = explode(':', $moeda);
       		 	if(count($moeda_temp) == 3) $array_moedas[] = array('nome' => $moeda_temp[0], 'simbolo' => '&' .$moeda_temp[1] . ';', 'position' => $moeda_temp[2]);
       		 }
        }
        if ($this->_getParam('message')) {
            $this->view->message = $this->_getParam('message');
        }
        if(isset($_POST['submit_cambio_gravar'])){
				$nomeCambio   = $_POST['nome'];

			    $cambio = $_POST["cambio"];
				if (is_numeric($cambio)) {
					$cambioModel = Goweb::getModelInstance('Catalogo_Model_Cambio', 'db', false);
					$cambioModel->getAdapter()->query("UPDATE " . $cambioModel->getTableName() . " SET activo='0' WHERE nome = '$nomeCambio'");
					$cambioModel = Goweb::getModelInstance('Catalogo_Model_Cambio', 'db', false);
					$cambioModel->nome = $nomeCambio;
					$cambioModel->cambio = $cambio;
					$cambioModel->save();
					$this->view->message = translateAdmin('Cambio inserido com sucesso!');
				}
				else{
					$this->view->message = translateAdmin('O campo Cambio &eacute; inv&aacute;lido!');
				}
		}
        $this->view->moedas = $array_moedas;
        $section->setModel($this->_cambioModel);
        $section->setListCols(array('id', 'nome', 'cambio', 'criado'));
        $section->setSearchCols(array('nome'));
        $section->setOrdering(array('nome','-id'));
        $section->setWhere('activo = 0');
        $section->setOrdering(array('-id','nome'));

        $this->view->action = translateAdmin('Listagem');



        $cambioModel = Goweb::getModelInstance('Catalogo_Model_Cambio', 'db', false);
        $cambioModel->order(array('nome'));
        $cambioModel->where('activo = 1');
        $cambios = $cambioModel->fetchAll();
       	if($cambios)
        $this->view->cambios_activos = $cambios->toArray();
        else
        	$this->view->cambios_activos = null;

        $this->view->title  = $this->_title;
        $this->view->setViewsPath(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'views');
        $this->view->output = $this->_listGeneric($section,
                                                   $this->view,
                                                   false,
                                                   'list_cambios.tpl',
                                                   'list_status',
                                                   translateAdmin('Cambios'));
        $this->view->setViewsPath(GENERIC_VIEWS_PATH);
        $this->_helper->viewRenderer->setRender('base');
    }

    /**
     * Criação dinâmica da àrvore, componente dhtmlx
     *
     */
    public function treeDhtmlxAction(){
        $this->_helper->viewRenderer->setNoRender();
        $categoriaModel = Goweb::getModelInstance('Catalogo_Model_Categoria', 'db', false);

        $idCat = $this->_request->id;
        if (!is_numeric($idCat)) {
            $idCat = 0;
        }
        $nodesParams = $this->_categoriasNodesParams;

        // valida se foram passados os campos necessário para o node
        if (!array_key_exists('id', $nodesParams)) {
            throw new Goweb_Exception("O campo 'id' &eacute; necess&aacute;rio nos par&aacute;metros dos nodes.");
        }
        if (!array_key_exists('pid', $nodesParams)) {
            throw new Goweb_Exception("O campo 'pid' &eacute; necess&aacute;rio nos par&aacute;metros dos nodes.");
        }
        if (!array_key_exists('name', $nodesParams)) {
            throw new Goweb_Exception("O campo 'name' &eacute; necess&aacute;rio nos par&aacute;metros dos nodes.");
        }
        if (!array_key_exists('urlId', $nodesParams)) {
            throw new Goweb_Exception("O campo 'urlId' &eacute; necess&aacute;rio nos par&aacute;metros dos nodes.");
        }

        $idCol = $nodesParams['id'];
        $pidCol = $nodesParams['pid'];
        $nameCol = $nodesParams['name'];
        $categoriaModel->where($categoriaModel->getTableName() . '.' . $pidCol . ' = ?', $idCat);
        $rowset = $categoriaModel->fetchAll();

        $data = array('id' => $idCat, 'item' => array());
        if ($idCat == 0){
            $data['item'][0] = array(
                        'id' => 'root', 
                        'text' => $this->_addTreeOptions(translateAdmin('Raiz'), 0, $this->_rootCategoriasNodeParams),
                        'item' => array());
        }
        if ($rowset){
            $items = array();
            foreach ($rowset as $item){
                $childs = $categoriaModel->getCountFilhos($item->{$idCol});
                $items[] = array(
                            'id' => $item->{$idCol}, 
                            'text' => $this->_addTreeOptions($item->{$nameCol}, $item->{$idCol}), 
                            'child' => $childs);
            }
            if ($idCat == 0){
                $data['item'][0]['item'] = $items;
            } else {
                $data['item'] = $items;
            }
        }

        if ($this->_getParam('format') == 'xml'){
            throw new Goweb_Exception('not completed');
            $this->getResponse()->setHeader('Content-Type', 'text/xml; charset=' . CHARSET);
            $output = '<tree id=\'' . $idCat . '\'>' . "\n";
            foreach ($data['item'] as $item){
                $output .= "<item ";
                foreach ($item as $key => $value){
                    if ($key != 'text'){
                        $output .= $key . "='" . $value . "' ";
                    } else {
                        $output .= $key . "='" . htmlspecialchars($value, ENT_QUOTES, CHARSET, false) . "' ";
                    }
                }
                $output .= '></item>' . "\n";
            }
            $output .= '</tree>' . "\n";
            $this->view->output = $output;
            $this->view->setViewsPath(VIEWS_PATH);
            $this->_helper->viewRenderer->setRender('vazia');
            $this->_helper->viewRenderer->setNoRender(false);

        } else {
            $this->_helper->json($data);
        }

    }
}
