| <?php
/***
 *----------- ShortCodeLib-php V3 --------------
 *
 *
 *    Bienenue à la bibliothèque de fonctions php "ShortCodeLib 3"
 *
 *    Cette bibliothèque a été mise sur pied pour faciliter le développement des projets php
 *
 *    ---- @Auteur : Sitchet Tomkeu Dimitric - Elève Ingénieur des travaux informatique option Génie Loiciel
 *    ---- @Contact : (+237) 691 88 95 87 - 673 40 66 61 / [email protected] 
 *    ---- @Licence : Creative Commons 4.0
 *            Vous êtes libre d'utiliser, de modifier et de partager cette bibliothèque à
 *            condition expresse de respecter toutes les conditions ci-dessous
 *                1 - CC-BY : En utilisant, en modifiant, ou en partageant ce code, vous
 *                    reconnaissez qu'il a été crée par Sitchet Tomkeu Dimitric
 *                2 - CC-SA : Pour partager ce code, vous devez le faire suivant les mêmes
 *                    conditions d'utilisation sus énumerées. Le nom de son auteur doit
 *                    apparaitre dans toutes les copies.
 *
 *    ---- Nouveautés V3.0 :
 *            Par Dimitric Sitchet Tomkeu <[email protected] > le 09/05/2019
 *            1) Ajout de la fonction scl_cypher() qui crypte et decrypte une chaine par simple substitution (ancienne fonctionnalite de scl_hash)
 *            2) Modification de la fonction scl_hash() en fonction de hashage a sens unique
 *
 *    ---- Nouveautés V3.0.1 :
 *            Par Dimitric Sitchet Tomkeu <[email protected] > le 10/05/2019
 *            1) Modification de la fonction scl_include() pour gerer les inclusions faibles et fortes
 *
 *    ---- Nouveautés V3.2 :
 *            Par Dimitric Sitchet Tomkeu <[email protected] > le 13/08/2019
 *            1) Ajout de la fonction scl_byte2size() qui renvoie le nombre de kb, mo, gb en fonction du nombre de byte passé en parametre
 *            2) Ajout de la fonction scl_int2letter() qui transforme un chiffre en lettre
 *
 *    ---- Nouveautés V3.2.1 :
 *            Par Dimitric Sitchet Tomkeu <[email protected] > le 15/08/2019
 *            1) Modification de la fonction scl_debug() pour adopter une mise en page plus moderne
 *
 *    ---- Nouveautés V3.3 :
 *            Par Dimitric Sitchet Tomkeu <[email protected] > le 12/01/2020
 *            1) Ajout de la fonction scl_shortenStr() qui tronque une chaine en ajoutant les mots de fin
 ***/
/**
 * ------- FUNCTION SCL_UPLOAD()   --------
 * @author Dimitric Sitchet Tomkeu <[email protected] >
 *
 * @brief Cette fonction permet de récupérer un fichier envoyer par formulaire
 * @return mixed renvoie true si tous s'est bien passé et en cas d'erreur, renvoie un tableau contenant le code de l'erreur et le message par defaut
 * @param array $input la super globale $_FILE['nom'] qui permet de récupérer toutes les informations concernant le fichier.
 * @param string $path le dossier du serveur où l'on souhaite ranger le fichier
 * @param int [$size]  la taille maximale en Ko du fichier pouvant être téléchargé
 * @param string [$type] représente le type de fichier pouvant être téléchargé
 * Cette fonction prend en charge 6 types de fichier (image, video, audio, doc, zip, et web)
 * mais le type par défaut est 'all' pour spécifier que les 6 types ci-dessus (24 extensions) sont pris en compte
 * @param string [$output]  le nom avec lequel le fichier sera enregistré.
 */
function scl_upLoad($input, $path = '', $size = 2500000, $type = '', $output = '')
{
    // taille par défaut
    $size = (empty($size) OR !is_numeric($size)) ? 2500000 : $size;
    // Le dossier par defaut est la racine
    $path = (!empty($path) AND !file_exists($path)) ? '' : htmlspecialchars($path);
    if (!is_array($input)) {
        return array(0, 'Entrée non valide');
    }
    if (empty($input['tmp_name']) OR empty($input['name']) OR empty($input['size'])) {
        return array(1, 'Informations d\'entrées incomplètes');
    }
    if ($input['size'] > $size) {
        return array(2, 'Fichier trop volumineux');
    }
    /* vérification du type et définition des extensions autorisées */
    if ($type == 'image') {
        $extensions = array('jpg', 'jpeg', 'png', 'gif');
    } else if ($type == 'audio') {
        $extensions = array('mp3', 'wav', 'mpeg');
    } else if ($type == 'video') {
        $extensions = array('mp4', 'avi', 'ogv', 'webm', 'flv', 'mov');
    } else if ($type == 'doc') {
        $extensions = array('txt', 'doc', 'docx', 'pdf');
    } else if ($type == 'web') {
        $extensions = array('htm', 'html', 'css', 'xml', 'js', 'json');
    } else if ($type == 'db') {
        $extensions = array('sql', 'vcf');
    } else if ($type == 'zip') {
        $extensions = array('zip', 'rar');
    } else {
        // Si on veut travailler avec une(plusieurs) extensions spécifique du même type
        if (preg_match('#^(image|audio|video|doc|web|db|zip){1}/(.*?)$#i', $type)) {
            $extensions = explode('/', $type)[1];
            if (empty($extensions)) {
                // Si il n y'a rien après le slash
                switch (explode('/', $type)[0]) {
                    case 'image' :
                        $extensions = array('jpg', 'jpeg', 'png', 'gif');
                        break;
                    case 'audio' :
                        $extensions = array('mp3', 'wav', 'mpeg');
                        break;
                    case 'video' :
                        $extensions = array('mp4', 'avi', 'ogv', 'webm', 'flv', 'mov');
                        break;
                    case 'doc' :
                        $extensions = array('txt', 'doc', 'docx', 'pdf');
                        break;
                    case 'web' :
                        $extensions = array('htm', 'html', 'css', 'xml', 'js', 'json');
                        break;
                    case 'db' :
                        $extensions = array('sql', 'vcf');
                        break;
                    case 'zip' :
                        $extensions = array('zip', 'rar');
                        break;
                }
            } else if (count(explode(',', $extensions)) < 2) {
                $extensions = array(explode(',', $extensions)[0]); // Si il y'a une seule extension
            } else {
                $ext = explode(',', $extensions);
                $extensions = array(); // Si il y'a plusieurs extensions
                foreach ($ext AS $ex) {
                    $extensions[] = $ex;
                }
            }
        } else {
            $extensions = array(
                'jpg', 'jpeg', 'png', 'gif', 'mp3', 'wav', 'mpeg', 'mp4', 'avi', 'ogv', 'webm', 'flv', 'mov', 'txt', 'doc', 'docx',
                'pdf', 'htm', 'html', 'css', 'xml', 'js', 'json', 'sql', 'vcf', 'zip', 'rar'
            );
        }
    }
    if (!in_array(strtolower(pathinfo($input['name'])['extension']), $extensions)) {
        return array(3, 'Extension non prise en charge');
    }
    /*
    vérification de la valeur du nom d'enregistrement ($output)
    --  $extension = '0.' signifie qu'on ne change pas l'extension du fichier tandis que
        $extension = '1.' signifie qu'on change. donc nous sommes dans le cas où le '.extension' a été spécifié
    --  NB: ne pas confondre $extensions et $extension. l'un représente les différents extension autorisés et
        l'autre vérifie si l'extension originale du fichier doit être modifié ou non
    */
    if (empty($output)) // Si on ne defini pas le nom de sortie...
    {
        // on enregistre le fichier avec la date et l'heure courante
        $output = 'scl_' . date('Ymd') . '-' . date('His');
        $extension = '0.';
    } else // Si on defini le nom de sortie...
    {
        if (!empty(explode('.', $output)[1]) AND in_array(strtolower(explode('.', $output)[1]), $extensions))  // Si l'extension est presente dans ce nom et est valide...
        {
            $out = explode('.', $output);
            $output = $out[0]; // On enregistre le fichier avec le nom specifié
            $extension = '1.' . $out[1]; // On enregistre le fichier avec l'extension specifié (changement d'extension)
        } else // Sinon...on enregistre le fichier avec le nom specifié mais en conservant son extension
        {
            $output = str_replace('.', '', $output);
            $output = str_replace(',', '', $output);
            $output = str_replace(';', '', $output);
            $extension = '0.';
        }
    }
    // si on a prévu modifier l'extension du fichier
    if (explode('.', $extension)[0] == 1) {
        $extension = explode('.', $extension)[1]; // l'extension est le celui specifié
    } else {
        $extension = strtolower(pathinfo($input['name'])['extension']); // 'extension est celui de départ
    }
    // si le fichier n'a pas été téléchargé
    if (!move_uploaded_file($input['tmp_name'], $path . $output . '.' . $extension)) {
        return array(4, 'Erreur de téléversement');
    }
    return true;
}
/**
 * ------- FUNCTION SCL_MINIMIZEIMG()   --------
 * @author Dimitric Sitchet Tomkeu <dev.dimitrisitchet@gmail>
 *
 * @brief Cette fonction permet diminuer les dimensions d'une image
 * @return mixed renvoie true si tous s'est bien passé et en cas d'erreur, renvoie un tableau contenant le code de l'erreur et le message par defaut
 *
 * @param string $src la source de l'image a redimentionner.
 * @param array|int [$size]  le tableau contenant les nouvelles dimensions ou la dimension unique(hauteur = largeur).
 * @param bool [$relative]  specifie si on redimensionne la photo proportionnellement aux dimensions initiales
 */
