/**
 * Ajouter les vérifications déclarées dans la fonction "saisies" du CVT
 *
 * Si un formulaire CVT a déclaré des saisies, on utilise sa déclaration
 * pour effectuer les vérifications du formulaire.
 *
 * @see saisies_formulaire_charger()
 * @uses saisies_verifier()
 *
 * @param array $flux
 *     Liste des erreurs du formulaire
 * @return array
 *     iste des erreurs
 */
function saisies_formulaire_verifier($flux)
{
    // Il faut que la fonction existe et qu'elle retourne bien un tableau
    include_spip('inc/saisies');
    $saisies = saisies_chercher_formulaire($flux['args']['form'], $flux['args']['args']);
    if ($saisies) {
        // On ajoute au contexte les champs à déclarer
        $erreurs = saisies_verifier($saisies);
        if ($erreurs and !isset($erreurs['message_erreur'])) {
            $erreurs['message_erreur'] = _T('saisies:erreur_generique');
        }
        $flux['data'] = array_merge($erreurs, $flux['data']);
    }
    return $flux;
}
function formulaires_construire_formulaire_verifier($identifiant, $formulaire_initial=array(), $options=array()){
	include_spip('inc/saisies');
	$erreurs = array();
	// l'une ou l'autre sera presente
	$configurer_saisie = $enregistrer_saisie = '';

	// Pas d'erreur si l'on ne demande rien
	if (!($nom_ou_id = $configurer_saisie  = _request('configurer_saisie')
	OR    $nom_ou_id = $enregistrer_saisie = _request('enregistrer_saisie'))) {
		return $erreurs;
	}

	// On ajoute un préfixe devant l'identifiant
	$identifiant = 'constructeur_formulaire_'.$identifiant;
	// On récupère le formulaire à son état actuel
	$formulaire_actuel = session_get($identifiant);

	// On récupère les saisies actuelles, par identifiant ou par nom
	if ($nom_ou_id[0] == '@') {
		$saisies_actuelles = saisies_lister_par_identifiant($formulaire_actuel);
		$nom = $saisies_actuelles[$nom_ou_id]['options']['nom'];
	} else {
		$saisies_actuelles = saisies_lister_par_nom($formulaire_actuel);
		$nom = $nom_ou_id;
	}
	$noms_autorises = array_keys($saisies_actuelles);

	// le nom (ou identifiant) doit exister
	if (!in_array($nom_ou_id, $noms_autorises)) {
		return $erreurs;
	}
	
	// La liste des saisies
	$saisies_disponibles = saisies_lister_disponibles();
	
	$saisie = $saisies_actuelles[$nom_ou_id];
	$formulaire_config = $saisies_disponibles[$saisie['saisie']]['options'];
	array_walk_recursive($formulaire_config, 'formidable_transformer_nom', "saisie_modifiee_${nom}[options][@valeur@]");
	$formulaire_config = saisie_identifier(array('saisies'=>$formulaire_config));
	$formulaire_config = $formulaire_config['saisies'];
	
	// Si la saisie possede un identifiant, on l'ajoute
	// au formulaire de configuration pour ne pas le perdre en route
	if (isset($saisie['identifiant']) and $saisie['identifiant']) {
		$formulaire_config = saisies_inserer(
			$formulaire_config,
			array(
				'saisie' => 'hidden',
				'options' => array(
					'nom' => "saisie_modifiee_${nom}[identifiant]",
					'defaut' => $saisie['identifiant']
				),
			)
		);
	}
	
	// S'il y a l'option adéquat, on ajoute le champ pour modifier le nom
	if (isset($options['modifier_nom']) and $options['modifier_nom']
	  and $chemin_nom = saisies_chercher($formulaire_config, "saisie_modifiee_${nom}[options][description]", true))
	{
		$chemin_nom[] = 'saisies';
		$chemin_nom[] = '0';

		$formulaire_config = saisies_inserer(
			$formulaire_config,
			array(
				'saisie' => 'input',
				'options' => array(
					'nom' => "saisie_modifiee_${nom}[options][nom]",
					'label' => _T('saisies:option_nom_label'),
					'explication' => _T('saisies:option_nom_explication'),
					'obligatoire' => 'oui',
					'size' => 50
				),
				'verifier' => array(
					'type' => 'regex',
					'options' => array(
						'modele' => '/^[\w]+$/'
					)
				)
			),
			$chemin_nom
		);
	}

	// liste des options de vérification
	$verif_options = array();

	// S'il y a un groupe "validation" alors on va construire le formulaire des vérifications
	if ($chemin_validation = saisies_chercher($formulaire_config, "saisie_modifiee_${nom}[options][validation]", true)){
		include_spip('inc/verifier');
		$liste_verifications = verifier_lister_disponibles();
		$chemin_validation[] = 'saisies';
		$chemin_validation[] = 1000000; // à la fin
		
		// On construit la saisie à insérer et les fieldset des options
		$saisie_liste_verif = array(
			'saisie' => 'selection',
			'options' => array(
				'nom' => "saisie_modifiee_${nom}[verifier][type]",
				'label' => _T('saisies:construire_verifications_label'),
				'option_intro' => _T('saisies:construire_verifications_aucune'),
				'conteneur_class' => 'liste_verifications',
				'datas' => array()
			)
		);

		foreach ($liste_verifications as $type_verif => $verif){
			$saisie_liste_verif['options']['datas'][$type_verif] = $verif['titre'];
			// Si le type de vérif a des options, on ajoute un fieldset
			if (isset($verif['options']) and $verif['options'] and is_array($verif['options'])){
				$groupe = array(
					'saisie' => 'fieldset',
					'options' => array(
						'nom' => 'options',
						'label' => $verif['titre'],
						'conteneur_class' => "$type_verif options_verifier"
					),
					'saisies' => $verif['options']
				);
				array_walk_recursive($groupe, 'formidable_transformer_nom', "saisie_modifiee_${nom}[verifier][$type_verif][@valeur@]");
				$verif_options[$type_verif] = $groupe;
			}
		}
		$verif_options = array_merge(array($saisie_liste_verif), $verif_options);
	}
	
	
	if ($enregistrer_saisie){
		// La saisie modifié
		$saisie_modifiee = _request("saisie_modifiee_${nom}");
		// On cherche les erreurs de la configuration
		$vraies_erreurs = saisies_verifier($formulaire_config);
		// Si on autorise à modifier le nom ET qu'il doit être unique : on vérifie
		if (isset($options['modifier_nom']) and $options['modifier_nom']
		  and isset($options['nom_unique']) and $options['nom_unique'])
		{
			$nom_modifie = $saisie_modifiee['options']['nom'];
			if ($nom_modifie != $enregistrer_saisie and saisies_chercher($formulaire_actuel, $nom_modifie))
				$vraies_erreurs["saisie_modifiee_${nom}[options][nom]"] = _T('saisies:erreur_option_nom_unique');
		}
		// On regarde s'il a été demandé un type de vérif
		if (isset($saisie_modifiee['verifier']['type'])
		  and (($type_verif = $saisie_modifiee['verifier']['type']) != '')
		  and $verif_options[$type_verif])
		{
			// On ne vérifie que les options du type demandé
			$vraies_erreurs = array_merge($vraies_erreurs, saisies_verifier($verif_options[$type_verif]['saisies']));
		}
	}

	// On insère chaque saisie des options de verification
	if ($verif_options){
		foreach ($verif_options as $saisie_verif){
			$formulaire_config = saisies_inserer($formulaire_config, $saisie_verif, $chemin_validation);
		}
	}
	$erreurs['configurer_'.$nom] = $formulaire_config;
	$erreurs['positionner'] = '#configurer_'.$nom;

	if ($enregistrer_saisie) {
		if ($vraies_erreurs) {
			$erreurs = array_merge($erreurs, $vraies_erreurs);
		} else {
			$erreurs = array();
		}
	} else {
		$erreurs['message_erreur'] = ''; // on ne veut pas du message_erreur automatique
	}

	return $erreurs;
}