<?php

/**
 * Class permettant la gestion des reponses de l'AO
 * @author edp
 *
 */
class AO_Reponse extends StdXmlWsdl
{

    // NO_AO : numéro de l'AO
    const NOM_SESSION = 'clAoReponse';

    const xslPopup = 'application/xsl/popup_aoreponse.xsl';

    const xslPopupFourAO = 'application/xsl/popup_aofour.xsl';

    const ACTION_VALIDE_REP = 'valide_reponse';

    const ACTION_VALIDE_REP_CNT = 'valide_reponse_cont';

    const ACTION_SAVE_OBJ = 'save_object';

    const formSaisie = 'form_popup_textarea';

    const ACTION_SPLIT_LG = 'splitLg';

    const ACTION_SUPPR_LG = 'supLg';

    const ACTION_PANEL_BTN = 'actionPanel';

    const ACTION_ONGLET_BTN = 'actionOnglet';

    private $indexFour = null;
 // Liste des fournisseur potentiel en reponse a un AO
    private $indexSelectFour = null;
 // Curseur de selection sur la liste des fournisseurs potentiel
    private $selectIndexReponse = null;

    private $errorMessage = null;

    private $nodeControle;

    private $arrayTemplate = null;

    private $uniquementLignes = false;

    private $uniquementQuestions = false;

    private $afficherReference = true;

    private $saveWsdlEnv = '';

    /**
     * Gestion du mode détail ou du mode synthétique
     * 
     * @return boolean
     */
    private $modeDetail = true;

    private $idPanelVisuAo = 'PanelIdAo';

    private $idPanelOnglet = 'PanelOnglet';

    private $idOngletDetail = 'id_sel_lg';

    private $idOngletQuesionnaire = 'id_sel_qu';

    private $idOngletCourant = 'id_sel_lg';

    private $presenceQuestionnaire = false;

    private $listePageOnglet = array();

    public $countData = 0;

    public function setPresenceQuestionnaire($presenceQuestionnaire)
    {
        $this->presenceQuestionnaire = $presenceQuestionnaire;
    }

    public function isPresenceQuestionnaire()
    {
        return $this->presenceQuestionnaire;
    }

    /**
     * Gestion du mode détail ou du mode synthétique
     * 
     * @return boolean
     */
    public function isModeDetail()
    {
        return $this->modeDetail;
    }

    /**
     * Gestion du mode détail ou du mode synthétique
     * 
     * @return boolean
     */
    public function setModeDetail($modeDetail)
    {
        $this->modeDetail = $modeDetail;
    }

    public function isAfficherReference()
    {
        return $this->afficherReference;
    }

    public function setAfficherReference($afficherReference)
    {
        $this->afficherReference = $afficherReference;
    }

    public function getErrorMessage()
    {
        return $this->errorMessage;
    }

    public static function getIntance()
    {
        $c = __CLASS__;
        return new $c();
    }

    // Autosave
    function __destruct()
    {
        $save = array();
        foreach ($this->listePageOnglet as $index => $class)
            $save[$index] = serializeSecure($class);
        
        $this->listePageOnglet = $save;
        
        $_SESSION[AO_Reponse::NOM_SESSION] = serializeSecure($this);
    }

    function __wakeup()
    {
        $save = array();
        foreach ($this->listePageOnglet as $index => & $class)
            $save[$index] = unserializeSecure($class);
        
        $this->listePageOnglet = $save;
    }

    public function changePage($onglet, $page)
    {
        $nomFolder = '';
        switch ($onglet) {
            case AO_ecran::FOLDER_LIGNE:
                $nomFolder = 'ListLignes';
                break;
        }
        
        if ($nomFolder != '') {
            if (array_key_exists($nomFolder, $this->listePageOnglet)) {
                $classPage = $this->listePageOnglet[$nomFolder];
                if ($classPage instanceof XmlPageOnglet) {
                    if (! $classPage->pageExiste($page)) {
                        
                        $uniquementLignes = true;
                        $uniquementQuestions = false;
                        
                        if ($ret = $this->wsdlLectureReponseAo($uniquementLignes, $uniquementQuestions, $page)) {
                            $ref = & $ret['ReponseAO']['ListLignes']['Ligne'];
                            
                            $ptr = null;
                            if (array_key_exists('0', $ref))
                                $ptr = & $ref;
                            else
                                $ptr[0] = & $ref;
                            
                            $this->affecteNameZoneWsdl($ptr);
                            
                            if ($ao = & $this->getProperties('SRM_AO')) {
                                foreach ($ptr as & $newLigne)
                                    $ao['ReponseAO']['ListLignes']['Ligne'][] = & $newLigne;
                                
                                $classPage->ajoutePage($page);
                            }
                        }
                    }
                    $classPage->setPageCourante($page);
                }
            }
        }
        return true;
    }

    public static function restoreSession()
    {
        if (array_key_exists(AO_Reponse::NOM_SESSION, $_SESSION))
            return unserializeSecure($_SESSION[AO_Reponse::NOM_SESSION]);
        
        return null;
    }

    public function &buildXmlFour()
    {
        $array = null;
        $this->indexFour = null;
        
        $NO_AO = $this->getProperties('NO_AO');
        $sql = 'select * from AO_FOUR with (nolock) WHERE NO_AO = ' . ReplaceSqlPointeur($NO_AO);
        if ($requeteFourAo = (new RequeteSQL($sql, DB_OXASQLDB))->TrouveTous()) {
            $ententeAo = SqlAo::rqGetAoEntente($NO_AO)->Trouve1();
            foreach ($requeteFourAo as $icpt => & $fourAo) {
                $this->indexFour[$icpt] = array(
                    'CODE_FOU' => $fourAo['CODE_FOU'],
                    'TYPE_FG' => $fourAo['TYPE_FG']
                );
                
                $element = null; // Dossier 25408 Il faut initialiser le tableau à null, car sinon cela rempli les éléments précedents en append
                $element['CODE_FOU']['!value'] = $fourAo['CODE_FOU'];
                $element['TYPE_FG']['!value'] = $fourAo['TYPE_FG'];
                $element['VILLE1']['!value'] = $fourAo['VILLE1'];
                
                switch ($fourAo['TYPE_FG']) {
                    case 'F':
                        if ($result = & SqlFrs::rqGetRecordFournis($element['CODE_FOU']['!value'])->Trouve1())
                            $element['CODE_FOU']['!libelle'] = $result['RS'];
                        break;
                    case 'G':
                        if ($result = & SqlGestFourniss::rqGetInfoGroupeFournisseur($element['CODE_FOU']['!value'])->Trouve1())
                            $element['CODE_FOU']['!libelle'] = $result['RS'];
                        break;
                }
                if ($requeteNbRep = SqlAo::rqGetAoEnteteByFourn($NO_AO, $fourAo['TYPE_FG'], $fourAo['CODE_FOU'])->TrouveTous()) {
                    foreach ($requeteNbRep as $index => & $reponse) {
                        $this->indexFour[$icpt]['info'][$index] = $reponse;
                        
                        // Ajout de la notion pour l'affichage de conforme / variante
                        $element['action'][] = array(
                            '!texte' => convertDateSqlToFr($reponse['DTE_REP']) . ' ' . $reponse['C_V'],
                            '!action' => 'CallUrl("popup_ao_saisie_rep.php?action=AO_Select_Four&index=' . $icpt . '&select=' . $index . '");'
                        );
                        if ($index >= 2)
                            break;
                    }
                    $element['EditRep'][] = array(
                        '!title' => trad('Editer réponse'),
                        '!EditRep' => 'CallUrl(\'gest_AO.php?action=AO_Reponse_Editer_Four&NO_AO=' . $NO_AO . '&TYPE_FOUR=' . $reponse['TYPE_FG'] . '&CODE=' . urlencode($reponse['CODE_FOU']) . '\');'
                    );
                } else
                    $index = 0;
                
                if ($index < 2) { // Uniquement maxi 3 reponses
                    if ($ententeAo['VARIANTE'] == 0)
                        $element['action'][] = array(
                            '!texte' => trad('Nouvelle'),
                            '!action' => 'CallUrl("popup_ao_saisie_rep.php?action=AO_Select_Four&index=' . $icpt . '");'
                        );
                    else {
                        $element['action'][] = array(
                            '!texte' => trad('Nouvelle Conforme'),
                            '!action' => 'CallUrl("popup_ao_saisie_rep.php?action=AO_Select_Four&VARIANTE=0&index=' . $icpt . '");'
                        );
                        $element['action'][] = array(
                            '!texte' => trad('Nouvelle Variante'),
                            '!action' => 'CallUrl("popup_ao_saisie_rep.php?action=AO_Select_Four&VARIANTE=1&index=' . $icpt . '");'
                        );
                    }
                }
                
                $array['liste']['four'][] = $element;
            }
        }
        
        return $array;
    }

