/**
 * Recuperer le nom du fichier selon le mode d'upload choisi
 * et mettre cela au format $_FILES
 *
 * Renvoie une liste de fichier ou un message en cas d'erreur
 *
 * @return string/array
 */
function joindre_trouver_fichier_envoye()
{
    static $files = array();
    // on est appele deux fois dans un hit, resservir ce qu'on a trouve a la verif
    // lorsqu'on est appelle au traitement
    if (count($files)) {
        return $files;
    }
    if (_request('joindre_upload')) {
        $post = isset($_FILES) ? $_FILES : $GLOBALS['HTTP_POST_FILES'];
        $files = array();
        if (is_array($post)) {
            include_spip('action/ajouter_documents');
            foreach ($post as $file) {
                if (is_array($file['name'])) {
                    while (count($file['name'])) {
                        $test = array('error' => array_shift($file['error']), 'name' => array_shift($file['name']), 'tmp_name' => array_shift($file['tmp_name']), 'type' => array_shift($file['type']));
                        if (!($test['error'] == 4)) {
                            if (is_string($err = joindre_upload_error($test['error']))) {
                                return $err;
                            }
                            // un erreur upload
                            if (!is_array(verifier_upload_autorise($test['name']))) {
                                return _T('medias:erreur_upload_type_interdit', array('nom' => $test['name']));
                            }
                            $files[] = $test;
                        }
                    }
                } else {
                    //UPLOAD_ERR_NO_FILE
                    if (!($file['error'] == 4)) {
                        if (is_string($err = joindre_upload_error($file['error']))) {
                            return $err;
                        }
                        // un erreur upload
                        if (!is_array(verifier_upload_autorise($file['name']))) {
                            return _T('medias:erreur_upload_type_interdit', array('nom' => $file['name']));
                        }
                        $files[] = $file;
                    }
                }
            }
            if (!count($files)) {
                return _T('medias:erreur_indiquez_un_fichier');
            }
        }
        return $files;
    } elseif (_request('joindre_distant')) {
        $path = _request('url');
        if (!strlen($path) or $path == 'http://') {
            return _T('medias:erreur_indiquez_un_fichier');
        }
        include_spip('action/ajouter_documents');
        $infos = renseigner_source_distante($path);
        if (!is_array($infos)) {
            return $infos;
        } else {
            return array(array('name' => basename($path), 'tmp_name' => $path, 'distant' => true));
        }
    } elseif (_request('joindre_ftp')) {
        $path = _request('cheminftp');
        if (!$path || strstr($path, '..')) {
            return _T('medias:erreur_indiquez_un_fichier');
        }
        include_spip('inc/documents');
        include_spip('inc/actions');
        $upload = determine_upload();
        if ($path != '/' and $path != './') {
            $upload .= $path;
        }
        if (!is_dir($upload)) {
            return array(array('name' => basename($upload), 'tmp_name' => $upload));
        } else {
            // on upload tout un repertoire
            $files = array();
            foreach (preg_files($upload) as $fichier) {
                $files[] = array('name' => basename($fichier), 'tmp_name' => $fichier);
            }
            return $files;
        }
    } elseif (_request('joindre_zip') and $token_zip = _request('chemin_zip')) {
        $zip_to_clean = isset($GLOBALS['visiteur_session']['zip_to_clean']) ? unserialize($GLOBALS['visiteur_session']['zip_to_clean']) : array();
        if (!$zip_to_clean or !isset($zip_to_clean[$token_zip]) or !($path = $zip_to_clean[$token_zip])) {
            return _T('avis_operation_impossible');
        }
        include_spip('inc/documents');
        //pour creer_repertoire_documents
        define('_tmp_zip', $path);
        define('_tmp_dir', creer_repertoire_documents(md5($path . $GLOBALS['visiteur_session']['id_auteur'])));
        if (_tmp_dir == _DIR_IMG) {
            return _T('avis_operation_impossible');
        }
        $files = array();
        if (_request('options_upload_zip') == 'deballe') {
            $files = joindre_deballer_lister_zip($path, _tmp_dir);
        }
        // si le zip doit aussi etre conserve, l'ajouter
        if (_request('options_upload_zip') == 'upload' or _request('options_deballe_zip_conserver')) {
            $files[] = array('name' => basename($path), 'tmp_name' => $path);
        }
        return $files;
    }
    return array();
}
/**
 * Vérification du formulaire
 *
 * @param int|string $id_document
 *    L'identidiant numérique du document s'il est à remplacer, sinon "new"
 * @param int $id_objet
 *    L'identifiant numérique de l'objet sur lequel on ajoute le document
 * @param string $objet
 *    Le type de l'objet sur lequel on ajoute le document
 * @param string $mode
 *    Le mode du document (auto,choix,document,image,vignette...), par défaut auto
 * @param string $galerie
 *    Passer optionnellement une galerie jointe au form, plus utilise nativement,
 *    on prefere la mise a jour apres upload par ajaxReload('documents')
 * @param bool|string $proposer_media
 *    Doit on afficher la médiathèque ?  par défaut oui
 *    Valeurs possibles si string : false,'non','no'.
 * @param bool|string $proposer_ftp
 *    Doit on afficher le ftp ? par défaut oui
 *    Valeurs possibles si string : false,'non','no'.
 * @return array $erreurs
 *    Les erreurs éventuelles dans un tableau
 */
