<?php
class AO_Questionnaire {
    const   fichierXsl            = 'application/xsl/ao/questionnaire.xsl';
    const   fichierPhp            = 'ao_questionnaire.php';
    const   idFormReponse         = 'form_reponse_ao';
    private $no_ao;
    
    function __construct(& $no_ao) {
        $this->no_ao = $no_ao;
    }
    
    /**
     * Affiche le questionnaire pour son édition
     * @param unknown $mode
     * @param unknown $xml_node
     * @param string $divResultat
     * @return multitype:Ambigous <multitype:, multitype:number NULL unknown Ambigous <string, multitype:NULL string > >
     */
    function & buildXml($mode, & $xml_node, & $divResultat = '') {
        $array    = array();
        $arrayTmp = array();
        
        $modeLocal = $xml_node['!Modifiable'];
        // Attention : la base d'affichage est semblable à buildXmlReponse
        if (array_key_exists('Theme_Question', $xml_node))
            foreach ($xml_node['Theme_Question'] as & $ltq ) {
                if (array_key_exists('#text', $ltq['TYPE_LIGNE'])) {
                    // Nous sommes sur une ligne qui contient de l'information
                    $type_ligne = $ltq['TYPE_LIGNE']['#text'];
                    $idPere      = urlencode((array_key_exists('#text', $ltq['ID_PERE']))?$ltq['ID_PERE']['#text']:'');
                    $id          = urlencode((array_key_exists('#text', $ltq['ID']))?$ltq['ID']['#text']:'');
                    switch($type_ligne) {
                        case 'T':
                            $arrayTmp = array(
                            '!is_reponse' => 0,
                            '!type_ligne' => $type_ligne,
                            '!libelle'    => (array_key_exists('#text', $ltq['LIBELLE']) ? $ltq['LIBELLE']['#text'] : ''),
                            '!comment'    => (array_key_exists('#text', $ltq['COMMENT']) ? $ltq['COMMENT']['#text'] : ''),
                            '!id_affiche' => (array_key_exists('#text', $ltq['ID_AFFICHE']) ? $ltq['ID_AFFICHE']['#text'] : ''),
                            );
                            if ('LE' == $mode && 1 == $modeLocal) {
                                $idTheme = $ltq['ID']['#text'];
                                
                                //
                                // Pas de menu contextuel, ça sort du cadre
                                //
                                
                                // Peut-on ajouter une question, i.e. est-ce que ce thème à des descendants?
                                
                                
                                if (BoolSql($ltq['!AjoutTheme'])) {
                                    // Ajouter un sous-thème
                                    $action  = 'OpenPopup("ao_bibliotheque.php?action=AffichePopup&no_ao='.$this->no_ao.'&id_pere='.$id.'&id=&type_elt=T&modeEdition=A&mode='.$mode.'&divResultat='.$divResultat.'", "popup_ao_biblio", "700", "500")';
                                    $idBtn   = 'ajout_ss_th_'.$idTheme;
                                    $title   = trad('Ajouter un sous-thème');
                                    $image   = ComposantXslAction::img_picto_ajouter;
                                    $compXsl = new ComposantXslAction($idBtn);
                                    $compXsl->setImage($image);
                                    $compXsl->setAction($action);
                                    $compXsl->setTitle($title);
                                    $arrayTmp['btnAjouterSSTh'] = $compXsl->buildXml();
                                    
                                    // Importer depuis la bibliothèque
                                    $action  = 'OpenPopup("ao_quest_biblio.php?action=AffichePopup&no_ao='.$this->no_ao.'&id_pere='.$idPere.'&id='.$id.'&mode='.$mode.'&ancrage='.$divResultat.'", "win_pop_ao_quest_biblio", 1000, 600);';
                                    $idBtn   = 'ajout_ss_th_'.$idTheme;
                                    $title   = trad('Importer depuis bibliothèque');
                                    $image   = ComposantXslAction::img_picto_imp_qst_bib;
                                    $compXsl = new ComposantXslAction($idBtn);
                                    $compXsl->setImage($image);
                                    $compXsl->setAction($action);
                                    $compXsl->setTitle($title);
                                    $arrayTmp['btnImporterBiblio'] = $compXsl->buildXml();
                                }
                                
                                if (BoolSql($ltq['!AjoutQuestion'])) {
                                    // Ajouter une question
                                    $action  = 'OpenPopup("ao_bibliotheque.php?action=AffichePopup&no_ao='.$this->no_ao.'&id_pere='.$id.'&id=&type_elt=Q&modeEdition=A&mode='.$mode.'&divResultat='.$divResultat.'", "popup_ao_biblio", "700", "500")';
                                    $idBtn   = 'ajout_quest_'.$idTheme;
                                    $title   = trad('Ajouter une question');
                                    $image   = ComposantXslAction::img_picto_ajouter;
                                    $compXsl = new ComposantXslAction($idBtn);
                                    $compXsl->setImage($image);
                                    $compXsl->setAction($action);
                                    $compXsl->setTitle($title);
                                    $arrayTmp['btnAjouterQuest'] = $compXsl->buildXml();
                                }
                                
                                if (BoolSql($ltq['!Modifiable'])) {
                                    // Bouton Modifier
                                    $action  = 'OpenPopup("ao_bibliotheque.php?action=AffichePopup&no_ao='.$this->no_ao.'&id_pere='.$idPere.'&id='.$id.'&type_elt=T&modeEdition=M&mode='.$mode.'&divResultat='.$divResultat.'", "popup_ao_biblio", "700", "500")';
                                    $idBtn   = 'modif_'.$idTheme;
                                    $image   = ComposantXslAction::img_picto_editer;
                                    $compXsl = new ComposantXslAction($idBtn);
                                    $compXsl->setImage($image);
                                    $compXsl->setAction($action);
                                    $arrayTmp['btnModifier'] = $compXsl->buildXml();
                                }
                                // EDP le 25/08/2016 Vu avec YA la notion de suppression ne doit pas etre en relation avec le fait de ne pas pouvoir modifier
                                if ('APRIX' != $id) {
                                    // Bouton Supprimer
                                    $action  = 'if (confirm("'.cnv_to_javascript(trad('Confirmez-vous la suppression de ce thème')).' ?")) CallUrl("'.AO_Questionnaire::fichierPhp.'?action=supprimerTheme&no_ao='.$this->no_ao.'&id_pere='.$idPere.'&id='.$id.'&mode='.$mode.'&ancrage='.$divResultat.'");';
                                    $idBtn   = 'suppr_'.$idTheme;
                                    $image   = ComposantXslAction::img_picto_supprimer;
                                    $compXsl = new ComposantXslAction($idBtn);
                                    $compXsl->setImage($image);
                                    $compXsl->setAction($action);
                                    $arrayTmp['btnSupprimer'] = $compXsl->buildXml();
                                }
                            }
                            break;
                        case 'Q':
                            $arrayTmp   = array(
                            '!is_reponse'   => 0,
                            '!type_ligne'   => $type_ligne,
                            '!id_affiche'   => (array_key_exists('#text', $ltq['ID_AFFICHE']) ? $ltq['ID_AFFICHE']['#text'] : ''),
                            '!libelle'      => (array_key_exists('#text', $ltq['LIBELLE']) ? $ltq['LIBELLE']['#text'] : ''),
                            '!comment'      => (array_key_exists('#text', $ltq['COMMENT']) ? $ltq['COMMENT']['#text'] : ''),
                            '!type_Reponse' => (array_key_exists('#text', $ltq['TYPE_REPONSE']) ? $ltq['TYPE_REPONSE']['#text'] : ''),
                            '!ordre'        => (array_key_exists('#text', $ltq['ORDRE']) ? $ltq['ORDRE']['#text'] : '')
                            );
                            
                            $idQuestion = ''; // RAZ le bol EDP
                            if (BoolSql($ltq['!Modifiable'])) {
                                // Bouton Modifier
                                $action  = 'OpenPopup("ao_bibliotheque.php?action=AffichePopup&no_ao='.$this->no_ao.'&id_pere='.$idPere.'&id='.$id.'&type_elt=Q&modeEdition=M&mode='.$mode.'&divResultat='.$divResultat.'", "popup_ao_biblio", "700", "500")';
                                $idBtn   = 'modif_'.$idQuestion;
                                $image   = ComposantXslAction::img_picto_editer;
                                $compXsl = new ComposantXslAction($idBtn);
                                $compXsl->setImage($image);
                                $compXsl->setAction($action);
                                $arrayTmp['btnModifier'] = $compXsl->buildXml();
                                
                            }
                            
                            // EDP le 25/08/2016 Vu avec YA la notion de suppression ne doit pas etre en relation avec le fait de ne pas pouvoir modifier
                            // Bouton Supprimer
                            $action  = 'if (confirm("'.cnv_to_javascript(trad('Confirmez-vous la suppression de cette question ')).' ?")) CallUrl("'.AO_Questionnaire::fichierPhp.'?action=supprimerQuestion&no_ao='.$this->no_ao.'&id_pere='.$idPere.'&id='.$id.'&mode='.$mode.'&ancrage='.$divResultat.'");';
                            $idBtn   = 'suppr_'.$idQuestion;
                            $image   = ComposantXslAction::img_picto_supprimer;
                            $compXsl = new ComposantXslAction($idBtn);
                            $compXsl->setImage($image);
                            $compXsl->setAction($action);
                            $arrayTmp['btnSupprimer'] = $compXsl->buildXml();
                            break;
                    }
                    $array[] = $arrayTmp;
                }
            }
        return $array;
    }
    