    public function setSelectFour($index)
    {
        if (is_null($index) || ! array_key_exists($index, $this->indexFour))
            return false;
        
        $this->indexSelectFour = $index;
        return true;
    }

    public function setSelectIndexReponse($select)
    {
        $this->selectIndexReponse = $select;
    }

    public function &getSelectIndexReponse()
    {
        return $this->selectIndexReponse;
    }

    public function setUniquementLignes($uniquementLignes)
    {
        $this->uniquementLignes = $uniquementLignes;
    }

    public function isUniquementLignes()
    {
        return $this->uniquementLignes;
    }

    public function setUniquementQuestions($uniquementQuestions)
    {
        $this->uniquementQuestions = $uniquementQuestions;
    }

    public function isUniquementQuestions()
    {
        return $this->uniquementQuestions;
    }

    /**
     * Nouveauté sur l'appel de reponse de l'AO
     * Mode Creation true / false
     * Mode template
     * 
     * @param unknown $login
     * @param unknown $num_AO
     * @param number $variante
     * @param string $UniquementLignes
     * @param string $UniquementQuestions
     * @param string $ModeTemplate
     * @return unknown
     */
    public function &CallWsdlGetAORepLecture($num_AO, $variante = 0, $uniquementLignes = true, $uniquementQuestions = true, $modeMiseAjour = true, $noPage = 1)
    {
        $infoRechercheFour = $this->indexFour[$this->indexSelectFour];
        
        if (is_null($this->selectIndexReponse)) {
            $modeCreation = true;
            $conformeVariante = ($variante == 1 ? 'V' : 'C');
            $dateReponse = null;
        } else {
            $repSelected = $this->indexFour[$this->indexSelectFour]['info'][$this->selectIndexReponse];
            $modeCreation = false;
            $conformeVariante = $repSelected['C_V'];
            $dateReponse = $repSelected['DTE_REP'];
        }
        
        /**
         * Attention ici on va faire 2 appels
         * Un pour acquerir le template, ce qui va permettre d'avoir le template pour la creation des niveau de ligne / sous lignes
         *
         * @var Ambiguous $envoi
         */
        if ($modeMiseAjour) {
            $ModeTemplate = true;
            $envoi = '<CodeUtilisateur>' . $_SESSION['Session_Login'] . '</CodeUtilisateur>' . ($ModeTemplate ? '' : '<ModeCreation>' . BoolWsdl($modeCreation) . '</ModeCreation>') . // Si mode template alors pas mode creation envoyé
'<NO_AO>' . $num_AO . '</NO_AO>' . (is_null($dateReponse) ? '' : '<DTE_REP>' . $dateReponse . '</DTE_REP>') . '<CODE_FOU>' . $infoRechercheFour['CODE_FOU'] . '</CODE_FOU>' . '<TYPE_FG>' . $infoRechercheFour['TYPE_FG'] . '</TYPE_FG>' . '<C_V>' . $conformeVariante . '</C_V>' . // ATTENTION ICI C'est bien une logique booleene sauf que c'est C ou V qu'il faut envoyé
'<UniquementLignes>' . BoolWsdl($uniquementLignes) . '</UniquementLignes>' . '<UniquementQuestions>' . BoolWsdl($uniquementQuestions) . '</UniquementQuestions>' . '<ModeTemplate>' . BoolWsdl($ModeTemplate) . '</ModeTemplate>' . '';
            
            $envoi = '<LectureReponseAOIn LngUtilisation="' . $_SESSION['Session_Langue'] . '">' . $envoi . '</LectureReponseAOIn>';
            $this->arrayTemplate = Wsdl::wsdlCallGen('Oxaproc_AO.wsdl', 'SRM_AO_REP_LECTURE', $envoi, false);
        }
        
        $ModeTemplate = false;
        
        if ($uniquementLignes)
            $this->setUniquementLignes($uniquementLignes);
        if ($uniquementQuestions)
            $this->setUniquementQuestions($uniquementQuestions);
        
        $envoi = '<CodeUtilisateur>' . $_SESSION['Session_Login'] . '</CodeUtilisateur>' . ($ModeTemplate ? '' : '<ModeCreation>' . BoolWsdl($modeCreation) . '</ModeCreation>') . // Si mode template alors pas mode creation envoyé
'<NO_AO>' . $num_AO . '</NO_AO>' . (is_null($dateReponse) ? '' : '<DTE_REP>' . $dateReponse . '</DTE_REP>') . '<CODE_FOU>' . $infoRechercheFour['CODE_FOU'] . '</CODE_FOU>' . '<TYPE_FG>' . $infoRechercheFour['TYPE_FG'] . '</TYPE_FG>' . '<C_V>' . $conformeVariante . '</C_V>' . // ATTENTION ICI C'est bien une logique booleene sauf que c'est C ou V qu'il faut envoyé
'<ModeTemplate>' . BoolWsdl($ModeTemplate) . '</ModeTemplate>';
        
        $this->saveWsdlEnv = $envoi;
        
        return $this->wsdlLectureReponseAo($uniquementLignes, $uniquementQuestions, $noPage);
    }

    public function &wsdlLectureReponseAo($UniquementLignes, $UniquementQuestions, $noPage = '')
    {
        $envoi = $this->saveWsdlEnv . '<UniquementLignes>' . BoolWsdl($UniquementLignes) . '</UniquementLignes>' . '<UniquementQuestions>' . BoolWsdl($UniquementQuestions) . '</UniquementQuestions>' . ($noPage != '' ? '<Ligne_NoPage>' . $noPage . '</Ligne_NoPage>' : '');
        
        $envoi = '<LectureReponseAOIn LngUtilisation="' . $_SESSION['Session_Langue'] . '">' . $envoi . '</LectureReponseAOIn>';
        return Wsdl::wsdlCallGen('Oxaproc_AO.wsdl', 'SRM_AO_REP_LECTURE', $envoi, false);
    }

    public function affecteNameZoneWsdl(& $xml)
    {
        if (is_array($xml))
            foreach ($xml as $index => & $node) {
                if (is_array($node) && array_key_exists('!Modifiable', $node) && ! array_key_exists('!zoneOXAPROC', $node)) {
                    $this->countData ++;
                    $node['!zoneOXAPROC'] = 'zone_' . $this->countData;
                }
                $this->affecteNameZoneWsdl($node);
            }
    }

    public function initObjectReponse()
    {
        $ao = $this->getProperties('NO_AO');
        
        $variante = $this->getProperties('VARIANTE');
        if (is_null($variante))
            $variante = '0';
        
        if ($ret = $this->CallWsdlGetAORepLecture($this->getProperties('NO_AO'), $variante, true, false, true, 1) // Appel en pagge 1
) {
            if (array_key_exists('Statut', $ret)) {
                // print_r($ret);
                if ($ret['Statut']['#text'] == 'O') {
                    $this->setProperties('SRM_AO', $ret);
                    $this->setPresenceQuestionnaire($ret['PresenceQuestionnaire']['#text'] != '0');
                    if ($ao = $this->getProperties('SRM_AO')) {
                        $this->countData = 0;
                        $this->affecteNameZoneWsdl($ao);
                        $this->setProperties('SRM_AO', $ao);
                    }
                    
                    $nomFolder = 'ListLignes';
                    $cl = new XmlPageOnglet();
                    $cl->setAction("popup_ao_saisie_rep.php?action=changePage&onglet=" . AO_ecran::FOLDER_LIGNE);
                    $cl->setMaxiPage($ret['ReponseAO'][$nomFolder]['!NbdePagesLignes']);
                    $cl->ajoutePage(1);
                    $cl->setPageCourante(1);
                    $this->listePageOnglet[$nomFolder] = $cl;
                    
                    return true;
                } else if ($ret['Statut']['#text'] == 'E') {
                    $this->errorMessage = $ret['MsgErreur']['#text'];
                }
            } else {
                $this->errorMessage = trad('Anomalie WebService absence du Tag :') . 'Statut';
                // print_r($ret);
            }
        } else {
            $this->errorMessage = trad('WebService d\'appel non joignable');
        }
        return true;
    }

