<?php

/**
 * <--- Copyright 2005-2011 de Solis - Cooperativa de Soluções Livres Ltda. e
 * Univates - Centro Universitário.
 * 
 * Este arquivo é parte do programa Gnuteca.
 * 
 * O Gnuteca é um software livre; você pode redistribuí-lo e/ou modificá-lo
 * dentro dos termos da Licença Pública Geral GNU como publicada pela Fundação
 * do Software Livre (FSF); na versão 2 da Licença.
 * 
 * Este programa é distribuído na esperança que possa ser útil, mas SEM
 * NENHUMA GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO
 * ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/GPL em
 * português para maiores detalhes.
 * 
 * Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o título
 * "LICENCA.txt", junto com este programa, se não, acesse o Portal do Software
 * Público Brasileiro no endereço www.softwarepublico.gov.br ou escreva para a
 * Fundação do Software Livre (FSF) Inc., 51 Franklin St, Fifth Floor, Boston,
 * MA 02110-1301, USA --->
 * 
 * Classe que exibe janela de consulta DECS.
 *
 * @author Jader Osvino Fiegenbaum [jader@solis.com.br]
 *
 * @version $Id$
 *
 * \b Maintainers \n
 * Jader Osvino Fiegenbaum [jader@solis.com.br]
 *
 * @since
 * Class created on 25/01/2017
 *
 * */

//Event handler.
$possibleEvents = array( 'searchWord' );
$event = GUtil::getAjaxFunction();

if ( in_array($event, $possibleEvents) )
{
    try
    {
        GDecs::$event();
    }
    catch ( Exception $e )
    {
        GForm::error($e->getMessage());
    }
}

class GDecs extends MDiv
{
    private $word;
    private $language;
    
    public function __construct($name, $word=NULL, $language=NULL, $execute=FALSE) 
    {
        $MIOLO = MIOLO::getInstance();
         
        parent::__construct($name);
    
        $this->word = $word;
        $this->language = $language;
        
        $content = new MVContainer('decsFields', self::getSearchFields($this->word));
        
        // Define os id's dos elementos envolvidos.
        $subjectTag = 'spreeadsheetField_' . str_replace('.', '_', MARC_SUBJECT_TAG);
        $mfnTag = 'spreeadsheetField_' . str_replace('.', '_', DECS_MFN_TAG);
        
        // Função JS para definir valores em seus respectivos campos.
        $js .= "function setValueDecs(value, mfn)
               {
                   tagDescriptor = dojo.byId('{$subjectTag}');
                   
                   if ( tagDescriptor )
                   {
                        tagDescriptor.value = value;
                   }
                   
                   tagMfn = dojo.byId('{$mfnTag}');
                   
                   if ( tagMfn )
                   {
                        tagMfn.value = mfn;
                   }
                }";
      
        $MIOLO->page->addJsCode($js);
        $this->setInner(array($content));
        
        // Define o foco no campo de pesquisa.
        $MIOLO->page->onLoad("gnuteca.setFocus('word', false );");
        
        // Limpa pilha de pesquisa.
        unset($_SESSION['DECS_QUEUE']);
    }
    
    /**
     * Obtém os filtros de pesquisa.
     * 
     * @param string $word Filtro pré-definido.
     * @return array de componentes.
     */
    public static function getSearchFields($word)
    {
        $fields = array();
        
        $fields[] = $radio = new GRadioButtonGroup('language', _M('Idioma dos descritores', 'gnuteca3') , self::getLanguageOptions(), 'pt' );
        $fields[] = new GContainer('', array( $wordField = new MTextField('word', $word, _M('Consulta por Palavra:'), FIELD_DESCRIPTION_SIZE )));
        $wordField->addAttribute('onPressEnter', GUtil::getAjax('searchWord'));
        $fields[] = new MButton('', _M('Consultar'), GUtil::getAjax('searchWord'));
        
        return $fields;
    }
    
    /**
     * Obtém opções de linguagem de pesquisa.
     * 
     * @param string $language Código da linguagem que se deseja obter a descrição.
     * @return array Opções de linguagem.
     */
    public static function getLanguageOptions($language=NULL)
    {
        $options = array(array(_M('Inglês'), 'en'), array(_M('Espanhol'), 'es' ), array(_M('Português'), 'pt' ));
        
        if ( $language )
        {
            foreach ( $options as $option )
            {
                if ( $option[1] == $language )
                {
                    return $option[0];
                }
            }
            
            return null;
        }
        else
        {
            return $options;
        }
    }
    