    /**
     * Affiche le questionnaire pour y répondre
     * @param unknown $action
     * @param unknown $type_fg
     * @param unknown $code_fou
     * @return multitype:
     */
    function & buildXmlReponse(& $action, & $type_fg, & $code_fou, & $dte_rep, & $c_v) {
        $array          = array();
        $arrayCacherDiv = array();
        $editable = true;
        $jsCheck        = 'TraiteUrl("'.AO_Questionnaire::fichierPhp.'?action=checkValue", this);';
        
        // Bouton valider
        $idBtn          = 'valider';
        $actionBtn      = 'TraiteUrl("'.AO_Questionnaire::fichierPhp.'?action=valider&no_ao='.$this->no_ao.'&type_fg='.$type_fg.'&code_fou='.urlencode($code_fou).'&dte_rep='.$dte_rep.'&c_v='.$c_v.'", document.forms["'.AO_Questionnaire::idFormReponse.'"].elements[0]);';
        $libelleBtn     = Trad('Enregistrer');
        $compXsl        = new ComposantXslAction($idBtn);
        $compXsl->setAction($actionBtn);
        $compXsl->setLibelle($libelleBtn);
        $compXsl->setEstPrimaire(true);
        
        // Infos formulaire
        $array['form'] = array(
            '!id'        => AO_Questionnaire::idFormReponse,
            'btnValider' => $compXsl->buildXml(),
        );
        $array['form']['questionnaire'] = array();
        
        // Thèmes et questions à présenter
        // Attention : la base d'affichage est semblable à buildXml
        $xml_node = AOQuestionnaireXml::GetFiche($this->no_ao);
        
        $questionnaire = AO_Questionnaire::getXmlArray($xml_node,$this->no_ao, $dte_rep, $type_fg, $code_fou, $c_v);
        
        if (!is_null($questionnaire)) $array['form']['questionnaire'] = & $questionnaire;
        
        $array['action']      = $action;
        $array['popup_title'] = strBuild(Trad('Réponse questionnaire AO N° @1@'),$this->no_ao);
        
        $retour = array (
            'array'          => $array,
            'arrayCacherDiv' => $arrayCacherDiv
        );
        return $retour;
    }
    