function scl_minimizeImg($src, $size = array(), $relative = false)
{
    // Si le fichier n'existe pas
    if (!file_exists($src)) {
        return array(0, 'Fichier inexistant');
    }
    // Si on n'envoi pas un tableau ou un nombre comme tailles
    if (empty($size) OR (!is_array($size) AND !is_int($size))) {
        return array(1, 'Mauvaises dimensions de redimensionnement');
    }
    // Si on envoie un tableau comme $size
    if (is_array($size)) {
        // Si le tableau n'a pas 1 ou deux element
        if (count($size) < 1 OR count($size) > 2) {
            return array(2, 'Violation du nombre de dimension');
        }
        // Si l'un des element du tableau n'est pas un nombre
        if (!is_int($size[0]) OR (!empty($size[1]) AND !is_int($size[1]))) {
            return array(3, 'Type de dimension inconnu');
        }
    }
    // Les nouvelles dimensions
    $dimensions = array('x' => 0, 'y' => 0);
    if (is_int($size)) {
        $dimensions['x'] = $size;
        $dimensions['y'] = $size;
    } else {
        if (count($size) == 1) {
            $dimensions['x'] = $size[0];
            $dimensions['y'] = $size[0];
        } else {
            $dimensions['x'] = $size[0];
            $dimensions['y'] = $size[1];
        }
    }
    if (preg_match('#\.jpe?g$#i', $src)) {
        $source = imagecreatefromjpeg($src);
    }
    if (preg_match('#\.png$#i', $src)) {
        $source = imagecreatefrompng($src);
    }
    if (preg_match('#\.gif$#i', $src)) {
        $source = imagecreatefromgif($src);
    }
    // Les dimensions de l'image source
    $l_s = imagesx($source); // Largeur
    $h_s = imagesy($source); // Hauteur
    // Les dimensions de la destination
    if ($relative) {
        $l_d = ($dimensions['x'] / 100) * $l_s;
        $h_d = ($dimensions['y'] / 100) * $h_s;
    } else {
        $l_d = ($dimensions['x'] <= 10) ? $l_s : $dimensions['x']; // Largeur
        $h_d = ($dimensions['y'] <= 10) ? $h_s : $dimensions['y']; // Hauteur
    }
    // On crée la miniature vide
    $destination = imagecreatetruecolor($l_d, $h_d);
    // On crée la miniature
    imagecopyresampled($destination, $source, 0, 0, 0, 0, $l_d, $h_d, $l_s, $h_s);
    // On enregistre la miniature
    if (preg_match('#\.jpe?g$#i', $src)) {
        $result = imagejpeg($destination, $src);
    }
    if (preg_match('#\.png$#i', $src)) {
        $result = imagepng($destination, $src);
    }
    if (preg_match('#\.gif$#i', $src)) {
        $result = imagegif($destination, $src);
    }
    return ($result == true) ? true : array(5, 'Erreur lors du redimensionnement');
}
/**
 * ------- FUNCTION SCL_GENERATEKEYS()   --------
 * @author Dimitric Sitchet Tomkeu <[email protected] >
 *
 * @brief Cette fonction permet de une chaine aléatoirement
 * @return string
 *
 * @param int [$nbr]  le nombre de caractères de la clé.
 * @param int [$type]  le type de clé à generer.
 */