    public function lanceQuestionnaire()
    {
        if ($ao = $this->getProperties('SRM_AO')) {
            if ($arrayAo = $this->getArraySrm('ReponseAO')) {
                foreach ($arrayAo as $indexAo => & $elementAO) {
                    $dteRep = StdXmlWsdl::getValueZoneInterne($elementAO['DTE_REP']);
                    $typeFg = StdXmlWsdl::getValueZoneInterne($elementAO['TYPE_FG']);
                    $codFour = StdXmlWsdl::getValueZoneInterne($elementAO['CODE_FOU']);
                    $noAo = StdXmlWsdl::getValueZoneInterne($elementAO['NO_AO']);
                    $c_v = StdXmlWsdl::getValueZoneInterne($elementAO['C_V']);
                    
                    $url = 'OpenPopup("ao_questionnaire.php?action=AffichePopupReponse' . '&no_ao=' . urlencode($noAo) . '&type_fg=' . urlencode($typeFg) . '&code_fou=' . urlencode($codFour) . '&dte_rep=' . urlencode($dteRep) . '&c_v=' . urlencode($c_v) . '", "popup_reponse_ao_fou", "1000", "600");';
                    return $url;
                }
            }
        }
        return '';
    }

    public function valideReponse()
    {
        // print_r($this->getProperties('SRM_AO'));
        // print_r($this->getArraySrm('ReponseAO'));exit;
        if ($ao = $this->getProperties('SRM_AO')) {
            if ($arrayAo = $this->getArraySrm('ReponseAO')) {
                $ok = true;
                foreach ($arrayAo as $indexAo => & $elementAO) {
                    /**
                     * Le controle suivant est mis coté OXA PROC car coté SRM c'etait prevu mais c'est pas fait le tag ModeCreation n'est pas dans le programme MAGIC
                     */
                    // DEBUT
                    if (is_null($this->selectIndexReponse)) {
                        $dteRep = StdXmlWsdl::getValueZoneInterne($elementAO['DTE_REP']);
                        $codFour = StdXmlWsdl::getValueZoneInterne($elementAO['CODE_FOU']);
                        $noAo = StdXmlWsdl::getValueZoneInterne($elementAO['NO_AO']);
                        
                        $dtelimit = StdXmlWsdl::getValueZoneInterne($elementAO['DTELIMIT']);
                        
                        if ($dtelimit != '00000000' && $dtelimit != '')
                            if ($dtelimit < $dteRep) {
                                Affichage::messageJS(trad('La date limite d\'offre ne peut pas être antérieure à la date de réponse.'));
                                $ok = false;
                            }
                        
                        if ($ok) {
                            $sql = 'select null from AO_REP with (nolock) ' . 'where NO_AO     = ' . ReplaceSqlPointeur($noAo) . ' ' . 'and   CODE_FOU  = \'' . ReplaceSqlPointeur($codFour) . '\' ' . 'and   DTE_REP   = \'' . ReplaceSqlPointeur($dteRep) . '\' ' . '';
                            
                            if ((new RequeteSQL($sql, DB_OXASQLDB))->Trouve1()) {
                                Affichage::messageJS(trad('Une réponse existe dejà pour la date indiquée.'));
                                $ok = false;
                            }
                        }
                    }
                    // FIN
                    if ($ok) {
                        if ($ListLignes = $this->getArraySrm('ListLignes', $elementAO)) {
                            foreach ($ListLignes as $indexliste => & $liste) {
                                foreach ($liste as $indexMot => & $lignes) {
                                    if ($indexMot == 'Ligne') {
                                        foreach ($lignes as $indexLigne => & $ligne) {}
                                    }
                                }
                            }
                        } else {
                            $ok = false;
                            Affichage::messageJS(trad('Anomalie système'));
                        }
                    }
                }
                // print_r($ao);
                // print_r(FluxXml::tradArrayInFluxXml($ao));
                if ($ok) {
                    $envoi = '<CodeUtilisateur>' . $_SESSION['Session_Login'] . '</CodeUtilisateur>' . '<ModeCreation>' . (is_null($this->selectIndexReponse) ? 'true' : 'false') . '</ModeCreation>' . FluxXml::tradArrayInFluxXml($ao);
                    
                    $envoi = '<MaJReponseAOIn LngUtilisation="' . $_SESSION['Session_Langue'] . '">' . $envoi . '</MaJReponseAOIn>';
                    
                    if ($ret = Wsdl::wsdlCallGen('Oxaproc_AO.wsdl', 'SRM_AO_REP_ENREG', $envoi, true)) {
                        if ($ret['Statut'] == 'O') {
                            return true;
                        } else if ($ret['Statut'] == 'E')
                            Affichage::messageJS($ret['Erreur']);
                    }
                }
            } else {
                Affichage::messageJS(trad('Anomalie système'));
            }
        } else {
            Affichage::messageJS(trad('Anomalie système'));
        }
        return false;
    }