    public static function & getXmlArray(& $xml_node, & $no_ao, & $dte_rep, & $type_fg, & $code_fou, & $c_v, $typeSaisie=null){
        $questionnaire = null;
        if (is_null($typeSaisie))
            $cmpUrl = '';
            else
                $cmpUrl = '&baseObj='.urlencode($typeSaisie);
                
                if (array_key_exists('Theme_Question', $xml_node))
                    foreach ($xml_node['Theme_Question'] as & $ltq ) {
                        if (array_key_exists('#text', $ltq['TYPE_LIGNE'])) {
                            $type_ligne = $ltq['TYPE_LIGNE']['#text'];
                            $id_pere     = urlencode((array_key_exists('#text', $ltq['ID_PERE']))?$ltq['ID_PERE']['#text']:'');
                            $id          = urlencode((array_key_exists('#text', $ltq['ID']))?$ltq['ID']['#text']:'');
                            
                            $arrayTmp = null;
                            switch ($type_ligne) {
                                case 'T':
                                    $arrayTmp = array(
                                    '!is_reponse'   => 1,
                                    '!type_ligne' => $type_ligne,
                                    '!libelle'    => (array_key_exists('#text', $ltq['LIBELLE']) ? $ltq['LIBELLE']['#text'] : ''),
                                    '!comment'    => (array_key_exists('#text', $ltq['COMMENT']) ? $ltq['COMMENT']['#text'] : ''),
                                    '!id_affiche' => (array_key_exists('#text', $ltq['ID_AFFICHE']) ? $ltq['ID_AFFICHE']['#text'] : ''),
                                    );
                                    
                                    break;
                                case 'Q':
                                    $type_reponse = $ltq['TYPE_REPONSE']['#text'];
                                    $arrayTmp     = array(
                                        '!is_reponse'       => 1,
                                        '!type_ligne'       => $type_ligne,
                                        '!id_affiche'       => (array_key_exists('#text', $ltq['ID_AFFICHE']) ? $ltq['ID_AFFICHE']['#text'] : ''),
                                        '!libelle'          => (array_key_exists('#text', $ltq['LIBELLE']) ? $ltq['LIBELLE']['#text'] : ''),
                                        '!comment'          => (array_key_exists('#text', $ltq['COMMENT']) ? $ltq['COMMENT']['#text'] : ''),
                                        '!comment_reponse'  => (array_key_exists('#text', $ltq['COMMENT_REPONSE']) ? $ltq['COMMENT_REPONSE']['#text'] : ''),
                                        '!type_Reponse'     => $type_reponse,
                                        '!ordre'            => (array_key_exists('#text', $ltq['ORDRE']) ? $ltq['ORDRE']['#text'] : ''),
                                    );
                                    $compXsl     = null;
                                    $idComp      = 'valeur_'.$id_pere.'_'.$id;
                                    
                                    $format      = $ltq['VALEUR_REPONSE']['!Format'];
                                    if (is_null($dte_rep))
                                        $sqlExistant = SqlAoQuestReponse::rq_ao_quest_get_reponse($no_ao, $dte_rep, $type_fg, $code_fou, $c_v, $id_pere, $id)->Trouve1();
                                    else
                                        $sqlExistant = null;
                                            
                                    $jsCheck = 'TraiteUrl("'.AO_Questionnaire::fichierPhp.'?action=saveData&no_ao='.$no_ao.'&id_pere='.$id_pere.'&id='.$id.$cmpUrl.'", this);';
                                    
                                    $ltq['VALEUR_REPONSE']['!zoneOXAPROC'] = $idComp;
                                    $ltq['VALEUR_REPONSE']['!typeReponse'] = $type_reponse;
                                    switch($type_reponse) {
                                        case 'O':
                                            /* ancienne version basé sur la recherche d'information en base
                                                $val_note = '';
                                                $val_comm = '';
                                                if (is_array($sqlExistant)) { // Il y a un existant
                                                // Quelle est la valeur du commentaire ?
                                                $val_note   = $sqlExistant['NOTE'];
                                                $rep_ouv_nm = $sqlExistant['REP_OUV_NM'];
                                                if (0 != $rep_ouv_nm)
                                                $val_comm   = Memos::get($rep_ouv_nm);
                                                }
                                                */
                                                
                                                // Nouvelle version base sur la lecture du flux
                                                $val_note = (array_key_exists('#text', $ltq['NOTE_ATTRIBUEE']) ? $ltq['NOTE_ATTRIBUEE']['#text'] : '0');
                                                $val_comm = (array_key_exists('#text', $ltq['VALEUR_REPONSE']) ? $ltq['VALEUR_REPONSE']['#text'] : '');
                                                
                                                // D'abord une note
                                                //$jsCheck = 'TraiteUrl("'.AO_Questionnaire::fichierPhp.'?action=checkRepType&no_ao='.$no_ao.'&id_pere='.$id_pere.'&id='.$id.'", this);';
                                                $idCompNote = 'note_'.$id_pere.'_'.$id;
                                                $ltq['NOTE_ATTRIBUEE']['!zoneOXAPROC'] = $idCompNote;
                                                
                                                $formatNote = 'N2';
                                                $lgNote     = 2;
                                                $libelle    = Trad('Note');
                                                $compXsl    = new ComposantXslTexte($idCompNote, $editable ?? '', $formatNote);
                                                $compXsl->setAction($jsCheck);
                                                $compXsl->setValeur($val_note);
                                                
                                                $compXsl->setLibelle($libelle);
                                                $compXsl->setSize($lgNote);
                                                $compXsl->setLongueurMax($lgNote);
                                                $arrayTmp['composants'][] = & $compXsl->buildXml();
                                                
                                                // Ensuite une case commentaire
                                                $compXsl  = new ComposantXslTexte($idComp, $editable ?? '', $format);
                                                $compXsl->setAction($jsCheck);
                                                $compXsl->setValeur($val_comm);
                                                
                                                $compXsl->setRowsCols(5, 60);
                                                $arrayTmp['composants'][] = & $compXsl->buildXml();
                                                break;
                                                
                                        case 'L':
                                            /* ancienne version basé sur la recherche d'information en base
                                                if (is_array($sqlExistant)) // Il y a un existant
                                                $val_log = BoolDbOxaproc($sqlExistant['REP_LOG']);
                                                else
                                                $val_log = '';
                                                */
                                                
                                                $compXsl  = new ComposantXslSelection($idComp, $editable ?? '', $format);
                                                $liste    = array();
                                                $liste[]  = array('!value' => '', '!texte' => Trad('Sélectionnez une valeur de réponse'));
                                                $liste[]  = array('!value' => '1','!texte' => Trad('Oui'));
                                                $liste[]  = array('!value' => '0','!texte' => Trad('Non'));
                                                $compXsl->setListeOptions($liste);
                                                
                                                $valeur = array_key_exists('#text', $ltq['VALEUR_REPONSE']) ? $ltq['VALEUR_REPONSE']['#text'] : '';
                                                //$compXsl->setValeur($val_log);
                                                $compXsl->setValeur($valeur);
                                                $compXsl->setAction($jsCheck);
                                                $arrayTmp['composants'][] = & $compXsl->buildXml();
                                                break;
                                                
                                        case 'N':
                                            /* ancienne version basé sur la recherche d'information en base
                                                if (is_array($sqlExistant)) { // Il y a un existant
                                                $val_note = $sqlExistant['NOTE'];
                                                $val_num  = $sqlExistant['REP_NUM'];
                                                } else {
                                                $val_note = '';
                                                $val_num  = '';
                                                }
                                                */
                                            
                                            $val_note = array_key_exists('#text', $ltq['NOTE_ATTRIBUEE']) ? $ltq['NOTE_ATTRIBUEE']['#text'] : '';
                                            $val_num  = array_key_exists('#text', $ltq['VALEUR_REPONSE']) ? $ltq['VALEUR_REPONSE']['#text'] : '';
                                            // D'abord une note
                                            $idCompNote = 'note_'.$id_pere.'_'.$id;
                                            $ltq['NOTE_ATTRIBUEE']['!zoneOXAPROC'] = $idCompNote;
                                            
                                            $formatNote = 'N2';
                                            $lgNote     = 2;
                                            $libelle    = Trad('Note');
                                            $compXsl    = new ComposantXslTexte($idCompNote, $editable ?? '' , $formatNote);
                                            $compXsl->setAction($jsCheck);
                                            $compXsl->setValeur($val_note);
                                            $compXsl->setLibelle($libelle);
                                            $compXsl->setSize($lgNote);
                                            $compXsl->setLongueurMax($lgNote);
                                            $arrayTmp['composants'][] = & $compXsl->buildXml();
                                            
                                            $compXsl  = new ComposantXslTexte($idComp, $editable ?? '' , $format);
                                            $lgCase   = 18;
                                            $compXsl->setAction($jsCheck);
                                            
                                            $compXsl->setValeur($val_num);
                                            
                                            $compXsl->setSize($lgCase);
                                            $compXsl->setLongueurMax($lgCase);
                                            $arrayTmp['composants'][] = & $compXsl->buildXml();
                                            break;
                                            
                                        case 'T':
                                            $val_rep = '';
                                            $val_com = '';
                                            // id du commentaire
                                            $idCompComm    = 'comment_reptyp_'.$id_pere.'_'.$id;
                                            $idDivCompComm = 'div_'.$idCompComm;
                                            
                                            if (is_array($sqlExistant)) { // Il y a un existant
                                                // Quelle est la valeur du commentaire ?
                                                $val_rep = $sqlExistant['REP_TAB'];
                                                $nm_com  = $sqlExistant['NM_COM'];
                                                if (0 != $nm_com)
                                                    $val_com = Memos::get($nm_com);
                                                    // Est-ce qu'il y a une valeur de réponse qui implique de masquer la zone de commentaire ?
                                                $masquer = true;
                                                if (is_null($val_rep) || '' == $val_rep) {
                                                    // On masque
                                                    echo '';
                                                } else {
                                                    // On recherche la valeur
                                                    echo '';
                                                    foreach($ltq['ListeReponsesType']['ReponseType'] as $rep_type) {
                                                        echo '';
                                                        if ($val_rep == $rep_type['REPTYPE_ID']['#text']) {
                                                            if (array_key_exists('#text', $rep_type['REPTYPE_AUTHCOMM'])) {
                                                                if ('1' == $rep_type['REPTYPE_AUTHCOMM']['#text']) {
                                                                    $masquer = false;
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                                // print_r($ltq['NOTE_ATTRIBUEE']
                                                if ($masquer) {
                                                    $arrayCacherDiv[$idDivCompComm] = 1;
                                                }
                                            }
                                            
                                            
                                            $val_rep = array_key_exists('#text', $ltq['VALEUR_REPONSE']) ? $ltq['VALEUR_REPONSE']['#text'] : '';
                                            $val_com = array_key_exists('#text', $ltq['COMMENT_REPONSE']) ? $ltq['COMMENT_REPONSE']['#text'] : '';
                                            
                                            // Le choix sur liste
                                            if ($cmpUrl!='')
                                                $jsChange = 'TraiteUrl("'.AO_Questionnaire::fichierPhp.'?action=saveData&no_ao='.$no_ao.'&id_pere='.$id_pere.'&id='.$id.$cmpUrl.'", this);';
                                            else
                                                $jsChange = 'TraiteUrl("'.AO_Questionnaire::fichierPhp.'?action=checkRepType&no_ao='.$no_ao.'&id_pere='.$id_pere.'&id='.$id.'", this);';
                                            
                                            $compXsl  = new ComposantXslSelection($idComp, $editable ?? '', $format);
                                            $liste    = array();
                                            $liste[]  = array(
                                                '!value' => '', 
                                                '!texte' => Trad('Sélectionnez une valeur de réponse'),
                                                '!isCommentModifiable' => 0
                                            );
                                                
                                            $listeCommentModif = '';                                            
                                            $commentaireDisabled = 1;
                                            foreach($ltq['ListeReponsesType']['ReponseType'] as & $repType) {
                                                if (is_array($repType)) {
                                                    $liste[] = array(
                                                        '!value' => $repType['REPTYPE_ID']['#text'],
                                                        '!texte' => $repType['REPTYPE_TEXTE']['#text'],
                                                        '!title' => (isset($repType['REPTYPE_COMMENT'])? $repType['REPTYPE_COMMENT']['#text']:''),
                                                        '!isCommentModifiable' => $repType['REPTYPE_AUTHCOMM']['#text']
                                                    );
                                                    // En fonction de la valeur, le commentaire peut être modifiable ou non
                                                    // Liste des valeurs et de la modification possible du commentaire de la réponse : <value option>_<commentaire modifiable = 1, non modifiable = 0> séparation par ;
                                                    $listeCommentModif .= $repType['REPTYPE_ID']['#text'].'_'.$repType['REPTYPE_AUTHCOMM']['#text'].';';
                                                    if($val_rep==$repType['REPTYPE_ID']['#text'])
                                                    {
                                                        if($repType['REPTYPE_AUTHCOMM']['#text']=='1'){
                                                            $commentaireDisabled = 0;
                                                        }
                                                    }
                                                }
                                            }
                                            $compXsl->setListeOptions( $liste );
                                            $compXsl->setValeur($val_rep);
                                                
                                            $compXsl->setAction( $jsChange );
                                            $arrayTmp['composants'][] = & $compXsl->buildXml();
                                            
                                            // Un commentaire
                                            $idCompComm = 'comment_reptyp_'.$id_pere.'_'.$id;
                                            $formatComm = 'A3000';
                                            $lgComm     = 3000;
                                            
                                            
                                            $compXsl    = new ComposantXslTexte($idCompComm, $editable ?? '', $formatComm);
                                            $compXsl->setAction($jsCheck);
                                            $compXsl->setValeur($val_com);
                                            $compXsl->setRowsCols(5, 60);
                                            $compXsl->setLongueurMax($lgComm);
                                            $xmlComment = & $compXsl->buildXml();
                                            $xmlComment2 = [
                                                '!disabled' => $commentaireDisabled
                                            ];
                                            $arrayTmp['composants'][] = array_merge($xmlComment, $xmlComment2);
                                            
                                            $ltq['COMMENT_REPONSE']['!zoneOXAPROC'] = $idCompComm;
                                            $arrayTmp['!listeCommentModif'] = substr($listeCommentModif, 0, -1);
                                            $arrayTmp['!idListeCommentModif'] = 'modifiable_'.$id_pere.'_'.$id;
                                            
                                            break;
                                    }
                                    break;
                            }
                            if (!is_null($arrayTmp)) $questionnaire[] = $arrayTmp;
                        }
                    }
                    // print_r($questionnaire);
                return $questionnaire;
    }
    
    function & buildXmlFrameworkEDP(& $indiceOnglet, & $no_ao, & $xml_node, $TYPE_SOC_GS, $CODE_STE) {
        $array = array();
        
        $divResultat = 'id_tag_'.$indiceOnglet.'_corps';
        $mode = ('1' == $xml_node['!Modifiable'])?'LE':'L';
        
        $array['!templateName'] = 'AOQuestionnaire';
        $array['!visible']      = 'true';
        $array['entete']        = array(
            '!id'     => 'tag_'.$indiceOnglet,
            '!select' => true,
            '!texte'  => Trad('Questions')
        );
        if ('LE' == $mode) {
            $array['entete']['toolbar'] = array(
                '!mode'   => 32,
                'element' => array(
                    0 => array(
                        '!type'   => 'ajouter',
                        '!action' => 'OpenPopup("ao_bibliotheque.php?action=AffichePopup&no_ao='.$no_ao.'&type_elt=T&modeEdition=A&mode='.$mode.'&divResultat='.$divResultat.'", "popup_ao_biblio", "700", "500")',
                        '!title'  => Trad('Ajouter un thème')
                    ),
                    1 => array(
                        '!type'   => 'importQstBib',
                        '!action' => 'OpenPopup("ao_quest_biblio.php?action=AffichePopup&no_ao='.$no_ao.'&mode='.$mode.'&ancrage='.$divResultat.'", "win_pop_ao_quest_biblio", 1000, 600);',
                        '!title'  => Trad('Importer un élément de la bibliothèque')
                    ),
                    2 => array(
                        '!type'   => 'importModQst',
                        '!action' => 'OpenPopup("ao_import_modele.php?action=AffichePopup&no_ao='.$no_ao.'&mode='.$mode.'&ancrage='.$divResultat.'&type_soc_gs='.$TYPE_SOC_GS.'&code_ste='.urlencode($CODE_STE).'", "win_pop_ao_quest_biblio", 1000, 600);',
                        '!title'  => Trad('Importer un modèle')
                    ),
                )
            );
        }
        $array['entete']['toolbar']['element'][] =
        array('!type' => 'agrandir' ,
            '!selected' => 0,
            '!visible'  => 1,
        );
        if (is_array($xml_node))
            $array['detail'] = $this->buildXml($mode, $xml_node, $divResultat, $no_ao);
            
            return $array;
    }
    
    function & supprimerTheme(& $id_pere, & $id_theme) {
        $type_ligne = 'T';
        return AOQuestionnaireXml::SupprimeElement($this->no_ao, $type_ligne, $id_theme, $id_pere);;
    }
    
    function & supprimerQuestion(& $id_theme, & $id_question) {
        $type_ligne = 'Q';
        return AOQuestionnaireXml::SupprimeElement($this->no_ao, $type_ligne, $id_question, $id_theme);
    }
    
    function & changeRepType($id_pere, $id, $value) {
        $result = '0';
        
        $xml_node = AOQuestionnaireXml::GetFiche($this->no_ao);
        if (is_array($xml_node)) {
            foreach ($xml_node['Theme_Question'] as & $ltq) {
                if (array_key_exists('#text', $ltq['ID_PERE']))
                    $id_pere_courant = $ltq['ID_PERE']['#text'];
                    else
                        $id_pere_courant = '';
                        if (array_key_exists('#text', $ltq['ID']))
                            $id_courant = $ltq['ID']['#text'];
                            else
                                $id_courant = '';
                                if ($id_courant == $id && $id_pere_courant == $id_pere) {
                                    if (is_array($ltq['ListeReponsesType'])) {
                                        if (array_key_exists('ReponseType', $ltq['ListeReponsesType'])) {
                                            foreach($ltq['ListeReponsesType']['ReponseType'] as & $rt) {
                                                if (array_key_exists('#text', $rt['REPTYPE_ID'])) {
                                                    if ($value == $rt['REPTYPE_ID']['#text']) {
                                                        if (array_key_exists('#text', $rt['REPTYPE_AUTHCOMM'])) {
                                                            $result = & $rt['REPTYPE_AUTHCOMM']['#text'];
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    break;
                                }
            }
        }
        return $result;
    }
    
    function & validerReponse(& $data) {
        $messageErreur = '';
        $type_fg       = trim($data['type_fg']);
        $code_fou      = trim($data['code_fou']);
        $c_v           = trim($data['c_v']);
        $dte_rep       = trim($data['dte_rep']);
        
        // Dans un premier temps, on vérifie que les réponses sont correctes ?
        $xml_node = AOQuestionnaireXml::GetFiche($this->no_ao);
        if (is_array($xml_node)) {
            foreach ($xml_node['Theme_Question'] as & $ltq) {
                if ('' == $messageErreur && 'Q' == $ltq['TYPE_LIGNE']['#text']) {
                    // Nous sommes sur une question
                    if (array_key_exists('#text', $ltq['ID_PERE']))
                        $id_pere_courant = $ltq['ID_PERE']['#text'];
                        else
                            $id_pere_courant = '';
                            if (array_key_exists('#text', $ltq['ID']))
                                $id_courant = $ltq['ID']['#text'];
                                else
                                    $id_courant = '';
                                    // valeurs par défaut pour les tables
                                    $rep_num = $rep_log = $rep_tab = $nm_comm = $rep_ouv_nm = $note = 0;
                                    
                                    // est-ce qu'on a une valeur?
                                    // /!\ Attention : dans les id_pere, les '.' sont remplacés par des '_'
                                    $idComp = 'valeur_'.str_replace('.', '_', urlencode($id_pere_courant)) .'_'.$id_courant;
                                    $valeur = (array_key_exists($idComp, $data))?$data[$idComp]:'';
                                    
                                    // Est-ce qu'il y a un existant?
                                    $sqlExistant = SqlAoQuestReponse::rq_ao_quest_get_reponse($this->no_ao, $dte_rep, $type_fg, $code_fou, $c_v, $id_pere_courant, $id_courant)->Trouve1();
                                    $is_insert   = (!is_array($sqlExistant));
                                    switch($ltq['TYPE_REPONSE']['#text']) {
                                        case 'O':
                                            // Il peut y avoir une note
                                            $id_note = str_replace('valeur_', 'note_', $idComp);
                                            $note    = trim($data[$id_note]);
                                            if ('' == $note)
                                                $note = 0;
                                                if ($is_insert) {
                                                    // On créé le mémo
                                                    $rep_ouv_nm = Memos::insert($valeur);
                                                    // On insère la ligne
                                                    SqlAoQuestReponse::rq_ao_quest_insert_reponse($this->no_ao, $dte_rep, $type_fg, $code_fou, $c_v, $id_pere_courant, $id_courant, $rep_num, $rep_log, $rep_tab, $nm_comm, $rep_ouv_nm, $note)->ExecuteSql();
                                                } else {
                                                    if ('' != $valeur) {
                                                        // On récupère le numéro de mémo
                                                        $rep_ouv_nm = $sqlExistant['REP_OUV_NM'];
                                                        if ('0' == $rep_ouv_nm)
                                                            // on créé le numéro de mémo
                                                            $rep_ouv_nm = Memos::insert($valeur);
                                                            else // On met à jour le mémo
                                                                Memos::set($rep_ouv_nm, $valeur);
                                                    } else
                                                        $rep_ouv_nm = 0;
                                                        // On met à jour la ligne
                                                        SqlAoQuestReponse::rq_ao_quest_update_reponse($this->no_ao, $dte_rep, $type_fg, $code_fou, $c_v, $id_pere_courant, $id_courant, $rep_num, $rep_log, $rep_tab, $nm_comm, $rep_ouv_nm, $note)->ExecuteSql();
                                                }
                                                break;
                                                
                                        case 'L':
                                            if ('' != $valeur) {
                                                $rep_log = BoolSql($valeur);
                                                $note    = 0;
                                                if ($rep_log) {
                                                    if (array_key_exists('#text', $ltq['REPLOG_NOTE_POUR_VRAI']))
                                                        $note = $ltq['REPLOG_NOTE_POUR_VRAI']['#text'];
                                                } else {
                                                    if (array_key_exists('#text', $ltq['REPLOG_NOTE_POUR_FAUX']))
                                                        $note = $ltq['REPLOG_NOTE_POUR_FAUX']['#text'];
                                                }
                                                if ($is_insert)
                                                    $reqSql = SqlAoQuestReponse::rq_ao_quest_insert_reponse($this->no_ao, $dte_rep, $type_fg, $code_fou, $c_v, $id_pere_courant, $id_courant, $rep_num, $rep_log, $rep_tab, $nm_comm, $rep_ouv_nm, $note);
                                                    else
                                                        $reqSql = SqlAoQuestReponse::rq_ao_quest_update_reponse($this->no_ao, $dte_rep, $type_fg, $code_fou, $c_v, $id_pere_courant, $id_courant, $rep_num, $rep_log, $rep_tab, $nm_comm, $rep_ouv_nm, $note);
                                                        $reqSql->ExecuteSql();
                                            }
                                            break;
                                            
                                        case 'N':
                                            $id_note = str_replace('valeur_', 'note_', $idComp);
                                            $note    = trim($data[$id_note]);
                                            if ('' == $note)
                                                $note = 0;
                                                $rep_num = trim($valeur);
                                                if ('' != $rep_num || '' != $note) {
                                                    // 								if (array_key_exists('#text', $ltq['REPNUM_VALMIN']) && array_key_exists('#text', $ltq['REPNUM_VALMAX'])) {
                                                    // 									$val_min = $ltq['REPNUM_VALMIN']['#text'];
                                                    // 									$val_max = $ltq['REPNUM_VALMAX']['#text'];
                                                    // 									if (is_numeric($val_min) && is_numeric($val_max)) {
                                                    // 										$limite_sup = 10;
                                                    // 										$limite_inf = -10;
                                                    // 										$noteTmp    = ($rep_num - $val_min) * $val_max / ($val_max - $val_min);
                                                    // 										$note       = ($noteTmp * ($limite_sup - $limite_inf)) / 100 + $limite_inf;
                                                    // 									}
                                                    // 								}
                                                    if ($is_insert)
                                                        $reqSql = SqlAoQuestReponse::rq_ao_quest_insert_reponse($this->no_ao, $dte_rep, $type_fg, $code_fou, $c_v, $id_pere_courant, $id_courant, $rep_num, $rep_log, $rep_tab, $nm_comm, $rep_ouv_nm, $note);
                                                        else
                                                            $reqSql = SqlAoQuestReponse::rq_ao_quest_update_reponse($this->no_ao, $dte_rep, $type_fg, $code_fou, $c_v, $id_pere_courant, $id_courant, $rep_num, $rep_log, $rep_tab, $nm_comm, $rep_ouv_nm, $note);
                                                            $reqSql->ExecuteSql();
                                                }
                                                break;
                                                
                                        case 'T':
                                            $rep_tab = trim($valeur);
                                            if ('' != $rep_tab) {
                                                // Il peut y avoir un commentaire
                                                $id_comm     = str_replace('valeur_', 'comment_reptyp_', $idComp);
                                                $commentaire = trim($data[$id_comm]);
                                                $note        = 0;
                                                foreach ($ltq['ListeReponsesType']['ReponseType'] as $rep_type) {
                                                    if ($rep_tab == $rep_type['REPTYPE_ID']['#text']) {
                                                        if (array_key_exists('#text', $rep_type['REPTYPE_NOTE'])) {
                                                            $note_tmp = $rep_type['REPTYPE_NOTE']['#text'];
                                                            if (is_numeric($note_tmp))
                                                                $note = $note_tmp;
                                                                break;
                                                        }
                                                    }
                                                }
                                                if ($is_insert) {
                                                    if ('' != $commentaire)
                                                        $nm_comm = Memos::insert($commentaire);
                                                        $reqSql = SqlAoQuestReponse::rq_ao_quest_insert_reponse($this->no_ao, $dte_rep, $type_fg, $code_fou, $c_v, $id_pere_courant, $id_courant, $rep_num, $rep_log, $rep_tab, $nm_comm, $rep_ouv_nm, $note);
                                                } else {
                                                    $nm_comm = $sqlExistant['NM_COM'];
                                                    if ('' != $commentaire) {
                                                        if (0 == $nm_comm)
                                                            $nm_comm = Memos::insert($commentaire);
                                                            else
                                                                Memos::set($nm_comm, $commentaire);
                                                    } else {
                                                        if (0 != $nm_comm) {
                                                            Memos::delete($nm_comm);
                                                            $nm_comm = 0;
                                                        }
                                                    }
                                                    $reqSql = SqlAoQuestReponse::rq_ao_quest_update_reponse($this->no_ao, $dte_rep, $type_fg, $code_fou, $c_v, $id_pere_courant, $id_courant, $rep_num, $rep_log, $rep_tab, $nm_comm, $rep_ouv_nm, $note);
                                                }
                                                $reqSql->ExecuteSql();
                                            }
                                            break;
                                    }
                }
            }
        }
        //$messageErreur .= 'ceci est une erreur, type = '. $type_fg.', code_fou = '.$code_fou;
        
        return $messageErreur;
    }
}