function scl_generateKeys($nbr = 8, $type = 0)
{
    /* Valeurs par défaut */
    $nbr = (empty($nbr)) ? 8 : (int)$nbr;
    $nbr = (!is_int($nbr)) ? 8 : (int)$nbr;
    $nbr = ($nbr < 3 OR $nbr > 64) ? 8 : (int)$nbr;
    switch ($type) {
        case 1 :
            $chars = range('a', 'z');
            break; // Caractères alphabetique minuscules
        case 2 :
            $chars = range('A', 'Z');
            break; // Caractères alphabetique majuscules
        case 3 :
            $chars = range(0, 9);
            break; // Caractères numerique
        case 4 :
            $chars = array_merge(range('a', 'z'), range('A', 'Z'));
            break; // Caractères alphabetique
        case 5 :
            $chars = array_merge(range(0, 9), range('a', 'z'));
            break; // Caractères numerique et alphabetique minuscules
        case 6 :
            $chars = array_merge(range(0, 9), range('A', 'Z'));
            break; // Caractères numerique et alphabetique majuscules
        default :
            $chars = array_merge(range(0, 9), range('a', 'z'), range('A', 'Z'));
            break; // Tous les caractères
    }
    $return = ''; // Valeur de retour
    $nb_char = count($chars); // On compte le nombre de caractères disponible
    for ($i = 0; $i < $nbr; $i++) {
        // On tire un nombre au hasard parmi toutes les indexes de caracteres et on affiche le caracteres corespondant
        $return .= $chars[rand(0, ($nb_char - 1))];
    }
    return $return;
}
/**
 * ------- FUNCTION SCL_DATE()   --------
 * @author Dimitric Sitchet Tomkeu <[email protected] >
 * @brief Cette fonction permet de formater une date
 * @return string
 *
 * @param string $date la date à formater
 * @param string [$format]  le format de sortie
 * @param bool [$interval] specifie si l'interval va etre donné (true) ou pas (false)
 * @param string [$fuseau]  le fuseau horaire
 */
function scl_date($date, $format = 'D, d M Y', $interval = true, $fuseau = 'Europe/Paris')
{
    /* Valeurs par défaut */
    $format = (empty($format) OR !is_string($format)) ? 'D, d M Y' : htmlspecialchars(trim($format)); // Le format de sortie, par défaut = D, d M Y
    $fuseau = (empty($fuseau) OR !is_string($fuseau)) ? 'Europe/Paris' : htmlspecialchars(trim($fuseau)); // fuseau horaire
    $interval = (!is_bool($interval)) ? true : $interval; // Specifie si on gere les intervales ou pas
    $interval = ($interval == false) ? false : true; // Specifie si on gere les intervales ou pas
    $date = new DateTime($date);  // On contruit la date
    // Si on ne gere pas les intervales
    if ($interval == false) {
        //On renvoie la date formatée et dans le fuseau correspondant
        return $date->setTimezone(new DateTimeZone($fuseau))->format($format);
    }
    // Si on gere les intervales
    $maintenant = new DateTime(date('Y-m-d H:i:s')); // recupere la date actuelle
    // On place les date dans le fuseau horaire souhaité
    $maintenant->setTimezone(new DateTimeZone($fuseau));
    $date->setTimezone(new DateTimeZone($fuseau));
    $dif = $maintenant->diff($date)->format('%d');
    if ($dif < 0 OR $dif > 3) {
        // Si sa fait plus de 3 jours ou la date n'est pas encore arriver
        $return = $date->setTimezone(new DateTimeZone($fuseau))->format($format);
    } else if ($dif > 1) {
        $return = $maintenant->diff($date)->format('There is %d days');
    } else if ($dif == 1) {
        $return = 'Yesterday at ' . $date->format('H') . 'h';
    } else {
        // Si c'est aujourd'hui
        $dif = $maintenant->diff($date)->format('%h');
        if ($dif < 0) {
            // Si l'heure est par hasard negatif, on renvoie la data normalement
            $return = $date->setTimezone(new DateTimeZone($fuseau))->format($format);
        } else if ($dif > 1) {
            $return = $maintenant->diff($date)->format('There is %h hours');
        } else {
            $dif = $maintenant->diff($date)->format('%i');
            if ($dif < 0) {
                $return = $date->setTimezone(new DateTimeZone($fuseau))->format($format);
            } else if ($dif > 1) {
                $return = $maintenant->diff($date)->format('There is a %i minutes');
            } else {
                $dif = $maintenant->diff($date)->format('%s');
                if ($dif < 0) {
                    $return = $date->setTimezone(new DateTimeZone($fuseau))->format($format);
                } else if ($dif >= 10) {
                    $return = $maintenant->diff($date)->format('There is %s seconds');
                } else {
                    $return = 'Now';
                }
            }
        }
    }
    if ($maintenant->diff($date)->format('%y') >= 1 OR $maintenant->diff($date)->format('%m') >= 1) {
        return $date->setTimezone(new DateTimeZone($fuseau))->format($format);
    }
    if ($maintenant->format('d') < $date->format('d') AND $maintenant->format('y-m') <= $date->format('y-m')) {
        return $date->setTimezone(new DateTimeZone($fuseau))->format($format);
    }
    if ($maintenant < $date) {
        $dif = $date->diff($maintenant)->format('%y');
        if ($dif > 1) {
            return $date->diff($maintenant)->format('In %y years');
        }
        $dif = $date->diff($maintenant)->format('%m');
        if ($dif > 1) {
            return $date->diff($maintenant)->format('In %m months');
        }
        $dif = $date->diff($maintenant)->format('%d');
        if ($dif > 1) {
            return $date->diff($maintenant)->format('In %d days');
        }
        $dif = $date->diff($maintenant)->format('%h');
        if ($dif < 0) {
            return $date->setTimezone(new DateTimeZone($fuseau))->format($format);
        } else if ($dif >= 1) {
            return $date->diff($maintenant)->format('In %h hours');
        }
        $dif = $date->diff($maintenant)->format('%i');
        if ($dif < 0) {
            return $date->setTimezone(new DateTimeZone($fuseau))->format($format);
        } else if ($dif >= 1) {
            return $date->diff($maintenant)->format('In %i minutes');
        } else {
            return $date->setTimezone(new DateTimeZone($fuseau))->format($format);
        }
    }
    return $return;
}
/**
 * ------- FUNCTION SCL_TRANSLATE_DATE()   --------
 * @author Dimitric Sitchet Tomkeu <dev.dimitrisitchet@gmail>
 * @brief Cette fonction permet de traduire une date en une autre langue formater une date
 * @return string
 *
 * @param string $date la date à traduire
 * @param string> [$lang] la langue de sortie
 */