    /**
     * Genere la partie array contenant les lignes de reponses
     *
     * @return NULL|string[]
     */
    public function &buildXml()
    {
        $array = null;
        $ao = $this->getProperties('SRM_AO');
        
        if ($arrayAo = $this->getArraySrm('ReponseAO')) {
            
            $nb_decimales_pu = Param::getNombreDeciamlePU();
            // print_r($arrayAo);
            foreach ($arrayAo as $indiceAo => & $ao) {
                $conforme = ($this->getValueSrm('C_V', $ao) != 'V');
                
                switch ($this->idOngletCourant) {
                    // Section des affichages de lignes de l'AO
                    case $this->idOngletDetail:
                        $nomFolder = 'ListLignes';
                        $clPagination = $this->listePageOnglet[$nomFolder];
                        
                        if ($clPagination instanceof XmlPageOnglet)
                            $tabPagination = & $clPagination->genXmlArray();
                        else
                            $tabPagination = null;
                        
                        $tmp = null;
                        foreach ($ao as $indexTag => & $infoNull)
                            if (! is_numeric($indexTag) && stripos($indexTag, '!') !== 0 && stripos($indexTag, '#') !== 0)
                                $tmp[$indexTag] = $this->getValueSrmForXsl($indexTag, $ao);
                        
                        if (! is_null($tmp)) {
                            $element = $tmp;
                            switch ($element['TYPE_FG']['!value']) {
                                case 'F':
                                    if ($result = & SqlFrs::rqGetRecordFournis($element['CODE_FOU']['!value'])->Trouve1())
                                        $element['CODE_FOU']['!libelle'] = $result['RS'];
                                    break;
                                case 'G':
                                    if ($result = & SqlGestFourniss::rqGetInfoGroupeFournisseur($element['CODE_FOU']['!value'])->Trouve1())
                                        $element['CODE_FOU']['!libelle'] = $result['RS'];
                                    break;
                            }
                            
                            if ($result = & SqlPanier::rqSqlTableDevise($element['DEVISE']['!value'])->Trouve1())
                                $element['DEVISE']['!libelle'] = $result['LIBELLE'];
                            
                            if ($arrayL = & $ao['ListLignes']['Ligne']) {
                                if (array_key_exists(0, $arrayL))
                                    $arrayLignes = & $arrayL;
                                else
                                    $arrayLignes[0] = $arrayL;
                                
                                foreach ($arrayLignes as $ligne)
                                    if ($ligne['!NoPage'] == $clPagination->getPageCourante()) {
                                        $tmp = null;
                                        $noPoAo = $this->getValueSrm('NO_PO_AO', $ligne);
                                        
                                        $existeSousLigne = false;
                                        foreach ($ligne as $indexTag => & $infoNull)
                                            if (! is_numeric($indexTag) && stripos($indexTag, '!') !== 0 && stripos($indexTag, '#') !== 0) {
                                                if ($indexTag == 'ListSousLignes') { // Bloc de sous lignes
                                                    if (array_key_exists('SousLigne', $infoNull)) {
                                                        if (array_key_exists('NO_SSLIG', $infoNull['SousLigne']))
                                                            $sousLigne[0] = & $infoNull['SousLigne'];
                                                        else
                                                            $sousLigne = & $infoNull['SousLigne'];
                                                        
                                                        $nSousLigne = 0;
                                                        foreach ($sousLigne as $numeroLigne => & $sousLigneDetail)
                                                            if (! array_key_exists('!Etat', $sousLigneDetail) || $sousLigneDetail['!Etat'] != 'S') {
                                                                foreach ($sousLigneDetail as $sousIndexTag => & $sousInfoNull)
                                                                    if (! is_numeric($sousIndexTag) && stripos($sousIndexTag, '!') !== 0 && stripos($sousIndexTag, '#') !== 0)
                                                                        $tmp['_SousLigne'][$nSousLigne][$sousIndexTag] = $this->getValueSrmForXsl($sousIndexTag, $sousLigneDetail);
                                                                
                                                                $ligneInfo = & $tmp['_SousLigne'][$nSousLigne];
                                                                if ($sousIndexTag == 'PU' && array_key_exists('!value', $ligneInfo[$sousIndexTag]) && $ligneInfo[$sousIndexTag]['!value'] != '')
                                                                    $ligneInfo[$sousIndexTag]['!value'] = FormatageData::formatMontant($ligneInfo[$sousIndexTag]['!value'], $nb_decimales_pu, ' ');
                                                                
                                                                if (! $conforme) {
                                                                    $tmp['_SousLigne'][$nSousLigne]['_action'][] = array(
                                                                        '!action' => 'CallUrl("popup_ao_saisie_rep.php?action=' . AO_Reponse::ACTION_SUPPR_LG . '&NO_PO_AO_SS=' . $noPoAo . '_' . $numeroLigne . '");',
                                                                        '!class' => 'img_picto_supprimer_16x16',
                                                                        '!tooltip' => trad('Supprimer la sous ligne')
                                                                    );
                                                                }
                                                                
                                                                // Traitement sur la notion modifiable sur les sous lignes
                                                                $zoneTest = 'CODE_ART';
                                                                if (array_key_exists($zoneTest, $tmp['_SousLigne'][$nSousLigne])) {
                                                                    $zone = 'DES_ART';
                                                                    if (array_key_exists($zone, $sousLigneDetail) && $this->getValueSrm($zoneTest, $sousLigneDetail) != '') {
                                                                        $tmp['_SousLigne'][$nSousLigne][$zone]['!modifiable'] = 0; // Si split de ligne alors le prix n'est pas modifiable par l'utilisateur
                                                                    }
                                                                }
                                                                
                                                                $zoneTest = 'COD_GAM';
                                                                if (array_key_exists('!Objet', $sousLigneDetail[$zoneTest]))
                                                                    if ($sousLigneDetail[$zoneTest]['!Objet'] == 'GAMME' || $sousLigneDetail[$zoneTest]['!Objet'] == 'GAMMES')
                                                                        $tmp['_SousLigne'][$nSousLigne][$zoneTest]['!actionAide'] = 'Traite("popup_ao_saisie_rep.php?action=zoomListe",form_popup_textarea.' . $tmp['_SousLigne'][$nSousLigne][$zoneTest]['!name'] . ')';
                                                                
                                                                $zoneTest = 'UNITE';
                                                                if (array_key_exists('!Objet', $sousLigneDetail[$zoneTest])) {
                                                                    if ($sousLigneDetail[$zoneTest]['!Objet'] == 'UNITES') {
                                                                        if ($reqSql = & SqlPanier::rqGetListeUnites()->TrouveTous())
                                                                            foreach ($reqSql as & $data)
                                                                                $tmp['_SousLigne'][$nSousLigne][$zoneTest]['option'][] = array(
                                                                                    '!value' => & $data['unit'],
                                                                                    '!texte' => & $data['unit']
                                                                                );
                                                                    }
                                                                }
                                                                
                                                                $existeSousLigne = true;
                                                                $nSousLigne ++;
                                                            }
                                                    }
                                                } else {
                                                    $tmp[$indexTag] = $this->getValueSrmForXsl($indexTag, $ligne);
                                                    if ($indexTag == 'PU' && array_key_exists('!value', $tmp[$indexTag]) && $tmp[$indexTag]['!value'] != '')
                                                        $tmp[$indexTag]['!value'] = FormatageData::formatMontant($tmp[$indexTag]['!value'], $nb_decimales_pu, ' ');
                                                }
                                            }
                                        
                                        /**
                                         * Si mode variante alors il doit etre possible de spliter la ligne
                                         */
                                        
                                        if (! $conforme) {
                                            $libelle = trad('Décomposer la ligne');
                                            $clImage = 'img_split_16x16';
                                            $action = 'CallUrl("popup_ao_saisie_rep.php?action=' . AO_Reponse::ACTION_SPLIT_LG . '&NO_PO_AO=' . $noPoAo . '");';
                                            
                                            if ($existeSousLigne) {
                                                if (array_key_exists('PU', $tmp)) {
                                                    $tmp['PU']['!modifiable'] = 0; // Si split de ligne alors le prix n'est pas modifiable par l'utilisateur
                                                }
                                                
                                                if (! $this->isModeDetail()) {
                                                    $libelle = trad('Présence de sous-lignes de réponse');
                                                    $clImage = 'img_split_16x16_v';
                                                    $action = 'CallUrl("popup_ao_saisie_rep.php?action=' . AO_Reponse::ACTION_SPLIT_LG . '&NO_PO_AO=' . $noPoAo . '");';
                                                }
                                            }
                                            $tmp['_action'][] = array(
                                                '!action' => $action,
                                                '!class' => $clImage,
                                                '!tooltip' => $libelle
                                            );
                                        }
                                        
                                        // dans le cas d'existance de sous lignes il faut interdire certaines modificationns
                                        
                                        $zoneTest = 'CODE_ART';
                                        if (array_key_exists($zoneTest, $tmp)) {
                                            $zone = 'DES_ART';
                                            // Si présence de sous ligne ou code article existant alors
                                            if ($conforme || (array_key_exists($zone, $ligne) && ($existeSousLigne || $this->getValueSrm($zoneTest, $ligne) != ''))) {
                                                $tmp[$zone]['!modifiable'] = 0; // Si split de ligne alors le prix n'est pas modifiable par l'utilisateur
                                            }
                                            if ($conforme || $existeSousLigne) {
                                                $tmp[$zoneTest]['!modifiable'] = 0;
                                            }
                                        }
                                        
                                        /* Traitement spécial pour code gammes car depend du code fabricant */
                                        $zoneTest = 'COD_GAM';
                                        if (array_key_exists('!Objet', $ligne[$zoneTest])) {
                                            if ($ligne[$zoneTest]['!Objet'] == 'GAMME' || $ligne[$zoneTest]['!Objet'] == 'GAMMES') {
                                                // print_r($tmp[$zoneTest]); exit;
                                                $tmp[$zoneTest]['!actionAide'] = 'Traite("popup_ao_saisie_rep.php?action=zoomListe",form_popup_textarea.' . $tmp[$zoneTest]['!name'] . ')';
                                            }
                                        }
                                        
                                        $zoneTest = 'UNITE';
                                        if (array_key_exists('!Objet', $ligne[$zoneTest])) {
                                            if ($ligne[$zoneTest]['!Objet'] == 'UNITES') {
                                                if ($reqSql = SqlPanier::rqGetListeUnites()->TrouveTous())
                                                    foreach ($reqSql as & $data)
                                                        $tmp[$zoneTest]['option'][] = array(
                                                            '!value' => & $data['unit'],
                                                            '!texte' => & $data['unit']
                                                        );
                                            }
                                        }
// print_r($tmp);
                                        
                                        if (! is_null($tmp)) {
                                            $element['ligne'][] = $tmp;
                                        }
                                    }
                            }
                            
                            $element['validation_suite'] = array(
                                '!action' => 'Traite("popup_ao_saisie_rep.php",this);',
                                '!name' => AO_Reponse::ACTION_VALIDE_REP_CNT
                            );
                            
                            $actionPanelVisu = null;
                            
                            $actionPanelVisu[] = array(
                                'action' => array(
                                    '!texte' => $this->isAfficherReference() ? trad('Masquer références') : trad('Afficher références'),
                                    '!action' => 'CallUrl("popup_ao_saisie_rep.php?action=' . AO_Reponse::ACTION_PANEL_BTN . '&name=ref");',
                                    '!is_actif' => true
                                )
                            );
                            
                            // Ce bouton ne doit être présent que si le mode variante est sélectionné
                            if ($this->getValueSrm('C_V', $ao) == 'V') {
                                $actionPanelVisu[] = array(
                                    'action' => array(
                                        '!texte' => $this->isModeDetail() ? trad('Mode synthétique') : trad('Mode détaillé'),
                                        '!action' => 'CallUrl("popup_ao_saisie_rep.php?action=' . AO_Reponse::ACTION_PANEL_BTN . '&name=sligne");',
                                        '!is_actif' => true
                                    )
                                );
                            }
                            
                            $element['panelSelect'] = array(
                                '!id' => $this->idPanelVisuAo,
                                $actionPanelVisu
                            );
                            $element['pagination'] = $tabPagination;
                        }
                        break;
                    // Section des affichages de lignes de l'AO
                    default:
                        // $dteRep = StdXmlWsdl::getValueZoneInterne($elementAO['DTE_REP']);
                        $typeFg = StdXmlWsdl::getValueZoneInterne($elementAO['TYPE_FG']);
                        $codFour = StdXmlWsdl::getValueZoneInterne($elementAO['CODE_FOU']);
                        $noAo = StdXmlWsdl::getValueZoneInterne($elementAO['NO_AO']);
                        $c_v = StdXmlWsdl::getValueZoneInterne($elementAO['C_V']);
                        
                        // $questionnaire = AO_Questionnaire::getXmlArray($xml_node,$this->getProperties('NO_AO'), $dte_rep, $type_fg, $code_fou);
                        $dteRep = null;
                        if (array_key_exists('Questionnaire', $ao) && array_key_exists('Liste_Themes_Questions', $ao['Questionnaire'])) {
                            $questionnaire = AO_Questionnaire::getXmlArray($ao['Questionnaire']['Liste_Themes_Questions'], $this->getProperties('NO_AO'), $dteRep, $typeFg, $codFour, $c_v, 'AO_Reponse');
                            if (! is_null($questionnaire))
                                $element['questionnaire'] = & $questionnaire;
                        }
                        
                        break;
                }
                
                $element['panelOnglet'] = array(
                    '!id' => $this->idPanelOnglet,
                    '!idSelect' => $this->idOngletCourant,
                    array(
                        'action' => array(
                            '!id' => $this->idOngletDetail,
                            '!texte' => trad('Prix'),
                            '!action' => 'CallUrl("popup_ao_saisie_rep.php?action=' . AO_Reponse::ACTION_ONGLET_BTN . '&name=' . $this->idOngletDetail . '");',
                            '!is_actif' => true
                        )
                    ),
                    array(
                        'action' => array(
                            '!id' => $this->idOngletQuesionnaire,
                            '!texte' => trad('Questionnaire'),
                            '!action' => 'CallUrl("popup_ao_saisie_rep.php?action=' . AO_Reponse::ACTION_ONGLET_BTN . '&name=' . $this->idOngletQuesionnaire . '");',
                            '!is_actif' => $this->isPresenceQuestionnaire()
                        )
                    )
                );
                $element['sauveelement'] = array(
                    '!action' => 'Traite("popup_ao_saisie_rep.php?action=' . AO_Reponse::ACTION_SAVE_OBJ . '",this);'
                );
                $element['validation'] = array(
                    '!action' => 'Traite("popup_ao_saisie_rep.php",this);',
                    '!name' => AO_Reponse::ACTION_VALIDE_REP,
                    '!value' => trad('Enregistrer la réponse')
                );
                
                $element['!afficheDetail'] = $this->isModeDetail();
                $element['!afficheReference'] = $this->isAfficherReference();
                $element['!tradCommentaireFournisseur'] =  trad('Commentaire fournisseur');
                $element['!tradDesComp'] =  trad('Désignation complémentaire');
                $array['AO'][] = $element;
            }
        }
        return $array;
    }

