// ------------------------------------------------------------------------
// fabriquer une chaine aléatoire
const chaine = (length) => {
	let chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzàâäéèêëîïôöûüùÀÂÄÉÈÊËÎÏÔÖÛÜÙ';
	let str = '';
    for (let i = 0; i < length; i++) {
        str += chars.charAt(Math.floor(Math.random() * chars.length));
	}
    return str;
}
// renvoyer une chaine
return chaine(10)

// renvoyer un tableau de chaines
for (let i = 0; i < 3 + Math.floor(Math.random() * 5); ++i) {
	${lesnoms} = ${lesnoms}.concat(chaine(10));
}
return ${lesnoms};				// => lesnoms

// ------------------------------------------------------------------------
// fabriquer chaîne avec nom prénom
const upper = (str) => {
	return str.charAt(0).toUpperCase() + str.slice(1);
};
const chaine = (length) => {
	let chars = 'aàbcdeéèfghijklmnoôpqrstuùvwxyz';
	let str = '';
	for (let i = 0; i < length; i++) {
		str += chars.charAt(Math.floor(Math.random() * chars.length));
	}
	let debut = upper(str.slice(0, length/2));
	let fin = upper(str.slice(length/2));
	return debut + ' ' + fin;
};
for (let i = 0; i < 7 + Math.floor(Math.random() * 15); ++i) {
	${lesnoms} = ${lesnoms}.concat(chaine(11 + Math.floor(Math.random() * 5)));
}
return ${lesnoms};

// fabriquer adresse courriel
const chaine = (length) => {
	let chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
	let str = '';
    for (let i = 0; i < length; i++) {
        str += chars.charAt(Math.floor(Math.random() * chars.length));
    }
    return str;
};
return chaine(8) + "@ici.fr";

// code postal
return Math.random().toString(10).substring(2, 7);

// numéro téléphone
return '0' + Math.random().toString(10).substring(2, 11);

// supprimer espace dans numéro téléphone
return ${telephone}.replace(/\\s/g, "")


// ------------------------------------------------------------------------
// Calculer date réelle à partir d'une date saisie même bizarre
// ex: 95/31/2020 => 03/10/2022
function joursMois (annee, mois) {
    return new Date(annee, mois, 0).getDate();
}
function getDate(chaine) {
	var ds = chaine.split('/');
	var jour=ds[0];
	var an = Math.floor(ds[1]/12);
	var annee = Number(ds[2]) + an;
	var mois = ds[1] - 12 * an;
	var dm = joursMois(annee, mois);
	while (jour > dm) {
		jour -= dm;
		++mois;
		if (mois > 12) { mois = 1; ++annee; }
		dm = joursMois(annee, mois);
	}
	if (jour < 10) { jour = '0' + jour; }
	if (mois < 10) { mois = '0' + mois; }
	return(jour + '/' + mois + '/' + annee);
}
return getDate(${date});


// ------------------------------------------------------------------------
// rendre visibles les options de filtres de membre
var nav = document.querySelector(".dropdown");
var li = nav.querySelectorAll("li");
for (const l of li) { l.style.display="block"; }
return;


// ------------------------------------------------------------------------
// vérifier la validité d'une date au format JJ/MM/AAAA

// 1. séparer une date JJ/MM/AAAA selon les /
return ${ds}.split('/')			// => ts

// 2. faire une date au format MM-DD-YYYY
return ${ts}[1] + '-' + ${ts}[0] +'-' + ${ts}[2] // => dd

// 3. vérifier si on peut créer une date valide
return ! isNaN(Date.parse(${dd})) // => ok


// ------------------------------------------------------------------------
// créer un tableau d'objets {numéro, catégorie}
// le trier par numéro
// renvoyer le tableau des catégories
let tab = [];
for (let i = 0; i < ${lesnumeros}.length; ++i)
{
	let o = Object();
	o.num=${lesnumeros}[i];
	o.cat=${lescategories}[i];
	tab.push(o);
}

// trier
tab.sort((a, b) => {
	return a.num - b.num;
});

// catégories
let categs = [];
tab.forEach((e) => {
	categs.push(e.cat);
});
return categs;

// ------------------------------------------------------------------------
// renvoyer le numéro d'une catégorie donnée
// params :
// - nom d'une catégorie
// - tableau des catégories classé par numéro croissant
function getNumero(cat_name, categories) {
	let i = 0;
	while (i < categories.length) {
		if (categories[i] == cat_name) { return i + 1; }
		i += 1;
	}
}

return getNumero(${categorie}, ${categories_num});

// ------------------------------------------------------------------------
// trier les membres : voir tri.js
// ------------------------------------------------------------------------

// sélectionner un parent parmi les nb premiers éléments du tableau
// lesnoms
function selParent(lesnoms, lesparents, nb)
{
	while(true) {
		let num = Math.floor(Math.random() * nb);
		if (lesparents[num].length == 0) { return lesnoms[num]; }
	}
}
return selParent(${lesnoms}, ${lesparents}, ${nb_total_membres})

// ------------------------------------------------------------------------
// normaliser une chaîne :
// - mettre en minuscules
// - remplacer les caractères avec accent par leur équivalent sans accent
// ------------------------------------------------------------------------
const accent = "àâäéèêëîïôöùûü";
const normal = "aaaeeeeiioouuu";

function normaliser (chaine) {
	let resu = "";
	chaine = chaine.toLocaleLowerCase();
	for (let i = 0; i < chaine.length; ++i) {
		let ind = accent.indexOf(chaine[i]);
		if (ind == -1) {
			resu += chaine[i];
		} else {
			resu += normal[ind];
		}
	}
	return resu;
}

// const donnee = "Aèzfoj Rdùxiè";
// let resu = normaliser(donnee.toLocaleLowerCase());
// console.log("donnée = " + donnee + "\nresu   = " + resu);

// ------------------------------------------------------------------------
// compter le nb d'occurences d'un élément dans un tableau de chaines
// ------------------------------------------------------------------------
function nbocc(elem, tab) {
	let nb = 0;
	for (const e of tab) {
		if (normaliser(e).localeCompare(elem) == 0) { nb += 1; }
	}
	return nb;
}
//return nbocc(${nom}.toLocaleLowerCase(), ${lesnoms})

// ------------------------------------------------------------------------
// renvoyer un nom au hasard d'un tableau en s'assurant qu'il n'a pas
// d'homonyme après normalisation
// ------------------------------------------------------------------------
function getNom(tab) {
	while (true) {
		let nom = tab.at(Math.floor(Math.random() * tab.length));
		let nb = nbocc(normaliser(nom), tab);
		if (nb == 1) { return nom; }
	}
}
return getNom(${lesnoms})

// ------------------------------------------------------------------------
// vérifier qu'une chaine est présente dans un nom normalisé
// ------------------------------------------------------------------------
function verif(chaine, nom) {
	return normaliser(nom).includes(chaine);
}

// ------------------------------------------------------------------------
// faire un tableau des « homonymes » de chaine
// ------------------------------------------------------------------------
function homonymes(chaine, tab) {
	let homos = []
	for (const e of tab) {
		if (normaliser(e).includes(chaine)) {
			homos.push(e);
		}
	}
	return homos;
}

// idem en renvoyant les indices
function indonymes(chaine, tab) {
	let homos = [];
	for (let i = 0 ; i < tab.length; ++i) {
		if (normaliser(tab[i]).includes(chaine)) {
			homos.push(i);
		}
	}
	return homos;
}