function scl_translate_date($date, $lang = 'en')
{
    $lang = strtolower($lang);
    if ($lang == 'fr') {
        $date = preg_replace('#^Now?#iSu', 'Maintenant', $date);
        $date = preg_replace('#^There is(\s?a)?#iSu', 'Il y a', $date);
        $date = preg_replace('#^Yesterday at#iSu', 'Hier à', $date);
        $date = preg_replace('#^In#iSu', 'Dans', $date);
        $date = preg_replace('#years#iSu', 'ans', $date);
        $date = preg_replace('#months#iSu', 'mois', $date);
        $date = preg_replace('#days#iSu', 'jours', $date);
        $date = preg_replace('#hours#iSu', 'heures', $date);
        $date = preg_replace('#seconds#iSu', 'secondes', $date);
        $date = preg_replace('#Monday#iSu', 'Lundi', $date);
        $date = preg_replace('#Mon#iSu', 'Lun', $date);
        $date = preg_replace('#Tuesday#iSu', 'Mardi', $date);
        $date = preg_replace('#Tue#iSu', 'Mar', $date);
        $date = preg_replace('#Wednesday#iSu', 'Mercredi', $date);
        $date = preg_replace('#Wed#iSu', 'Mer', $date);
        $date = preg_replace('#Thursday#iSu', 'Jeudi', $date);
        $date = preg_replace('#Thu#iSu', 'Jeu', $date);
        $date = preg_replace('#Friday#iSu', 'Vendredi', $date);
        $date = preg_replace('#Fri#iSu', 'Ven', $date);
        $date = preg_replace('#Saturday#iSu', 'Samedi', $date);
        $date = preg_replace('#Sat#iSu', 'Sam', $date);
        $date = preg_replace('#Sunday#iSu', 'Dimanche', $date);
        $date = preg_replace('#Sun#iSu', 'Dim', $date);
        $date = preg_replace('#January#iSu', 'Janvier', $date);
        $date = preg_replace('#Jan#iSu', 'Jan', $date);
        $date = preg_replace('#February#iSu', 'Févier', $date);
        $date = preg_replace('#Feb#iSu', 'Fev', $date);
        $date = preg_replace('#March#iSu', 'Mars', $date);
        $date = preg_replace('#Mar#iSu', 'Mar', $date);
        $date = preg_replace('#April#iSu', 'Avril', $date);
        $date = preg_replace('#Apr#iSu', 'Avr', $date);
        $date = preg_replace('#May#iSu', 'Mai', $date);
        $date = preg_replace('#June#iSu', 'Juin', $date);
        $date = preg_replace('#Jun#iSu', 'Juin', $date);
        $date = preg_replace('#July#iSu', 'Juillet', $date);
        $date = preg_replace('#July?#iSu', 'Jui', $date);
        $date = preg_replace('#August#iSu', 'Août', $date);
        $date = preg_replace('#Aug#iSu', 'Août', $date);
        $date = preg_replace('#September#iSu', 'Septembre', $date);
        $date = preg_replace('#Sept?#iSu', 'Sept', $date);
        $date = preg_replace('#October#iSu', 'Octobre', $date);
        $date = preg_replace('#Oct#iSu', 'Oct', $date);
        $date = preg_replace('#November#iSu', 'Novembre', $date);
        $date = preg_replace('#Nov#iSu', 'Nov', $date);
        $date = preg_replace('#December#iSu', 'Décembre', $date);
        $date = preg_replace('#Dec#iSu', 'Déc', $date);
    }
    return $date;
}
/**
 * ------- FUNCTION SCL_HASH()   --------
 * @author Dimitric Sitchet Tomkeu <[email protected] >
 * @brief Cette fonction permet d'hasher une chaine
 * @return string
 *
 * @param string $str la chaine caractères qu'on veut hasher
 * @param int [$lenght] la longueur de la chaine a sortir
 */
function scl_hash($str, $lenght = 128, $key = '')
{
// Valeur par defaut
    $lenght = (empty($lenght) OR !is_int($lenght)) ? 128 : $lenght;
//    Valeurs minimale et maximale pour le haché
    $lenght = ($lenght < 50) ? 50 : $lenght;
    $lenght = ($lenght > 200) ? 200 : $lenght;
    $str = trim(htmlspecialchars($str)); // On echappe la chaine et on supprime les espaces de debut et de fin
    $code = strlen($str); // On recupere la logueur de la chaine
    $code = ($code * 200) * ($code / 50); // afin de creer un code
//    Le sel
    $sel1 = strlen($str);
    $sel2 = strlen($code);
    $sel = strlen($str . $code);
//    Le hashage commence ici
    $texte_hash_1 = hash('sha256', 'scl_' . $sel1 . $str . $sel2); // Premier hash avec le sha256
    $texte_hash_2 = hash('sha512', $texte_hash_1 . $sel . '_hash'); // Deuxieme hash avec le sha512
//    On divise les deux hash en 2 parties egales
    $texte_hash_1_1 = substr($texte_hash_1, 0, 32);
    $texte_hash_1_2 = substr($texte_hash_1, -32); // Les parties du premier hashé
    $texte_hash_2_1 = substr($texte_hash_2, 0, 64);
    $texte_hash_2_2 = substr($texte_hash_2, -64); // Les parties du deuxieme hashé
    $final = $texte_hash_1_1 . 'ec' . $texte_hash_2_1 . 'af' . $texte_hash_1_2 . '84' . $texte_hash_2_2 . '5f'; // On additionne les deux hashés en ajoutant un sel statique pour atteindre les 200 caract
//    On renvoi le hash avec la longueur souhaité
    return substr($final, 0, $lenght);
}
/**
 * ------- FUNCTION SCL_CYPHER()   --------
 * @author Dimitric Sitchet Tomkeu <[email protected] >
 * @brief Cette fonction permet d'encrypter et de decrypter une chaine de caracteres
 * @return string
 *
 * @param string $str la chaine caractères qu'on veut encrypter ou decrypter
 * @param string [$action] l'action qu'on veut effectuer (encrypter/decrypter).
 * @param int [$repeat] le nombre de fois qu'on repete l'action
 */