    public function getIdPanel()
    {
        return $this->idPanelVisuAo;
    }

    public function getIdOnglet()
    {
        return $this->idPanelOnglet;
    }

    public function saveValue($zoneSaisie = null)
    {
        if (is_null($this->nodeControle))
            return false;
        
        if ($arrayAo = $this->getArraySrm('ReponseAO')) {
            $parent = & $this->getParent($arrayAo, $this->nodeControle);
            // print_r($parent); exit;
            if (array_key_exists('!Objet', $this->nodeControle)) {
                switch ($this->nodeControle['!Objet']) {
                    case 'ARTICLES':
                        $listeZone = array(
                            'DES_ART',
                            'UNITE',
                            'COD_FAB',
                            'COD_GAM'
                        );
                        $okValideControle = false;
                        if ($reqSql = & SqlArticle::rqIsArticleHaplus($this->internalValue)->Trouve1()) {
                            $this->setValueSrm('UNITE', $parent, $reqSql['UNIT']);
                            $this->setValueSrm('DES_ART', $parent, $reqSql['DESIGN']);
                            $this->setValueSrm('COD_FAB', $parent, $reqSql['CODEFAB']);
                            $this->setValueSrm('COD_GAM', $parent, $reqSql['CODEGAM']);
                            
                            $this->nodeControle['#text'] = $this->internalValue;
                            $okValideControle = true;
                        } else {
                            if ($this->internalValue != '') {
                                $this->errorMessage = strBuild(trad('Le code article saisi est inconnu ( @1@ )'), $this->internalValue);
                                $okValideControle = false;
                            } else {
                                if ($this->nodeControle['#text'] != $this->internalValue) {
                                    $this->nodeControle['#text'] = $this->internalValue;
                                    $this->setValueSrm('DES_ART', $parent, '');
                                }
                                $okValideControle = true;
                            }
                        }
                        
                        if ($okValideControle) {
                            $genXsl = new GenXslt(true);
                            $genXsl->XslHtml(AO_Reponse::xslPopup, $this->buildXml());
                            
                            foreach ($listeZone as & $nomZone)
                                $genXsl->echoHtml('id_td_' . $parent[$nomZone]['!zoneOXAPROC']);
                        }
                        
                        return $okValideControle;
                        break;
                    case 'UNITES':
                        // Attention a la notion d'unite alternative
                        if ($reqSql = & SqlArticle::rqIsUniteHaplus($this->internalValue)->Trouve1()) {
                            $this->nodeControle['#text'] = $this->internalValue;
                            return true;
                        } else {
                            if ($this->internalValue != '') {
                                $this->errorMessage = strBuild(trad('Le code unité saisi est inconnu ( @1@ )'), $this->internalValue);
                                return false;
                            } else {
                                $this->nodeControle['#text'] = $this->internalValue;
                                return true;
                            }
                        }
                        break;
                    case 'FABRICAN':
                    case 'FABRICANT':
                        if ($reqSql = & SqlFrs::rqGetFabricantRS($this->internalValue)->Trouve1()) {
                            $this->nodeControle['#text'] = $this->internalValue;
                            return true;
                        } else {
                            if ($this->internalValue != '') {
                                $this->errorMessage = strBuild(trad('Le code fabricant saisi est inconnu ( @1@ )'), $this->internalValue);
                                return false;
                            }
                            return true;
                        }
                        break;
                    case 'GAMMES':
                        // Il faut recherche le parent et donc obtenir la gammes
                        $codeFab = StdXmlWsdl::getValueZoneInterne($parent['COD_FAB']);
                        if ($reqSql = & SqlArticle::rqGetFabricantGamme($codeFab, $this->internalValue)->Trouve1()) {
                            $this->nodeControle['#text'] = $this->internalValue;
                            return true;
                        } else {
                            if ($this->internalValue != '') {
                                $this->errorMessage = strBuild(trad('Le code gamme saisi est inconnu ( @1@ )'), $this->internalValue);
                                return false;
                            }
                            return true;
                        }
                        break;
                    case 'COUNTRY':
                        $this->nodeControle['#text'] = $this->internalValue;
                        return true;
                        break;
                    default:
                        // $this->errorMessage = trad('Contrôle manquant de la zone').' '.$this->nodeControle['!Objet'];
                        return true;
                        break;
                }
            } else {
                switch ($this->zoneXml) {
                    case 'QTE_PROP':
                    case 'PU':
                        // Traitement different entre les lignes et les sous lignes
                        $this->nodeControle['#text'] = $this->internalValue;
                        
                        // Recherche de la parenté :
                        if (array_key_exists('NO_SSLIG', $parent)) {
                            // Gestion du mode sous lignes
                            $parentLigne = & $this->getParent($arrayAo, $parent);
                            
                            $this->majPrixUnitaireLigneAO($arrayAo, $parentLigne);
                        } else {
                            // Gestion du mode ligne
                        }
                        
                        break;
                    case 'DELAIJ':
                        $DELAI = PanierLigne::getDateLivraisonMin($this->internalValue, $_SESSION['Session_DureeTraitementDA']);
                        $this->setValueSrm('DELAI', $parent, convertDateUserToSql($DELAI));
                    default:
                        $this->nodeControle['#text'] = $this->internalValue;
                        break;
                }
                
                return true;
            }
        } else
            return false;
    }

