<?php

/**
 *  Inclusion de frw_xsl_xml
 *
 */
class TradXsl
{

    public static $xls_reserve_trad = array(
        'background',
        'textarea',
        'checkbox',
        'href',
        'javascript',
        'script',
        'notrad',
        'hidden',
        'align'
    );

    public static $xls_reserve_name = array(
        'script',
        'style',
        'background',
        'src',
        'textarea',
        'href',
        'javascript',
        'notrad',
        'hidden',
        'xsl:comment',
        'align'
    );

    public static $liste_attr = array(
        'title',
        'alt',
        'placeholder'
    );

    var $mode_save = false;

    public static $exclude = array(
        '+',
        '-',
        '(',
        ')',
        ' ',
        '&#160;',
        '&nbsp;',
        'src',
        'href',
        'type',
        'name',
        'checkbox',
        'javascript',
        'script',
        'notrad',
        'hidden',
        'textarea',
        'class',
        'align'
    );

    protected $version;

    protected $contexte;

    // Liste des valeurs exclue pour la traduction
    // !!!! TRES IMPORTANT => ne pas insérer dans le tableau des noms d'attribut pouvant avoir la même valeur que leur nom comme par ex : nowrap='nowrap'
    // Il est donc IMPORTANT de ne pas utiliser cet attribut dans les xsl avec <xsl:attribute name='nowrap'>nowrap</xsl:attribute>
    protected $valeur_non_traitee = array(
        'background',
        'src',
        'checkbox',
        'href',
        'javascript',
        'script',
        'name',
        'id',
        'onclick',
        'onmouseover',
        'onmouseout',
        // 'value', 'text',
        /**
         * EDP ATTENTION MISE EN COMMENTAIRE Le 13/01/2017 car exemple la traduction Ajout de document rattchés / Enregister ne fonctionnerait plus a revoir dans le futur quand meme
         * pour text : c'est au niveau des mots : suivant / précedent : panel de navigation
         */
        'style',
        'class',
        'disabled',
        'onchange',
        'onselect',
        'radio',
        'hidden',
        'file',
        'image',
        'password',
        'reset',
        'submit',
        'align',
        'valign',
        'halign',
        'colspan',
        'rowspan',
        'width',
        'height',
        'type',
        'selected',
        'maxlength'
    );
 // Liste des valeur d'attribut entrainant le saut du noeud courant vers le prochain noeud sans traduction
    function __construct()
    {
        // $this->xls_reserve_trad = array('display:none', 'display:display', 'display:none;', '&nbsp;', '&#160;', ' ', chr(194) . chr(160), chr(226) . chr(160), '&#160;&#160;', chr(38) . chr(35) . chr(49) . chr(54) . chr(48) . chr(59));
        $this->version = '10.30aa';
    }

    /**
     * Function permettant d'enregistrer les differents mots des xsl
     */
    function &Trouve(& $valeur)
    {
        $resultat = false;
        if (stripos($valeur, 'this.') === 0)
            $resultat = true;
        if (stripos($valeur, 'javascript:') === 0)
            $resultat = true;
        if (stripos($valeur, 'FdStyle') === 0)
            $resultat = true;
        if (stripos($valeur, 'FdTab') === 0)
            $resultat = true;
        if (stripos($valeur, 'brw_') === 0)
            $resultat = true;
        if (stripos($valeur, 'rUser') === 0)
            $resultat = true;
        if (stripos($valeur, '_') === 0)
            $resultat = true;
        if (stripos($valeur, 'Brw') === 0)
            $resultat = true;
        if (stripos($valeur, 'rPr') === 0)
            $resultat = true;
        if (stripos($valeur, 'brw') === 0)
            $resultat = true;
        if (stripos($valeur, 'ruserfav') === 0)
            $resultat = true;
        if (stripos($valeur, 'display') === 0)
            $resultat = true;
        if (in_array($valeur, TradXsl::$exclude))
            $resultat = true;
        return $resultat;
    }

    function SaveMot($mot)
    {
        $mot = iconv("UTF-8", "WINDOWS-1252", $mot); // génère le fichier sur norme ANSI pour magic
        
        $mot1 = str_ireplace("/n", '', $mot);
        $mot2 = str_ireplace("/r", '', $mot1);
        
        if ('' != trim($mot2) && ! strstr($mot2, '<')) {
            $test = trim($mot2);
            if ($test > '0')
                if (strpos($mot2, ')') === false)
                    if (strpos($mot2, '{') === false) {
                        $mot2 = "\"OXAPROC\";\"{$mot2}\";\"{$this->version}\";\"XSL\";\"{$this->contexte}\"";
                        fwrite($this->handle, $mot2 . "\r\n");
                    }
        }
    }