function scl_cypher($str, $action = 'encrypt', $repeat = 0)
{
    /*Valeur par defaut */
    $action = strtolower($action);
    $action = ($action != 'decrypt') ? 'encrypt' : 'decrypt';
    $repeat = (!is_int($repeat) OR $repeat < 1) ? 0 : $repeat;
    $chars = ''; //Les differents caractères entrés
    $size = strlen($str);
    for ($i = $size; $i > 1; $i--) {
        // On separes chaque caracteres du mot independament
        $chars .= substr($str, 0, 1) . ' ';
        $str = substr($str, 1);
    }
    if (strlen($str) <> 0) {
        $chars .= $str;
    } else {
        $chars = substr($chars, 0, strlen($chars) - 1);
    }
    //Les entrées / sorties
    $inputs = array(
        'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
    );
    $outputs = array(
        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
        'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
        'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'
    );
    $chars = explode(' ', $chars);  // On transforme la chaine précédement créée en tableau
    $return = '';
    // On parcours tout le dit tableau (ie. on recupere les caracteres un a un)
    foreach ($chars As $val) {
        // Si le caractère est encryptable ou decryptable
        if (in_array($val, $inputs) AND in_array($val, $outputs)) {
            // Si on veut encrypter
            if ($action == 'encrypt') {
                $num = array_search($val, $inputs); // On recupere l'index de la lettre
                $return .= $outputs[$num]; // et on ajoute le caractère d'encryptage correspondant
            } // sinon, on veut decrypter
            else {
                $num = array_search($val, $outputs); // On recupere l'index de la lettre
                $return .= $inputs[$num]; // et on ajoute le caractère de décryptage correspondant
            }
        } //Sinon
        else {
            $return .= $val; // On le laisse comme il est
        }
    }
    for ($i = 0; $i < $repeat; $i++) {
        $return = scl_cypher($return, $action);
    }
    return $return; // On renvoie la chaine encrypter ou decrypter
}
/**
 * ------- FUNCTION SCL_CRYPT()   --------
 * @author Dimitric Sitchet Tomkeu <[email protected] >
 * @param string $str la chaine caractères qu'on veut e
 * @brief Cette fonction permet d'encrypter et de decrypter une chaine de caracteres
 * @return string
 *ncrypter ou decrypter
 * @param string $key la clé de chiffrement
 * @param string [$action] l'action qu'on veut effectuer (encrypter/decrypter).
 */
function scl_crypt($str, $key, $action = 'encrypt')
{
    /*Valeur par defaut */
    $action = strtolower($action);
    $action = ($action != 'decrypt') ? 'encrypt' : 'decrypt';
    $return = ''; // La valeur retournée
    /* On protège la clé pour eviter les failles */
    $code = strlen($key);
    $code = ($code * 4) * ($code / 3);
    $key = sha1(strlen($key) . $key . strlen($key . $code));
    $key .= md5($code . $key . $code);
    $letter = -1;
    $str = ($action == 'encrypt') ? $str : base64_decode($str);
    $strlen = strlen($str); // Nombre de caractère de la chaine à traiter
    for ($i = 0; $i < $strlen; $i++) {
        $letter++;
        if ($letter > 31) {
            $letter = 0;
        }
        if ($action == 'encrypt') {
            $neword = ord($str[$i]) + ord($key[$letter]);
            if ($neword > 255) {
                $neword -= 256;
            }
        } else {
            $neword = ord($str[$i]) - ord($key[$letter]);
            if ($neword < 1) {
                $neword += 256;
            }
        }
        $return .= chr($neword);
    }
    $return = ($action == 'encrypt') ? base64_encode($return) : $return;
    return $return; // On renvoie la chaine encrypter ou decrypter
}
/**
 * ------- FUNCTION SCL_TRUNCATE()   --------
 * @author Dimitric Sitchet Tomkeu <[email protected] >
 * @brief Cette fonction permet de couper une chaine de caractere
 * @return string
 *
 * @param  string $str la chaine caractères qu'on veut couper
 * @param int $size est la longueur finale de la chaine apres la coupure
 * @param bool [$suspension] specifie si on ajoute les points de suspension à la fin (true) ou pas (false).
 */
function scl_truncate($str, $size, $suspension = false)
{
    /*Valeur par defaut */
    $str = htmlspecialchars($str); // On protege la chaine
    $size = (!is_numeric($size)) ? strlen($str) : $size; // Taille à couper
    $lenght = strlen($str); // longueur de la chaine
    if ($lenght > $size) {
        // Si la longueur initiale de la chaine est superieur à la taille qu'on veut
        $str = substr($str, 0, $size); // On coupe la chaine
        if ($suspension === true) {
            $str .= '...'; // On ajoute les suspension
        }
    }
    return $str; // On renvoie la chaine couper
}
/**
 * ------- FUNCTION SCL_SHORTENSTR()   --------
 * @author Dimitric Sitchet Tomkeu <[email protected] >
 * @brief Cette fonction permet de couper une chaine de caractere
 * @return string
 *
 * @param  string $str la chaine caractères qu'on veut couper
 * @param int $max est la longueur finale de la chaine apres la coupure
 * @param string [$sep] Le separateur entre le debut et la fin de la chaine
 * @param int [$width] Le nombre de fois qu'on doit repeter le separateur
 *
 * @example
 *  echo scl_shortenStr("J'aime le PHP et j'ose croire que cette fonction vous sera utile", 34); // J'aime le PHP et...vous sera utile
 */
function scl_shortenStr($str, $max, $sep = '.', $width = 3)
{
    /*Valeur par defaut */
    $str = htmlspecialchars($str); // On protege la chaine
    $max = (!is_numeric($max)) ? strlen($str) : $max; // Taille à couper
    $length = strlen($str); // Nombre de caractères
    if ($length > $max) {
        $too_much_length = $length - $max + $width; // Nombre de caractères en trop
        if ($max < $width) {
            // Dans le cas où la largeur max est inférieur à la largeur du séparateur
            $width = $max;
        }
        $start = ceil($length / 2 - $too_much_length / 2);
        $str = substr($str, 0, $start) . str_repeat($sep, $width) . substr($str, floor($start + $too_much_length));
    }
    return $str;
}
/**
 * ------- FUNCTION SCL_CLEANER()   --------
 * @author Dimitric Sitchet Tomkeu <[email protected] >
 *
 * @brief Cette fonction permet de suprimer les espace en debut et fin d'une chaine tout en echappant les entités html
 * @return string
 *
 * @param string $str la chaine caractères qu'on veut netoyer
 */
function scl_cleaner(&$str)
{
    if (is_array($str)) {
        foreach ($str As $key => $value) {
            if (is_string($value)) {
                $str[$key] = trim(htmlspecialchars($value));
            }
            if (is_array($value)) {
                foreach ($value As $cle => $valeur) {
                    $str[$key][$cle] = scl_cleaner($valeur);
                }
            }
        }
    }
    if (is_string($str)) {
        $str = trim(htmlspecialchars($str));
    }
    return $str; // On renvoie la chaine netoyer
}
/**
 * ------- FUNCTION SCL_INCLUDE()   --------
 * @author Dimitric Sitchet Tomkeu <[email protected] >
 *
 * @brief Cette fonction permet inclure un fichier de maniere securiser dans une page web
 * @return void
 *
 * @param string $file le fichier a inclure
 * @param array|null $data
 * @param bool $exception
 *
 */