    /**
     * Realiza pesquisa do Decs.
     * @param string $args Argumentos AJAX.
     * @return 
     */
    public static function searchWord($args)
    {
        $MIOLO = MIOLO::getInstance();
        
        $MIOLO->uses('classes/decs/xmlstr_to_array.php', 'gnuteca3');
        $MIOLO->uses('classes/decs/DecsResponse.class.php', 'gnuteca3');

        $args = MIOLO::_REQUEST('__mainForm__EVENTARGUMENT');
        
        $searchType = 'words';
        $isComingBack = false;
        $firstSearch = false;
        
        // Trata os parâmetros de pesquisa.
        if ( strlen($args) > 0 )
        {
            $argsParts = explode('|', $args);
            $word = $argsParts[0];
            $language = $argsParts[1];
            $searchType = $argsParts[2];
            $isComingBack = isset($argsParts[3]);
        }
        else 
        {
            $word = MIOLO::_REQUEST('word');
            $language = MIOLO::_REQUEST('language');
            $firstSearch = true;
        }
        
        $lastSearch = NULL;
        
        // Empilha pesquisa (para posteriormente poder voltar).
        if ( !$isComingBack )
        {
            self::incrementQueue($word, $language, $searchType);
        }
        else
        {
            self::removeLastTerm();
        }
        
        // Obtém termo anterior para usuário poder voltar.
        $lastSearch = self::getLastTerm();
        
        $originalSearchType = $searchType;
        $searchType = $searchType == 'tree_id2' ? 'tree_id' : $searchType;
        
        $languageDescription = self::getLanguageOptions($language);
        
        // Realiza a pesquisa.
        $xmlString = file_get_contents($search = DECS_URL_SEARCH . $searchType . '=' . $word . '&lang=' . $language );
 
        // Realiza o processamento da resposta.
        $decs = new DecsParse($xmlString, false, $language);
        
        $titleDiv .= new MDiv('decsTituloResultados', "<font style = 'font-weight:bold'>" .  _M('Resultados para:') . "</font> " . $word );
        
        $backButton = NULL;
        
        // Cria botão para pesquisar termo anterior.
        if ( $lastSearch )
        {
            $backButton = new MButton('backButton', _M('Voltar', 'gnuteca3'), 'javascript:' . GUtil::getAjax('searchWord', $lastSearch['term'] . '|' . $lastSearch['language'] . '|' . $lastSearch['type'] . '|t'));
        }
        
        $newSearchButton = new MDiv('newSearchButtonDiv', array($backButton, new MButton('newSearchButton', _M('Nova consulta', 'gnuteca3'), GUtil::getAjax('openDecsSearch'))));
        
        $response = new MDiv('decsUp', array($titleDiv, $newSearchButton));
        
        $totalResults = count($decs->decsResponse);
        $imageAccept = GUtil::getImageTheme('accept-16x16.png');
        
        // Itera sobre as respostas.
        foreach ( $decs->decsResponse as $i => $d )
        {
            unset($d->xmlArray);

            $response .= new MDiv('decsNumeroResultado', ($i + 1) . '/' . $totalResults);
            
            //------------ DESCRIÇÃO----------------
            $tbData = array();
            $tbData[0][0] = _M('Descritor Inglês', 'gnuteca3');
            $tbData[1][0] = _M('Descritor Espanhol', 'gnuteca3');
            $tbData[2][0] = _M('Descritor Português', 'gnuteca3');
            $tbData[3][0] = _M('Sinônimos @1', 'gntueca3', $languageDescription);
            $tbData[4][0] = _M('Categorias', 'gnuteca3');
            $tbData[5][0] = _M('Definição @1:', 'gntueca3', $languageDescription);
            $tbData[6][0] = _M('Nota de Indexação @1:', 'gntueca3', $languageDescription);
            $tbData[7][0] = _M('Relacionados @1:', 'gntueca3', $languageDescription);
            $tbData[8][0] = _M('Qualificadores Permitidos @1:', 'gntueca3', $languageDescription);
            $tbData[9][0] = _M('Número do Registro');
            $tbData[10][0] = _M('Identificador Único:', 'gntueca3');
            
            if ( $originalSearchType == 'tree_id' && !$d->isQualifier )
            {
                $tbData[11][0] = _M('', 'gntueca3');
            }
            
            //------------ VALORES----------------
            // Descritores com ação de obter.
            $tbData[0][1] = $d->descriptors['en'] .  new MImageLink('getDescriptorEn', null, 'javascript:setValueDecs(\'' . $d->descriptors['en'] . '\',\'' . $d->mfn . '\'); gnuteca.closeAction(); return false;', $imageAccept);
            $tbData[1][1] = $d->descriptors['es'] . new MImageLink('getDescriptorEs', null, 'javascript:setValueDecs(\'' . $d->descriptors['es'] . '\',\'' . $d->mfn . '\');gnuteca.closeAction(); return false;', $imageAccept);;
            $tbData[2][1] = $d->descriptors['pt'].  new MImageLink('getDescriptorPt', null, 'javascript:setValueDecs(\'' . $d->descriptors['pt'] . '\',\'' . $d->mfn . '\');gnuteca.closeAction(); return false;', $imageAccept);
            $tbData[3][1] = implode('<br>', $d->synonym);

            // Categorias.
            foreach( $d->categories as $categorie )
            {
                $tbData[4][1] .=  self::getLinkSearch($categorie, $language, 'tree_id', $categorie) . "<br>";
            }
            
            $tbData[5][1] = $d->definition;
            $tbData[6][1] = $d->noteIndexing;
            $tbData[7][1] = implode('<br>', $d->related);
            
            $qualifierArray = array();
            
            // Qualificadores
            if ( count($d->qualifiers) > 0 )
            {
                foreach ( $d->qualifiers as $key => $qualifier )
                {
                    $qualifierArray[] = $key . ' ' . self::getLinkSearch($qualifier['abbreviated'], $language, 'tree_id2', $qualifier['label']);
                }
            }
            
            $tbData[8][1] = implode('<br>', $qualifierArray);
            $tbData[9][1] = $d->mfn;
            $tbData[10][1] = $d->uniqueIdentifier;
            
            // Prepara a árvore.
            if ( $originalSearchType == 'tree_id' && !$d->isQualifier)
            {
                $tree = '';
                if ( is_array($d->tree) )
                {
                    foreach ( $d->tree as $key => $branch )
                    {
                        if ( strlen($branch) > 0 )
                        {
                            $levels = count(explode('.', $key));
                            $tree .=  str_repeat('&nbsp&nbsp', $levels) . self::getLinkSearch($key, $language, 'tree_id', $branch  ). "<br>";
                        }
                    }
                }

                $tbData[11][1] = $tree;
            }
            
            // Cria tabela com resultado da pequisa.
            $response .= $tb =  new MTableRaw('', $tbData);
            $tb->setAlternate(true);
        }
        
        $div = new MDiv('', $response);

        // Se for invocado por ajax devolve reposta Ajax, se invocado por PHP retorna os componentes.
        if ( $pWord )
        {
            return $div;
        }
        else
        {
            $MIOLO->ajax->setResponse($div, 'decsFields');
        }
    }
    
