<?php

defined('DCMS') or die();

/**
 * Преобразуем $_FILES в более удобный массив
 * @param $name
 * @return array
 */
function files_to_normal_array($name){
    $files = array();
    if (!empty($_FILES [$name])){
        foreach($_FILES [$name] AS $key => $value){
            $value = (array)$value;
            foreach ($value AS $index => $val){
                $files[$index][$key] = $val;
            }
        }
    }
    return $files;
}


// файл отвечает за исполнение действий
if ($access_write) {

    // выгрузка
    if (!empty($_FILES ['files'])) {
        $files = files_to_normal_array('files');
        foreach ($files AS $file) {
            if ($file['error']) {
                switch ($file['error']) {
                    case UPLOAD_ERR_INI_SIZE:
                        $doc->err(__('Размер принятого файла превысил максимально допустимый размер, который задан директивой upload_max_filesize'));
                        break;
                    case UPLOAD_ERR_FORM_SIZE:
                        $doc->err(__('Размер загружаемого файла превысил значение MAX_FILE_SIZE, указанное в HTML-форме'));
                        break;
                    case UPLOAD_ERR_PARTIAL:
                        $doc->err(__('Загружаемый файл был получен только частично'));
                        break;
                    case UPLOAD_ERR_NO_FILE:
                        $doc->err(__('Файл не был загружен'));
                        break;
                    case UPLOAD_ERR_NO_TMP_DIR:
                        $doc->err(__('Отсутствует временная папка'));
                        break;
                    case UPLOAD_ERR_CANT_WRITE:
                        $doc->err(__('Не удалось записать файл на диск'));
                        break;
                    case UPLOAD_ERR_EXTENSION:
                        $doc->err(__('PHP-расширение остановило загрузку файла'));
                        break;
                }
                continue;
            }

            if (!$file['size']) {
                $doc->err(__('Содержимое файла пусто'));
                continue;
            }

            if ($dir->is_file(text::for_filename($file ['name']))) {
                $doc->err(__('Файл с таким названием (%s) уже существует', text::for_filename($file ['name'])));
                continue;
            }

            if ($files_ok = $dir->filesAdd(array($file ['tmp_name'] => $file ['name']))) {
                $files_ok [$_FILES ['file'] ['tmp_name']]->id_user = $user->id;
                $files_ok [$_FILES ['file'] ['tmp_name']]->group_edit = max($user->group, $dir->group_write, 2);
                $user->balls += $dcms->add_balls_upload_file;
                $doc->msg(__('Файл "%s" успешно добавлен', $file ['name']));
                // записываем свое действие в общий лог
                if ($dir->group_write > 1)
                    $dcms->log('Файлы', 'Выгрузка файла [url="/files' . $files_ok [$file['tmp_name']]->getPath() . '"]' . $file ['name'] . '[/url]');
                unset($files_ok);
            } else {
                $doc->err(__('Не удалось сохранить выгруженный файл'));
            }
        }
    }
}