function scl_include($file, $data = array(), $exception = false)
{
    $file = trim(htmlspecialchars($file));
    if (is_file($file) AND file_exists($file)) {
        extract((array)$data);
        include_once($file);
    }
    else if ($exception) {
        die('SCL EXCEPTION : The file « <b>' . $file . '</b> » don\'t exist !');
    }
    return;
}
/**
 * ------- FUNCTION SCL_DEBUG()   --------
 * @author Dimitric Sitchet Tomkeu <[email protected] >
 *
 * @brief Cette fonction permet de debuger une ou plusieurs variable
 * @return void
 *
 * @param mixed $var
 * @param bool $style specifie si on veut styliser le resultat ou pas (affichage classique de var_dump())
 */
function scl_debug($var, $style = false)
{
    $vars = (array) $var;
    if(true !== (bool) $style)
    {
        echo "<pre style=\"background:#eee;padding:1em;border:1px inset #adb5bd;border-radius:5px;font-family:monospace;margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar;\">\n";
        foreach ($vars As $var) {
            var_dump($var);
        }
        echo "</pre>\n";
        return;
    }
    echo "<pre style=\"background:#eee;padding:1em;border:1px inset #adb5bd;border-radius:5px;font-family:monospace;margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar;\">\n";
    $i = 0;
    foreach ($vars As $var)
    {
        if($i != 0) {
            echo '<hr style="height:1;margin:0;margin-top:1em;" color="#ddd" size="1">';
        }
        $i++;
        echo '<span style="width:auto;display:inline-block; margin-bottom: .25em; font-weight:bold;font-family:\'Lato\', candara, \'Arial Narrow\', sans-serif; color:#6c17cb; font-style:italic">';
        echo ucfirst(gettype($var));
        if(is_object($var)) {
            echo ' | '.get_class($var);
        }
        if(is_string($var)) {
            echo '<span style="width:auto;font-weight:lighter !important; display:inline-block; padding-left:.5em; color:crimson">(lenght : '.strlen($var).')</span>';
        }
        if(is_array($var)) {
            echo '<span style="width:auto;font-weight:lighter !important; display:inline-block; padding-left:.5em; color:crimson">(lenght : '.count($var).')</span>';
        }
        echo "</span>";
        if(is_null($var)) {
            echo "\n\tNULL";
        }
        else if(is_string($var) OR is_numeric($var))
        {
            echo "\n\t".$var;
        }
        else if(is_bool($var)) {
            echo (true === $var) ? "\n\ttrue" : "\n\tfalse";
        }
        else if(is_array($var) OR is_object($var))
        {
            if(empty($var)) {
                echo "\n\tempty";
            }
            else
            {
                foreach($var As $key => $value)
                {
                    echo "\n\t<span style=\"width:auto;display:inline-block; margin: .25em; 0\">";
                    echo "<b>".$key."</b> => ";
                    if(is_array($value) OR is_object($value)) {
                        scl_debug($value);
                    }
                    else {
                        if(is_bool($value)) {
                            echo (true === $value) ? 'true' : 'false';
                        }
                        else {
                            echo $value;
                        }
                        echo '<span style="auto;font-weight:lighter !important; display:inline-block; padding-left:.5em; color:#eb7c55">['.ucfirst(gettype($value));
                        if(is_string($value)) {
                            echo '('.strlen($value).')';
                        }
                        echo ']</span>';
                    }
                    echo "</span>";
                }
            }
        }
    }
    echo "</pre>";
    return;
}
/* ------------------------------------------------------------------------- */
/**
 * ------- FUNCTION SCL_BYTE2SIZE()   --------
 *
 * @brief Cette fonction donne le poids en byte, kb, mb en fonction du nombre de byte passé en parametre
 * @return string
 *
 * @param int $bytes
 * @param int $format
 * @param int $precision
 */
function scl_byte2size($bytes, $format = 1024, $precision = 2)
{
    $unit = array('B','KB','MB');
    return @round($bytes / pow($format, ($i = floor(log($bytes, 1024)))), $precision).' '.$unit[$i];
}
/**
 * ------- FUNCTION SCL_MOVESPECIALCHAR()   --------
 *
 * @brief Cette fonction permet d'enlever tous les caractères spéciaux (accents, points...) dans une chaine
 * @return string
 *
 * @param string $str est chaine à traiter.
 * @param bool [$leaveSpecialChar] specifie si on veut laisser les ponctuations (.,?/:) (true) ou les remplacer par les tirets (false)
 * @param bool [$UpperToLower] specifie si on veut laisser les majuscules (false) ou les transformer en minuscules (true)
 * @param array [$specialChars] La liste des caracteres speciaux a gerer
 */
function scl_moveSpecialChar($str, $leaveSpecialChar = false, $UpperToLower = true, $specialChars = array())
{
    /* Valeurs par défaut */
    $leaveSpecialChar = ($leaveSpecialChar != false) ? true : false;
    $UpperToLower = ($UpperToLower != false) ? true : false;
    // transformer les caractères accentués en entités HTML
    $str = htmlentities($str, ENT_NOQUOTES);
    // remplacer les entités HTML pour avoir juste le premier caractères non accentués. Exemple : "&ecute;" => "e", "&Ecute;" => "E", "à" => "a" ...
    $str = preg_replace('#&([A-za-z])(?:acute|grave|cedil|circ|orn|ring|slash|th|tilde|uml);#', '\1', $str);
    // Remplacer les ligatures tel que : ?, Æ ... . Exemple "?" => "oe"
    $str = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $str);
    // Supprimer tout le reste
    $str = preg_replace('#&[^;]+;#', '', $str);
    // Si on ne veut pas avoir les caractères spéciaux
    if ($leaveSpecialChar == false) {
        // Caractères spéciaux à modifier en tirets
        $specialChars = array_merge(array(
            ' ', '?', '!', '.', ',', ':', ';', "'", '"', '/', '\\', '*', '+', '=', '%',
            '[', ']', '(', ')', '{', '}', '<', '>', '&', '$', '^', '@', 'µ', '£', '§',
        ), $specialChars);
        $str = str_replace($specialChars, '-', $str);
    }
    $modifStr = true;
    while ($modifStr == true) {
        $modifStr = false;
        // On modifie tous les << -- >> par un seul << - >>
        if (preg_match('#--#iSu', $str)) {
            $str = str_replace('--', '-', $str);
            $modifStr = true;
        }
        // Si le dernier caractère est un tiret, on le supprime
        if (preg_match('#(-)+$#iSu', $str)) {
            $str = substr($str, 0, (strlen($str) - 1));
            $modifStr = true;
        }
    }
    if ($UpperToLower == true) {
        // Si on veut transformer les majuscules en minuscules
        $str = strtolower($str);
    }
    return $str;
}
/**
 * ------- FUNCTION SCL_MOVEDUPLICATECHAR()   --------
 *
 * @brief Cette fonction permet d'enlever tous les caractères doublées dans une chaine
 * @return string
 *
 * @param string $str est la chaine à traiter.
 */