    function ExtraitMot($fichier_xsl, $unique = true)
    {
        $xsl = new DomDocument('1.0', 'UTF-8');
        
        $this->contexte = str_ireplace('./', '', $fichier_xsl . '.xsl');
        
        // echo $home_acc.DS.$fichier_xsl."<BR/>";
        $xsl->load($fichier_xsl . '.xsl');
        
        $this->mode_save = true;
        // Lecture du dom de la xsl pour traduction
        if ($unique)
            $chemin = 'extraction_libelle_global.txt';
        else
            $chemin = $fichier_xsl . '.trad.txt';
        
        if ($this->handle = fopen($chemin, 'a+')) {
            $this->Traduit($xsl);
            fclose($this->handle);
        }
    }

    function Traduit(& $noeud_xls)
    {
        if ($noeud_xls) {
            if ($noeud_xls->firstChild) {
                $noeud_suite = $noeud_xls->firstChild;
                while (! is_null($noeud_suite)) {
                    switch ($noeud_suite->nodeType) {
                        case XML_DOCUMENT_NODE:
                            
                            // Mise en commentaire car entrainait un pb bloquant de boucle infinie (cf dossier 11253)
                            // $this->Traduit($noeud_suite);
                            
                            break;
                        
                        case XML_ELEMENT_NODE:
                            
                            $continue = true;
                            
                            $node_name = strtolower(trim($noeud_suite->nodeName));
                            
                            if (! in_array($node_name, TradXsl::$xls_reserve_name)) {
                                if ($noeud_suite->hasAttributes())
                                    foreach ($noeud_suite->attributes as $attr) {
                                        $valeur = strtolower(trim($attr->value));
                                        $name = strtolower(trim($attr->name));
                                        
                                        if (in_array($attr->name, TradXsl::$liste_attr) && ! in_array($name, TradXsl::$xls_reserve_trad) && $valeur > ' ')
                                            if (! $this->Trouve($valeur))
                                                if ($this->mode_save)
                                                    $this->SaveMot($attr->value);
                                                else
                                                    $attr->value = Trad($attr->value);
                                        
                                        // Si la valeur de l'attribut appartient aux valeurs d'attribut à exclure alors on saute au noeud suivant
                                        // et on arrete la recursivité pour le noeud en cours.
                                        if (in_array($valeur, $this->valeur_non_traitee)) {
                                            $this->Traduit($noeud_suite->nextSibling); // On saute au noeud suivant
                                            $continue = false; // On stoppe la récursivité
                                        }
                                    }
                                
                                // Si le flag est à true alors on continue la recursivité
                                if ($continue)
                                    $this->Traduit($noeud_suite);
                            }
                            /**
                             * else
                             * if ($node_name=='notrad'){
                             * $text = $noeud_xls->nodeValue;
                             * $suite = & $noeud_suite->nextSibling;
                             * $noeud_xls->nodeValue = (is_null($text) ? '' : $text).$noeud_suite->nodeValue;
                             * $noeud_suite->parentNode->removeChild($noeud_suite);
                             * $noeud_suite = & $suite;
                             * continue;
                             * }
                             */
                            
                            break;
                        
                        case XML_COMMENT_NODE:
                            
                            break;
                        
                        case XML_TEXT_NODE:
                            
                            $name = strtolower(trim($noeud_suite->nodeName));
                            if (! in_array($name, TradXsl::$xls_reserve_trad) && ! in_array($name, TradXsl::$exclude) && ! in_array($name, TradXsl::$xls_reserve_name))
                                if (($valeur = strtolower(trim($noeud_suite->nodeValue))) > ' ')
                                    if (! is_numeric($valeur))
                                        if (! $this->Trouve($noeud_suite->nodeValue)) // EDP Important car <xsl:text>Type<xsl:text> existe ne pas confondre avec 'type'
                                            if ($this->mode_save)
                                                $this->SaveMot($noeud_suite->nodeValue);
                                            else
                                                $noeud_suite->nodeValue = Trad($noeud_suite->nodeValue);
                            
                            break;
                    }
                    // Analyse des attributs
                    // Dossier 26063 : on ôte l'esperluette
                    $noeud_suite = $noeud_suite->nextSibling;
                }
            }
        }
    }
}