if ($access_edit) {
    // импорт файлов
    if (!empty($_POST ['file_import']) && !empty($_POST ['url'])) {
        if ($file = $dir->fileImport($_POST ['url'])) {
            $doc->msg(__('Файл "%s" успешно импортирован', $file->runame));
            $file->id_user = $user->id;
            // записываем свое действие в общий лог
            if ($dir->group_write > 1) {
                $dcms->log('Файлы', 'Импорт файла [url="/files' . $file->getPath() . '"]' . $file->runame . '[/url]');
            }

            header('Refresh: 1; url=?act=file_import&' . passgen());

            $doc->ret(__('К файлу'), '/files' . $file->getPath() . '.htm');
            $doc->ret(__('Вернуться'), '?act=file_import&amp;' . passgen());
            exit();
        } elseif ($error = $dir->error) {
            $doc->err($error);
        } else {
            $doc->err(__('Не удалось импортировать файл'));
        }
    }
    // изменеение параметров
    if (isset($_POST ['edit_path']) && !empty($_POST ['path_rel_new'])) {
        // перемещение папки
        $root_dir = new files(FILES);
        $dirs = $root_dir->getPathesRecurse($dir);

        $path_rel_new = $_POST ['path_rel_new'];

        foreach ($dirs as $dir2) {
            // если нет прав на чтение папки или на запись в папку, то пропускаем
            if ($dir2->group_show > $user->group || $dir2->group_write > $user->group) {
                continue;
            }
            // мы не можем папку переместить саму в себя
            if ($dir2->path_rel == $dir->path_rel)
                continue;
            if ($dir2->getPath() == $path_rel_new) {
                $path_abs_new = $dir2->path_abs . '/' . $dir->name;
            }
        }

        if (!empty($path_abs_new)) {
            if ($dir->move($path_abs_new)) {
                // записываем свое действие в общий лог
                $dcms->log('Файлы', 'Перемещение папки [url="/files' . $dir->getPath() . '"]' . $dir->runame . '[/url]');

                $doc->msg(__('Папка успешно перемещена'));
                $doc->ret(__('Вернуться'), '/files' . $dir->getPath() . '?' . passgen());
                header('Refresh: 1; url=/files' . $dir->getPath() . '?' . passgen());
                exit();
            } else {
                $doc->err(__('При перемещении папки возникла ошибка'));
            }
        } else
            $doc->err(__('Ошибка при выборе нового каталога'));
    }

    if (isset($_POST ['write_dir']) && isset($_POST ['name'])) {
        $runame = text::for_name($_POST ['name']);

        if (!$runame)
            $doc->err(__('Неверно задано имя папки'));
        elseif (!$new_dir = $dir->mkdir($runame))
            $doc->err(__('Не удалось создать папку на сервере'));
        else {
            $new_dir->id_user = $user->id;

            $dcms->log('Файлы', 'Создание папки [url="/files' . $new_dir->getPath() . '"]' . $new_dir->runame . '[/url]');

            $doc->msg(__('Папка "%s" успешно создана', $runame));
            $doc->ret(__('Вернуться'), '?act=write_dir');
            header('Refresh: 1; url=?act=write_dir');
            exit();
        }
    }

    if (isset($_POST ['edit_unlink']) && $rel_path && $dir->name{0} !== '.') {
        if (empty($_POST ['captcha']) || empty($_POST ['captcha_session']) || !captcha::check($_POST ['captcha'], $_POST ['captcha_session'])) {
            $design->err(__('Проверочное число введено неверно'));
        } else {
            if ($dir->delete()) {
                $dcms->log('Файлы', 'Удаление папки ' . $dir->runame . ' (' . $dir->getPath() . ')');

                $doc->msg(__('Папка успешно удалена'));
                $doc->ret(__('Вернуться'), '../?' . passgen());
                header('Refresh: 1; url=../?' . passgen());
                exit();
            } else {
                $doc->err(__('Ошибка при удалении папки'));
            }
        }
    }

    if (isset($_POST ['edit_prop'])) {
        $groups = groups::load_ini(); // загружаем массив групп


        if ($rel_path && isset($_POST ['position'])) {
            $dir->position = (int)$_POST ['position'];
        }
        if (isset($_POST ['description'])) {
            $dir->description = text::input_text($_POST ['description']);
        }
        if (isset($_POST ['meta_description'])) {
            $dir->meta_description = text::input_text($_POST ['meta_description']);
        }
        if (isset($_POST ['meta_keywords'])) {
            $dir->meta_keywords = text::input_text($_POST ['meta_keywords']);
        }


        $order_keys = $dir->getKeys();
        if (!empty($_POST ['sort_default']) && isset($order_keys [$_POST ['sort_default']])) {
            $dir->sort_default = $_POST ['sort_default'];
        }


        if (!empty($_POST ['name'])) {
            $runame = text::for_name($_POST ['name']);
            $name = text::for_filename($runame);

            if ($runame != $dir->runame) {
                $oldname = $dir->runame;
                if (!$runame || !$name)
                    $doc->err(__('Неверно задано имя папки'));
                elseif (!$dir->rename($runame, $name))
                    $doc->err(__('Не удалось переименовать папку'));
                else {
                    $dcms->log('Файлы', 'Переименование папки из ' . $oldname . ' в [url="/files' . $dir->getPath() . '"]' . $dir->runame . '[/url]');
                    $doc->msg(__('Новое название папки "%s"', $runame));
                }
            }
        }

        if (isset($_POST ['group_show'])) { // просмотр
            $group_show = (int)$_POST ['group_show'];
            if (isset($groups [$group_show]) && $group_show != $dir->group_show) {
                $dir->setGroupShowRecurse($group_show); // данный параметр необходимо применять рекурсивно


                $dcms->log('Файлы', 'Изменение привилегий просмотра папки [url="/files' . $dir->getPath() . '"]' . $dir->runame . '[/url] на группу ' . groups::name($group_show));

                $doc->msg(__('Просмотр папки разрешен группе "%s" и выше', groups::name($group_show)));
            }
        }

        if (isset($_POST ['group_write'])) { // запись
            $group_write = (int)$_POST ['group_write'];
            if (isset($groups [$group_write]) && $group_write != $dir->group_write) {
                if ($dir->group_show > $group_write)
                    $doc->err(__('Для того, чтобы выгружать файлы группе "%s" сначала необходимо дать права на просмотр этой папки', groups::name($group_write)));
                else {
                    $dir->group_write = $group_write;

                    $dcms->log('Файлы', 'Изменение привилегий выгрузки файлов для папки [url="/files' . $dir->getPath() . '"]' . $dir->runame . '[/url] на группу ' . groups::name($group_write));

                    $doc->msg(__('Выгружать файлы разрешено группе "%s" и выше', groups::name($group_write)));
                }
            }
        }

        if (isset($_POST ['group_edit'])) { // редактирование
            $group_edit = (int)$_POST ['group_edit'];
            if (isset($groups [$group_edit]) && $group_edit != $dir->group_edit) {
                if ($dir->group_write > $group_edit)
                    $doc->err(__('Для изменения параметров папки и создания папок группе "%s" сначала необходимо дать права на запись в папку', groups::name($group_edit)));
                else {
                    $dir->group_edit = $group_edit;

                    $dcms->log('Файлы', 'Изменение привилегий создания папок и изменения параметров для папки [url="/files' . $dir->getPath() . '"]' . $dir->runame . '[/url] на группу ' . groups::name($group_edit));

                    $doc->msg(__('Изменять параметры папки и создание папок теперь разрешено группе "%s" и выше', groups::name($group_edit)));
                }
            }
        }


        $doc->msg(__('Параметры успешно приняты'));
        $doc->ret(__('Вернуться'), '/files' . $dir->getPath() . '?' . passgen());
        header('Refresh: 2; url=/files' . $dir->getPath() . '?' . passgen());
        exit;
    }
}