function scl_moveDuplicateChar($str)
{
    for ($ascii = 95; $ascii <= 123; $ascii++) {
        // le chiffre 3 permet de controler qu'il y a 3 fois de suite le meme caractère
        $str = preg_replace('#' . chr($ascii) . '{3,}#', chr($ascii), $str);
    }
    return $str;
}
/**
 * ------- FUNCTION SCL_SPLITINT()   --------
 *
 * @brief Cette fonction permet de segmenter un nombre
 * @return string|void
 *
 * @param float|int $nbr le nombre qu'on veut segmenter.
 * @param int [$pas] le pas de segmentation.
 * @param string [$separateur] le separateur des segments.
 */
function scl_splitInt($nbr, $pas = 3, $separateur = ' ')
{
    /* Valeurs par défaut */
    if (!is_numeric($nbr)) {
        return;
    }
    $pas = (!empty($pas) AND is_int($pas)) ? $pas : 3;
    $separateur = (in_array($separateur, array(' ', ',', '-', '/'))) ? $separateur : ' ';
    $return = ''; // Valeur renvoyée
    $nombre = explode('.', $nbr);
    $nbr = $nombre[0];
    $virgule = (!empty($nombre[1])) ? '.' . $nombre[1] : '';
    $lenght = strlen($nbr); // nombre de chiffre
    $nbr = strrev($nbr); // on inverse le nombre
    while ($lenght > $pas) {
        // On coupe le nombre après 3 ($pas) chiffres à partir de debut et on le stocke dans $return
        $return .= substr($nbr, 0, $pas) . $separateur;
        $nbr = substr($nbr, $pas); // On enleve les 3 ($pas) premier chiffres du nombre
        $lenght = $lenght - $pas; // Le nombre de chiffr du nombre diminue donc de 3 ($pas)
    }
    if (strlen($nbr) <> 0) {
        $return .= $nbr;
    } else {
        $return = substr($return, 0, strlen($return) - 1);
    }
    // On inverse encore le nombre pour revenir à la valeur initiale et on le retourne
    return strrev($return) . '' . $virgule;
}
/**
 * ------- FUNCTION SCL_GETTAGS()   --------
 *
 * @brief Cette fonction permet de generer les mots clés d'un contenu
 * @return string
 *
 * @param string $content le contenu à partir duquel on va generer les mots clés.
 * @param int [$nb_tags]  le nombre de mots clés à generer.
 * @param bool [$relief] specifie si les mots clés renvoyés doivent avoir une taille proportionnelle à leur frequence d'apparition (true) ou pas (false).
 * @param null|file|array [$mots_a_banir] specifie une liste de mot a banir dans la recherche
 */
function scl_getTags($content, $nb_tags = 10, $relief = false, $mots_a_bannir = null)
{
    /* Valeurs par défaut */
    $nb_tags = (empty($nb_tags)) ? 10 : (int)$nb_tags;
    $relief = ($relief != true) ? false : true;
    if (is_file($mots_a_bannir) AND file_exists($mots_a_bannir)) {
        $mots_a_bannir = file_get_contents($mots_a_bannir);
        $mots_a_bannir = explode("\n", $mots_a_bannir);
    }
    $mots_a_bannir = array_merge(array(
        #---------------Pronoms---------------
        'ELLE', 'ELLES', 'CETTE', 'IL', 'ILS', 'LUI', 'NOUS', 'VOUS', 'EUX', 'MOI', 'JE', 'TU',
        #---------------Verbes etre et avoir---------------
        'SOMMES', 'ETES', 'SONT', 'ETAIS', 'ETAIS', 'ETAIT', 'ETIONS', 'ETIEZ', 'ETAIENT', 'FUMES', 'FUTES',
        'FURENT', 'SERAI', 'SERAS', 'SERA', 'SERONS', 'SEREZ', 'SERONT', 'SOIS', 'SOIT', 'SOYONS', 'SOYEZ',
        'SOIENT', 'FUSSE', 'FUSSES', 'FUT', 'FUSSIONS', 'FUSSIEZ', 'FUSSENT', 'AVONS', 'AVEZ', 'AVAIS',
        'AVAIT', 'AVIONS', 'AVIEZ', 'AVAIENT', 'AURAI', 'AURAS', 'AURA', 'AURONS', 'AUREZ', 'AURONT',
        'AURAIS', 'AURAIS', 'AURAIT', 'AURIONS', 'AURIEZ', 'AURAIENT',
        #---------------Mot de liaison---------------
        'DANS', 'AVEC', 'AFIN', 'POUR', 'DONT', 'COMME', 'SELON', 'APRES', 'ENSUITE', 'QUAND', 'QUANT',
        'PUIS', 'ENFIN', 'MAIS', 'CEPENDANT', 'TOUTEFOIS', 'NEANMOINS', 'POURTANT', 'SINON', 'SEULEMENT',
        'MALGRE', 'QUOIQUE', 'TANDIS', 'ALORS', 'CERTES', 'EVIDEMMENT', 'EVIDENT', 'AINSI', 'SOIT', 'DONC',
        'TOUT', 'TOUS',
        #---------------Caracteres HTML---------------
        'AGRAVE', 'EACUTE', 'NBSP',
    ), (array)$mots_a_bannir);
    foreach ($mots_a_bannir As $banni) {
        $content = preg_replace('#' . $banni . '#iSu', '', $content); //Supprime les mots à bannir
    }
    $content = preg_replace("#[^[:alpha:]]#", ' ', $content); //On ne garde que les chaines contenant des caractères
    $content = preg_replace('#(\s|\b)[\w]{1,3}\s#i', ' ', $content); //On supprime les chaines inférieurs à 3 caractrèes
    $content = preg_replace('/\s\s+/', ' ', $content); //Supprime les doubles espaces
    $content = explode(" ", $content); // On recupere chaque mot (separer de l'autre mot par un espace)
    $nb_words = count($content); // On compte le nombre de mots du contenu
    $content = array_count_values($content); //Construit un tableau avec le nombre d'occurences de chaques mots
    arsort($content); //Tri le tableau par valeur décroissante en gardant les index
    $tags = array_slice($content, 0, $nb_tags, true); //Coupe le tableau pour n'obtenir que le nombre de mots souhaité
    foreach ($tags as &$value) { //Utilisation de & pour modifier la valeur
        $value = round((($value / $nb_words) * 100), 2);
    }
    $render_array = array();
    foreach ($tags as $key => $value) {
        // Si on veut voir en relief c'est-a-dire avec des taille qui dependent du nombre d'apparition des tags
        if ($relief == true) {
            $size = 6;
            $size = $size + $size * $value; //Calcul de la taille du tag en fonction de sa fréquence d'apparition
            $render_array[] = "<span style='font-size:" . $size . "px' class='tag'>" . strtoupper($key) . "</span> ";
        } else {
            $render_array[] = $key . " ";
        }
    }
    srand((float)microtime() * 1000000);
    shuffle($render_array); //On mélange aléatoirement le tableau
    $return = ''; // La variable de retour
    foreach ($render_array as $value) {
        $return .= $value;
    }
    return $return;
}
/**
 * ------- FUNCTION SCL_INT2LETTER()   --------
 *
 * @brief Cette fonction convertie un entier en lettre (ex: 12 => douze)
 * @credit { Author: zied9b | Url: http://codes-sources.commentcamarche.net/source/51285-chiffres-en-lettres}
 * @return string
 *
 * @param int $int
 */
