<?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.
 *
 *
 *
 *
 *
 *
 *
 * */
GFileUploader::ajaxEventHandler();

class GFileUploader extends GRepetitiveField
{

    public function __construct($caption, $validator = false, $opts = null, $name=NULL)
    {
        $controls[] = new MFileField('uploadedfile', null, _M('Selecione o arquivo', $module), null, _M('O arquivo deve ter no máximo ' . ini_get('upload_max_filesize'), $module));
        $columns[] = new MGridColumn(_M('Arquivo', 'gnuteca3'), 'left', true, null, true, 'basename');
        $columns[] = new MGridColumn(_M('Tipo', 'gnuteca3'), 'left', true, null, true, 'type');
        $columns[] = new MGridColumn(_M('Mime', 'gnuteca3'), 'left', true, null, true, 'mimeContent');
        $columns[] = new MGridColumn(_M('Nome temporário', 'gnuteca3'), 'left', true, null, false, 'tmp_name');
        $columns[] = new MGridColumn(_M('Tamanho', 'gnuteca3'), 'left', true, null, true, 'size');
        $columns[] = new MGridColumn(_M('Link', 'gnuteca3'), 'left', true, null, false, 'mioloLink');
        $columns[] = new MGridColumn(_M('Última modificação', 'gnuteca3'), 'left', true, null, true, 'lastChange');
        
        if ( is_null($name) )
        {
            $name = 'generalUploader';
        }
        
        parent::__construct($name, $caption, $columns, $controls, $opts ? $opts : array('remove', 'download'));
        //bloqueia de cara envio de php, class e javascript
        $this->setExtensions(null, array('php', 'class', 'js'));
    }

    public static function setLimit($limit, $repetitive = NULL)
    {
        $repetitive = $repetitive ? $repetitive : 'generalUploader';

        if ($limit == FALSE || $limit == NULL)
        {
            GRepetitiveField::setSessionValue('uploadFileLimit', nulll, $repetitive);
        }
        else
        {
            GRepetitiveField::setSessionValue('uploadFileLimit', $limit, $repetitive);
        }
    }

    public static function getLimit($repetitive)
    {
        $repetitive = $repetitive ? $repetitive : 'generalUploader';
        return GRepetitiveField::getSessionValue('uploadFileLimit', $repetitive);
    }

    public static function setExtensions($allowed, $deny = array('php', 'class', 'js'), $repetitive = 'generalUploader')
    {
        $repetitive = $repetitive ? $repetitive : 'generalUploader';
        GRepetitiveField::setSessionValue('uploadFileAllowedExt', $allowed, $repetitive);
        GRepetitiveField::setSessionValue('uploadFileDenyExt', $deny, $repetitive);
    }

    public static function getAllowedExtensions($repetitive)
    {
        $repetitive = $repetitive ? $repetitive : 'generalUploader';
        return GRepetitiveField::getSessionValue('uploadFileAllowedExt', $repetitive);
    }

    public static function getDenyExtensions($repetitive)
    {
        $repetitive = $repetitive ? $repetitive : 'generalUploader';
        return GRepetitiveField::getSessionValue('uploadFileDenyExt', $repetitive);
    }

    public function getData($repetitive = null)
    {
        $repetitive = $repetitive ? $repetitive : 'generalUploader';

        return parent::getData($repetitive);
    }

    public function setData($data, $repetitive = null)
    {
        $repetitive = $repetitive ? $repetitive : 'generalUploader';
        parent::setData($data, $repetitive);
    }

    public function clearData($repetitive = null)
    {
        $repetitive = $repetitive ? $repetitive : 'generalUploader';
        parent::clearData($repetitive);
    }

    public static function downloadFile($file)
    {
        $MIOLO = MIOLO::getInstance();
        $module = 'gnuteca3';

        if (!is_object($file))
        {
            $busFile = $MIOLO->getBusiness('gnuteca3', 'BusFile');
            $relative = GUtil::getAjaxEventArgs();
            $file = $busFile->getFile($file);
        }

        $link = "window.open('$file->mioloLink');";

        if ($file->type == 'image' || $file->type == 'text')
        {
            $content[] = $info = new MDiv('info', '', 'reportDescription');

            $infos[] = new MDiv('', _M('Tamanho: @1 Tipo: @2', 'gnuteca3', $file->size, $file->mimeContent));
            $infos[] = new MDiv('', _M('Última modificação: @1', 'gnuteca3', $file->lastChange));

            if ($file->type == 'image')
            {
                $content[] = new MDiv('image', "<img src='{$file->mioloLink}&width=600px'></img>");
            }
            else
            {
                $fileContent = file_get_contents($file->absolute);
                $editable = is_writable($file->absolute);
                $infos[] = new MDiv('', _M('Codificação: @1', 'gnuteca3', GString::detectEncoding($fileContent)));
                $content[] = $absolute = new MTextField('absolute', $file->absolute);
                $absolute->addStyle("display", 'none');

                if ($editable)
                {
                    $content[] = $fileContentField = new MultiLineField('fileContent', $fileContent, '', 30, 40, 40);
                    $fileContentField->addStyle("width", "99%");
                }
                else
                {
                    $content[] = new MDiv('image', '<pre>' . $fileContent . '</pre>', 'receiptBox');
                    $infos[] = new MDiv('', _M('O arquivo não possui permissões suficientes para edição.', 'gnuteca3'));
                }
            }

            $info->setInner($infos);

            if ($editable)
            {
                $buttons[] = new MButton('saveFile', _M('Salvar', $module), GUtil::getAjax('saveFile'), GUtil::getImageTheme('save-16x16.png'));
            }

            $buttons[] = new MButton('downloadFile', _M('Download', $module), $link, GUtil::getImageTheme('table-down.png'));
            $buttons[] = GForm::getCloseButton();

            $content[] = new MDiv(null, $buttons);

            $title = $editable ? _M('Edição', 'gnuteca3') : _M('Visualização', 'gnuteca3');
            GForm::injectContent($content, false, $title . ' - ' . $file->basename);
        }
        else
        {
            $MIOLO->page->onLoad($link);
            $MIOLO->ajax->setResponse(null, GForm::GDIV);
        }
    }

    /**
     * Salva arquivo de texto simples
     */
    public function saveFile()
    {
        $args = (Object) $_REQUEST;
        if ($args->absolute && is_writable($args->absolute))
        {
            $ok = file_put_contents($args->absolute, $args->fileContent);

            if ($ok > 0)
            {
                GForm::information(_M("Arquivo atualizado com sucesso", 'gnuteca3'));
            }
            else
            {
                throw new Exception(_M("Erro ao salvar o arquivo.", 'gnuteca3', $args->absolute));
            }
        }
        else
        {
            throw new Exception(_M("Sem permisssão para salvar o arquivo @1", 'gnuteca3', $args->absolute));
        }
    }

    public static function generateTable($repetitive = null)
    {
        $MIOLO = MIOLO::getInstance();
        $repetitive = $repetitive ? $repetitive : 'generalUploader';
        $MIOLO->ajax->setResponse(GRepetitiveField::getTable($repetitive), 'divgeneralUploader');
    }

    public static function ajaxEventHandler()
    {
        $event = GUtil::getAjaxFunction();
        $events = array('removeUploadedFile', 'removeFile', 'downloadFile', 'saveFile');

        if (in_array($event, $events))
        {
            GFileUploader::$event();
        }
    }

}

?>
