<?php
/**
 * Copyright 2005-2017 de Solis Soluções Livres Ltda.
 *
 * Este arquivo é parte do programa Gnuteca.
 *
 * O Gnuteca é um software de propriedade da SOLIS, sendo desenvolvido
 * e mantido exclusivamente por esta empresa.
 *
 * A licença de uso está disponível mediante aquisição exclusiva junto à
 * SOLIS. A licença é concedida sem caráter de exclusividade ao licenciado.
 * Os direitos de uso são perpétuos.
 *
 * Embora os códigos fontes sejam fornecidos, o software é de propriedade
 * da SOLIS, não sendo permitido ao adquirente da licença a sua revenda,
 * empréstimo ou cessão (onerosa ou não) à terceiros. Também não é permitido,
 * a qualquer título e tempo, promover no software qualquer tipo de alienação,
 * reprodução, distribuição, divulgação, registro, licenciamento, transferência
 * ou qualquer outro ato que prejudique ou comprometa os direitos de propriedade
 * de software, o nome e a imagem da sua proprietária e do próprio software,
 * além de configurar concorrência à SOLIS.
 *
 * O licenciado, com o acesso ao código fonte do software, terá o direito de
 * promover mudanças no respectivo código. No entanto, nas situações em que ele
 * contar com o suporte oficial prestado pela SOLIS, não poderá promover mudanças
 * no código fonte, sob pena de perda do referido suporte.
 *
 * Para conhecer em detalhes o Termo de Licenciamento do Software Gnuteca
 * leia o arquivo “LICENCA.txt” disponível junto ao código deste software.
 * 
 * 
 * Componente adminsitrador de dicionários, é um lookup especializado
 *
 *
 *
 *
 *
 **/
class GDictionaryField extends MLookupTextField
{
    public function  __construct( $name = '', $value = '', $label = '', $size = FIELD_DESCRIPTION_SIZE, $hint = '', $validator = null, $related = '', $module = '', $item = '', $event = 'filler', $filter = '', $autocomplete = true )
    {
        parent::__construct( $name, $value, $label, $size, $hint, $validator, $related, $module, $item, $event, $filter, $autocomplete );
        $this->autocomplete = false;
        $this->baseModule = $this->module;
        $this->page->addScript('GDictionaryField.js', 'gnuteca3');
    }

    public function generate()
    {
        $readonly = $this->getAttribute( 'readonly' );

        if ( !$readonly )
        {
            $delaySeach = DICTIONARY_DELAY_SEARCH;
            $this->addAttribute('onkeydown', "return onkeyUpDictionary(event, this,'{$this->name}','{$this->related}', '{$this->item}', '{$this->filter}','{$delaySeach}');" ); //ajax
            $this->addAttribute('onblur',"return onblurDictionary('{$this->name}');");
            $this->addAttribute('ondblclick',"return onDoubleClick(event,'{$this->name}')");

            $div = "<div id='{$this->name}Div' class='mTextField gDictionary'></div>";
            $input = "<input type='hidden' id='{$this->name}Input' value=''/>"; //somente id para não ir no post
        }

        return parent::generate().$div.$input;
    }

    /**
     * Função chamada após a digitação dos dados
     * 
     * @param stdClass $args
     */
    public static function onkeyUpDictionary($args)
    {
        $MIOLO = MIOLO::getInstance();
        $name = $args->name;
        $div = $name.'Div';
        $value = $args->$name;
        $lookup = $args->item;
        $related = $args->related;
        $filter = $args->filter;

        $dbLookup = $MIOLO->getBusiness('gnuteca3', 'lookup');
        $dbLookup = new BusinessGnuteca3Lookup();
        $dbLookup->setForRepetitiveField(true,true); //seta função lookup para repetitive field

        //instancia o lookup chamado e executa a função especifica
        if ( $lookup ) //se esse id tiver lookup
        {
            $function   = 'autoComplete'.$lookup; //monta função de autocomplete

            if ( method_exists( $dbLookup, $function ) ) //verifica se função existe
            {
                $_REQUEST['filter'] = $value; //seta o filter
                $dbLookup->$function(); //chama a função do lookup
                $result = $dbLookup->result;
            }
        }

        // Trata os dados.
        if ( $result )
        {
            $onClick = array();
            
            foreach ( $result as $line => $info)
            {
                // Escapa string.
                $valueScaped = str_replace("'", "\'", $info[0] ); 
                $onClick[$line] = 'dojo.byId(\''.$name.'\').value = \''.$valueScaped.'\'; dojo.byId(\''.$div.'\').style.display=\'none\';';
                $result[$line] = $info[0];
            }
        }

        //cria uma tabela com os dados
        $content = $table = new MTableRaw( null, $result , null);
        
        // Adiciona o evento para cada linha e célula da tabela. Garantindo o disparo do evento.
        foreach( $result as $i => $value )
        {
            $table->setCellAttribute($i, 0, 'onClick', $onClick[$i]);
            $table->setCellAttribute($i, 0, 'id', "{$name}Item{$i}");
            $table->setRowAttribute($i, 'onClick', $onClick[$i]);
        }
        
        $table->setAlternate( true );
        $table->addAttribute('style','width:100%');
        $table->addAttribute('id',$name.'Table');
        
        //só executa o js que mostra a caixa caso tenha resultados
        if ( $result )
        {
            $MIOLO->page->onload( "onkeyUpResponse('$name');" );
        }
        else
        {
            $MIOLO->page->onload("dojo.byId('{$name}Div').style.display='none';");
        }
        
        $MIOLO->ajax->setResponse( $content, $div);
    }
}
?>