    public function majPrixUnitaireLigneAO(& $arrayAo, & $parentLigne, $refresh = true)
    {
        if (is_array($parentLigne)) {
            
            $elementLigneAO = & $parentLigne;
            while (! is_null($elementLigneAO)) {
                if (array_key_exists('NO_PO_AO', $elementLigneAO))
                    break;
                $elementLigneAO = & $this->getParent($arrayAo, $elementLigneAO);
            }
            
            if (array_key_exists('NO_SSLIG', $parentLigne))
                $listeSousLigne[0] = & $parentLigne;
            else
                $listeSousLigne = & $parentLigne;
            
            $pu = 0;
            foreach ($listeSousLigne as & $sousLigne)
                if (! array_key_exists('!Etat', $sousLigne) || $sousLigne['!Etat'] != 'S') {
                    $puSousLigne = & $this->getValueSrm('PU', $sousLigne);
                    $qteSousLigne = & $this->getValueSrm('QTE_PROP', $sousLigne);
                    
                    if (is_numeric($puSousLigne) && is_numeric($qteSousLigne))
                        $pu += (float) $puSousLigne * (float) $qteSousLigne;
                }
            
            $this->setValueSrm('PU', $elementLigneAO, $pu);
            
            if ($refresh) {
                if (is_array($elementLigneAO['PU']) && array_key_exists('!zoneOXAPROC', $elementLigneAO['PU'])) {
                    $genXsl = new GenXslt(true);
                    $genXsl->XslHtml(AO_Reponse::xslPopup, $this->buildXml());
                    
                    $genXsl->echoHtml('id_td_' . $elementLigneAO['PU']['!zoneOXAPROC']);
                }
            }
        }
    }

    /**
     * NE SURTOUT PAS MODIFIER LE CODE AVEC LES REFERENCES CAR SINON Il y a des copies mémoire de réalisée et tout le système de serialization ne fonctionne plus
     *
     * @param unknown $base
     * @param unknown $nodeArecherche
     * @return unknown|NULL|unknown
     */
    public function &getParent(& $base, & $nodeArecherche)
    {
        $retour = null;
        if (is_array($base)) {
            foreach ($base as $index => & $nodeSequence)
                if ($nodeSequence === $nodeArecherche)
                    return $base;
                else {
                    $retour = & $this->getParent($nodeSequence, $nodeArecherche);
                    if ($retour != null)
                        return $retour;
                }
        }
        
        return $retour;
    }

    public function &getNodeControl()
    {
        return $this->nodeControle;
    }

    /**
     * Eonnant d'etre obligé de faire cela mais sinon la reference n'est pas pris en compte
     * 
     * @param number $decal
     * @return unknown
     */
    public function &getArrayStore($decal = 0)
    {
        $ret = & $this->tabRech[count($this->tabRech) - 2 - $decal]; // & OBLIGATOIRE
        return $ret;
    }

    public function rechercheZone(& $xml, $zone, $inc)
    {
        if ($inc == 0) {
            if (isset($this->tabRech))
                unset($this->tabRech);
        }
        if (is_array($xml)) {
            foreach ($xml as $index => & $node) {
                $this->tabRech[$inc] = & $node;
                if (is_array($node) && array_key_exists('!zoneOXAPROC', $node) && $node['!zoneOXAPROC'] == $zone) {
                    $this->zoneXml = $index;
                    $this->nodeControle = & $node;
                    return true;
                }
                if ($this->rechercheZone($node, $zone, $inc + 1))
                    return true;
            }
        }
        return false;
    }

    public function getZoneXml()
    {
        return $this->zoneXml;
    }

    public function deleteSousLigne($numeroLigneSs)
    {
        if ($arrayAo = & $this->getArraySrm('ReponseAO')) {
            list ($numeroLigne, $sousLigneNumero) = explode('_', $numeroLigneSs);
            
            // / ici on va chercher la ligne qui contient la référence sur le numéro de ligne
            foreach ($arrayAo as $indexAo => & $elementAO)
                if (array_key_exists('ListLignes', $elementAO)) {
                    $nodeLigne = & $elementAO['ListLignes'];
                    
                    if (array_key_exists(0, $nodeLigne['Ligne']))
                        $arrayList = & $nodeLigne['Ligne'];
                    else
                        $arrayList[0] = & $nodeLigne['Ligne'];
                    
                    foreach ($arrayList as & $ligneAO)
                        if ($this->getValueSrm('NO_PO_AO', $ligneAO) == $numeroLigne)
                            // Maintenant on va chercher la sous ligne en question pour là supprimer
                            
                            if (array_key_exists('ListSousLignes', $ligneAO) && array_key_exists('SousLigne', $ligneAO['ListSousLignes'])) {
                                $sousLigne = null;
                                if (array_key_exists('NO_SSLIG', $ligneAO['ListSousLignes']['SousLigne']))
                                    $sousLigne[0] = & $ligneAO['ListSousLignes']['SousLigne'];
                                else
                                    $sousLigne = & $ligneAO['ListSousLignes']['SousLigne'];
                                
                                $listeSousLigne = & $ligneAO['ListSousLignes']['SousLigne'];
                                
                                foreach ($sousLigne as $numeroLigne => & $sousLigneDetail)
                                    if ($numeroLigne == $sousLigneNumero) {
                                        if (array_key_exists('!Etat', $sousLigneDetail) && $sousLigneDetail['!Etat'] == 'A')
                                            if (array_key_exists('NO_SSLIG', $listeSousLigne)) {
                                                $listeSousLigne['!Etat'] = 'S';
                                                $this->majPrixUnitaireLigneAO($arrayAo, $listeSousLigne, false);
                                                unset($listeSousLigne);
                                            } else {
                                                $listeSousLigne[$numeroLigne]['!Etat'] = 'S';
                                                $this->majPrixUnitaireLigneAO($arrayAo, $listeSousLigne, false);
                                                unset($listeSousLigne[$numeroLigne]);
                                            }
                                        else if (array_key_exists('NO_SSLIG', $listeSousLigne)) {
                                            $listeSousLigne['!Etat'] = 'S';
                                            $this->majPrixUnitaireLigneAO($arrayAo, $listeSousLigne, false);
                                        } else {
                                            $listeSousLigne[$numeroLigne]['!Etat'] = 'S';
                                            $this->majPrixUnitaireLigneAO($arrayAo, $listeSousLigne, false);
                                        }
                                        
                                        return true;
                                    }
                            }
                }
        }
        return false;
    }

    /**
     *
     * @param unknown $nameButton
     * @return boolean
     */
    public function actionOnglet($nameOnglet)
    {
        if ($nameOnglet == $this->idOngletDetail) {
            $this->idOngletCourant = $this->idOngletDetail;
            return true;
        } else if ($nameOnglet == $this->idOngletQuesionnaire) {
            if (! $this->isUniquementQuestions() && $this->isPresenceQuestionnaire()) {
                // On rappatrie le question
                if ($retour = $this->wsdlLectureReponseAo(false, true, 1)) {
                    if (array_key_exists('ReponseAO', $retour)) {
                        if (array_key_exists('Questionnaire', $retour['ReponseAO'])) {
                            // Ajout des données sur le xml complet
                            if ($arrayAo = & $this->getArraySrm('ReponseAO')) {
                                foreach ($arrayAo as $indexAo => & $xmlAo)
                                    if ($this->getValueSrm('NO_AO', $xmlAo) == $this->getProperties('NO_AO')) {
                                        $xmlAo['Questionnaire'] = & $retour['ReponseAO']['Questionnaire'];
                                        $this->setUniquementQuestions(true);
                                        break;
                                    }
                            }
                        }
                    }
                }
            }
            $this->idOngletCourant = $this->idOngletQuesionnaire;
            return true;
        }
        return false;
    }