function scl_int2letter($int)
{
    $int_val= intval($int);
    $real_val = intval(round($int - intval($int), 2) * 1000);
    if($int_val == 0) {
        return 'Zero';
    }
    $return = '';
    $dix_c = intval($real_val%100/10);
    $cent_c = intval($real_val%1000/100);
    $unite[1] = $int_val%10;
    $dix[1] = intval($int_val%100/10);
    $cent[1] =intval($int_val%1000/100);
    $unite[2]=intval($int_val%10000/1000);
    $dix[2] = intval($int_val%100000/10000);
    $cent[2] = intval($int_val%1000000/100000);
    $unite[3] = intval($int_val%10000000/1000000);
    $dix[3] = intval($int_val%100000000/10000000);
    $cent[3] = intval($int_val%1000000000/100000000);
    $chif = array('', 'un', 'deux', 'trois', 'quatre', 'cinq', 'six', 'sept', 'huit', 'neuf', 'dix', 'onze', 'douze', 'treize', 'quatorze', 'quinze', 'seize', 'dix sept', 'dix huit', 'dix neuf');
    $trio_c='';
    for($i=1; $i<=3; $i++)
    {
        $prim[$i]='';
        $secon[$i]='';
        $trio[$i]='';
        if($dix[$i]==0) {
            $secon[$i]=''; $prim[$i]=$chif[$unite[$i]];
        }
        else if($dix[$i]==1) {
            $secon[$i]=''; $prim[$i]=$chif[($unite[$i]+10)];
        }
        else if($dix[$i]==2)
        {
            if($unite[$i]==1) {
                $secon[$i]='vingt et'; $prim[$i]=$chif[$unite[$i]];
            }
            else {
                $secon[$i]='vingt'; $prim[$i]=$chif[$unite[$i]];
            }
        }
        else if($dix[$i]==3)
        {
            if($unite[$i]==1) {
                $secon[$i]='trente et'; $prim[$i]=$chif[$unite[$i]];
            }
            else {
                $secon[$i]='trente'; $prim[$i]=$chif[$unite[$i]];
            }
        }
        else if($dix[$i]==4)
        {
            if($unite[$i]==1) {
                $secon[$i]='quarante et'; $prim[$i]=$chif[$unite[$i]];
            }
            else {
                $secon[$i]='quarante'; $prim[$i]=$chif[$unite[$i]];
            }
        }
        else if($dix[$i]==5)
        {
            if($unite[$i]==1) {
                $secon[$i]='cinquante et'; $prim[$i]=$chif[$unite[$i]];
            }
            else {
                $secon[$i]='cinquante'; $prim[$i]=$chif[$unite[$i]];
            }
        }
        else if($dix[$i]==6)
        {
            if($unite[$i]==1) {
                $secon[$i]='soixante et'; $prim[$i]=$chif[$unite[$i]];
            }
            else {
                $secon[$i]='soixante'; $prim[$i]=$chif[$unite[$i]];
            }
        }
        else if($dix[$i]==7)
        {
            if($unite[$i]==1) {
                $secon[$i]='soixante et'; $prim[$i]=$chif[$unite[$i]+10];
            }
            else {
                $secon[$i]='soixante'; $prim[$i]=$chif[$unite[$i]+10];
            }
        }
        else if($dix[$i]==8)
        {
            if($unite[$i]==1)
            {
                $secon[$i]='quatre-vingts et'; $prim[$i]=$chif[$unite[$i]];
            }
            else {
                $secon[$i]='quatre-vingt'; $prim[$i]=$chif[$unite[$i]];
            }
        }
        else if($dix[$i]==9)
        {
            if($unite[$i]==1) {
                $secon[$i]='quatre-vingts et'; $prim[$i]=$chif[$unite[$i]+10];
            }
            else {
                $secon[$i]='quatre-vingts'; $prim[$i]=$chif[$unite[$i]+10];
            }
        }
        if($cent[$i]==1) {
            $trio[$i]='cent';
        }
        else if($cent[$i]!=0 || $cent[$i]!='') {
            $trio[$i] = $chif[$cent[$i]] .' cents';
        }
    }
    $chif2=array('', 'dix', 'vingt', 'trente', 'quarante', 'cinquante', 'soixante', 'soixante-dix', 'quatre-vingts', 'quatre-vingts dix');
    $secon_c=$chif2[$dix_c];
    if($cent_c==1) {
        $trio_c='cent';
    }
    else if($cent_c!=0 || $cent_c!='') {
        $trio_c = $chif[$cent_c] .' cents';
    }
    if(($cent[3]==0 || $cent[3]=='') && ($dix[3]==0 || $dix[3]=='') && ($unite[3]==1)) {
        $return .= $trio[3]. '  ' .$secon[3]. ' ' . $prim[3]. ' million ';
    }
    else if(($cent[3]!=0 && $cent[3]!='') || ($dix[3]!=0 && $dix[3]!='') || ($unite[3]!=0 && $unite[3]!='')) {
        $return .= $trio[3]. ' ' .$secon[3]. ' ' . $prim[3]. ' millions ';
    }
    else {
        $return .= $trio[3]. ' ' .$secon[3]. ' ' . $prim[3];
    }
    if(($cent[2]==0 || $cent[2]=='') && ($dix[2]==0 || $dix[2]=='') && ($unite[2]==1)) {
        $return .= ' mille ';
    }
    else if(($cent[2]!=0 && $cent[2]!='') || ($dix[2]!=0 && $dix[2]!='') || ($unite[2]!=0 && $unite[2]!='')) {
        $return .= $trio[2]. ' ' .$secon[2]. ' ' . $prim[2]. ' milles ';
    }
    else {
        $return .= $trio[2]. ' ' .$secon[2]. ' ' . $prim[2];
    }
    $return .= $trio[1]. ' ' .$secon[1]. ' ' . $prim[1];
    if(!($cent_c=='0' || $cent_c=='') || !($dix_c=='0' || $dix_c=='')) {
        $return .= $trio_c. ' ' .$secon_c;
    }
    return trim($return);
}
 |