/*
 * Générateur de mot de passe.
 * Daniel Hagnoul
 * 
 * motdepasse(seed, nombre, taille, charString)
 *
 * Code v1.1.0 2010-06-24
 * Texte v1.1.0 2010-06-24
 *
 * motdepasse() utilise le générateur de nombre aléatoire
 * Alea de Johannes Baagøe -- baagoe@baagoe.com, 2010
 * https://baagoe.com/en/RandomMusings/javascript/
 
 * Le paramètre seed est un texte ou un nombre,
 * choisi au hasard, comportant au minimum 8 caractères,
 * qui doit être modifié à chaque appel de la fonction
 * motdepasse. Il sert à l'initialisation de l'objet Alea.
 * 
 * Le paramètre nombre fixe la quantité de mots de
 * passe qui seront générés.
 * 
 * Le paramètre taille fixe la longueur du mot de passe.
 * 
 * Le paramètre charString est un String contenant
 * les caractères qui peuvent figurer dans le mot
 * de passe.
 * 
 * taille minimum = 8, c'est la longueur minimale
 * recommandée pour un mot de passe.
 * 
 * charString.length > 2 * taille
 * charString.length minimum > 2 * taille minimum
 *
 * Si charString n'est pas valide, il contiendra par
 * défaut l'ensemble des caractères ci-dessous :
 * "azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN"
 * "1234567890"
 * "&é@#§^è!çà-_âêûîôäëïöü$*%£µùùáíóúàìòù"
 *
 * motdepasse() retourne un array de String.
*/ 
function motdepasse(seed, nombre, taille, charString){
    if ((seed === null) || (seed === undefined) || (seed.length < 8)){
        return "Erreur ! Le paramètre seed n'est pas défini ou il comporte moins de 8 caractères !";
    }
    
    var random = new Alea(seed);
                 
    // retourne X tel que : min <= X <= max
    function intRandom(min, max){
        return Math.floor(random() * (max - min + 1) + min);
    }
    
    // retourne un array dans un ordre pseudo-aléatoire
    function brouille(tab){
        var pos, temp;
        
        for (var j = tab.length - 1; j > 0; j--){
            pos = intRandom(0, j + 1);
            temp = tab[j];
            tab[j] = tab[pos];
            tab[pos] = temp;
        }
        
        return tab;
    }
    
    var nMin = 1; // minimum 1 mot de passe
    var tMin = 8; // minimum 8 charactères
    
    var n = parseInt(nombre) || nMin;
    
    if ((typeof n === "number") && (n < nMin)) {
        n = nMin;
    }
    
    var t = parseInt(taille) || tMin;
    
    if ((typeof t === "number") && (t < tMin)) {
        t = tMin;
    }
    
    var s = "";
    var strs = [];
    var chars = [];
    
    if ((charString != null) && (charString != undefined) && (charString.length > 2 * t)){
        chars = charString.split('');
    } else {
        chars = "azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN1234567890&é@#§^è!çà-_âêûîôäëïöü$*%£µùùáíóúàìòù~=+".split('');
    }
    
    var charslong = chars.length - 1;
    
    /*
     * Une couche d'aléatoire
     * 
     * La distribution des caractères est différente
     * à chaque appel de la méthode motdepasse.
    */ 
    chars = brouille(chars);
    
    for (var i = 0; i < n; i++){
        s = "";
        
        /*
         * Une couche d'aléatoire
         *
         * On choisit t-1 caractères au hasard.
        */
        for (var j = 0 ; j < t ; j++){
            s += chars[intRandom(0, charslong)];
        }
        
        strs.push(s);
    }
    
    return strs;
}