    /**
     *
     * @param unknown $nameOnglet
     * @return boolean
     */
    public function actionPanel($nameButton)
    {
        if ($nameButton == 'ref') {
            $this->setAfficherReference(! $this->isAfficherReference());
            return true;
        } else if ($nameButton == 'sligne') {
            $this->setModeDetail(! $this->isModeDetail());
            return true;
        }
        return false;
    }

    public function afficheLoupe($zone)
    {
        if ($arrayAo = & $this->getArraySrm('ReponseAO')) {
            // Reccherche du noeud contenant la zone de controle
            if ($this->rechercheZone($arrayAo, $zone, 0)) {
                $nodeXml = & $this->nodeControle;
                $parent = & $this->getParent($arrayAo, $this->nodeControle);
                
                if (array_key_exists('!Objet', $nodeXml)) {
                    switch ($nodeXml['!Objet']) {
                        case 'GAMME': // on passe la référence fabricant aussi
                        case 'GAMMES': // on passe la référence fabricant aussi
                            $retourZone = $nodeXml['!zoneOXAPROC'];
                            
                            echo "OpenPopup('ctrl_liste_gammes.php?action=initPopup&popup_id=" . 'GAMMES' . "&formName=" . $this->getFormulaire() . "&backForm=" . $this->getFormulaire() . "&inputField=" . $retourZone  . "&backAction=change" . "&backPopup=1" . "&backField=" . $retourZone . "&modeHtml=1" . "&CODEFABR=" . urldecode(StdXmlWsdl::getValueZoneInterne($parent['COD_FAB'])) . "','popup_de_liste',750,600);";
                            
                            break;
                        default:
                            break;
                    }
                }
            }
        }
    }

    /**
     * Insere un ligne vierge dans le tableau memoire vis à vis du calc
     * 
     * @param unknown $numeroLigne
     * @return boolean
     */
    public function splitLigne($numeroLigne)
    {
        if ($arrayAo = & $this->getArraySrm('ReponseAO')) {
            
            // Ne pas mettre de reference ici car on veut bien une copie mememoire
            $templateSousLigne = $this->arrayTemplate['ReponseAO']['ListLignes']['Ligne']['ListSousLignes']['SousLigne'];
            
            // print_r($templateSousLigne); exit;
            // / ici on va chercher la ligne qui contient la référence sur le numéro de ligne
            foreach ($arrayAo as $indexAo => & $elementAO) {
                if (array_key_exists('ListLignes', $elementAO)) {
                    $nodeLigne = & $elementAO['ListLignes'];
                    
                    if (! array_key_exists('CODE_ART', $nodeLigne['Ligne']))
                        $arrayList = & $nodeLigne['Ligne'];
                    else
                        $arrayList[0] = & $nodeLigne['Ligne'];
                    
                    foreach ($arrayList as & $ligneAO)
                        if ($this->getValueSrm('NO_PO_AO', $ligneAO) == $numeroLigne) {
                            
                            $templateSousLigne['!Etat'] = 'A';
                            if (array_key_exists('ListSousLignes', $ligneAO))
                                if (array_key_exists('SousLigne', $ligneAO['ListSousLignes']))
                                    if (! array_key_exists('NO_SSLIG', $ligneAO['ListSousLignes']['SousLigne']))
                                        $ligneAO['ListSousLignes']['SousLigne'][] = & $templateSousLigne;
                                    else if (count($ligneAO['ListSousLignes']['SousLigne']) == 0)
                                        $ligneAO['ListSousLignes']['SousLigne'] = array(
                                            & $templateSousLigne
                                        );
                                    else {
                                        $ligneAO['ListSousLignes']['SousLigne'] = array(
                                            $ligneAO['ListSousLignes']['SousLigne']
                                        );
                                        $ligneAO['ListSousLignes']['SousLigne'][] = & $templateSousLigne;
                                    }
                                else
                                    $ligneAO['ListSousLignes']['SousLigne'] = array(
                                        & $templateSousLigne
                                    );
                            else
                                $ligneAO['ListSousLignes']['SousLigne'] = & $templateSousLigne;
                            
                            $this->affecteNameZoneWsdl($templateSousLigne);
                            
                            $this->majPrixUnitaireLigneAO($arrayAo, $ligneAO['ListSousLignes']['SousLigne'], false);
                            
                            return true;
                        }
                }
            }
            
            return false;
        }
        
        return false;
    }

    public function controleSaisie($zoneSaisie, $value)
    {
        $this->internalValue = null;
        $this->errorMessage = null;
        
        if ($arrayAo = & $this->getArraySrm('ReponseAO')) {
            // Reccherche du noeud contenant la zone de controle
            if ($this->rechercheZone($arrayAo, $zoneSaisie, 0)) {
                if (stripos($this->nodeControle['!Format'], 'N') === 0) {
                    $ctrl = explode('.', substr($this->nodeControle['!Format'], 1));
                    if (count($ctrl) == 2) {
                        $value = str_replace(' ', '', $value);
                        if (ControleSaisie::CtrlSaisieNumerique($value, $ctrl[0], $ctrl[1])) {
                            $this->internalValue = $value;
                            return true;
                        } else {
                            switch ($this->getZoneXml()) {
                                case 'PU':
                                    if ($value == '') {
                                        $this->internalValue = $value;
                                        return true;
                                    }
                                    break;
                                case 'QTECOND':
                                    if ($value == '') {
                                        $this->internalValue = $value;
                                        return true;
                                    }
                                    break;
                                case 'QTE_PROP':
                                    if ($value == '') {
                                        $this->internalValue = $value;
                                        return true;
                                    }
                                    break;
                                default:
                                    echo 'alert("', $this->getZoneXml(), '");';
                                    break;
                            }
                            
                            // $this->errorMessage = trad('La saisie de la valeur est incorrecte').' ('.$value.')';
                            return false;
                        }
                    } else { // 27291
                        if (ControleSaisie::CtrlSaisieNumerique($value, $ctrl[0], $ctrl[1])) {
                            $this->internalValue = $value;
                            return true;
                        } else {
                            switch ($this->getZoneXml()) {
                                case 'DELAIJ':
                                    if (ControleSaisie::CtrlQuantite($value)) {
                                        $this->internalValue = $value;
                                        return true;
                                    } else {
                                        $this->errorMessage = strBuild(trad('Saisie de la valeur incorrecte ( @1@ )'), $value);
                                    }
                                    break;
                                default:
                                    print strBuild(trad('controle numérique non prevu'), $this->getZoneXml());
                                    print_r($ctrl);
                                    exit();
                            }
                        }
                    }
                } else if ($this->nodeControle['!Format'] == 'D') {
                    if ($value == '') {
                        $this->internalValue = '';
                        return true;
                    }
                    if (ControleSaisie::isDateValideFormat($value)) {
                        $this->internalValue = convertDateUserToSql($value);
                        return true;
                    } else {
                        $this->errorMessage = strBuild(trad('Saisie de la date incorrecte ( @1@ )'), $value);
                        return false;
                    }
                } else if (stripos($this->nodeControle['!Format'], 'A') === 0) {
                    if (stripos($this->nodeControle['!Format'], 'AU') === 0) {
                        $value = strtoupper($value);
                        
                        $length = substr($this->nodeControle['!Format'], 2);
                        if (mb_strlen($value) > $length) {
                            $this->errorMessage = strBuild(trad('La longueur de la saisie est limitée à ( @1@cc)'), $length);
                            
                            /**
                             * return false;
                             */
                            // Demande PP garder la valeur mais tronquer la saisie au nombre de caractère maximum
                            $this->internalValue = mb_substr($value, 0, $length);
                            return true;
                        } else {
                            $this->internalValue = $value;
                            return true;
                        }
                    } else {
                        $length = substr($this->nodeControle['!Format'], 1);
                        if (mb_strlen($value) > $length) {
                            $this->errorMessage = strBuild(trad('La longueur de la saisie est limitée à ( @1@cc)'), $length);
                            
                            /**
                             * return false;
                             */
                            // Demande PP garder la valeur mais tronquer la saisie au nombre de caractère maximum
                            $this->internalValue = mb_substr($value, 0, $length);
                            return true;
                        } else {
                            $this->internalValue = $value;
                            return true;
                        }
                    }
                } else {
                    $this->internalValue = $value;
                    return true;
                }
            }
        }
        
        return false;
    }