function formulaires_joindre_document_verifier_dist($id_document = 'new', $id_objet = 0, $objet = '', $mode = 'auto', $galerie = false, $proposer_media = true, $proposer_ftp = true)
{
    include_spip('inc/joindre_document');
    $erreurs = array();
    // on joint un document deja dans le site
    if (_request('joindre_mediatheque')) {
        $refdoc_joindre = intval(preg_replace(',^(doc|document|img),', '', _request('refdoc_joindre')));
        if (!sql_getfetsel('id_document', 'spip_documents', 'id_document=' . intval($refdoc_joindre))) {
            $erreurs['message_erreur'] = _T('medias:erreur_aucun_document');
        }
    } else {
        $files = joindre_trouver_fichier_envoye();
        if (is_string($files)) {
            $erreurs['message_erreur'] = $files;
        } elseif (is_array($files)) {
            // erreur si on a pas trouve de fichier
            if (!count($files)) {
                $erreurs['message_erreur'] = _T('medias:erreur_aucun_fichier');
            } else {
                // regarder si on a eu une erreur sur l'upload d'un fichier
                foreach ($files as $file) {
                    if (isset($file['error']) and $test = joindre_upload_error($file['error'])) {
                        if (is_string($test)) {
                            $erreurs['message_erreur'] = $test;
                        } else {
                            $erreurs['message_erreur'] = _T('medias:erreur_aucun_fichier');
                        }
                    }
                }
                // si ce n'est pas deja un post de zip confirme
                // regarder si il faut lister le contenu du zip et le presenter
                if (!count($erreurs) and !_request('joindre_zip') and $contenu_zip = joindre_verifier_zip($files)) {
                    list($fichiers, $erreurs, $tmp_zip) = $contenu_zip;
                    if ($fichiers) {
                        // on passe le md5 du fichier uniquement, on le retrouvera dans zip_to_clean de la session
                        $token_zip = md5($tmp_zip);
                        $erreurs['message_erreur'] = '';
                        $erreurs['lister_contenu_archive'] = recuperer_fond("formulaires/inc-lister_archive_jointe", array('chemin_zip' => $token_zip, 'liste_fichiers_zip' => $fichiers, 'erreurs_fichier_zip' => $erreurs));
                    } else {
                        $erreurs['message_erreur'] = _T('medias:erreur_aucun_fichier');
                    }
                }
            }
        }
        if (count($erreurs) and defined('_tmp_dir')) {
            effacer_repertoire_temporaire(_tmp_dir);
        }
    }
    return $erreurs;
}