    /**
     * Cria link HTML para pesquisa de termo.
     * 
     * @param string $term Palavra que se deseja buscar.
     * @param string $language Idioma desejado (pt, es ou en).
     * @param string $type Tipo de pesquisa (words ou tree_id).
     * @param string $label Nome do link.
     * 
     * @return string Link HTML.
     */
    private static function getLinkSearch($term, $language, $type, $label)
    {
        return '<a href="javascript:' . GUtil::getAjax('searchWord', $term. '|' . $language . '|' . $type) . '">' . $label . '</a>';
    }
    
    /**
     * Adiciona novo termo de pesquisa na fila.
     * 
     * @param string $term Palavra usada como filtro.
     * @param string $language Idioma.
     * @param string $type Tipo de pesquisa.
     */
    public static function incrementQueue($term, $language, $type)
    {
        $element = array('term' => $term, 'language' => $language, 'type' => $type);
        $_SESSION['DECS_QUEUE'][] = $element;
    }
    
    /**
     * Remove última pesquisa realizada.
     */
    public static function removeLastTerm()
    {
        array_pop($_SESSION['DECS_QUEUE']);
    }
    
    /**
     * Obtém o último termo de pesquisa.
     * 
     * @return stdClass Objeto contendo infomações da última pesquisa realizada.
     */
    public static function getLastTerm()
    {
        $return = NULL;
        
        $lastTermIndex = sizeof($_SESSION['DECS_QUEUE']) -2;
        
        if (array_key_exists($lastTermIndex, $_SESSION['DECS_QUEUE']) )
        {
            $return = $_SESSION['DECS_QUEUE'][$lastTermIndex];
        }
       
       return $return;
    }
    
}