    public function &getValueSrm($zone, & $node = null)
    {
        $ret = null;
        if (is_null($node))
            $node = $this->getProperties('SRM_AO');
        
        if (is_array($node) && array_key_exists($zone, $node) && is_array($node[$zone]) && array_key_exists('#text', $node[$zone]))
            $ret = $node[$zone]['#text'];
        
        return $ret;
    }

    public function setValueSrm($zone, & $node, $value)
    {
        $node[$zone]['#text'] = $value;
    }

    public function getFormulaire()
    {
        return AO_Reponse::formSaisie;
    }

    public function getValueSrmForXsl($zone, & $node = null)
    {
        $ret = '';
        $modifiable = false;
        $NonVisible = false;
        $format = '';
        $actionListe = '';
        if (is_null($node))
            $node = $this->getProperties('SRM_AO');
        
        if (is_array($node) && array_key_exists($zone, $node)) {
            $ret = StdXmlWsdl::getValueZone($node[$zone]);
            
            if (array_key_exists('!Modifiable', $node[$zone]))
                $modifiable = BoolSql($node[$zone]['!Modifiable']);
            if (array_key_exists('!NonVisible', $node[$zone]))
                $NonVisible = BoolSql($node[$zone]['!NonVisible']);
            
            if (array_key_exists('!Format', $node[$zone]))
                $format = $node[$zone]['!Format'];
            
            if ($modifiable == 1 && array_key_exists('!zoneOXAPROC', $node[$zone])) {
                $zoneOxaproc = $node[$zone]['!zoneOXAPROC'];
                if ($node[$zone]['!Format'] == 'D')
                    $actionListe = 'CL.show(null,document.getElementById(\'' . $zoneOxaproc . '\'),null,-80);';
                else if (array_key_exists('!Objet', $node[$zone])) {
                    switch ($node[$zone]['!Objet']) {
                        case 'GAMME': // on passe la référence fabricant aussi
                        case 'GAMMES': // on passe la référence fabricant aussi
                            $retourZone = $node[$zone]['!zoneOXAPROC'];
                            
                            $actionListe = "OpenPopup('ctrl_liste_gammes.php?action=initPopup&popup_id=" . 'GAMMES' . "&formName=" . $this->getFormulaire() . "&backForm=" . $this->getFormulaire() . "&inputField=" . $retourZone  . "&backAction=change" . "&backPopup=1" . "&backField=" . $retourZone . "&modeHtml=1" . "&CODEFABR=" . urldecode(StdXmlWsdl::getValueZoneInterne($node['COD_FAB'])) . "','popup_de_liste',750,600);";
                            
                            break;
                        case 'COUNTRY':
                            $actionListe = PopupBrowse::initZoomByCodeTable('COUNTRY', $this->getFormulaire(), $node[$zone]['!zoneOXAPROC'], '');
                            break;
                        default:
                            $actionListe = XmlWsdlOutil::getListeStandard($node[$zone]['!Objet'], $this->getFormulaire(), $node[$zone]['!zoneOXAPROC']);
                            break;
                    }
                }
            } else
                $zoneOxaproc = '';
            
            return array(
                '!name' => $zoneOxaproc,
                '!value' => $ret,
                '!modifiable' => $modifiable ? '1' : '0',
                '!visible' => $NonVisible ? '0' : '1',
                '!format' => $format,
                '!actionAide' => $actionListe
            );
        }
        return null;
    }

    public function &getArraySrm($tag, & $node = null)
    {
        $ret = null;
        if (is_null($node))
            $node = & $this->getProperties('SRM_AO'); // ULTRA IMPORTANT DE GARDER CET REFERENCE
        
        if (is_array($node) && array_key_exists($tag, $node))
            $ret[0] = & $node[$tag];
        
        return $ret;
    }

    static public function addInfoPopup(& $array, $objet = null)
    {
        $aoReponse = AO_Reponse::restoreSession();
        $idxRep = $aoReponse->getSelectIndexReponse();
        $btnAjoutReponse = null;
        
        $btnAjoutReponse = null;
        if (! is_null($objet)) {
            $no_ao = $objet->getProperties('NO_AO');
        /**
         * Plus de bouton permettant d'acceder au questionnaire, maintenant c'est sous forme d'onglet
         * $infosQuestionnaire = AOQuestionnaireXml::GetFiche($no_ao);
         * if (is_array($infosQuestionnaire)) {
         * $nb = count($infosQuestionnaire['Theme_Question']);
         * if ($nb > 1) { // Le premier est un modèle, on ne le compte pas
         * if (!is_null($idxRep)) {
         * //$dte_rep = convertDateUserToSql($array['AO'][$idxRep]['DTE_REP']['!value']);
         * //$c_v = $array['AO'][$idxRep]['C_V']['!value'];
         * $infos_fou = $objet->indexFour[$objet->indexSelectFour];
         * if (is_array($infos_fou)) {
         * $code_fou = $infos_fou['CODE_FOU'];
         * $type_fg = $infos_fou['TYPE_FG'];
         *
         * $dte_rep = $infos_fou['info'][$idxRep]['DTE_REP'];
         * $c_v = $infos_fou['info'][$idxRep]['C_V'];
         *
         * $idBtn = 'RepondreQuestionnaire';
         * $libelleBtn = trad('Questionnaire');
         *
         * $actionBtn = "Oxa_getDevice().closePopup('popup_saisie_suite');".
         * 'setTimeout(function(){ '.
         * 'parent.OpenPopup("'.AO_Questionnaire::fichierPhp.'?action=AffichePopupReponse'.
         * '&no_ao='.$no_ao.
         * '&type_fg='.$type_fg.
         * '&code_fou='.urlencode($code_fou).
         * '&dte_rep='.$dte_rep.
         * '&c_v='.$c_v.'", "popup_reponse_ao_fou", "1000", "600");'.
         * ' }, 0);';
         * $btnAjoutReponse = new ComposantXslAction($idBtn);
         * $btnAjoutReponse->setLibelle($libelleBtn);
         * $btnAjoutReponse->setAction($actionBtn);
         * $btnAjoutReponse->setEstPrimaire(true);
         * }
         * }
         * else{
         * $idBtn = 'RepondreQuestionnaire';
         * $libelleBtn = trad('Questionnaire');
         * $actionBtn = "if(window.confirm('" .
         * cnv_to_javascript(trad("L'accès aux questions validera les prix saisis. Voulez-vous continuer ?")) ."')) ".
         * "{Traite('popup_ao_saisie_rep.php',document.form_popup_textarea.valide_reponse_cont);}";
         *
         * $btnAjoutReponse = new ComposantXslAction($idBtn);
         * $btnAjoutReponse->setLibelle($libelleBtn);
         * $btnAjoutReponse->setAction($actionBtn);
         * $btnAjoutReponse->setEstPrimaire(true);
         * }
         * }
         * }
         */
        }
        
        $array['fenetre'] = array(
            'information' => array(
                '!value' => ''
            ),
            'form_parent' => array(
                '!value' => getValue('form_parent')
            ),
            'champ' => array(
                '!value' => getValue('champ')
            ),
            'prg_appel' => array(
                '!value' => getValue('prg_appel')
            )
        );
        if (! is_null($btnAjoutReponse))
            $array['fenetre']['questionnaire'] = $btnAjoutReponse->buildXml();
        
        $array['popup_title'] = Trad('Gestion des réponses');
        
        if (! is_null($objet) && ! is_null($objet->getErrorMessage())) {
            $array['fenetre']['!erreur'] = $objet->getErrorMessage();
        }
    }

    static public function addInfoPopupFour(& $array)
    {
        $array['fenetre'] = array(
            'information' => array(
                '!value' => ''
            ),
            'form_parent' => array(
                '!value' => getValue('form_parent')
            ),
            'champ' => array(
                '!value' => getValue('champ')
            ),
            'prg_appel' => array(
                '!value' => getValue('prg_appel')
            )
        );
        $array['popup_title'] = Trad('Sélection du fournisseur');
    }

    static public function afficheElement(& $array, $objet = null)
    {
        AO_Reponse::addInfoPopup($array, $objet);
        
        $genXsl = new GenXslt(true);
        echo $genXsl->XslHtml(AO_Reponse::xslPopup, $array);
    }

    static public function afficheListeFournisseurAo(& $array)
    {
        AO_Reponse::addInfoPopupFour($array);
        
        $genXsl = new GenXslt(true);
        echo $genXsl->XslHtml(AO_Reponse::xslPopupFourAO, $array);
    }
}

// fin de la classe AO
