<?php

class AO_ecran extends XmlWsdlOutil
{

    private $login;

    private $mapDatabase;

    private $contexteSaisie;

    private $etatXml;

    const FOLDER_ENTETE = 'AODetailGen';

    const FOLDER_LIGNE = 'AODetailLigne';

    const FOLDER_FOURNISSEUR = 'AODetailFournisseur';

    const FOLDER_CLAUSE = 'AOClause';

    const FOLDER_PIECE_JOINTE = 'AOPieceJointe';

    const FOLDER_DOC_RATTACHE = 'AODocRatt';

    const FOLDER_QUESTIONNAIRE = 'AOQuestionnaire';

    const XSL_LIEN_ID_GEN = 'id_lien_ajout_gen_';

    /**
     * Donnée technique permettant d'indiquer le statut de l'AO dans le temps
     * 
     * @var unknown
     */
    private $statutAO = '';

    /**
     * Mode saisie C/M/V
     * 
     * @var unknown
     */
    private $modeSaisie = 'V';

    private $sousElement = '';

    /**
     * Indication de nombre maximum de page par onglet
     * 
     * @var array
     */
    private $listePageOnglet = array();

    /**
     * Gestion des fonctionnalites de recherche
     * 
     * @var array
     */
    private $listePageRecherche = array();

    /**
     * Numero de page courante sur la partie gestion des lignes d'AO
     * 
     * @var integer
     */
    private $noPage = 1;

    const XSL_FILE = 'xsl/ao/ao_fiche.xsl';

    public $OBJ_SESSION = 'OBJ_AO';

    const ID_TITRE = 'id_titre_ecran';

    /**
     * Lors de la destruction de la class il faut serialiser les class de paginations.
     */
    public function __sleep()
    {
        // Serialisation du systeme de gestion de pages
        $save = array();
        foreach ($this->listePageOnglet as $index => $class)
            $save[$index] = serializeSecure($class);
        
        $this->listePageOnglet = $save;
        
        // Serialisation du systeme de gestion de element de recherche
        $save = array();
        foreach ($this->listePageRecherche as $index => $class)
            $save[$index] = serializeSecure($class);
        
        $this->listePageRecherche = $save;
        
        return array_keys(get_object_vars($this));
    }

    /**
     * Lors de la restauration de la class il faut restaurer les classes de pagination
     */
    public function __wakeup()
    {
        $this->restoreClassSession();
    }

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

    public function __construct()
    {
        /**
         * Il faut imperativement faire un appel a vide pour avoir la structure et là stocker
         */
        $this->setLogin($_SESSION['Session_Login']);
        $this->contexteSaisie = new ContexteEcran();
        
        if ($retour = AO::CallWsdlGetAO($this->login, 0)) {
            if (array_key_exists('Statut', $retour)) {
                if ($retour['Statut']['#text'] == 'E') {
                    $this->setObjectOk(false);
                    $this->setErrorMessage($retour['MsgErreur']['#text']);
                    return false;
                }
            }
        } else {
            $this->setObjectOk(false);
            $this->setErrorMessage('Anomalie appel du WebService');
            return false;
        }
        $this->mapDatabase = & $retour;


        return $this->initalize();
    }

    public function setSousElement($sousElement)
    {
        $this->sousElement = $sousElement;
    }

    public function getSousElement()
    {
        return $this->sousElement;
    }

    public function rechargePage($onglet)
    {
        $retour = AO::CallWsdlGetAO($this->login, $this->getProperties('NO_AO'), $this->sousElement, $this->noPage);
        
        print_r($retour);
    }

    public function initalize()
    {
        parent::initalize();
        
        if ($retour = AO::CallWsdlGetAO($this->login, $this->getProperties('NO_AO'), $this->sousElement, $this->noPage)) {
            if (array_key_exists('Statut', $retour)) {
                if ($retour['Statut']['#text'] == 'E') {
                    $this->setObjectOk(false);
                    $this->setErrorMessage($retour['MsgErreur']['#text']);
                    return false;
                }
            }
            
            if ($this->sousElement == '' || $this->sousElement == 'LIGNES') {
                $nomFolder = 'ListLignes';
                $cl = new XmlPageOnglet();
                $cl->setAction("AO_fiche.php?action=changePage&onglet=" . AO_ecran::FOLDER_LIGNE);
                $cl->setMaxiPage($retour['AO'][$nomFolder]['!NbdePagesLignes']);
                $cl->ajoutePage(1);
                $cl->setPageCourante(1);
                $this->listePageOnglet[$nomFolder] = $cl;
                
                $clRecherche = new XmlPageRecherche();
                $clRecherche->setZoneRechercheName('txt_rech_lignes');
                $clRecherche->setAction('AO_fiche.php?action=recherche&onglet=AODetailLigne');
                $clRecherche->setActionNext('AO_fiche.php?action=rechercheSuivant&onglet=AODetailLigne');
                
                $this->listePageRecherche[$nomFolder] = $clRecherche;
            }
        } else {
            $this->setObjectOk(false);
            $this->setErrorMessage(trad('Anomalie appel du WebService'));
            return false;
        }
        
        /*** SPEC 4241 Caractéristiques complémentaires ***/
        /*
        $NO_AO = $this->getNumAo();
        if($NO_AO && isset($retour['AO']['ListLignes']['Ligne']))
        {
            // Réinitialisation des CC avec DOC_TYPE='AOT'
            SqlCaracteristiquesCompl::rqSupCCDoc('AOT', null, null, $_SESSION['id_user'])->ExecuteSql();   
            $tbl_source = ['DOC_TYPE'=> 'AO', 'DOC_NUM' => $NO_AO, 'ID_USER_BASKET' => 0];
            $tbl_cible = ['DOC_TYPE'=> 'AOT', 'ID_USER_BASKET' => $_SESSION['id_user']];
            SqlCaracteristiquesCompl::rqDuplicateAllCCLigne($tbl_source, $tbl_cible)->ExecuteSql();
            // Recherche des CC par ligne avec DOC_TYPE='AOT'
            if(isset($retour['AO']['ListLignes']['Ligne']['NO_PO'])){
                $NO_PO = $$retour['AO']['ListLignes']['Ligne']['NO_PO']['#text'];
                $listeCCLigne = CaracteristiquesCompl::getListeCCDoc('AOT', $NO_AO, $NO_PO, $_SESSION['id_user']);
                $existCC = isset($listeCCLigne) && count($listeCCLigne)>0;
                $retour['AO']['ListLignes']['Ligne']['existCC']['#text'] = $existCC;
                $retour['AO']['ListLignes']['Ligne']['existCC']['!onclick'] = "window.open('popup_caractCompl.php?action=afficherCcCs&page=AO&DOC_NUM=$NO_AO&doc_line_num=$NO_PO&pg_src=AO_fiche','popup_caractCompl','width=870, height=475'); return false;";
            }else{
                foreach($retour['AO']['ListLignes']['Ligne'] as &$ligne){
                    $NO_PO = $ligne['NO_PO']['#text'];
                    $listeCCLigne = CaracteristiquesCompl::getListeCCDoc('AOT', $NO_AO, $NO_PO, $_SESSION['id_user']);
                    $existCC = isset($listeCCLigne) && count($listeCCLigne)>0;
                    $ligne['existCC']['#text'] = $existCC;
                    $ligne['existCC']['!onclick'] = "window.open('popup_caractCompl.php?action=afficherCcCs&page=AO&DOC_NUM=$NO_AO&doc_line_num=$NO_PO&pg_src=AO_fiche','popup_caractCompl','width=870, height=475'); return false;";
                }
            }
        }
        */
        

        $this->wsdlObject = & $retour['AO'];
        // exit;
        $this->getContexteEcran()->setFrameName('frm_detail');
        $this->setFormulaire('frm_detail');
        $this->setObjectOk(true);
        return true;
    }

    public function saisieQteGenerique($index, & $article)
    {
        if ($node = $this->isArticleGeneriqueExiste($article)) {
            $champEnCours = array(
                '!texte' => $article['COD_ART'],
                '!onclick' => "CallUrl('recherche_article.php?action=ajouterArticleGen&index={$index}&code_item=" . urlencode($article['COD_ART']) . "');",
                '!texte_ajout' => trad('Re Ajouter à l\'AO'),
                '!id' => AO_ecran::XSL_LIEN_ID_GEN . $index
            );
        } else {
            $champEnCours = array(
                '!texte' => $article['COD_ART'],
                '!onclick' => "CallUrl('recherche_article.php?action=ajouterArticleGen&index={$index}&code_item=" . urlencode($article['COD_ART']) . "');",
                '!texte_ajout' => trad('Ajouter à l\'AO'),
                '!id' => AO_ecran::XSL_LIEN_ID_GEN . $index
            );
        }
        
        return $champEnCours;
    }

    public function getZoneLibellAutomatique($object)
    {
        switch ($object) {
            case 'ARTICLES':
                return false;
            default:
                return parent::getZoneLibellAutomatique($object);
        }
    }

    /**
     * Donne un xml qui sera intégré pour l'affichage dans la recherche article
     *
     * @param unknown $article
     */
    public function saisieQteCatalogue($index, & $article)
    {
        if ($node = $this->isArticleCatalogueExiste($article)) {
            $qte = StdXmlWsdl::getValueZoneInterne($node['QTE']);
            if ($qte == '')
                $qte = 0;
            $champEnCours = array(
                '!texte' => $qte,
                '!onblur' => "var maClasse = this.className;TraiteUrlAsyncNoWait('recherche_article.php?action=ajouterArticle" . "&ID_CAT={$article['ID_CAT']}" . "&serialization={$article['SERIALIZATION']}" . '&databaseid=' . $article['DATABASEID'] . "&num_ligne={$index}" . "',this,'qte',maClasse);",
                '!onfocus' => 'SelObj(this);',
                '!id' => 'qte_' . $index,
                '!idDiv' => 'div_qte_' . $index,
                '!name' => 'qte_' . $index
            );
            $champEnCours['!plus'] = " if(setValueForElement('{$champEnCours['!id']}', Number(parseFloat(getValueElementById('{$champEnCours['!id']}'))+1).toFixed(3))){document.getElementById('{$champEnCours['!id']}').focus(); document.getElementById('{$champEnCours['!id']}').blur();}";
            $champEnCours['!moins'] = " if(Number(parseFloat(getValueElementById('{$champEnCours['!id']}'))-1).toFixed(3) < 1){setValueForElement('{$champEnCours['!id']}','1.000');} ; if(setValueForElement('{$champEnCours['!id']}', Number(parseFloat(getValueElementById('{$champEnCours['!id']}'))-1).toFixed(3))){document.getElementById('{$champEnCours['!id']}').focus(); document.getElementById('{$champEnCours['!id']}').blur();}";
        } else {
            $champEnCours = array(
                '!texte' => trad('Ajouter'),
                '!onclick' => "var maClasse = this.className;TraiteUrlAsyncNoWait('recherche_article.php?action=ajouterArticle" . "&ID_CAT={$article['ID_CAT']}" . "&serialization={$article['SERIALIZATION']}" . '&databaseid=' . $article['DATABASEID'] . "&num_ligne={$index}" . "',this,'qte',maClasse);",
                '!id' => 'qte_' . $index,
                '!idDiv' => 'div_qte_' . $index,
                '!name' => 'qte_' . $index,
                '!value' => 'add',
                '!type' => 'btnAction'
            );
        }
        return $champEnCours;
    }

    public function &getPrixReference(& $ligneVierge)
    {
        $refFab = StdXmlWsdl::getValueZoneInterne($ligneVierge['REF_FAB']);
        $codFab = StdXmlWsdl::getValueZoneInterne($ligneVierge['COD_FAB']);
        $codeArt = StdXmlWsdl::getValueZoneInterne($ligneVierge['CODE_ART']);
        $codeStrGrp = StdXmlWsdl::getValueZoneInterne($this->wsdlObject['CODE_STE']);
        $prixRef = StdXmlWsdl::getValueZoneInterne($ligneVierge['PRIX_REF']);
        if ($prixRef != '')
            $prixRef = 0;
        
        /* AO sur une société */
        switch (StdXmlWsdl::getValueZoneInterne($this->wsdlObject['TYPE_SOC_GS'])) {
            case 'S':
                
                if ($refFab != '' && $codFab != '') {
                    $sql = 'select CA_LIGNE.PU * ( 1 - CA_LIGNE.REMISE / 100 ) PRIX_REF from CA_LIGNE with (nolock), CA_ENTET with (nolock) ' . 'where	CA_ENTET.NO_CDE = CA_LIGNE.NO_CDE  ' . 'and		CA_ENTET.EVE_IMP <> 0  ' . 'and		CA_LIGNE.COD_FAB = \'' . ReplaceSqlPointeur($codFab) . '\' ' . 'and		CA_LIGNE.REF_FAB = \'' . ReplaceSqlPointeur($refFab) . '\' ' . 'and		CA_LIGNE.CODE_STE = \'' . ReplaceSqlPointeur($codeStrGrp) . '\' ' . 'order by CA_ENTET.DTE_PERIO DESC ';
                    if ($result = (new RequeteSQL($sql, DB_OXASQLDB))->Trouve1()) {
                        $prixRef = $result['PRIX_REF'];
                        break;
                    }
                }
                $sql = 'select TOP 1 CA_LIGNE.PU * ( 1 - CA_LIGNE.REMISE/100 ) PRIX_REF from CA_LIGNE with (nolock), CA_ENTET with (nolock) ' . 'where CA_ENTET.NO_CDE = CA_LIGNE.NO_CDE ' . 'and	  CA_ENTET.EVE_IMP <> 0 ' . 'and   CA_LIGNE.CODE_ART = \'' . ReplaceSqlPointeur($codeArt) . '\' ' . 'and   CA_LIGNE.CODE_STE = \'' . ReplaceSqlPointeur($codeStrGrp) . '\' ';
                if ($result = (new RequeteSQL($sql, DB_OXASQLDB))->Trouve1())
                    $prixRef = $result['PRIX_REF'];
                
                /**
                 * Notion avec code fabricant ou reference fabricant :
                 * select l.PU*(1-l.REMISE/100) from CA_LIGNE l, CA_ENTET e where e.NO_CDE=l.NO_CDE and e.EVE_IMP<>0 and l.COD_FAB='<code du fabricant>' and l.REF_FAB='<réf fabricant>' and l.CODE_STE='<code de la sté>'
                 * order by e.DTE_PERIO DESC
                 */
                break;
            case 'G':
                if ($refFab != '' && $codFab != '') {
                    $sql = 'select TOP 1 CA_LIGNE.PU * ( 1 - CA_LIGNE.REMISE / 100 ) PRIX_REF from CA_LIGNE with (nolock) , CA_ENTET with (nolock) ,SOCIETE with (nolock) ' . 'where	CA_ENTET.NO_CDE = CA_LIGNE.NO_CDE  ' . 'and		CA_ENTET.EVE_IMP<> 0  ' . 'and		CA_LIGNE.COD_FAB = \'' . ReplaceSqlPointeur($codFab) . '\' ' . 'and		CA_LIGNE.REF_FAB = \'' . ReplaceSqlPointeur($refFab) . '\' ' . 'and		SOCIETE.CODE_STE = CA_LIGNE.CODE_STE  ' . 'and		SOCIETE.GROUPE = \'' . ReplaceSqlPointeur($codeStrGrp) . '\' ' . 'order by CA_ENTET.DTE_PERIO DESC ';
                    if ($result = (new RequeteSQL($sql, DB_OXASQLDB))->Trouve1()) {
                        $prixRef = $result['PRIX_REF'];
                        break;
                    }
                }
                $sql = 'select TOP 1 CA_LIGNE.PU * (1 - CA_LIGNE.REMISE/100) PRIX_REF from CA_LIGNE with (nolock) ,CA_ENTET with (nolock) , SOCIETE with (nolock) ' . 'where	CA_ENTET.NO_CDE = CA_LIGNE.NO_CDE  ' . 'and		CA_ENTET.EVE_IMP <> 0  ' . 'and		CA_LIGNE.CODE_ART = \'' . ReplaceSqlPointeur($codeArt) . '\' ' . 'and		SOCIETE.CODE_STE  = CA_LIGNE.CODE_STE  ' . 'and		SOCIETE.GROUPE    = \'' . ReplaceSqlPointeur($codeStrGrp) . '\' ';
                'order by CA_ENTET.DTE_PERIO DESC ';
                if ($result = (new RequeteSQL($sql, DB_OXASQLDB))->Trouve1())
                    $prixRef = $result['PRIX_REF'];
                break;
        }
        return $prixRef;
    }

    public function ajouterArticleGen(& $article_trouve)
    {
        $ligneVierge = $this->mapDatabase['AO']['ListLignes']['Ligne']; // Copie IMPERATIVE
        
        StdXmlWsdl::setValueXml($ligneVierge, $article_trouve['COD_ART'], 'CODE_ART');
        StdXmlWsdl::setValueXml($ligneVierge, $article_trouve['DES_ART'], 'DES');
        StdXmlWsdl::setValueXml($ligneVierge, $article_trouve['DES_COMP'], 'DCOMP');
        StdXmlWsdl::setValueXml($ligneVierge, 0, 'QTE');
        StdXmlWsdl::setValueXml($ligneVierge, $article_trouve['COD_UNIT'], 'UNITE');
        StdXmlWsdl::setValueXml($ligneVierge, $article_trouve['COD_SFAM'], 'SSFAMILLE');
        
        StdXmlWsdl::setValueXml($ligneVierge, $this->getPrixReference($ligneVierge), 'PRIX_REF');

        /*** SPEC 4241 Caractéristiques complémentaires : initialisation CC : recherche de la liste des CC ***/
        /*
        $NO_AO = $this->getNumAo();
        $listeCCLigne = CaracteristiquesCompl::getListeCCInit($article_trouve['SSFAM'], '', $article_trouve['COD_ART']);
        */
        if (! is_array($this->wsdlObject['ListLignes'])) {
            $this->wsdlObject['ListLignes']['Ligne'] = $ligneVierge; // NE PAS METTRE DE REFERENCE
            $this->wsdlObject['ListLignes']['Ligne']['!Etat'] = 'A';
            
            // SPEC 4241 : insertion des CC dans CC_LDOC        
            /*
            $this->wsdlObject['ListLignes']['Ligne']['NO_PO']['#text'] = $NO_PO = 1;
            $SqlListe = new PileSql(DB_OXAPROCDB);
            CaracteristiquesCompl::InsertListeCC($SqlListe, $listeCCLigne, 'AO', $NO_AO, $NO_PO, $_SESSION['id_user']);
            $SqlListe->Commit();
            $existCC = isset($listeCCLigne) && count($listeCCLigne)>0;
            $this->wsdlObject['ListLignes']['Ligne']['existCC']['#text'] = $existCC;
            $this->wsdlObject['ListLignes']['Ligne']['existCC']['!onclick'] = "window.open('popup_caractCompl.php?action=afficherCcCs&page=AO&DOC_NUM=$NO_AO&doc_line_num=$NO_PO&pg_src=AO_fiche','popup_caractCompl','width=870, height=475'); return false;";
            */

            $ligneRef = & $this->wsdlObject['ListLignes']['Ligne'];
        } else if (array_key_exists('Ligne', $this->wsdlObject['ListLignes'])) {
            if (! array_key_exists(0, $this->wsdlObject['ListLignes']['Ligne'])) {
                $pointeur = $this->wsdlObject['ListLignes']['Ligne'];
                $this->wsdlObject['ListLignes']['Ligne'] = null;
                $this->wsdlObject['ListLignes']['Ligne'][] = $pointeur;
            }
            
            $this->wsdlObject['ListLignes']['Ligne'][] = $ligneVierge; // NE PAS METTRE DE REFERENCE
            $indice = count($this->wsdlObject['ListLignes']['Ligne']);

            // SPEC 4241 : insertion des CC dans CC_LDOC
            /*
            $this->wsdlObject['ListLignes']['Ligne'][$indice - 1]['NO_PO']['#text'] = $NO_PO = $this->wsdlObject['ListLignes']['Ligne'][$indice - 2]['NO_PO']['#text'] + 1;
            $SqlListe = new PileSql(DB_OXAPROCDB);
            CaracteristiquesCompl::InsertListeCC($SqlListe, $listeCCLigne, 'AO', $NO_AO, $NO_PO, $_SESSION['id_user']);
            $SqlListe->Commit();
            $existCC = isset($listeCCLigne) && count($listeCCLigne)>0;
            $this->wsdlObject['ListLignes']['Ligne'][$indice - 1]['existCC']['#text'] = $existCC;
            $this->wsdlObject['ListLignes']['Ligne'][$indice - 1]['existCC']['!onclick'] = "window.open('popup_caractCompl.php?action=afficherCcCs&page=AO&DOC_NUM=$NO_AO&doc_line_num=$NO_PO&pg_src=AO_fiche','popup_caractCompl','width=870, height=475'); return false;";
            */

            $ligneRef = & $this->wsdlObject['ListLignes']['Ligne'][$indice - 1];
            $ligneRef['!Etat'] = 'A';            
        } else {
            $this->wsdlObject['ListLignes']['Ligne'][] = $ligneVierge; // NE PAS METTRE DE REFERENCE
            $indice = count($this->wsdlObject['ListLignes']['Ligne']);            

            // SPEC 4241 : insertion des CC dans CC_LDOC
            /*
            $this->wsdlObject['ListLignes']['Ligne'][$indice - 1]['NO_PO']['#text'] = $NO_PO = $this->wsdlObject['ListLignes']['Ligne'][$indice - 2]['NO_PO']['#text'] + 1;
            $SqlListe = new PileSql(DB_OXAPROCDB);
            CaracteristiquesCompl::InsertListeCC($SqlListe, $listeCCLigne, 'AO', $NO_AO, $NO_PO, $_SESSION['id_user']);
            $SqlListe->Commit();
            $existCC = isset($listeCCLigne) && count($listeCCLigne)>0;
            $this->wsdlObject['ListLignes']['Ligne'][$indice - 1]['existCC']['#text'] = $existCC;
            $this->wsdlObject['ListLignes']['Ligne'][$indice - 1]['existCC']['!onclick'] = "window.open('popup_caractCompl.php?action=afficherCcCs&page=AO&DOC_NUM=$NO_AO&doc_line_num=$NO_PO&pg_src=AO_fiche','popup_caractCompl','width=870, height=475'); return false;";
            */

            $ligneRef = & $this->wsdlObject['ListLignes']['Ligne'][$indice - 1];
            $ligneRef['!Etat'] = 'A';
        }
        
        $ligneRef['!_PROVENANCE'] = $article_trouve['PROVENANCE'];
        $ligneRef['!_SERIALIZATION'] = $article_trouve['SERIALIZATION'];
        $ligneRef['!_DATABASEID'] = $article_trouve['DATABASEID'];
        
        if ($this->wsdlSave()) {
            $this->setMode(AO_ecran::FOLDER_LIGNE);
            if ($ligneRef['!Etat'] == 'S') {
                $indiceOnglet = 0;
                foreach ($this->wsdlObject['ListLignes'] as $index => & $record)
                    if ($index == 'Ligne') { // INTERDICTION ABSOLUE DE METTRE des affectations direct sur pointeur sinon perte de certain niveau
                        if (array_key_exists(0, $record))
                            $ptr[$indiceOnglet] = & $record;
                        else
                            $ptr[$indiceOnglet][0] = & $record;
                        
                        foreach ($ptr[$indiceOnglet] as $idx => & $ligne)
                            if ($ligne === $ligneRef) {
                                unset($ptr[$indiceOnglet][$idx]);
                                break;
                            }
                    }
            } else
                $ligneRef['!Etat'] = '';
            
            $this->saveSession($this->OBJ_SESSION);
            return true;
        }
        return false;
    }

    public function ajouterArticleCatalogue($qte_saisie, & $article_trouve)
    {
        $ligneVierge = $this->mapDatabase['AO']['ListLignes']['Ligne']; // Copie IMPERATIVE
        
        /**
         * CODE_ART COD_ART
         * DES DES_ART
         * DCOMP DES_COMP
         * QTE 0
         * UNITE COD_UNIT
         * PRIX_REF PX_ART
         * SSFAMILLE COD_SFAM
         * COD_FAB COD_FAB
         * COD_GAM COD_GAM
         * REF_FAB REF_FAB
         */
        if ($qte_saisie == 'add') {
            StdXmlWsdl::setValueXml($ligneVierge, $article_trouve['COD_ART'], 'CODE_ART');
            StdXmlWsdl::setValueXml($ligneVierge, $article_trouve['DES_ART'], 'DES');
            StdXmlWsdl::setValueXml($ligneVierge, $article_trouve['DES_COMP'], 'DCOMP');
            StdXmlWsdl::setValueXml($ligneVierge, 0, 'QTE');
            StdXmlWsdl::setValueXml($ligneVierge, $article_trouve['COD_UNIT'], 'UNITE');
            StdXmlWsdl::setValueXml($ligneVierge, $article_trouve['PX_ART'], 'PRIX_REF');
            StdXmlWsdl::setValueXml($ligneVierge, $article_trouve['COD_SFAM'], 'SSFAMILLE');
            StdXmlWsdl::setValueXml($ligneVierge, $article_trouve['COD_FAB'], 'COD_FAB');
            StdXmlWsdl::setValueXml($ligneVierge, $article_trouve['COD_GAM'], 'COD_GAM');
            StdXmlWsdl::setValueXml($ligneVierge, $article_trouve['REF_FAB'], 'REF_FAB');
            
            /*** SPEC 4241 Caractéristiques complémentaires : initialisation CC : recherche de la liste des CC ***/
            /*
            $NO_AO = $this->getNumAo();
            $listeCCLigne = CaracteristiquesCompl::getListeCCInit($article_trouve['SSFAM'], '', $article_trouve['COD_ART']);
            */
            if (! is_array($this->wsdlObject['ListLignes'])) {
                $this->wsdlObject['ListLignes']['Ligne'] = $ligneVierge; // NE PAS METTRE DE REFERENCE
                $this->wsdlObject['ListLignes']['Ligne']['!Etat'] = 'A';
                
                // SPEC 4241 : insertion des CC dans CC_LDOC      
                /*
                $this->wsdlObject['ListLignes']['Ligne']['NO_PO']['#text'] = $NO_PO = 1;
                $SqlListe = new PileSql(DB_OXAPROCDB);
                CaracteristiquesCompl::InsertListeCC($SqlListe, $listeCCLigne, 'AO', $NO_AO, $NO_PO, $_SESSION['id_user']);
                $SqlListe->Commit();
                $existCC = isset($listeCCLigne) && count($listeCCLigne)>0;
                $this->wsdlObject['ListLignes']['Ligne']['existCC']['#text'] = $existCC;
                $this->wsdlObject['ListLignes']['Ligne']['existCC']['!onclick'] = "window.open('popup_caractCompl.php?action=afficherCcCs&page=AO&DOC_NUM=$NO_AO&doc_line_num=$NO_PO&pg_src=AO_fiche','popup_caractCompl','width=870, height=475'); return false;";
                */

                $ligneRef = & $this->wsdlObject['ListLignes']['Ligne'];
            } else if (array_key_exists('Ligne', $this->wsdlObject['ListLignes'])) {
                if (! array_key_exists(0, $this->wsdlObject['ListLignes']['Ligne'])) {
                    $pointeur = $this->wsdlObject['ListLignes']['Ligne'];
                    $this->wsdlObject['ListLignes']['Ligne'] = null;
                    $this->wsdlObject['ListLignes']['Ligne'][] = $pointeur;
                }
                
                $this->wsdlObject['ListLignes']['Ligne'][] = $ligneVierge; // NE PAS METTRE DE REFERENCE
                $indice = count($this->wsdlObject['ListLignes']['Ligne']);

                // SPEC 4241 : insertion des CC dans CC_LDOC
                /*
                $this->wsdlObject['ListLignes']['Ligne'][$indice - 1]['NO_PO']['#text'] = $NO_PO_TEMP = $this->wsdlObject['ListLignes']['Ligne'][$indice - 2]['NO_PO']['#text'] + 1;
                $SqlListe = new PileSql(DB_OXAPROCDB);
                CaracteristiquesCompl::InsertListeCC($SqlListe, $listeCCLigne, 'AO', $NO_AO, $NO_PO_TEMP, $_SESSION['id_user']);
                $SqlListe->Commit();
                $existCC = isset($listeCCLigne) && count($listeCCLigne)>0;
                $this->wsdlObject['ListLignes']['Ligne'][$indice - 1]['existCC']['#text'] = $existCC;
                $this->wsdlObject['ListLignes']['Ligne'][$indice - 1]['existCC']['!onclick'] = "window.open('popup_caractCompl.php?action=afficherCcCs&page=AO&DOC_NUM=$NO_AO&doc_line_num=$NO_PO_TEMP&pg_src=AO_fiche','popup_caractCompl','width=870, height=475'); return false;";
                */

                $ligneRef = & $this->wsdlObject['ListLignes']['Ligne'][$indice - 1];
                $ligneRef['!Etat'] = 'A';
            } else {
                $this->wsdlObject['ListLignes']['Ligne'][] = $ligneVierge; // NE PAS METTRE DE REFERENCE
                $indice = count($this->wsdlObject['ListLignes']['Ligne']); 

                // SPEC 4241 : insertion des CC dans CC_LDOC 
                /*
                $this->wsdlObject['ListLignes']['Ligne'][$indice - 1]['NO_PO']['#text'] = $NO_PO_TEMP = $this->wsdlObject['ListLignes']['Ligne'][$indice - 2]['NO_PO']['#text'] + 1;
                $SqlListe = new PileSql(DB_OXAPROCDB);
                CaracteristiquesCompl::InsertListeCC($SqlListe, $listeCCLigne, 'AO', $NO_AO, $NO_PO_TEMP, $_SESSION['id_user']);
                $SqlListe->Commit();
                $existCC = isset($listeCCLigne) && count($listeCCLigne)>0;
                $this->wsdlObject['ListLignes']['Ligne'][$indice - 1]['existCC']['#text'] = $existCC;
                $this->wsdlObject['ListLignes']['Ligne'][$indice - 1]['existCC']['!onclick'] = "window.open('popup_caractCompl.php?action=afficherCcCs&page=AO&DOC_NUM=$NO_AO&doc_line_num=$NO_PO_TEMP&pg_src=AO_fiche','popup_caractCompl','width=870, height=475'); return false;";
                */

                $ligneRef = & $this->wsdlObject['ListLignes']['Ligne'][$indice - 1];
                $ligneRef['!Etat'] = 'A';
            }
        } else if ($ligneRef = & $this->isArticleCatalogueExiste($article_trouve)) {
            $qte = StdXmlWsdl::getValueZoneInterne($ligneRef['QTE']);
            if ($qte == 0 && $qte_saisie == 0) {
                $ligneRef['!Etat'] = 'S'; 
            } else {
                StdXmlWsdl::setValueXml($ligneRef, $qte_saisie, 'QTE');
                $ligneRef['!Etat'] = 'M';
            }
        }
        
        /**
         * Test si l'article est déjà inclus
         */
        $ligneRef['!_PROVENANCE'] = $article_trouve['PROVENANCE'];
        $ligneRef['!_NO_SERIALIZATION'] = $article_trouve['NO_SERIALIZATION'];
        $ligneRef['!_DATABASEID'] = $article_trouve['DATABASEID'];
        
        if ($this->wsdlSave()) {
            $this->setMode(AO_ecran::FOLDER_LIGNE);
            if ($ligneRef['!Etat'] == 'S') {
                $indiceOnglet = 0;
                foreach ($this->wsdlObject['ListLignes'] as $index => & $record)
                    if ($index == 'Ligne') { // INTERDICTION ABSOLUE DE METTRE des affectations direct sur pointeur sinon perte de certain niveau
                        if (isset($record[0]))
                            $ptr[$indiceOnglet] = & $record;
                        else
                            $ptr[$indiceOnglet][0] = & $record;
                        
                        foreach ($ptr[$indiceOnglet] as $idx => & $ligne)
                            if ($ligne === $ligneRef) {
                                unset($ptr[$indiceOnglet][$idx]);
                                break;
                            }
                    }
            } else
                $ligneRef['!Etat'] = '';
            
            $this->saveSession($this->OBJ_SESSION);
            return true;
        }
        return false;
    }

    public function &isArticleGeneriqueExiste(& $article_trouve)
    {
        $indiceOnglet = 0;
        foreach ($this->wsdlObject['ListLignes'] as $index => & $record) {
            if ($index == 'Ligne') { // INTERDICTION ABSOLUE DE METTRE des affectations direct sur pointeur sinon perte de certain niveau
                if (isset($record[0]))
                    $ptr[$indiceOnglet] = & $record;
                else
                    $ptr[$indiceOnglet][0] = & $record;
                
                if (is_array($ptr[$indiceOnglet]) && is_array($article_trouve))
                    foreach ($ptr[$indiceOnglet] as & $ligne)
                        if (is_array($ligne))
                            if (array_key_exists('!_PROVENANCE', $ligne) && $ligne['!_PROVENANCE'] == $article_trouve['PROVENANCE'] && array_key_exists('!_SERIALIZATION', $ligne) && $ligne['!_SERIALIZATION'] == $article_trouve['SERIALIZATION'])
                                return $ligne;
            }
        }
        
        $ligne = null;
        return $ligne;
    }

    public function &isArticleCatalogueExiste(& $article_trouve)
    {
        $indiceOnglet = 0;
        foreach ($this->wsdlObject['ListLignes'] as $index => & $record) {
            if ($index == 'Ligne') { // INTERDICTION ABSOLUE DE METTRE des affectations direct sur pointeur sinon perte de certain niveau array_key_exists(0, $record)
                if (isset($record[0]))
                    $ptr[$indiceOnglet] = & $record;
                else
                    $ptr[$indiceOnglet][0] = & $record;
                
                if (is_array($ptr[$indiceOnglet]) && is_array($article_trouve))
                    foreach ($ptr[$indiceOnglet] as & $ligne)
                        if (is_array($ligne))
                            if (array_key_exists('!_PROVENANCE', $ligne) && $ligne['!_PROVENANCE'] == $article_trouve['PROVENANCE'] && array_key_exists('!_NO_SERIALIZATION', $ligne) && $ligne['!_NO_SERIALIZATION'] == $article_trouve['NO_SERIALIZATION'])
                                return $ligne;
            }
        }
        
        $ligne = null;
        return $ligne;
    }

    public function setLogin($login)
    {
        $this->login = $login;
    }

    public function getLogin()
    {
        return $this->login;
    }

    public function setNumAo($num_AO)
    {
        $this->setProperties('NO_AO', $num_AO);
    }

    public function getNumAo()
    {
        return $this->getProperties('NO_AO');
    }

    public function initCreationAo()
    {
        $this->setNumAo(0);
        $this->initalize();
        // Par défaut le type sera à société
        StdXmlWsdl::setValueXml($this->wsdlObject, 'S', 'TYPE_SOC_GS');
        // Par défault la société sera celle de l'utilisateur connecté
        StdXmlWsdl::setValueXml($this->wsdlObject, $_SESSION['Session_SocUsr'], 'CODE_STE');
        
        // Zone acheteur si type acheteur alors login de session sinon rien
        $this->changeValeurData($this->wsdlObject, 'CODE_STE');
        
        StdXmlWsdl::setValueXml($this->wsdlObject, '00000000', 'DTE_VALID_AO');
        StdXmlWsdl::setValueXml($this->wsdlObject, '00000000', 'VALCHXFOU');
        
        $this->setModeCreation(true);
        $this->setModeMiseAjour(true);
        
        return true;
    }

    /**
     * Fonction permettant d'indiquer que l'on passe en création
     * 
     * @see XmlWsdlOutil::nouvelEnregistrement()
     */
    public function nouvelEnregistrement()
    {
        switch ($this->getMode()) {
            case AO_ecran::FOLDER_ENTETE:

                if ($this->initCreationAo())
                    $obj_xml = $this->refresh(AO_ecran::XSL_FILE);
                
                return true;
                break;
            case AO_ecran::FOLDER_LIGNE:
                if (! array_key_exists('ListLignes', $this->wsdlObject))
                    $this->wsdlObject['ListLignes'] = null;
                
                $nomFolder = 'ListLignes';
                $classPage = $this->listePageOnglet[$nomFolder];
                $this->changePage($this->getMode(), $classPage->getMaxiPage());
                
                $reference = $this->ajouteLigneWsdl($this->mapDatabase['AO']['ListLignes']['Ligne'], true, $classPage);

                $this->setModeCreation(true);
                $this->setModeMiseAjour(true);
                
                $obj_xml = $this->refresh(AO_ecran::XSL_FILE);
                
                break;
            case AO_ecran::FOLDER_FOURNISSEUR:
                if (! array_key_exists('ListFournisseurs', $this->wsdlObject))
                    $this->wsdlObject['ListFournisseurs'] = null;
                
                if (array_key_exists('CODE_FOU', $this->wsdlObject['ListFournisseurs']['Fournisseur']) && trim(StdXmlWsdl::getValueZoneInterne($this->wsdlObject['ListFournisseurs']['Fournisseur']['CODE_FOU'])) == '' && (! array_key_exists('!Etat', $this->wsdlObject['ListFournisseurs']['Fournisseur']))) {
                    
                    $reference = & $this->wsdlObject['ListFournisseurs']['Fournisseur'];
                    $reference['!Etat'] = 'A';
                } else {
                    if (! is_array($this->wsdlObject['ListFournisseurs'])) {
                        $this->wsdlObject['ListFournisseurs']['Fournisseur'] = $this->mapDatabase['AO']['ListFournisseurs']['Fournisseur']; // NE PAS METTRE DE REFERENCE
                        $this->wsdlObject['ListFournisseurs']['Fournisseur']['!Etat'] = 'A';
                        
                        $reference = & $this->wsdlObject['ListFournisseurs']['Fournisseur'];
                    } else if (array_key_exists('Fournisseur', $this->wsdlObject['ListFournisseurs'])) {
                        if (! array_key_exists(0, $this->wsdlObject['ListFournisseurs']['Fournisseur'])) {
                            $pointeur = $this->wsdlObject['ListFournisseurs']['Fournisseur'];
                            $this->wsdlObject['ListFournisseurs']['Fournisseur'] = null;
                            $this->wsdlObject['ListFournisseurs']['Fournisseur'][] = $pointeur;
                        }
                        $this->wsdlObject['ListFournisseurs']['Fournisseur'][] = $this->mapDatabase['AO']['ListFournisseurs']['Fournisseur']; // NE PAS METTRE DE REFERENCE
                        $indice = count($this->wsdlObject['ListFournisseurs']['Fournisseur']);
                        $this->wsdlObject['ListFournisseurs']['Fournisseur'][$indice - 1]['!Etat'] = 'A';
                        
                        $reference = & $this->wsdlObject['ListFournisseurs']['Fournisseur'][$indice - 1];
                    } else {
                        $this->wsdlObject['ListFournisseurs']['Fournisseur'][] = $this->mapDatabase['AO']['ListFournisseurs']['Fournisseur']; // NE PAS METTRE DE REFERENCE
                        $indice = count($this->wsdlObject['ListFournisseurs']['Fournisseur']);
                        
                        $this->wsdlObject['ListFournisseurs']['Fournisseur'][$indice - 1]['!Etat'] = 'A';
                        
                        $reference = & $this->wsdlObject['ListFournisseurs']['Fournisseur'][$indice - 1];
                    }
                }
                
                $this->setModeCreation(true);
                $this->setModeMiseAjour(true);
                
                $obj_xml = $this->refresh(AO_ecran::XSL_FILE);
                
                Affichage::setFocusForm($this->getFormulaire(), $reference['CODE_FOU']['!nameZone']);
                
                break;
            case AO_ecran::FOLDER_CLAUSE:
                if (! array_key_exists('ListClauses', $this->wsdlObject))
                    $this->wsdlObject['ListClauses'] = null;
                
                if (array_key_exists('NO_ORDRE', $this->wsdlObject['ListClauses']['Clause']) && trim(StdXmlWsdl::getValueZoneInterne($this->wsdlObject['ListClauses']['Clause']['NO_ORDRE'])) == '0' && (! array_key_exists('!Etat', $this->wsdlObject['ListClauses']['Clause']))) {
                    
                    $reference = & $this->wsdlObject['ListClauses']['Clause'];
                    $reference['!Etat'] = 'A';
                } else {
                    if (! is_array($this->wsdlObject['ListClauses'])) {
                        $this->wsdlObject['ListClauses']['Clause'] = $this->mapDatabase['AO']['ListClauses']['Clause']; // NE PAS METTRE DE REFERENCE
                        $this->wsdlObject['ListClauses']['Clause']['!Etat'] = 'A';
                    } else if (array_key_exists('Clause', $this->wsdlObject['ListClauses'])) {
                        if (! array_key_exists(0, $this->wsdlObject['ListClauses']['Clause'])) {
                            $pointeur = $this->wsdlObject['ListClauses']['Clause'];
                            $this->wsdlObject['ListClauses']['Clause'] = null;
                            $this->wsdlObject['ListClauses']['Clause'][] = $pointeur;
                        }
                        $this->wsdlObject['ListClauses']['Clause'][] = $this->mapDatabase['AO']['ListClauses']['Clause']; // NE PAS METTRE DE REFERENCE
                        $indice = count($this->wsdlObject['ListClauses']['Clause']);
                        $this->wsdlObject['ListClauses']['Clause'][$indice - 1]['!Etat'] = 'A';
                    } else {
                        $this->wsdlObject['ListClauses']['Clause'][] = $this->mapDatabase['AO']['ListClauses']['Clause']; // NE PAS METTRE DE REFERENCE
                        $indice = count($this->wsdlObject['ListClauses']['Clause']);
                        $this->wsdlObject['ListClauses']['Clause'][$indice - 1]['!Etat'] = 'A';
                    }
                }
                
                $this->setModeCreation(true);
                $this->setModeMiseAjour(true);
                
                $obj_xml = $this->refresh(AO_ecran::XSL_FILE);
                break;
            case AO_ecran::FOLDER_PIECE_JOINTE:
                $urlRetour = $this->getContexteEcran()->getPrgRetour() . '?action=refresh&onglet=' . $this->getMode();
                
                $largeurFenetre = 495;
                $hauteurFenetre = 315;
                
                $properties = new Properties();
                $properties->setProperties('contexte', 'ajoutDocument');
                $properties->setProperties('typeItem', 'AO_ENTET');
                $properties->setProperties('codeItem', $this->getNumAo());
                $properties->setProperties('urlRetour', $urlRetour);
                
                $properties->saveObjectSession('infoRetourPj');
                
                $url = 'saisie_pj.php?form_parent=frm_saisie_panier&champ=information&MOD=A';
                
                echo "var win_pop = OpenPopup('", $url, "','win_pop_ajout','", $largeurFenetre, "','", $hauteurFenetre, "');";
                exit();
                
                break;
            case AO_ecran::FOLDER_DOC_RATTACHE:
                $urlRetour = $this->getContexteEcran()->getPrgRetour() . '?action=refresh&onglet=' . $this->getMode();
                echo "OpenPopup('suivi_doc.php?action=ajouterDocAtt" . "&urlRet=" . urlencode($urlRetour) . "&contexte=ajoutDocAttGen" . "&typeItem=AO_ENTET" . "&codeItem=" . $this->getNumAo() . '\',\'popup_doc_att\',800,400);';
                
                break;
        }
        return false;
    }

    public function &ajouteLigneWsdl($LigneModele, $new, $classPage)
    {
        $NO_AO = $this->getNumAo();
        $reference = null;
        if (array_key_exists('NO_PO', $this->wsdlObject['ListLignes']['Ligne']) && trim(StdXmlWsdl::getValueZoneInterne($this->wsdlObject['ListLignes']['Ligne']['NO_PO'])) == '' && (! array_key_exists('!Etat', $this->wsdlObject['ListLignes']['Ligne']))) 
        {
            /*** SPEC 4241 Caractéristiques complémentaires : l'icône des CC sera présente mais cachée ***/
            /*
            if($new){
                $NO_PO_TEMP = 1;
                $this->wsdlObject['ListLignes']['Ligne']['NO_PO']['#text'] = $NO_PO_TEMP;
                $this->wsdlObject['ListLignes']['Ligne']['existCC']['#text'] = 0;
                $this->wsdlObject['ListLignes']['Ligne']['existCC']['!onclick'] = "window.open('popup_caractCompl.php?action=afficherCcCs&page=AO&DOC_NUM=$NO_AO&doc_line_num=$NO_PO_TEMP&pg_src=AO_fiche','popup_caractCompl','width=870, height=475'); return false;";
            }
            */
         
            $reference = & $this->wsdlObject['ListLignes']['Ligne'];
            if ($new) {
                $reference['!Etat'] = 'A';
                $reference['!NoPage'] = $classPage->getPageCourante();
            }
        } else {
            if (! is_array($this->wsdlObject['ListLignes'])) {
             
                $this->wsdlObject['ListLignes']['Ligne'] = $LigneModele; // NE PAS METTRE DE REFERENCE
                if ($new) {
                    $this->wsdlObject['ListLignes']['Ligne']['!Etat'] = 'A';
                    $this->wsdlObject['ListLignes']['Ligne']['!NoPage'] = $classPage->getPageCourante();

                    /*** SPEC 4241 Caractéristiques complémentaires : l'icône des CC sera présente mais cachée ***/
                    // POUR INFO : je n'ai pas réussi à entrer dans cette condition
                    /*
                    $NO_PO_TEMP = 1;
                    $this->wsdlObject['ListLignes']['Ligne']['NO_PO']['#text'] = $NO_PO_TEMP;
                    $this->wsdlObject['ListLignes']['Ligne']['existCC']['#text'] = 0;
                    $this->wsdlObject['ListLignes']['Ligne']['existCC']['!onclick'] = "window.open('popup_caractCompl.php?action=afficherCcCs&page=AO&DOC_NUM=$NO_AO&doc_line_num=$NO_PO_TEMP&pg_src=AO_fiche','popup_caractCompl','width=870, height=475'); return false;";
                    */
                }
                
                $reference = & $this->wsdlObject['ListLignes']['Ligne'];
            } 
            else if (array_key_exists('Ligne', $this->wsdlObject['ListLignes'])) 
            {
                if (! array_key_exists(0, $this->wsdlObject['ListLignes']['Ligne'])) 
                {
                    $pointeur = $this->wsdlObject['ListLignes']['Ligne'];
 
                    $this->wsdlObject['ListLignes']['Ligne'] = null;
                    $this->wsdlObject['ListLignes']['Ligne'][] = $pointeur;
                }
                
        
                $this->wsdlObject['ListLignes']['Ligne'][] = $LigneModele; // NE PAS METTRE DE REFERENCE
                $indice = count($this->wsdlObject['ListLignes']['Ligne']);
                if ($new) 
                {
                    $this->wsdlObject['ListLignes']['Ligne'][$indice - 1]['!Etat'] = 'A';
                    $this->wsdlObject['ListLignes']['Ligne'][$indice - 1]['!NoPage'] = $classPage->getPageCourante();

                    /*** SPEC 4241 Caractéristiques complémentaires : l'icône des CC sera présente mais cachée ***/
                    /*
                    $this->wsdlObject['ListLignes']['Ligne'][$indice - 1]['NO_PO']['#text'] = $NO_PO_TEMP = $this->wsdlObject['ListLignes']['Ligne'][$indice - 2]['NO_PO']['#text'] + 1;
                    $this->wsdlObject['ListLignes']['Ligne'][$indice - 1]['existCC']['#text'] = 0;
                    $this->wsdlObject['ListLignes']['Ligne'][$indice - 1]['existCC']['!onclick'] = "window.open('popup_caractCompl.php?action=afficherCcCs&page=AO&DOC_NUM=$NO_AO&doc_line_num=$NO_PO_TEMP&pg_src=AO_fiche','popup_caractCompl','width=870, height=475'); return false;";
                    */
                }
                
                $reference = & $this->wsdlObject['ListLignes']['Ligne'][$indice - 1];
            }
            else 
            {
                $this->wsdlObject['ListLignes']['Ligne'][] = $LigneModele; // NE PAS METTRE DE REFERENCE
                $indice = count($this->wsdlObject['ListLignes']['Ligne']);
                if ($new) {
                    $this->wsdlObject['ListLignes']['Ligne'][$indice - 1]['!Etat'] = 'A';
                    $this->wsdlObject['ListLignes']['Ligne'][$indice - 1]['!NoPage'] = $classPage->getPageCourante();

                    /*** SPEC 4241 Caractéristiques complémentaires : l'icône des CC sera présente mais cachée ***/
                    /*
                    $this->wsdlObject['ListLignes']['Ligne'][$indice - 1]['NO_PO']['#text'] = $NO_PO_TEMP = $this->wsdlObject['ListLignes']['Ligne'][$indice - 2]['NO_PO']['#text'] + 1;
                    $this->wsdlObject['ListLignes']['Ligne'][$indice - 1]['existCC']['#text'] = 0;
                    $this->wsdlObject['ListLignes']['Ligne'][$indice - 1]['existCC']['!onclick'] = "window.open('popup_caractCompl.php?action=afficherCcCs&page=AO&DOC_NUM=$NO_AO&doc_line_num=$NO_PO_TEMP&pg_src=AO_fiche','popup_caractCompl','width=870, height=475'); return false;";
                    */
                }
                
                $reference = & $this->wsdlObject['ListLignes']['Ligne'][$indice - 1];
            }
        }
        
        return $reference;
    }

    /**
     * Fonction de modification des enregistrements
     * 
     * @return boolean
     */
    public function modifieEnregistrement()
    {
        switch ($this->getMode()) {
            case AO_ecran::FOLDER_ENTETE:
                $this->initalize();
                // StdXmlWsdl::setValueXml($this->wsdlObject, '00000000', 'DTE_VALID_AO');
                // StdXmlWsdl::setValueXml($this->wsdlObject, '00000000', 'VALCHXFOU');
                
                $this->setModeMiseAjour(true);
                $this->setModeMiseAjour(true);
                
                $obj_xml = $this->refresh(AO_ecran::XSL_FILE, false, null,AO_ecran::FOLDER_ENTETE);
                
                return true;
                break;
            case AO_ecran::FOLDER_LIGNE:
                $this->initalize();
                
                $this->setModeMiseAjour(true);
                $this->setModeMiseAjour(true);
                
                $obj_xml = $this->refresh(AO_ecran::XSL_FILE, false, null,AO_ecran::FOLDER_LIGNE);
                return true;
                break;
            case AO_ecran::FOLDER_FOURNISSEUR:
                $this->initalize();
                
                $this->setModeMiseAjour(true);
                $this->setModeMiseAjour(true);
                
                $obj_xml = $this->refresh(AO_ecran::XSL_FILE, false, null,AO_ecran::FOLDER_FOURNISSEUR);
                return true;
                break;
            case AO_ecran::FOLDER_CLAUSE:
                $this->initalize();
                
                $this->setModeMiseAjour(true);
                $this->setModeMiseAjour(true);
                
                $obj_xml = $this->refresh(AO_ecran::XSL_FILE, false, null,AO_ecran::FOLDER_CLAUSE);
                return true;
                break;
            case AO_ecran::FOLDER_PIECE_JOINTE:
                $this->initalize();
                
                $this->setModeMiseAjour(true);
                $this->setModeMiseAjour(true);
                
                $obj_xml = $this->refresh(AO_ecran::XSL_FILE, false, null,AO_ecran::FOLDER_PIECE_JOINTE);
                return true;
                break;
            case AO_ecran::FOLDER_DOC_RATTACHE:
                $this->initalize();
                
                $this->setModeMiseAjour(true);
                $this->setModeMiseAjour(true);
                
                $obj_xml = $this->refresh(AO_ecran::XSL_FILE, false, null,AO_ecran::FOLDER_DOC_RATTACHE);
                return true;
                break;
        }
        return false;
    }

    /**
     * Function d'annulation et donc remise dans l'état précédent
     * 
     * @see XmlWsdlOutil::annulerEnregistrement()
     */
    public function annulerEnregistrement()
    {
        switch ($this->getMode()) {
            case AO_ecran::FOLDER_ENTETE:
                // if ($this->isModeCreation()) $this->setNumAo(32);
                
                $this->initalize();
                $modeCreation = $this->isModeCreation();
                $this->setModeCreation(false);
                $this->setModeMiseAjour(false);
                
                $obj_xml = $this->refresh(AO_ecran::XSL_FILE, false, null,AO_ecran::FOLDER_ENTETE);
                if ($modeCreation)
                    Affichage::scroolPage(false);
                else
                    exit;
                return true;
                
                break;
            case AO_ecran::FOLDER_LIGNE:
                $this->initalize();
                $this->setModeCreation(false);
                $this->setModeMiseAjour(false);
                
                $obj_xml = $this->refresh(AO_ecran::XSL_FILE, false, null,AO_ecran::FOLDER_LIGNE);
                return true;
                
                break;
            case AO_ecran::FOLDER_FOURNISSEUR:
                $this->initalize();
                $this->setModeCreation(false);
                $this->setModeMiseAjour(false);
                
                $obj_xml = $this->refresh(AO_ecran::XSL_FILE, false, null,AO_ecran::FOLDER_FOURNISSEUR);
                return true;
                
                break;
            case AO_ecran::FOLDER_CLAUSE:
                $this->initalize();
                $this->setModeCreation(false);
                $this->setModeMiseAjour(false);
                
                $obj_xml = $this->refresh(AO_ecran::XSL_FILE, false, null,AO_ecran::FOLDER_CLAUSE);
                return true;
                
                break;
            case AO_ecran::FOLDER_PIECE_JOINTE:
                $this->initalize();
                $this->setModeCreation(false);
                $this->setModeMiseAjour(false);
                
                $obj_xml = $this->refresh(AO_ecran::XSL_FILE, false, null,AO_ecran::FOLDER_PIECE_JOINTE);
                return true;
                
                break;
            case AO_ecran::FOLDER_DOC_RATTACHE:
                $this->initalize();
                $this->setModeCreation(false);
                $this->setModeMiseAjour(false);
                
                $obj_xml = $this->refresh(AO_ecran::XSL_FILE, false, null,AO_ecran::FOLDER_DOC_RATTACHE);
                return true;
                
                break;
        }
        return false;
    }

    public function wsdlSave($ListeCs = array(), $contexte='')
    {
        if ($res = AO::CallWsdlCreeAOPanier($_SESSION['Session_Login'], ($this->isModeCreation() && $this->getMode() == AO_ecran::FOLDER_ENTETE), $this->wsdlObject, $ListeCs, $contexte)) {
            if ($res['Statut'] == 'E') {
                Affichage::messageJS($res['MsgErreur']);
                return false;
            } else if ($res['Statut'] == 'O') {
                $this->setNumAo($res['NO_AO']);
                return true;
            } else {
                Affichage::messageJS(strBuild(trad('Statut de retour non connu : @1@'), $res['Statut']));
                return false;
            }
        }
    }

    /**
     * Fonction d'enregistrement et donc processus de validation finale
     * 
     * @return boolean
     */
    public function enregisterEnregistrement()
    {
        $indiceOnglet = 0;
        
        switch ($this->getMode()) {
            case AO_ecran::FOLDER_ENTETE:

                $liste_cs = & SqlCs::rqGetInfoCS('AO_ENTET')->TrouveTous();
                
                foreach($liste_cs as $cs)
                {
                    $cs['VALEUR'] = getValueCS('CS_0_'.$cs['NUM_FIX'].'_VALEUR');
                    
                    $CS = new CS($cs);
                    $code_retour = $CS->ControlValueCS(true, true, $this->wsdlObject['CODE_STE']['#text']);
                    if (0 == $code_retour[0]) {
                        
                            Affichage::messageJS(CS::alertUser($code_retour[1], $cs['NOM']));
                            return false;
                    }
                    
                    if($cs['FORMAT'] == 'L')
                    {
                        $cs['VALEUR'] = $cs['VALEUR']? 'O':'N';
                    }
                    
                    $liste_valeur_cs[$cs['NUM_FIX']] = ['TBLSECTO' => BoolDbOxaproc($cs['TBLSECTO']), 'VALEUR' => $cs['VALEUR']];
                }
                
                if ($this->wsdlSave($liste_valeur_cs ?? [], 'AO_ENTET')) {
                    $this->initalize();
                    $this->setModeCreation(false);
                    $this->setModeMiseAjour(false);
                    
                    $obj_xml = $this->refresh(AO_ecran::XSL_FILE, false, null,AO_ecran::FOLDER_ENTETE);

                    
                    return true;
                } else {
                    exit();
                }
                
                break;
            case AO_ecran::FOLDER_LIGNE:
                if (array_key_exists('ListLignes', $this->wsdlObject) && is_array($this->wsdlObject['ListLignes'])) {
                    foreach ($this->wsdlObject['ListLignes'] as $index => & $record) {
                        if ($index == 'Ligne') { // INTERDICTION ABSOLUE DE METTRE des affectations direct sur pointeur sinon perte de certain niveau
                            if (array_key_exists(0, $record))
                                $ptr[$indiceOnglet] = & $record;
                            else
                                $ptr[$indiceOnglet][0] = & $record;
                            
                            foreach ($ptr[$indiceOnglet] as & $ligne)
                                if (array_key_exists('!Etat', $ligne)) {
                                    if ($ligne['!Etat'] == 'A' || $ligne['!Etat'] == 'M') {
                                        if (trim(StdXmlWsdl::getValueZoneInterne($ligne['DES'])) == '') {
                                            Affichage::messageJS(trad('La saisie de la désignation de l\'article est obligatoire.'));
                                            return false;
                                        } else if (trim(StdXmlWsdl::getValueZoneInterne($ligne['SSFAMILLE'])) == '') {
                                            Affichage::messageJS(trad('La saisie de la sous famille de l\'article est obligatoire.'));
                                            return false;
                                        }
                                    }
                                }
                        }
                    }
                    $indiceOnglet ++;
                }

                if ($this->wsdlSave()) {
                    $this->initalize();
                    $this->setModeCreation(false);
                    $this->setModeMiseAjour(false);
                    
                    $obj_xml = $this->refresh(AO_ecran::XSL_FILE, false, null,AO_ecran::FOLDER_LIGNE);
                    return true;
                } else {
                    exit();
                }
                
                break;
            case AO_ecran::FOLDER_FOURNISSEUR:
                if (array_key_exists('ListFournisseurs', $this->wsdlObject) && is_array($this->wsdlObject['ListFournisseurs'])) {
                    foreach ($this->wsdlObject['ListFournisseurs'] as $index => & $record) {
                        if ($index == 'Fournisseur') { // INTERDICTION ABSOLUE DE METTRE des affectations direct sur pointeur sinon perte de certain niveau
                            if (array_key_exists(0, $record))
                                $ptr[$indiceOnglet] = & $record;
                            else
                                $ptr[$indiceOnglet][0] = & $record;
                            
                            foreach ($ptr[$indiceOnglet] as & $ligne)
                                if (array_key_exists('!Etat', $ligne)) {
                                    if ($ligne['!Etat'] == 'A' || $ligne['!Etat'] == 'M') {
                                        if (trim(StdXmlWsdl::getValueZoneInterne($ligne['CODE_FOU'])) == '') {
                                            
                                            Affichage::setFocusForm($this->getFormulaire(), $ligne['CODE_FOU']['!nameZone']);
                                            Affichage::messageJS(trad('Le choix du fournisseur ou groupement est obligatoire.'));
                                            
                                            return false;
                                        }
                                        if ($ligne['!Etat'] == 'A') {
                                            foreach ($ptr[$indiceOnglet] as & $ligneAControler) {
                                                if ($ligne !== $ligneAControler) {
                                                    if (StdXmlWsdl::getValueZoneInterne($ligne['CODE_FOU']) == StdXmlWsdl::getValueZoneInterne($ligneAControler['CODE_FOU']) && StdXmlWsdl::getValueZoneInterne($ligne['TYPE_FG']) == StdXmlWsdl::getValueZoneInterne($ligneAControler['TYPE_FG'])) {
                                                        Affichage::setFocusForm($this->getFormulaire(), $ligne['CODE_FOU']['!nameZone']);
                                                        Affichage::messageJS(trad('Ce choix de fournisseur ou groupement existe déjà.'));
                                                        return false;
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                        }
                    }
                    $indiceOnglet ++;
                }
                
                if ($this->wsdlSave()) {
                    $this->initalize();
                    $this->setModeCreation(false);
                    $this->setModeMiseAjour(false);
                    
                    $obj_xml = $this->refresh(AO_ecran::XSL_FILE, false, null,AO_ecran::FOLDER_FOURNISSEUR);
                    return true;
                } else {
                    exit();
                }
                
                break;            
            case AO_ecran::FOLDER_CLAUSE:
                
                if ($res = AO::CallWsdlCreeAOPanier($_SESSION['Session_Login'], false, $this->wsdlObject)) {
                    if ($res['Statut'] == 'E') {
                        Affichage::messageJS($res['MsgErreur']);
                        return false;
                    } else if ($res['Statut'] == 'O') {
                        $this->setNumAo($res['NO_AO']);
                    } else {
                        Affichage::messageJS(strbuild(trad('Statut de retour non connu : @1@'), $res['Statut']));
                        exit();
                    }
                }
                
                $this->initalize();
                $this->setModeCreation(false);
                $this->setModeMiseAjour(false);
                
                $obj_xml = $this->refresh(AO_ecran::XSL_FILE, false, null,AO_ecran::FOLDER_CLAUSE);
                return true;
                
                break;
            case AO_ecran::FOLDER_PIECE_JOINTE:
                $this->initalize();
                $this->setModeCreation(false);
                $this->setModeMiseAjour(false);
                
                $obj_xml = $this->refresh(AO_ecran::XSL_FILE, false, null,AO_ecran::FOLDER_PIECE_JOINTE);
                return true;
                
                break;
            case AO_ecran::FOLDER_DOC_RATTACHE:
                $this->initalize();
                $this->setModeCreation(false);
                $this->setModeMiseAjour(false);
                
                $obj_xml = $this->refresh(AO_ecran::XSL_FILE, false, null,AO_ecran::FOLDER_DOC_RATTACHE);
                return true;
                
                break;
        }
        return false;
    }

    /**
     *
     * @param unknown $node
     * @param unknown $zone
     * @param unknown $typeObjectWsdl
     * @param unknown $ret
     */
    public function getCustoListe(& $node, & $zone, & $ret)
    {
        switch ($zone) {
            case 'TYPEDEL':
                $ret['option'] = array(
                    array(
                        '!value' => 'D',
                        '!texte' => trad('Date')
                    ),
                    array(
                        '!value' => 'J',
                        '!texte' => trad('Jour')
                    ),
                    array(
                        '!value' => 'T',
                        '!texte' => trad('Texte')
                    )
                );
                
                $ret['!action'] = 'Traite("' . $this->getContexteEcran()->getPrgRetour() . StdXmlWsdl::ACTION_CTRL_SRV;
                return true;
                break;
        }
        return parent::getCustoListe($node, $zone, $ret);
    }

    public function &getXslAttributeZone($node, $zone, $visible, $actif)
    {
        $arrayRetour = null;
        if (array_key_exists($zone, $node)) {
            if ($visible) {
                if ($actif) {
                    switch ($zone) {
                        // Section concernant les données de ligne d'article
                        case 'TITRE_AV':
                            $arrayRetour['!placeHolder'] = & trad('Titre ou sous titre');
                            break;
                        case 'TITRE_ST':
                            $arrayRetour['!placeHolder'] = & trad('Titre du sous total');
                            break;
                        case 'NO_DA':
                            $arrayRetour['!placeHolder'] = & trad('Num. DA');
                            break;
                        case 'CODE_ART':
                            $arrayRetour['!placeHolder'] = & trad('Code article');
                            break;
                        case 'DES':
                            $arrayRetour['!placeHolder'] = & trad('Désignation');
                            break;
                        case 'DCOMP':
                            $arrayRetour['!placeHolder'] = & trad('Désignation complémentaire');
                            break;
                        case 'QTE':
                            $arrayRetour['!placeHolder'] = & trad('Quantité');
                            break;
                        case 'COD_FAB':
                            $arrayRetour['!placeHolder'] = & trad('Code fabricant');
                            break;
                        case 'REF_FAB':
                            $arrayRetour['!placeHolder'] = & trad('Référence fabricant');
                            break;
                        case 'COD_GAM':
                            $arrayRetour['!placeHolder'] = & trad('Code gamme');
                            break;
                        case 'PRIX_REF':
                            $arrayRetour['!placeHolder'] = & trad('Prix référence');
                            break;
                        case 'BUDGET':
                            $arrayRetour['!placeHolder'] = & trad('Budget unitaire');
                            break;
                        case 'SSFAMILLE':
                            $arrayRetour['!placeHolder'] = & trad('Sous famille');
                            break;
                        // Section concernant les données fournisseur
                        case 'CODE_FOU':
                            if (StdXmlWsdl::getValueZoneInterne($node['TYPE_FG']) == 'F')
                                $arrayRetour['!placeHolder'] = & trad('Code fournisseur');
                            else
                                $arrayRetour['!placeHolder'] = & trad('Cde groupement');
                            break;
                        case 'VILLE':
                            $arrayRetour['!placeHolder'] = & trad('Ville');
                            break;
                        case 'CPOSTAL':
                            $arrayRetour['!placeHolder'] = & trad('Code Postal');
                            break;
                        case 'ADR':
                            $arrayRetour['!placeHolder'] = & trad('Adresse');
                            break;
                        case 'EMAILCONT':
                            $arrayRetour['!placeHolder'] = & trad('Email du contact');
                            break;
                        case 'POR_CTCT':
                            $arrayRetour['!placeHolder'] = & trad('Portable du contact');
                            break;
                        case 'FAX_CTCT':
                            $arrayRetour['!placeHolder'] = & trad('Fax du contact');
                            break;
                        case 'TEL_CTCT':
                            $arrayRetour['!placeHolder'] = & trad('Téléphone du contact');
                            break;
                        case 'NOM_CTCT':
                            $arrayRetour['!placeHolder'] = & trad('Nom du contact');
                            break;
                    }
                }
            }
        }
        return $arrayRetour;
    }

    /**
     * (non-PHPdoc)
     * 
     * @see XmlWsdlOutil::getValueZoneInterne()
     */
    public function getValueZoneInterne($node, $zone, $objetArecherche, $objectCible)
    {
        switch ($zone) {
            case 'COD_GAM':
                if ($objetArecherche == 'FABRICAN')
                    return StdXmlWsdl::getValueZoneInterne($node['COD_FAB']);
                
                break;
        }
        
        parent::getValueZoneInterne($node, $zone, $objetArecherche, $objectCible);
    }

    /**
     * Defini si la zone est active ou pas
     * 
     * @see XmlWsdlOutil::isZoneActive()
     */
    public function isZoneActive($zone, & $node)
    {
        if ($this->isModeMiseAjour()) {
            if (($this->getEtatXml() == $this->getMode()))
                if (array_key_exists('!Modifiable', $node) && $node['!Modifiable'] == 1) {
                    if ($this->getEtatXml() == AO_ecran::FOLDER_FOURNISSEUR) {
                        return true;
                    }
                }
        }
        if ($this->statutAO == 'P') {
            if ($this->isModeMiseAjour()) {
                $actif = ($this->getEtatXml() == $this->getMode());
                if ($actif) {
                    switch ($zone) {
                        case 'DES':
                        case 'SSFAMILLE':
                        case 'UNITE':
                            // case 'COD_GAM': Impossible de conditionner cela car si c'est un article libre alors il faut bien pouvoir l'affecter
                            // case 'COD_FAB': Impossible de conditionner cela car si c'est un article libre alors il faut bien pouvoir l'affecter
                            // case 'REF_FAB': Impossible de conditionner cela car si c'est un article libre alors il faut bien pouvoir l'affecter
                            $actif = (StdXmlWsdl::getValueZoneInterne($node['CODE_ART']) == '');
                            break;
                    }
                }
            } else
                $actif = false;
        } else
            $actif = false;
        
        if ($actif == false)
            return $actif;
        else
            return parent::isZoneActive($zone, $node);
    }

    /**
     * Defini si la zone est active ou pas
     * 
     * @see XmlWsdlOutil::isZoneActive()
     */
    public function isZoneAffiche($zone, & $node)
    {
        switch ($zone) {
            case 'TITRE_AV':
                return ($node['!TITRE_AV'] != '1');
                break;
            case 'TITRE_ST':
                return ($node['!TITRE_ST'] != '1');
                break;
        }
        return true;
    }

    public function getTypeListe(& $node, & $zone)
    {
        switch ($node[$zone]['!Objet']) {
            case 'SOCIETE':
                switch (StdXmlWsdl::getValueZoneInterne($node['TYPE_SOC_GS'])) {
                    case 'S':
                        return 'SOCIETE';
                        break;
                    case 'G':
                        return 'GROUPSOC';
                        break;
                    case 'T':
                        return null;
                        break;
                }
                break;
            case 'FOURNISS':
                switch (StdXmlWsdl::getValueZoneInterne($node['TYPE_FG'])) {
                    case 'F':
                        return 'FOURNISS';
                        break;
                    case 'G':
                        return 'GROUPFRS';
                        break;
                    case 'T':
                        return null;
                        break;
                }
        }
        
        return $node[$zone]['!Objet'];
    }

    public function isFolderVisible($folderLogique)
    {
        if ($this->isModeCreation()) {
            if ($this->getMode() == AO_ecran::FOLDER_ENTETE) {
                return ($folderLogique == AO_ecran::FOLDER_ENTETE);
            }
            return true;
        }
        return true;
    }

    public function setEtatXml($etatXml)
    {
        $this->etatXml = $etatXml;
    }

    public function getEtatXml()
    {
        return $this->etatXml;
    }

    public function getContexteEcran()
    {
        return $this->contexteSaisie;
    }

    public function genArrayXmlTitre(& $array)
    {
        $achInfo = StdXmlWsdl::getXmlValueZone($this->wsdlObject, 'ACH', $this);
        
        if (StdXmlWsdl::getValueZone($this->wsdlObject['DTE_VALID_AO']) == '') {
            $statut = trad('Préparation');
            $this->statutAO = 'P';
        } else if (StdXmlWsdl::getValueZone($this->wsdlObject['VALCHXFOU']) == '') {
            $statut = trad('En cours');
            $this->statutAO = 'E';
        } else {
            $statut = trad('Terminé');
            $this->statutAO = 'T';
        }
        
        $array['ecran']['!nomForm'] = $this->getFormulaire();
        
        if (is_null($this->getOngletAffiche())) {
            if ($this->isModeCreation() && $this->getMode() == AO_ecran::FOLDER_ENTETE) {
                $titreEcran = trad('CREATION D\'APPEL D\'OFFRE');
                
                $array['ecran']['general'] = array(
                    'col' => array(
                        array(
                            'zone' => array(
                                '!nameCtrl' => 'titre',
                                '!value' => $titreEcran,
                                '!divZone' => AO_ecran::ID_TITRE
                            )
                        )
                    )
                );
            } else if ($this->isModeMiseAjour() && $this->getMode() == AO_ecran::FOLDER_ENTETE) {
                // ancienne maniere de traduire
                // $titreEcran = trad('MODIFICATION DE l\'APPEL D\'OFFRE N°').
                // ' '.StdXmlWsdl::getValueZone($this->wsdlObject['NO_AO']).' '.
                // trad('crée le').
                // ' '.StdXmlWsdl::getValueZone($this->wsdlObject['DTE_AO']).' '.
                // (array_key_exists('!texte', $achInfo) ? trad('par').' '.$achInfo['!texte'] : '');
                $titreEcran = strBuild(trad('MODIFICATION DE l\'APPEL D\'OFFRE N° @1@ crée le @2@ @3@'), StdXmlWsdl::getValueZone($this->wsdlObject['NO_AO']), StdXmlWsdl::getValueZone($this->wsdlObject['DTE_AO']), (array_key_exists('!texte', $achInfo) ? trad('par') . ' ' . $achInfo['!texte'] : ''));
                
                $array['ecran']['general'] = array(
                    'col' => array(
                        array(
                            'zone' => array(
                                '!nameCtrl' => 'titre',
                                '!value' => $titreEcran,
                                '!divZone' => AO_ecran::ID_TITRE
                            )
                        )
                    )
                );
            } else {
                // ancienne maniere de traduire
                // $titreEcran = trad('APPEL D\'OFFRE N°').' '.StdXmlWsdl::getValueZone($this->wsdlObject['NO_AO']).' '.
                // trad('crée le').' '.StdXmlWsdl::getValueZone($this->wsdlObject['DTE_AO']).' '.
                // (array_key_exists('!texte', $achInfo) ? trad('par').' '.$achInfo['!texte'] : '');
                $titreEcran = strBuild(trad('APPEL D\'OFFRE N° @1@ crée le @2@ @3@'), StdXmlWsdl::getValueZone($this->wsdlObject['NO_AO']), StdXmlWsdl::getValueZone($this->wsdlObject['DTE_AO']), (array_key_exists('!texte', $achInfo) ? trad('par') . ' ' . $achInfo['!texte'] : ''));
                $array['ecran']['general'] = array(
                    'col' => array(
                        array(
                            'zone' => array(
                                '!nameCtrl' => 'titre',
                                '!value' => $titreEcran,
                                '!divZone' => AO_ecran::ID_TITRE
                            )
                        ),
                        array(
                            'zone' => array(
                                '!nameCtrl' => 'statut',
                                '!value' => trad('Statut') . ' : ' . $statut
                            )
                        )
                    )
                );
            }
        } else {
            switch ($this->getOngletAffiche()) {
                case AO_ecran::FOLDER_CLAUSE:
                    // ancienne maniere de traduire
                    // $titreEcran = trad('CLAUSE DE L\'APPEL D\'OFFRE N°').' '.StdXmlWsdl::getValueZone($this->wsdlObject['NO_AO']).' '.
                    // trad('crée le').' '.StdXmlWsdl::getValueZone($this->wsdlObject['DTE_AO']).' '.
                    // (array_key_exists('!texte', $achInfo) ? trad('par').' '.$achInfo['!texte'] : '');
                    $titreEcran = strBuild(trad('CLAUSE DE L\'APPEL D\'OFFRE N° @1@ crée le @2@ @3@'), StdXmlWsdl::getValueZone($this->wsdlObject['NO_AO']), StdXmlWsdl::getValueZone($this->wsdlObject['DTE_AO']), (array_key_exists('!texte', $achInfo) ? trad('par') . ' ' . $achInfo['!texte'] : ''));
                    
                    $array['ecran']['general'] = array(
                        'col' => array(
                            array(
                                'zone' => array(
                                    '!nameCtrl' => 'titre',
                                    '!value' => $titreEcran,
                                    '!divZone' => AO_ecran::ID_TITRE
                                )
                            )
                        )
                    );
                    break;
                case AO_ecran::FOLDER_PIECE_JOINTE:
                    // ancienne maniere de traduire
                    // $titreEcran = trad('PIECES JOINTES DE L\'APPEL D\'OFFRE N°').' '.StdXmlWsdl::getValueZone($this->wsdlObject['NO_AO']).' '.
                    // trad('crée le').' '.StdXmlWsdl::getValueZone($this->wsdlObject['DTE_AO']).' '.
                    // (array_key_exists('!texte', $achInfo) ? trad('par').' '.$achInfo['!texte'] : '');
                    $titreEcran = strBuild(trad('PIECES JOINTES DE L\'APPEL D\'OFFRE N° @1@ crée le @2@ @3@ '), StdXmlWsdl::getValueZone($this->wsdlObject['NO_AO']), StdXmlWsdl::getValueZone($this->wsdlObject['DTE_AO']), (array_key_exists('!texte', $achInfo) ? trad('par') . ' ' . $achInfo['!texte'] : ''));
                    
                    $array['ecran']['general'] = array(
                        'col' => array(
                            array(
                                'zone' => array(
                                    '!nameCtrl' => 'titre',
                                    '!value' => $titreEcran,
                                    '!divZone' => AO_ecran::ID_TITRE
                                )
                            )
                        )
                    );
                    break;
                case AO_ecran::FOLDER_DOC_RATTACHE:
                    // ancienne maniere de traduire
                    // $titreEcran = trad('DOCUMENTS RATTACHES DE L\'APPEL D\'OFFRE N°').' '.StdXmlWsdl::getValueZone($this->wsdlObject['NO_AO']).' '.
                    // trad('crée le').' '.StdXmlWsdl::getValueZone($this->wsdlObject['DTE_AO']).' '.
                    // (array_key_exists('!texte', $achInfo) ? trad('par').' '.$achInfo['!texte'] : '');
                    $titreEcran = strBuild(trad('DOCUMENTS RATTACHES DE L\'APPEL D\'OFFRE N° @1@ crée le @2@ @3@'), StdXmlWsdl::getValueZone($this->wsdlObject['NO_AO']), StdXmlWsdl::getValueZone($this->wsdlObject['DTE_AO']), (array_key_exists('!texte', $achInfo) ? trad('par') . ' ' . $achInfo['!texte'] : ''));
                    
                    $array['ecran']['general'] = array(
                        'col' => array(
                            array(
                                'zone' => array(
                                    '!nameCtrl' => 'titre',
                                    '!value' => $titreEcran,
                                    '!divZone' => AO_ecran::ID_TITRE
                                )
                            )
                        )
                    );
                    break;
                case AO_ecran::FOLDER_FOURNISSEUR:
                    // ancienne maniere de traduire
                    // $titreEcran = trad('FOURNISSEURS DE L\'APPEL D\'OFFRE N°').' '.StdXmlWsdl::getValueZone($this->wsdlObject['NO_AO']).' '.
                    // trad('crée le').' '.StdXmlWsdl::getValueZone($this->wsdlObject['DTE_AO']).' '.
                    // (array_key_exists('!texte', $achInfo) ? trad('par').' '.$achInfo['!texte'] : '');
                    $titreEcran = strBuild(trad('FOURNISSEURS DE L\'APPEL D\'OFFRE N° @1@ crée le @2@ @3@'), StdXmlWsdl::getValueZone($this->wsdlObject['NO_AO']), StdXmlWsdl::getValueZone($this->wsdlObject['DTE_AO']), (array_key_exists('!texte', $achInfo) ? trad('par') . ' ' . $achInfo['!texte'] : ''));
                    
                    $array['ecran']['general'] = array(
                        'col' => array(
                            array(
                                'zone' => array(
                                    '!nameCtrl' => 'titre',
                                    '!value' => $titreEcran,
                                    '!divZone' => AO_ecran::ID_TITRE
                                )
                            )
                        )
                    );
                    break;
            }
        }
    }

    public function genArrayXmlEnteteAO($indiceOnglet, & $array)
    {
        $toolBar = null;
        
        $no_ao = $this->wsdlObject['NO_AO']['#text'] ?? 0;
        $codeEnr = str_pad(($this->wsdlObject['NO_AO']['#text'] ?? 0), 9, 0, STR_PAD_LEFT);
        
        $this->setEtatXml(AO_ecran::FOLDER_ENTETE);
        if (! $this->isModeMiseAjour()) {
            // SPEC 4557 : Si présence d'un CS modifiable après validation, affichage de l'icone de modification si l'AO est en statut En cours
            $NbCSModApresVal = SqlCs::rqGetNbCSModApresVal('AO_ENTET')->Trouve1()['NB_MODAPVAL'];
            /*
             * Suppression de la possibilité d'ajouter un AO dans le container
             * $toolBar[] = array(
             * '!type' => 'ajouter',
             * '!action' => 'CallUrl(\''.$this->getContexteEcran()->getPrgRetour().'?'.'action=nouvelAO\');',
             * );
             */
            
            
            if ($this->statutAO == 'P' || ($this->statutAO == 'E' && $NbCSModApresVal > 0)) {
                $toolBar[] = array(
                    '!type' => 'edit',
                    // '!action' => 'CallUrlAsync(\'' . $this->getContexteEcran()->getPrgRetour() . '?' . 'action=modifieAO&MODE=httpreq\', "", "Traitement en cours");'
                    '!action' => 'TraiteAsync(\'' . $this->getContexteEcran()->getPrgRetour() . '?' . 'action=modifieAO&MODE=httpreq\',document.forms[\'frm_detail\'].elements[0],\'\',\''. trad("Traitement en cours...").'\');'
                );
            }

            $champsSupVisu = SqlCs::getValueCsByCodeEnr('AO_ENTET', $codeEnr);
            $i=0;
            foreach($champsSupVisu as $key => $value)
            {
                $ListeCs = SqlCs::rqGetInfoCS('AO_ENTET',$value['NUM_FIX'])->Trouve1();
                if($ListeCs['NONDISPO']!= 1)
                {
                    if($ListeCs['TYPE']=='LOGIQUE')
                    {
                        if($value['VALEUR'] =='O')
                        {
                            $value['VALEUR'] =trad('Oui');
                        }else
                        {
                            $value['VALEUR'] =trad('Non');
                        }
                    }
                    if($ListeCs['TBLSECTO']){
                        $value['VALEUR'] = substr($value['VALEUR'], 7) === false ? '' : substr($value['VALEUR'], 7);
                    }

                    $i++;
                    $champsSupVisu[$key] = $value;
                    if($i===3)
                    {
                        $champsSupVisu[$key]['SAUT']= 1;
                        $i=1;
                    }
                }else{
                    unset($champsSupVisu[$key]);
                }
            }
        }
        else if ($this->getMode() == $this->getEtatXml()) {
            $toolBar[] = array(
                '!type' => 'enregistrer',
                // '!action' => 'CallUrlAsync(\'' . $this->getContexteEcran()->getPrgRetour() . '?' . 'action=enregisterAO&MODE=httpreq\', "", "Traitement en cours");'
                '!action' => 'TraiteAsync(\'' . $this->getContexteEcran()->getPrgRetour() . '?' . 'action=enregisterAO&MODE=httpreq\',document.forms[\'frm_detail\'].elements[0],\'\',\''. trad("Traitement en cours...").'\');'
            );
            $toolBar[] = array(
                '!type' => 'annuler',
                '!action' => 'CallUrlAsync(\'' . $this->getContexteEcran()->getPrgRetour() . '?' . 'action=annulerAO&MODE=httpreq\', "", "'. trad('Traitement en cours...'). '");'
            );
            
            $champsSup = CS::generateXMLCS('AO_ENTET', 0, 'gestion_cs_panier.php', 'frm_detail', $codeEnr==0?false:true, 'null', $codeEnr, $this->wsdlObject['CODE_STE']['#text']);
            if(is_array($champsSup)){
                $i=0;
                foreach($champsSup['ListeCS']['CS'] as $keyArbre => &$valueArbre)
                {
                    if($this->statutAO == 'E')
                    {
                        $isCsNonModifiable = 0;
                        foreach($valueArbre['attributs'] as $key => $value)
                        {
                            if($value['!name'] == 'NONMODIF')
                            {
                                $keyNonModif = $key;
                            }
                            if($value['!name'] == 'MODAPVAL' && !BoolSql($value['!value']))
                            {
                                $isCsNonModifiable = 1;
                            }
                        }
                        if($isCsNonModifiable){
                            $valueArbre['attributs'][$keyNonModif]['!value'] = '1';
                        }
                    }
                    foreach($valueArbre['attributs'] as $key => $value)
                    {
                        if($value['!name'] == 'NONDISPO' and $value['!value'] == '0')
                        {
                            $i++;
                        }
                    }
                    foreach($valueArbre['attributs'] as $key => $value)
                    {
                        $champsSup['ListeCS']['CS'][$keyArbre]['attributs'][$key]= $value;
                        
                        if($i===3)
                        {
                            $champsSup['ListeCS']['CS'][$keyArbre]['attributs'][$key]['!SAUT']= 1;
                            $i=1;
                        } 
                    }
                }
            }
        }
        
        if ($this->getOngletAffiche() == $this->getEtatXml()) {
            $toolBar[] = array(
                '!type' => 'agrandir',
                '!selected' => 1,
                '!visible' => 0
            );
        } else {
            $toolBar[] = array(
                '!type' => 'agrandir',
                '!selected' => ($this->isModeMiseAjour() && $this->getMode() == $this->getEtatXml() ? 1 : 0),
                '!visible' => ($this->isModeMiseAjour() && $this->getMode() == $this->getEtatXml() ? 0 : 1)
            );
        }
        
        $listColonne = null;
        $colonne = array(
            array(
                'col' => array(
                    array(
                        '!etiquette' => 1,
                        'zone' => array(
                            StdXmlWsdl::getXmlValueZone($this->wsdlObject, 'TYPE_SOC_GS', $this)
                        )
                    ),
                    array(
                        'zone' => array(
                            StdXmlWsdl::getXmlValueZone($this->wsdlObject, 'CODE_STE', $this)
                        )
                    ),
                    array(
                        '!etiquette' => 1,
                        'zone' => array(
                            '!texte' => trad('Devise de l\'appel d\'offre'),
                            '!visible' => 1,
                            '!actif' => 0
                        )
                    ),
                    array(
                        'zone' => array(
                            StdXmlWsdl::getXmlValueZone($this->wsdlObject, 'DEVISE', $this)
                        )
                    )
                )
            ),
            array(
                'col' => array(
                    array(
                        '!etiquette' => 1,
                        'zone' => array(
                            '!texte' => trad('Centre émetteur'),
                            '!visible' => 1,
                            '!actif' => 0
                        )
                    ),
                    array(
                        'zone' => array(
                            StdXmlWsdl::getXmlValueZone($this->wsdlObject, 'EMETTEUR', $this)
                        )
                    ),
                    array(
                        '!etiquette' => 1,
                        'zone' => array(
                            '!texte' => trad('Réponse obligatoire dans la devise de l\'appel d\'offre'),
                            '!visible' => 1,
                            '!actif' => 0
                        )
                    ),
                    array(
                        'zone' => array(
                            StdXmlWsdl::getXmlValueZone($this->wsdlObject, 'REPDEV', $this)
                        )
                    )
                )
            ),
            array(
                'col' => array(
                    array(
                        '!etiquette' => 1,
                        'zone' => array(
                            '!texte' => trad('Centre de livraison'),
                            '!visible' => 1,
                            '!actif' => 0
                        )
                    ),
                    array(
                        'zone' => array(
                            StdXmlWsdl::getXmlValueZone($this->wsdlObject, 'CTR_LIV', $this)
                        )
                    ),
                    array(
                        '!etiquette' => 1,
                        'zone' => array(
                            '!texte' => trad('Appel d\'offre de référence'),
                            '!visible' => 1,
                            '!actif' => 0
                        )
                    ),
                    array(
                        'zone' => array(
                            StdXmlWsdl::getXmlValueZone($this->wsdlObject, 'NO_AO_1', $this)
                        )
                    )
                )
            ),
            array(
                'col' => array(
                    array(
                        '!etiquette' => 1,
                        'zone' => array(
                            '!texte' => trad('Acheteur'),
                            '!visible' => 1,
                            '!actif' => 0
                        )
                    ),
                    array(
                        'zone' => array(
                            StdXmlWsdl::getXmlValueZone($this->wsdlObject, 'ACH', $this)
                        )
                    ),
                    array(
                        '!etiquette' => 1,
                        'zone' => array(
                            '!texte' => trad('Variante autorisé'),
                            '!visible' => 1,
                            '!actif' => 0
                        )
                    ),
                    array(
                        'zone' => array(
                            StdXmlWsdl::getXmlValueZone($this->wsdlObject, 'VARIANTE', $this)
                        )
                    )
                )
            ),
            array(
                'col' => array(
                    array(
                        '!etiquette' => 1,
                        '!actif' => 0,
                        'zone' => array(
                            '!texte' => trad('Langue'),
                            '!visible' => 1,
                            '!actif' => 0
                        )
                    ),
                    array(
                        'zone' => array(
                            StdXmlWsdl::getXmlValueZone($this->wsdlObject, 'COD_LNG', $this)
                        )
                    ),
                    array(
                        '!etiquette' => 1,
                        'zone' => array(
                            '!texte' => trad('Type de délai'),
                            '!visible' => 1,
                            '!actif' => 0
                        )
                    ),
                    array(
                        'zone' => array(
                            StdXmlWsdl::getXmlValueZone($this->wsdlObject, 'TYPEDEL', $this)
                        )
                    )
                )
            ),
            array(
                'col' => array(
                    array(
                        '!etiquette' => 1,
                        'zone' => array(
                            '!texte' => trad('Réponse attendue pour le'),
                            '!visible' => 1,
                            '!actif' => 0
                        )
                    ),
                    array(
                        'zone' => array(
                            StdXmlWsdl::getXmlValueZone($this->wsdlObject, 'DTE_REP', $this)
                        )
                    ),
                    array(
                        '!etiquette' => 1,
                        'zone' => array(
                            '!texte' => trad('Choix fournisseur le'),
                            '!visible' => 1,
                            '!actif' => 0
                        )
                    ),
                    array(
                        'zone' => array(
                            StdXmlWsdl::getXmlValueZone($this->wsdlObject, 'VALCHXFOU', $this)
                        )
                    )
                )
            ),
            array(
                'col' => array(
                    array(
                        '!etiquette' => 1,
                        'zone' => array(
                            '!texte' => trad('Date validation'),
                            '!visible' => 1,
                            '!actif' => 0
                        )
                    ),
                    array(
                        'zone' => array(
                            StdXmlWsdl::getXmlValueZone($this->wsdlObject, 'DTE_VALID_AO', $this)
                        )
                    ),
                    array(
                        '!etiquette' => 1,
                        'zone' => array(
                            '!texte' => trad('Budget global'),
                            '!visible' => 1,
                            '!actif' => 0
                        )
                    ),
                    array(
                        'zone' => array(
                            StdXmlWsdl::getXmlValueZone($this->wsdlObject, 'BUDG_ENT', $this)
                        )
                    )
                )
            ),
            array(
                'col' => array(
                    array(
                        '!etiquette' => 1,
                        'zone' => array(
                            '!texte' => trad('Objet de l\'AO'),
                            '!visible' => 1,
                            '!actif' => 0
                        )
                    ),
                    array(
                        'zone' => array(
                            StdXmlWsdl::getXmlValueZone($this->wsdlObject, 'OBJET_AO', $this)
                        )
                    ),
                    array(
                        '!etiquette' => 1,
                        'zone' => array(
                            '!texte' => trad('Appel d\'offre public'),
                            '!visible' => 1,
                            '!actif' => 0
                        )
                    ),
                    array(
                        'zone' => array(
                            StdXmlWsdl::getXmlValueZone($this->wsdlObject, 'AO_PUBLIC', $this)
                        )
                    )
                )
            ),
            array(
                'col' => array(
                    array(
                        '!etiquette' => 1,
                        'zone' => array(
                            '!texte' => trad('Titre'),
                            '!visible' => 1,
                            '!actif' => 0,
                            '!nbCell' => 2
                        )
                    ),
                    
                    array(
                        '!etiquette' => 1,
                        'zone' => array(
                            '!texte' => trad('Commentaire'),
                            '!visible' => 1,
                            '!actif' => 0,
                            '!nbCell' => 2
                        )
                    )
                )
            ),
            array(
                'col' => array(
                    array(
                        'zone' => array(
                            '!nbCell' => 2,
                            StdXmlWsdl::getXmlValueZone($this->wsdlObject, 'TITRE_AO', $this)
                        )
                    ),
                    
                    array(
                        'zone' => array(
                            '!nbCell' => 2,
                            StdXmlWsdl::getXmlValueZone($this->wsdlObject, 'COMMENT_AO', $this)
                        )
                    )
                )
            )
        );
        
        $colAo = null;
        if ($this->isModeCreation() && $this->getMode() == $this->getEtatXml()) {
            if (array_key_exists('!Modifiable', $this->wsdlObject['NO_AO'])) {
                if ($this->wsdlObject['NO_AO']['!Modifiable'] == 1) {
                    $listColonne[] = array(
                        'col' => array(
                            array(
                                'zone' => array(
                                    '!texte' => 'N°AO',
                                    '!visible' => 1,
                                    '!actif' => 0
                                )
                            ),
                            array(
                                'zone' => array(
                                    StdXmlWsdl::getXmlValueZone($this->wsdlObject, 'NO_AO', $this)
                                )
                            )
                        )
                    );
                    
                    foreach ($colonne as & $refColonne)
                        $listColonne[] = $refColonne;
                }
                // exit;
            }
        }
        if (is_null($listColonne))
            $listColonne = & $colonne;
        
        $array['ecran']['onglet'][$indiceOnglet] = array(
            '!templateName' => $this->getEtatXml(),
            '!visible' => $this->isFolderVisible($this->getEtatXml()),
            'entete' => array(
                '!id' => 'tag_' . $indiceOnglet,
                '!select' => true,
                '!texte' => trad('Entête'),
                'toolbar' => array(
                    '!mode' => 32,
                    'element' => $toolBar
                )
            ),
            'detail' => array(
                'actif' => 0,
                'element' => array(
                    'row' => $listColonne
                )
            )
        );
        
        
        if(isset($champsSupVisu) && is_array($champsSupVisu)){
            $array['ecran']['onglet'][$indiceOnglet]['listeCsAffichage'] = $champsSupVisu;
        }
        if(isset($champsSup) && is_array($champsSup)){
            $array['ecran']['onglet'][$indiceOnglet]['champsSup'] = $champsSup;
        }
    }

    public function genArrayXmlLigneAO($indiceOnglet, & $array)
    {
        // Section ListLignes
        switch (StdXmlWsdl::getValueZoneInterne($this->wsdlObject['TYPEDEL'])) {
            case 'J':
                $zoneDelai = 'DELAIJ';
                break;
            case 'T':
                $zoneDelai = 'DELAIT';
                break;
            default:
                $zoneDelai = 'DELAI';
                break;
        }
        
        $this->setEtatXml(AO_ecran::FOLDER_LIGNE);
        $toolBar = null;
        
        $ligneArray = null;
        $ligneExist = false;
        
        $indexXmlOnglet = 'ListLignes';
        // listePageOnglet
        
        $tabPagination = null;
        $tabRecherche = null;
        
        if (array_key_exists($indexXmlOnglet, $this->wsdlObject) && is_array($this->wsdlObject[$indexXmlOnglet])) {
            $NoPageCourante = null;
            // Ajout des informations concernant la toolbar de navigation
            if (array_key_exists($indexXmlOnglet, $this->listePageOnglet)) {
                // Activation de la page
                // XmlPageOnglet
                $classPage = $this->listePageOnglet[$indexXmlOnglet];
                if ($classPage instanceof XmlPageOnglet) {
                    $tabPagination = $classPage->genXmlArray();
                    $NoPageCourante = $classPage->getPageCourante();
                }
            }
            
            if (array_key_exists($indexXmlOnglet, $this->listePageRecherche)) {
                // Activation de la page
                // XmlPageOnglet
                $classPage = $this->listePageRecherche[$indexXmlOnglet];
                if ($classPage instanceof XmlPageRecherche) {
                    $tabRecherche = $classPage->genXmlArray();
                }
            }
            
            foreach ($this->wsdlObject[$indexXmlOnglet] as $index => & $record)
                if ($index == 'Ligne') { // INTERDICTION ABSOLUE DE METTRE des affectations direct sur pointeur sinon perte de certain niveau
                    if (array_key_exists(0, $record))
                        $ptr[$indiceOnglet] = & $record;
                    else
                        $ptr[$indiceOnglet][0] = & $record;
                    
                    foreach ($ptr[$indiceOnglet] as $indice => & $ligne)
                        if (is_null($NoPageCourante) || (array_key_exists('!NoPage', $ligne) && $ligne['!NoPage'] == $NoPageCourante)) {
                            $ligneArray[$indice] = $this->arrayAoLigne($ligne, $zoneDelai);
                            
                            if (array_key_exists('!Etat', $ligneArray[$indice]) && ($ligneArray[$indice]['!Etat'] != '' && $ligneArray[$indice]['!Etat'] != 'S'))
                                $ligneExist = true;
                            else if (StdXmlWsdl::getValueZoneInterne($ligne['NO_PO']) != '')
                                $ligneExist = true;
                        }
                }
        }
        
        if (! $this->isModeMiseAjour()) {
            if ($this->statutAO == 'P') {
                $toolBar[] = array(
                    '!type' => 'param',
                    '!action' => 'CallUrlAsync(\'' . $this->getContexteEcran()->getPrgRetour() . '?' . 'action=paramLigne&MODE=httpreq\', "", "'. trad('Traitement en cours...'). '");'
                );
                
                $toolBar[] = array(
                    '!type' => 'ajouter',
                    '!action' => 'CallUrlAsync(\'' . $this->getContexteEcran()->getPrgRetour() . '?' . 'action=nouvelLigne&MODE=httpreq\', "", "'. trad('Traitement en cours...'). '");',
                    '!titre' => trad('Ajouter une ligne')
                );
                
                if (array_key_exists('#text', $this->wsdlObject['NO_AO']))
                    $toolBar[] = array(
                        '!type' => 'importQstBib',
                        '!action' => 'OpenPopup("ao_panier_import_da.php?action=AffichePopup&no_ao=' . $this->wsdlObject['NO_AO']['#text'] . '", "win_pop_ao_imp_da", 1000, 600);',
                        '!titre' => trad('Importer des lignes de DA')
                    );
                
                if ($ligneExist)
                    $toolBar[] = array(
                        '!type' => 'edit',
                        '!action' => 'CallUrlAsync(\'' . $this->getContexteEcran()->getPrgRetour() . '?' . 'action=modifieLigne&MODE=httpreq\', "", "'. trad('Traitement en cours...'). '");',
                        '!titre' => trad('Ajouter les lignes d\'AO')
                    );
            }
        } else if ($this->getMode() == $this->getEtatXml()) {
            $toolBar[] = array(
                '!type' => 'enregistrer',
                '!action' => 'CallUrlAsync(\'' . $this->getContexteEcran()->getPrgRetour() . '?' . 'action=enregisterLigne&MODE=httpreq\', "", "'. trad('Traitement en cours...'). '");',
                '!titre' => trad('Enregister la saisie')
            );
            $toolBar[] = array(
                '!type' => 'annuler',
                '!action' => 'CallUrlAsync(\'' . $this->getContexteEcran()->getPrgRetour() . '?' . 'action=annulerLigne&MODE=httpreq\', "", "'. trad('Traitement en cours...'). '");',
                '!titre' => trad('Annuler la saisie')
            );
            
            if ($this->statutAO == 'P') {
                $toolBar[] = array(
                    '!type' => 'ajouter',
                    '!action' => 'CallUrlAsync(\'' . $this->getContexteEcran()->getPrgRetour() . '?' . 'action=nouvelLigne&MODE=httpreq\', "", "'. trad('Traitement en cours...'). '");',
                    '!titre' => trad('Ajouter une ligne')
                );
            }
        }
        
        if ($this->getOngletAffiche() == $this->getEtatXml()) {
            $toolBar[] = array(
                '!type' => 'agrandir',
                '!selected' => 1,
                '!visible' => 0
            );
        } else {
            $toolBar[] = array(
                '!type' => 'agrandir',
                '!selected' => ($this->isModeMiseAjour() && $this->getMode() == $this->getEtatXml() ? 1 : 0),
                '!visible' => ($this->isModeMiseAjour() && $this->getMode() == $this->getEtatXml() ? 0 : 1)
            );
        }
        
        $array['ecran']['onglet'][$indiceOnglet] = array(
            '!templateName' => $this->getEtatXml(),
            '!visible' => $this->isFolderVisible($this->getEtatXml()),
            'entete' => array(
                '!id' => 'tag_' . $indiceOnglet,
                '!select' => true,
                '!texte' => trad('Lignes'),
                'toolbar' => array(
                    '!mode' => 32,
                    'element' => $toolBar
                
                ),
                'pagination' => $tabPagination,
                'recherche' => $tabRecherche
            ),
            'detail' => array(
                'actif' => 0,
                'element' => array(
                    'liste' => array(
                        'entete' => array(
                            '!row' => 2,
                            'element' => array(
                                array(
                                    '!col' => '5px',
                                    'texte' => array(
                                        trad('Poste / DA')
                                    )
                                ),
                                array(
                                    '!col' => '12px',
                                    'texte' => array(
                                        trad('Code Article'),
                                        trad('Ref. Fabricant')
                                    )
                                ),
                                array(
                                    '!col' => '20px',
                                    'texte' => array(
                                        trad('Libellé Article')
                                    )
                                ),
                                array(
                                    '!col' => '12px',
                                    'texte' => array(
                                        trad('Sous famille')
                                    )
                                ),
                                array(
                                    '!col' => '10px',
                                    'texte' => array(
                                        trad('Quantité / Unité')
                                    )
                                ),
                                array(
                                    '!col' => '10px',
                                    'texte' => array(
                                        trad('Délai')
                                    )
                                ),
                                array(
                                    '!col' => '10px',
                                    'texte' => array(
                                        trad('Prix Réf. / Budget')
                                    )
                                ),
                                array(
                                    '!col' => '9px',
                                    'texte' => array(
                                        trad('Action')
                                    )
                                )
                            )
                        )
                    )
                ),
                'ligne' => $ligneArray
            )
        );
    }

    public function genArrayXmlFournisseurAO($indiceOnglet, & $array)
    {
        $toolBar = null;
        $this->setEtatXml(AO_ecran::FOLDER_FOURNISSEUR);
        
        $ligneExist = false;
        
        $ligneArray = null;
        if (array_key_exists('ListFournisseurs', $this->wsdlObject) && is_array($this->wsdlObject['ListFournisseurs'])) {
            
            $refSegment = & $this->wsdlObject['ListFournisseurs'];
            if (array_key_exists('!Modifiable', $refSegment))
                $actifSegment = BoolSql($refSegment['!Modifiable']);
            else
                $actifSegment = true;
            
            foreach ($refSegment as $index => & $record) {
                if ($index == 'Fournisseur') { // INTERDICTION ABSOLUE DE METTRE des affectations direct sur pointeur sinon perte de certain niveau
                    if (array_key_exists(0, $record))
                        $ptr[$indiceOnglet] = & $record;
                    else
                        $ptr[$indiceOnglet][0] = & $record;
                    
                    foreach ($ptr[$indiceOnglet] as $numero => & $ligne) {
                        $zoneFG = StdXmlWsdl::getXmlValueZone($ligne, 'TYPE_FG', $this);
                        
                        if (array_key_exists('!Etat', $ligne) && $ligne['!Etat'] == 'A')
                            $modifiable = true;
                        else if (array_key_exists('!Modifiable', $ligne))
                            $modifiable = BoolSql($ligne['!Modifiable']);
                        else
                            $modifiable = true;
                        
                        if (array_key_exists('!Etat', $ligne) && ($ligne['!Etat'] != '' && $ligne['!Etat'] != 'S'))
                            $ligneExist = true;
                        else if (StdXmlWsdl::getValueZoneInterne($ligne['CODE_FOU']) != '')
                            $ligneExist = true;
                        
                        $listeZone = array(
                            array(
                                'zone' => array(
                                    $zoneFG
                                )
                            ),
                            array(
                                'zone' => array(
                                    StdXmlWsdl::getXmlValueZone($ligne, 'CODE_FOU', $this, true, $modifiable)
                                ),
                                'ListHistoriqueFourn' => $ligne['ListHistoriqueFourn']
                            ),
                            array(
                                'zone' => array(
                                    StdXmlWsdl::getXmlValueZone($ligne, 'NOM_CTCT', $this, true, $modifiable)
                                )
                            ),
                            array(
                                'zone' => array(
                                    StdXmlWsdl::getXmlValueZone($ligne, 'TEL_CTCT', $this, true, $modifiable)
                                )
                            ),
                            array(
                                'zone' => array(
                                    StdXmlWsdl::getXmlValueZone($ligne, 'FAX_CTCT', $this, true, $modifiable)
                                )
                            ),
                            array(
                                'zone' => array(
                                    StdXmlWsdl::getXmlValueZone($ligne, 'POR_CTCT', $this, true, $modifiable)
                                )
                            ),
                            array(
                                'zone' => array(
                                    StdXmlWsdl::getXmlValueZone($ligne, 'EMAILCONT', $this, true, $modifiable)
                                )
                            ),
                            array(
                                'zone' => array(
                                    StdXmlWsdl::getXmlValueZone($ligne, 'ADR', $this, true, $modifiable)
                                )
                            ),
                            array(
                                'zone' => array(
                                    StdXmlWsdl::getXmlValueZone($ligne, 'CPOSTAL', $this, true, $modifiable)
                                )
                            ),
                            array(
                                'zone' => array(
                                    StdXmlWsdl::getXmlValueZone($ligne, 'VILLE', $this, true, $modifiable)
                                )
                            ),
                            array(
                                'zone' => array(
                                    StdXmlWsdl::getXmlValueZone($ligne, 'PAYS', $this, true, $modifiable)
                                )
                            ),
                            array(
                                'zone' => array(
                                    StdXmlWsdl::getXmlValueZone($ligne, 'NO_COL', $this, true, $modifiable)
                                )
                            ),
                            array(
                                'zone' => array(
                                    StdXmlWsdl::getXmlValueZone($ligne, 'DTE_ENVOI_AO', $this, true, $modifiable)
                                )
                            ),
                            array(
                                'zone' => array(
                                    StdXmlWsdl::getXmlValueZone($ligne, 'DTE_REPONSE1', $this, true, $modifiable)
                                )
                            ),
                            array(
                                'zone' => array(
                                    StdXmlWsdl::getXmlValueZone($ligne, 'DTE_REPONSE2', $this, true, $modifiable)
                                )
                            ),
                            array(
                                'zone' => array(
                                    StdXmlWsdl::getXmlValueZone($ligne, 'DTE_REPONSE3', $this, true, $modifiable)
                                )
                            )
                        );
                        
                        if ($this->isModeMiseAjour() && $this->getMode() == $this->getEtatXml()) {
                            if ($modifiable && $this->isZoneActive('NOM_CTCT', $ligne)) {
                                $elementZone = & $this->getZone($this->getEtatXml(), $zoneFG['!nameZone'], '_LOUPE_ADR'); // Loupe pour les adresses fournisseurs
                                $elementZone['!value'] = $zoneFG['!nameZone'];
                                $elementZone['!visible'] = (StdXmlWsdl::getValueZoneInterne($ligne['TYPE_FG']) == 'F' ? '1' : '0');
                                $elementZone['!actif'] = 1;
                                $elementZone['!Format'] = 'loupe';
                                $elementZone['!action'] = 'Traite("' . $this->getContexteEcran()->getPrgRetour() . StdXmlWsdl::ACTION_CTRL_SRV;
                                $listeZone[] = array(
                                    'zone' => $elementZone
                                );
                                
                                $elementZone = & $this->getZone($this->getEtatXml(), $zoneFG['!nameZone'], '_LOUPE_ADR_SEC'); // Loupe pour les contacts fournisseurs
                                $elementZone['!value'] = $zoneFG['!nameZone'];
                                $elementZone['!visible'] = (StdXmlWsdl::getValueZoneInterne($ligne['TYPE_FG']) == 'F' ? '1' : '0');
                                $elementZone['!visible'] = 1;
                                $elementZone['!actif'] = 1;
                                $elementZone['!Format'] = 'loupe';
                                $elementZone['!action'] = 'Traite("' . $this->getContexteEcran()->getPrgRetour() . StdXmlWsdl::ACTION_CTRL_SRV;
                                $listeZone[] = array(
                                    'zone' => $elementZone
                                );
                                
                                $elementZone = & $this->getZone($this->getEtatXml(), $zoneFG['!nameZone'], '_SUP');
                                $elementZone['!value'] = 'supprime';
                                $elementZone['!visible'] = 1;
                                $elementZone['!actif'] = 1;
                                $elementZone['!Format'] = 'image';
                                $elementZone['!action'] = 'CallUrl(\'' . $this->getContexteEcran()->getPrgRetour() . '?action=supprimer' . '&onglet=' . urlencode($this->getEtatXml()) . '&reference=' . urlencode($zoneFG['!nameZone']) . '\');';
                                $listeZone[] = array(
                                    'zone' => $elementZone
                                );
                            }
                        }
                        
                        $ligneArray[] = array(
                            '!Etat' => (is_array($ligne) && array_key_exists('!Etat', $ligne) ? $ligne['!Etat'] : ''),
                            'col' => $listeZone
                        );
                    }
                }
            }
        }
        
        if (! $this->isModeMiseAjour()) {
            /**
             * $toolBar[] = array(
             * '!type' => 'param',
             * '!action' => 'CallUrl(\''.$this->getContexteEcran()->getPrgRetour().'?'.'action=paramFournisseur\');'
             * );
             */
            
            if ($this->statutAO != 'T') {
                $toolBar[] = array(
                    '!type' => 'ajouter',
                    '!action' => 'CallUrlAsync(\'' . $this->getContexteEcran()->getPrgRetour() . '?' . 'action=nouvelFournisseur&MODE=httpreq\', "","'. trad('Traitement en cours...'). '");',
                    '!titre' => trad('Ajouter un fournisseur')
                );
                
                if ($ligneExist)
                    $toolBar[] = array(
                        '!type' => 'edit',
                        '!action' => 'CallUrlAsync(\'' . $this->getContexteEcran()->getPrgRetour() . '?' . 'action=modifieFournisseur&MODE=httpreq\', "", "'. trad('Traitement en cours...'). '");',
                        '!titre' => trad('Modifier')
                    );
            }
        } else if ($this->getMode() == $this->getEtatXml()) {
            $toolBar[] = array(
                '!type' => 'enregistrer',
                '!action' => 'CallUrlAsync(\'' . $this->getContexteEcran()->getPrgRetour() . '?' . 'action=enregisterFournisseur&MODE=httpreq\', "", "'. trad('Traitement en cours...'). '");'
            );
            $toolBar[] = array(
                '!type' => 'annuler',
                '!action' => 'CallUrlAsync(\'' . $this->getContexteEcran()->getPrgRetour() . '?' . 'action=annulerFournisseur&MODE=httpreq\', "", "'. trad('Traitement en cours...'). '");'
            );
            
            if ($this->statutAO != 'T') {
                $toolBar[] = array(
                    '!type' => 'ajouter',
                    '!action' => 'CallUrlAsync(\'' . $this->getContexteEcran()->getPrgRetour() . '?' . 'action=nouvelFournisseur&MODE=httpreq\', "", "'. trad('Traitement en cours...'). '");',
                    '!titre' => trad('Ajouter un fournisseur')
                );
            }
        }
        
        if ($this->getOngletAffiche() == $this->getEtatXml()) {
            $toolBar[] = array(
                '!type' => 'agrandir',
                '!selected' => 1,
                '!visible' => 0
            );
        } else {
            $toolBar[] = array(
                '!type' => 'agrandir',
                '!selected' => ($this->isModeMiseAjour() && $this->getMode() == $this->getEtatXml() ? 1 : 0),
                '!visible' => ($this->isModeMiseAjour() && $this->getMode() == $this->getEtatXml() ? 0 : 1)
            );
        }
        
        $array['ecran']['onglet'][$indiceOnglet] = array(
            '!templateName' => $this->getEtatXml(),
            '!visible' => $this->isFolderVisible($this->getEtatXml()),
            'entete' => array(
                '!id' => 'tag_' . $indiceOnglet,
                '!select' => true,
                '!texte' => trad('Fournisseurs'),
                'toolbar' => array(
                    '!mode' => 32,
                    'element' => $toolBar
                )
            ),
            'detail' => array(
                'actif' => 0,
                'element' => array(
                    'liste' => array(
                        'entete' => array(
                            '!row' => 2,
                            'element' => array(
                                array(
                                    '!col' => '5px',
                                    'texte' => array(
                                        trad('Type')
                                    )
                                ),
                                array(
                                    '!col' => '22px',
                                    'texte' => array(
                                        trad('Fournisseurs')
                                    )
                                ),
                                array(
                                    '!col' => '22px',
                                    'texte' => array(
                                        trad('Contacts')
                                    )
                                ),
                                array(
                                    '!col' => '10px',
                                    'texte' => array(
                                        trad('Indice qualité')
                                    )
                                ),
                                array(
                                    '!col' => '20px',
                                    'texte' => array(
                                        trad('Historique')
                                    )
                                ),
                                array(
                                    '!col' => '7px',
                                    'texte' => array(
                                        trad('Envoi/Rép')
                                    )
                                ),
                                array(
                                    '!col' => '7px',
                                    'texte' => array(
                                        trad('Action')
                                    )
                                )
                            )
                        )
                    )
                ),
                'ligne' => $ligneArray
            )
        );
    }

    public function genArrayXmlClauseAO($indiceOnglet, & $array)
    {
        $this->setEtatXml(AO_ecran::FOLDER_CLAUSE);
        
        $ligneExist = false;
        $ligneArray = null;
        if (array_key_exists('ListClauses', $this->wsdlObject) && is_array($this->wsdlObject['ListClauses']))
            foreach ($this->wsdlObject['ListClauses'] as $index => & $record) {
                if ($index == 'Clause') { // INTERDICTION ABSOLUE DE METTRE des affectations direct sur pointeur sinon perte de certain niveau
                    if (array_key_exists(0, $record))
                        $ptr[$indiceOnglet] = & $record;
                    else
                        $ptr[$indiceOnglet][0] = & $record;
                    
                    foreach ($ptr[$indiceOnglet] as & $ligne) {
                        $zoneSaisie = StdXmlWsdl::getXmlValueZone($ligne, 'PARAG', $this);
                        
                        if (array_key_exists('!Etat', $ligne) && ($ligne['!Etat'] != '' && $ligne['!Etat'] != 'S'))
                            $ligneExist = true;
                        else if (StdXmlWsdl::getValueZoneInterne($ligne['NO_ORDRE']) != 0)
                            $ligneExist = true;
                        
                        if (array_key_exists('!Etat', $ligne)) {
                            if ($ligne['!Etat'] == 'A')
                                $zoneSaisie['!placeHolder'] = trad('Saisie de votre clause');
                            else if ($ligne['!Etat'] == 'M')
                                $zoneSaisie['!placeHolder'] = trad('Saisie de votre clause');
                        }
                        
                        $listeZone = array(
                            array(
                                'zone' => array(
                                    StdXmlWsdl::getXmlValueZone($ligne, 'NO_ORDRE', $this)
                                )
                            ),
                            array(
                                'zone' => array(
                                    $zoneSaisie
                                )
                            )
                        );
                        
                        if ($this->isModeMiseAjour() && $this->getMode() == $this->getEtatXml() && $ligne['PARAG']['!Modifiable'] == 1) {
                            if ($this->statutAO == 'P' || (array_key_exists('!Etat', $ligne) && $ligne['!Etat'] == 'A')) {
                                $largeurFenetre = 490;
                                $hauteurFenetre = 410;
                                $url = " OpenPopup('ctrl_liste_clauses.php?action=initPopup&popup_id=CLAUSES" . "&formName=" . $this->getFormulaire() . "&backForm=" . $this->getFormulaire() . "&inputField=" . $zoneSaisie['!nameZone']  . "&backAction=change" . "&backMode=form" . "&backPopup=1" . "&backField=" . $zoneSaisie['!nameZone'] . "&modeHtml=1" . "','popup_liste_clauses',700,700)";
                                
                                $elementZone = & $this->getZone($this->getEtatXml(), StdXmlWsdl::getValueZone($ligne['NO_ORDRE']), '_RECH');
                                $elementZone['!value'] = 'aide';
                                $elementZone['!visible'] = 1;
                                $elementZone['!Format'] = 'image';
                                $elementZone['!action'] = $url;
                                $listeZone[] = array(
                                    'zone' => $elementZone
                                );
                                
                                $elementZone = & $this->getZone($this->getEtatXml(), StdXmlWsdl::getValueZone($ligne['NO_ORDRE']), '_SUP');
                                $elementZone['!value'] = 'supprime';
                                $elementZone['!visible'] = 1;
                                $elementZone['!Format'] = 'image';
                                $elementZone['!action'] = 'CallUrl(\'' . $this->getContexteEcran()->getPrgRetour() . '?action=supprimer' . '&onglet=' . urlencode($this->getEtatXml()) . '&reference=' . urlencode($zoneSaisie['!nameZone']) . '\');';
                                $listeZone[] = array(
                                    'zone' => $elementZone
                                );
                            }
                        }
                        
                        $ligneArray[] = array(
                            '!Etat' => (is_array($ligne) && array_key_exists('!Etat', $ligne) ? $ligne['!Etat'] : ''),
                            'col' => $listeZone
                        );
                    }
                }
            }
        
        $toolBar = null;
        if (! $this->isModeMiseAjour()) {
            if ($this->statutAO == 'P') { // On reste toujours sur la notion de preparation
                $toolBar[] = array(
                    '!type' => 'ajouter',
                    '!action' => 'CallUrlAsync(\'' . $this->getContexteEcran()->getPrgRetour() . '?' . 'action=nouvelClause&MODE=httpreq\', "", "'. trad('Traitement en cours...'). '");'
                );
                if ($ligneExist)
                    $toolBar[] = array(
                        '!type' => 'edit',
                        '!action' => 'CallUrlAsync(\'' . $this->getContexteEcran()->getPrgRetour() . '?' . 'action=modifieClause&MODE=httpreq\', "", "'. trad('Traitement en cours...'). '");'
                    );
            }
        } else if ($this->getMode() == $this->getEtatXml()) {
            $toolBar[] = array(
                '!type' => 'enregistrer',
                '!action' => 'CallUrlAsync(\'' . $this->getContexteEcran()->getPrgRetour() . '?' . 'action=enregisterClause&MODE=httpreq\', "", "'. trad('Traitement en cours...'). '");'
            );
            $toolBar[] = array(
                '!type' => 'annuler',
                '!action' => 'CallUrlAsync(\'' . $this->getContexteEcran()->getPrgRetour() . '?' . 'action=annulerClause&MODE=httpreq\', "", "'. trad('Traitement en cours...'). '");'
            );
            
            if ($this->statutAO == 'P') {
                $toolBar[] = array(
                    '!type' => 'ajouter',
                    '!action' => 'CallUrlAsync(\'' . $this->getContexteEcran()->getPrgRetour() . '?' . 'action=nouvelClause&MODE=httpreq\', "", "'. trad('Traitement en cours...'). '");',
                    '!titre' => trad('Ajouter une ligne')
                );
            }
        }
        
        if ($this->getOngletAffiche() == $this->getEtatXml()) {
            $toolBar[] = array(
                '!type' => 'agrandir',
                '!selected' => 1,
                '!visible' => 0
            );
        } else {
            $toolBar[] = array(
                '!type' => 'agrandir',
                '!selected' => ($this->isModeMiseAjour() && $this->getMode() == $this->getEtatXml() ? 1 : 0),
                '!visible' => ($this->isModeMiseAjour() && $this->getMode() == $this->getEtatXml() ? 0 : 1)
            );
        }
        
        $array['ecran']['onglet'][$indiceOnglet] = array(
            '!templateName' => $this->getEtatXml(),
            '!visible' => $this->isFolderVisible($this->getEtatXml()),
            'entete' => array(
                '!id' => 'tag_' . $indiceOnglet,
                '!select' => true,
                '!texte' => trad('Clauses'),
                'toolbar' => array(
                    '!mode' => 32,
                    'element' => $toolBar
                )
            ),
            'detail' => array(
                'actif' => 0,
                'element' => array(
                    'liste' => array(
                        'entete' => array(
                            '!row' => 2,
                            'element' => array(
                                array(
                                    '!col' => '93px',
                                    'texte' => array(
                                        trad('Textes et Clauses contractuelles')
                                    )
                                ),
                                array(
                                    '!col' => '7px',
                                    'texte' => array(
                                        trad('Action')
                                    )
                                )
                            )
                        )
                    )
                ),
                'ligne' => $ligneArray
            )
        );
    }

    public function genArrayXmlPieceJointeAO($indiceOnglet, & $array)
    {
        $toolBar = null;
        $this->setEtatXml(AO_ecran::FOLDER_PIECE_JOINTE);
        
        if (! $this->isModeMiseAjour()) {
            if ($this->statutAO == 'P') { // Ajout d’une nouvelle pièce jointe. Possible en mode MODIFICATION si l’AO n’est pas validé [dbo].[AO_ENTET]. [DTE_VALID_AO] = ‘00/00/0000’.
                $toolBar[] = array(
                    '!type' => 'ajouter',
                    '!action' => 'CallUrlAsync(\'' . $this->getContexteEcran()->getPrgRetour() . '?' . 'action=nouvelPieceJointe&MODE=httpreq\', "", "'. trad('Traitement en cours...'). '");'
                );
                
                /*
                 * Pas de mode edit pour les PJ
                 * $toolBar[] = array(
                 * '!type' => 'edit',
                 * '!action' => 'CallUrl(\''.$this->getContexteEcran()->getPrgRetour().'?'.'action=modifiePieceJointe\');',
                 * );
                 */
            }
        } else if ($this->getMode() == $this->getEtatXml()) {
            $toolBar[] = array(
                '!type' => 'enregistrer',
                '!action' => 'CallUrlAsync(\'' . $this->getContexteEcran()->getPrgRetour() . '?' . 'action=enregisterPieceJointe&MODE=httpreq\', "", "'. trad('Traitement en cours...'). '");'
            );
            $toolBar[] = array(
                '!type' => 'annuler',
                '!action' => 'CallUrlAsync(\'' . $this->getContexteEcran()->getPrgRetour() . '?' . 'action=annulerPieceJointe&MODE=httpreq\', "", "'. trad('Traitement en cours...'). '");'
            );
        }
        
        if ($this->getOngletAffiche() == $this->getEtatXml()) {
            $toolBar[] = array(
                '!type' => 'agrandir',
                '!selected' => 1,
                '!visible' => 0
            );
        } else {
            $toolBar[] = array(
                '!type' => 'agrandir',
                '!selected' => ($this->isModeMiseAjour() && $this->getMode() == $this->getEtatXml() ? 1 : 0),
                '!visible' => ($this->isModeMiseAjour() && $this->getMode() == $this->getEtatXml() ? 0 : 1)
            );
        }
        
        $array['ecran']['onglet'][$indiceOnglet] = array(
            '!templateName' => $this->getEtatXml(),
            '!visible' => $this->isFolderVisible($this->getEtatXml()),
            'entete' => array(
                '!id' => 'tag_' . $indiceOnglet,
                '!select' => true,
                '!texte' => trad('Pièces Jointes'),
                'toolbar' => array(
                    '!mode' => 32,
                    'element' => $toolBar
                )
            ),
            'detail' => array(
                'actif' => 0,
                'element' => array(
                    'liste' => array(
                        'entete' => array(
                            '!row' => 2,
                            'element' => array(
                                array(
                                    '!col' => '15px',
                                    'texte' => array(
                                        trad('Type Document')
                                    )
                                ),
                                array(
                                    '!col' => '78px',
                                    'texte' => array(
                                        trad('Nom Document')
                                    )
                                ),
                                array(
                                    '!col' => '7px',
                                    'texte' => array(
                                        trad('Action')
                                    )
                                )
                            )
                        )
                    )
                )
            )
        );
        
        if (! $this->isModeCreation() || $this->getMode() != AO_ecran::FOLDER_ENTETE)
            if ($reqListe = SqlSuiviBis::rqAttachementAllType($this->getNumAo(), TypeSuivi::AO)->TrouveTous()) {
                // Pile de donnée
                
                foreach ($reqListe as & $ligne) {
                    $listeZone = null;
                    
                    $elementZone = & $this->getZone($this->getEtatXml(), $ligne['NO_ORDRE'], 'NO_ORDRE');
                    $elementZone['!value'] = $ligne['NO_ORDRE'];
                    $elementZone['!visible'] = 1;
                    $listeZone[] = array(
                        'zone' => $elementZone
                    );
                    
                    $elementZone = & $this->getZone($this->getEtatXml(), $ligne['NO_ORDRE'], 'TYPE');
                    $elementZone['!value'] = $ligne['!LABEL1'];
                    $elementZone['!visible'] = 1;
                    $listeZone[] = array(
                        'zone' => $elementZone
                    );
                    
                    $elementZone = & $this->getZone($this->getEtatXml(), $ligne['NO_ORDRE'], 'TITRE');
                    $elementZone['!value'] = $ligne['!LABEL2'];
                    $elementZone['!visible'] = 1;
                    $elementZone['!jsOpen'] = 'window.open("' . Fichier::GetUrl('pj', $ligne['!KEY1'], $ligne['!LABEL2']) . '");';
                    $listeZone[] = array(
                        'zone' => $elementZone
                    );
                    
                    $elementZone = & $this->getZone($this->getEtatXml(), $ligne['NO_ORDRE'], '_SUP');
                    $elementZone['!value'] = 'supprime';
                    $elementZone['!visible'] = 1;
                    $elementZone['!Format'] = 'image';
                    $elementZone['!action'] = 'CallUrl(\'' . $this->getContexteEcran()->getPrgRetour() . '?action=supprimer' . '&onglet=' . urlencode($this->getEtatXml()) . '&reference=' . urlencode($ligne['NO_ORDRE']) . '\');';
                    
                    $listeZone[] = array(
                        'zone' => $elementZone
                    );
                    
                    if (array_key_exists('!Etat', $ligne))
                        $array['ecran']['onglet'][$indiceOnglet]['detail']['ligne'][] = array(
                            '!Etat' => $ligne['!Etat'],
                            'col' => $listeZone
                        );
                    else
                        $array['ecran']['onglet'][$indiceOnglet]['detail']['ligne'][] = array(
                            'col' => $listeZone
                        );
                }
            }
    }

    public function genArrayXmlDocAttAO($indiceOnglet, & $array)
    {
        $toolBar = null;
        $this->setEtatXml(AO_ecran::FOLDER_DOC_RATTACHE);
        
        if (! $this->isModeMiseAjour()) {
            $toolBar[] = array(
                '!type' => 'ajouter',
                '!action' => 'CallUrlAsync(\'' . $this->getContexteEcran()->getPrgRetour() . '?' . 'action=nouvelDocRatt&MODE=httpreq\', "", "'. trad('Traitement en cours...'). '");'
            );
        } else if ($this->getMode() == $this->getEtatXml()) {
            $toolBar[] = array(
                '!type' => 'enregistrer',
                '!action' => 'CallUrlAsync(\'' . $this->getContexteEcran()->getPrgRetour() . '?' . 'action=enregisterDocRatt&MODE=httpreq\', "", "'. trad('Traitement en cours...'). '");'
            );
            $toolBar[] = array(
                '!type' => 'annuler',
                '!action' => 'CallUrlAsync(\'' . $this->getContexteEcran()->getPrgRetour() . '?' . 'action=annulerDocRatt&MODE=httpreq\', "", "'. trad('Traitement en cours...'). '");'
            );
        }
        
        if ($this->getOngletAffiche() == $this->getEtatXml()) {
            $toolBar[] = array(
                '!type' => 'agrandir',
                '!selected' => 1,
                '!visible' => 0
            );
        } else {
            $toolBar[] = array(
                '!type' => 'agrandir',
                '!selected' => ($this->isModeMiseAjour() && $this->getMode() == $this->getEtatXml() ? 1 : 0),
                '!visible' => ($this->isModeMiseAjour() && $this->getMode() == $this->getEtatXml() ? 0 : 1)
            );
        }
        
        $array['ecran']['onglet'][$indiceOnglet] = array(
            '!templateName' => $this->getEtatXml(),
            '!visible' => $this->isFolderVisible($this->getEtatXml()),
            'entete' => array(
                '!id' => 'tag_' . $indiceOnglet,
                '!select' => true,
                '!texte' => trad('Documents rattachés'),
                'toolbar' => array(
                    '!mode' => 32,
                    'element' => $toolBar
                )
            ),
            'detail' => array(
                'actif' => 0,
                'element' => array(
                    'liste' => array(
                        'entete' => array(
                            '!row' => 2,
                            'element' => array(
                                array(
                                    '!col' => '15px',
                                    'texte' => array(
                                        trad('Type Document')
                                    )
                                ),
                                array(
                                    '!col' => '78px',
                                    'texte' => array(
                                        trad('Nom Document')
                                    )
                                ),
                                array(
                                    '!col' => '7px',
                                    'texte' => array(
                                        trad('Action')
                                    )
                                )
                            )
                        )
                    )
                )
            )
        );
        
        if (! $this->isModeCreation() || $this->getMode() != AO_ecran::FOLDER_ENTETE)
            if ($reqListe = SqlInfo::rqGetDocRattByItem('AO_ENTET', $this->getNumAo())->TrouveTous()) {
                
                foreach ($reqListe as & $ligne) {
                    $listeZone = null;
                    
                    $elementZone = & $this->getZone($this->getEtatXml(), $ligne['NO_ORDRE'], 'NO_ORDRE');
                    $elementZone['!value'] = $ligne['NO_ORDRE'];
                    $elementZone['!visible'] = 1;
                    $listeZone[] = array(
                        'zone' => $elementZone
                    );
                    
                    $elementZone = & $this->getZone($this->getEtatXml(), $ligne['NO_ORDRE'], 'TYPE');
                    $elementZone['!value'] = $ligne['TYPE_PJ'];
                    $elementZone['!visible'] = 1;
                    $listeZone[] = array(
                        'zone' => $elementZone
                    );
                    
                    $elementZone = & $this->getZone($this->getEtatXml(), $ligne['NO_ORDRE'], 'TITRE');
                    $elementZone['!value'] = $ligne['NOM_ORI'];
                    $elementZone['!visible'] = 1;
                    $elementZone['!jsOpen'] = 'window.open("' . Fichier::GetUrl('pj', $ligne['NOM_FIC'], $ligne['NOM_ORI']) . '");';
                    $listeZone[] = array(
                        'zone' => $elementZone
                    );
                    
                    $elementZone = & $this->getZone($this->getEtatXml(), $ligne['NO_ORDRE'], '_SUP');
                    $elementZone['!value'] = 'supprime';
                    $elementZone['!visible'] = 1;
                    $elementZone['!Format'] = 'image';
                    $elementZone['!action'] = 'CallUrl(\'' . $this->getContexteEcran()->getPrgRetour() . '?action=supprimer' . '&onglet=' . urlencode($this->getEtatXml()) . '&reference=' . urlencode($ligne['NO_ORDRE']) . '\');';
                    $listeZone[] = array(
                        'zone' => $elementZone
                    );
                    
                    if (array_key_exists('!Etat', $ligne))
                        $array['ecran']['onglet'][$indiceOnglet]['detail']['ligne'][] = array(
                            '!Etat' => $ligne['!Etat'],
                            'col' => $listeZone
                        );
                    else
                        $array['ecran']['onglet'][$indiceOnglet]['detail']['ligne'][] = array(
                            'col' => $listeZone
                        );
                }
            }
    }

    public function &buildXml($ecran = null)
    {
        $array = null;
        if (is_null($ecran))
            $this->genArrayXmlTitre($array);
        
        $indiceOnglet = - 1;
        
        // Fabrication de la toolbar
        if (is_null($this->getOngletAffiche())) {
            $indiceOnglet ++;
            if (is_null($ecran) || $ecran == AO_ecran::FOLDER_ENTETE)
                $this->genArrayXmlEnteteAO($indiceOnglet, $array);
            $indiceOnglet ++;
            if (is_null($ecran) || $ecran == AO_ecran::FOLDER_LIGNE)
                $this->genArrayXmlLigneAO($indiceOnglet, $array);
            $indiceOnglet ++;
            if (is_null($ecran) || $ecran == AO_ecran::FOLDER_FOURNISSEUR)
                $this->genArrayXmlFournisseurAO($indiceOnglet, $array);
            $indiceOnglet ++;
            if (is_null($ecran) || $ecran == AO_ecran::FOLDER_CLAUSE)
                $this->genArrayXmlClauseAO($indiceOnglet, $array);
            $indiceOnglet ++;
            if (is_null($ecran) || $ecran == AO_ecran::FOLDER_PIECE_JOINTE)
                $this->genArrayXmlPieceJointeAO($indiceOnglet, $array);
            $indiceOnglet ++;
            if (is_null($ecran) || $ecran == AO_ecran::FOLDER_DOC_RATTACHE)
                $this->genArrayXmlDocAttAO($indiceOnglet, $array);
            
            $indiceOnglet ++;
            if (is_null($ecran) || $ecran == AO_ecran::FOLDER_QUESTIONNAIRE) {
                if (array_key_exists('#text', $this->wsdlObject['NO_AO']))
                    $no_ao = $this->wsdlObject['NO_AO']['#text'];
                else
                    $no_ao = 0;
                $obj_Questionnaire = new AO_Questionnaire($no_ao);
                $CODE_STE = $this->mapDatabase['AO']['CODE_STE']['#text'];
                $TYPE_SOC_GS = $this->mapDatabase['AO']['TYPE_SOC_GS']['#text'];
                // On prend cet élément plutôt que le wsdl du nouveau framework EDP ne gère pas automatiquement les niveaux de tableaux dans l'arborescence
                $xml_node = AOQuestionnaireXml::GetFiche($no_ao);
                $array['ecran']['onglet'][$indiceOnglet] = $obj_Questionnaire->buildXmlFrameworkEDP($indiceOnglet, $no_ao, $xml_node, $TYPE_SOC_GS, $CODE_STE);
            }
        } else {
            $indiceOnglet ++;
            if ($this->getOngletAffiche() == AO_ecran::FOLDER_ENTETE)
                $this->genArrayXmlEnteteAO($indiceOnglet, $array);
            $indiceOnglet ++;
            if ($this->getOngletAffiche() == AO_ecran::FOLDER_LIGNE)
                $this->genArrayXmlLigneAO($indiceOnglet, $array);
            $indiceOnglet ++;
            if ($this->getOngletAffiche() == AO_ecran::FOLDER_FOURNISSEUR)
                $this->genArrayXmlFournisseurAO($indiceOnglet, $array);
            $indiceOnglet ++;
            if ($this->getOngletAffiche() == AO_ecran::FOLDER_CLAUSE)
                $this->genArrayXmlClauseAO($indiceOnglet, $array);
            $indiceOnglet ++;
            if ($this->getOngletAffiche() == AO_ecran::FOLDER_PIECE_JOINTE)
                $this->genArrayXmlPieceJointeAO($indiceOnglet, $array);
            $indiceOnglet ++;
            if ($this->getOngletAffiche() == AO_ecran::FOLDER_DOC_RATTACHE)
                $this->genArrayXmlDocAttAO($indiceOnglet, $array);
            
            $indiceOnglet ++;
            if ($this->getOngletAffiche() == AO_ecran::FOLDER_QUESTIONNAIRE) {
                if (array_key_exists('#text', $this->wsdlObject['NO_AO']))
                    $no_ao = $this->wsdlObject['NO_AO']['#text'];
                else
                    $no_ao = 0;
                $obj_Questionnaire = new AO_Questionnaire($no_ao);
                $mode = ($this->isModeMiseAjour()) ? 'LE' : 'L';
                $array['ecran']['onglet'][$indiceOnglet] = $obj_Questionnaire->buildXmlFrameworkEDP($indiceOnglet, $no_ao, $this->wsdlObject['Questionnaire'], $mode);
            }
        }
        
        $array['ecran']['!nbOnglet'] = count($array['ecran']['onglet']);
        
        if ($this->isModePopup())
            $array['fiche']['!modePopup'] = 1;
        
        $array['fiche']['!modeCreation'] = $this->isModeCreation();
        $array['fiche']['!modeMiseAjour'] = $this->isModeMiseAjour();
        
        return $array;
    }

    public function arrayAoLigne(& $ligne, $zoneDelai)
    {
        if (! array_key_exists('!TITRE_AV', $ligne))
            $ligne['!TITRE_AV'] = (trim(StdXmlWsdl::getValueZoneInterne($ligne['TITRE_AV'])) == '' ? '1' : '0');
        if (! array_key_exists('!TITRE_ST', $ligne))
            $ligne['!TITRE_ST'] = (trim(StdXmlWsdl::getValueZoneInterne($ligne['TITRE_ST'])) == '' ? '1' : '0');
            
        $zoneTITRE_AV = StdXmlWsdl::getXmlValueZone($ligne, 'TITRE_AV', $this);
        
        $listeZone = array(
            array(
                'zone' => array(
                    $zoneTITRE_AV
                )
            ),
            array(
                'zone' => array(
                    StdXmlWsdl::getXmlValueZone($ligne, 'NO_PO', $this)
                )
            ),
            array(
                'zone' => array(
                    StdXmlWsdl::getXmlValueZone($ligne, 'NO_DA', $this)
                )
            ),
            array(
                'zone' => array(
                    StdXmlWsdl::getXmlValueZone($ligne, 'NO_PO_DA', $this)
                )
            ),
            array(
                'zone' => array(
                    '!codeLibelle' => 0,
                    StdXmlWsdl::getXmlValueZone($ligne, 'CODE_ART', $this)
                )
            ),
            array(
                'zone' => array(
                    StdXmlWsdl::getXmlValueZone($ligne, 'DES', $this)
                )
            ),
            array(
                'zone' => array(
                    StdXmlWsdl::getXmlValueZone($ligne, 'DCOMP', $this)
                )
            ),
            array(
                'zone' => array(
                    StdXmlWsdl::getXmlValueZone($ligne, 'QTE', $this)
                )
            ),
            array(
                'zone' => array(
                    StdXmlWsdl::getXmlValueZone($ligne, 'UNITE', $this)
                )
            ),
            array(
                'zone' => array(
                    StdXmlWsdl::getXmlValueZone($ligne, $zoneDelai, $this)
                )
            ),
            array(
                'zone' => array(
                    StdXmlWsdl::getXmlValueZone($ligne, 'BUDGET', $this)
                )
            ),
            array(
                'zone' => array(
                    StdXmlWsdl::getXmlValueZone($ligne, 'PRIX_REF', $this)
                )
            ),
            array(
                'zone' => array(
                    StdXmlWsdl::getXmlValueZone($ligne, 'ORI_PRIX_REF', $this)
                )
            ),
            array(
                'zone' => array(
                    StdXmlWsdl::getXmlValueZone($ligne, 'SSFAMILLE', $this)
                )
            ),
            array(
                'zone' => array(
                    StdXmlWsdl::getXmlValueZone($ligne, 'COD_FAB', $this)
                )
            ),
            array(
                'zone' => array(
                    StdXmlWsdl::getXmlValueZone($ligne, 'COD_GAM', $this)
                )
            ),
            array(
                'zone' => array(
                    StdXmlWsdl::getXmlValueZone($ligne, 'REF_FAB', $this)
                )
            ),
            array(
                'zone' => array(
                    StdXmlWsdl::getXmlValueZone($ligne, 'TITRE_AV', $this)
                )
            ),
            array(
                'zone' => array(
                    StdXmlWsdl::getXmlValueZone($ligne, 'SSTOTAL', $this)
                )
            ),
            array(
                'zone' => array(
                    StdXmlWsdl::getXmlValueZone($ligne, 'TITRE_ST', $this)
                )
            ),
            array(
                'zone' => array(
                    StdXmlWsdl::getXmlValueZone($ligne, 'existCC', $this, false, $this->isModeMiseAjour() && $this->getMode() == $this->getEtatXml())
                )
            ),
        );
        
        if ($this->isModeMiseAjour() && $this->getMode() == $this->getEtatXml()) {
            if (array_key_exists('!Etat', $ligne) && $ligne['!Etat'] == 'S') {
                $elementZone = & $this->getZone($this->getEtatXml(), $zoneTITRE_AV['!nameZone'], '_SUP');
                $elementZone['!value'] = 'reactiver';
                $elementZone['!visible'] = 1;
                $elementZone['!Format'] = 'image';
                $elementZone['!titre'] = trad('Réactiver la ligne');
                $elementZone['!action'] = 'CallUrl(\'' . $this->getContexteEcran()->getPrgRetour() . '?action=reactiver' . '&onglet=' . urlencode($this->getEtatXml()) . '&reference=' . urlencode($zoneTITRE_AV['!nameZone']) . '\');reloadAfterDelete(); ';
                
                $listeZone[] = array(
                    'zone' => $elementZone
                );
            } else {
                $elementZone = & $this->getZone($this->getEtatXml(), $zoneTITRE_AV['!nameZone'], '_SUP');
                $elementZone['!value'] = 'supprime';
                $elementZone['!visible'] = 1;
                $elementZone['!Format'] = 'image';
                $elementZone['!titre'] = trad('Supprimer la ligne');
                $elementZone['!action'] = 'CallUrl(\'' . $this->getContexteEcran()->getPrgRetour() . '?action=supprimer' . '&onglet=' . urlencode($this->getEtatXml()) . '&reference=' . urlencode($zoneTITRE_AV['!nameZone']) . '\');reloadAfterDelete(); ';
                
                $listeZone[] = array(
                    'zone' => $elementZone
                );
                
                // On va se baser sur un element boolean pouvant etre générer à la volet
                if ($ligne['!TITRE_AV'] == 1) {
                    /**
                     * Pour activer la saisie d'un titre avant
                     */
                    $elementZone = & $this->getZone($this->getEtatXml(), $zoneTITRE_AV['!nameZone'], '_ACT_AV');
                    $elementZone['!value'] = 'supprime';
                    $elementZone['!visible'] = 1;
                    $elementZone['!Format'] = 'image';
                    $elementZone['!titre'] = trad('Ajouter un titre avant la ligne');
                    $elementZone['!action'] = 'CallUrl(\'' . $this->getContexteEcran()->getPrgRetour() . '?action=TITRE_AV_act' . '&onglet=' . urlencode($this->getEtatXml()) . '&reference=' . urlencode($zoneTITRE_AV['!nameZone']) . '\');';
                    $listeZone[] = array(
                        'zone' => $elementZone
                    );
                } else {
                    /**
                     * Pour désactiver la saisie d'un titre avant
                     */
                    $elementZone = & $this->getZone($this->getEtatXml(), $zoneTITRE_AV['!nameZone'], '_DES_AV');
                    $elementZone['!value'] = 'supprime';
                    $elementZone['!visible'] = 1;
                    $elementZone['!Format'] = 'image';
                    $elementZone['!titre'] = trad('Supprimer le titre');
                    $elementZone['!action'] = 'CallUrl(\'' . $this->getContexteEcran()->getPrgRetour() . '?action=TITRE_AV_des' . '&onglet=' . urlencode($this->getEtatXml()) . '&reference=' . urlencode($zoneTITRE_AV['!nameZone']) . '\');';
                    $listeZone[] = array(
                        'zone' => $elementZone
                    );
                }
                
                if ($ligne['!TITRE_ST'] == 1) {
                    /**
                     * Pour activer la saisie d'un titre avant
                     */
                    $elementZone = & $this->getZone($this->getEtatXml(), $zoneTITRE_AV['!nameZone'], '_ACT_ST');
                    $elementZone['!value'] = 'supprime';
                    $elementZone['!visible'] = 1;
                    $elementZone['!Format'] = 'image';
                    $elementZone['!titre'] = trad('Ajouter un sous-total après la ligne');
                    $elementZone['!action'] = 'CallUrl(\'' . $this->getContexteEcran()->getPrgRetour() . '?action=TITRE_ST_act' . '&onglet=' . urlencode($this->getEtatXml()) . '&reference=' . urlencode($zoneTITRE_AV['!nameZone']) . '\');';
                    $listeZone[] = array(
                        'zone' => $elementZone
                    );
                } else {
                    /**
                     * Pour désactiver la saisie d'un titre avant
                     */
                    $elementZone = & $this->getZone($this->getEtatXml(), $zoneTITRE_AV['!nameZone'], '_DES_ST');
                    $elementZone['!value'] = 'supprime';
                    $elementZone['!visible'] = 1;
                    $elementZone['!Format'] = 'image';
                    $elementZone['!titre'] = trad('Supprimer le sous total');
                    $elementZone['!action'] = 'CallUrl(\'' . $this->getContexteEcran()->getPrgRetour() . '?action=TITRE_ST_des' . '&onglet=' . urlencode($this->getEtatXml()) . '&reference=' . urlencode($zoneTITRE_AV['!nameZone']) . '\');';
                    $listeZone[] = array(
                        'zone' => $elementZone
                    );
                }
            }
        }
        
        return array(
            '!Etat' => (is_array($ligne) && array_key_exists('!Etat', $ligne) ? $ligne['!Etat'] : ''),
            'col' => $listeZone
        );
    }

    public function recherche($onglet, $zoneRecherche)
    {
        $nomFolder = '';
        switch ($onglet) {
            case AO_ecran::FOLDER_LIGNE:
                $nomFolder = 'ListLignes';
                break;
        }
        if ($nomFolder != '') {
            if (array_key_exists($nomFolder, $this->listePageRecherche)) {
                $classPage = $this->listePageRecherche[$nomFolder];
                if ($classPage instanceof XmlPageRecherche) {
                    $texte = trim(getValue($zoneRecherche));
                    if ($texte != '') {
                        if ($retour = AO::CallWsdlAORechercheLigne($this->login, $this->getProperties('NO_AO'), $texte)) {
                            $okWsdl = false;
                            if (array_key_exists('Statut', $retour)) {
                                $okWsdl = true;
                                if ($retour['Statut']['#text'] == 'O' || $retour['Statut']['#text'] == 'A') {
                                    /**
                                     * ListeChampsRecherche/Champ : Recuperation de la liste des champs pemettant la recherche
                                     *
                                     * Collecte la liste des champs pour savoir quels sont les champs à scanner
                                     */
                                    
                                    /**
                                     * ListeResultats/Resultat/NoPage ,
                                     *
                                     * Ces numeros de pages doivent etre stocké dans la class
                                     */
                                    
                                    /**
                                     * Ici on va chercher dans les lignes existante si l'on trouve aussi cette information et stocké la page dans la classe
                                     * si deja pas existante dedans
                                     */
                                    
                                    // En dernier on se place sur la premiere page et on met un curseur de l'element trouvé
                                    if ($retour['Statut']['#text'] == 'A') {
                                        // Affichage::messageJS($retour['MsgErreur']['#text']);
                                    }
                                    
                                    if (array_key_exists('ListLignes', $this->wsdlObject) && array_key_exists('Ligne', $this->wsdlObject['ListLignes']))
                                        $indexTabLigne = & $this->wsdlObject['ListLignes']['Ligne'];
                                    else
                                        $indexTabLigne = null;
                                    
                                    $listeChamp = null;
                                    
                                    if (array_key_exists($nomFolder, $this->listePageOnglet))
                                        $classPageOnglet = $this->listePageOnglet[$nomFolder];
                                    else
                                        $classPageOnglet = null;
                                    
                                    $classPage->resetZoneRecherche($retour, $indexTabLigne, $classPageOnglet);
                                    if (array_key_exists('ListeChampsRecherche', $retour) && array_key_exists('Champ', $retour['ListeChampsRecherche'])) {
                                        $pointeur = & $retour['ListeChampsRecherche']['Champ'];
                                        if (array_key_exists('0', $pointeur))
                                            $listeChamp = & $pointeur;
                                        else
                                            $listeChamp[0] = $pointeur;
                                        
                                        foreach ($listeChamp as $index => & $zone)
                                            $classPage->ajouteZoneRecherche(StdXmlWsdl::getValueZoneInterne($zone));
                                    }
                                    
                                    $classPage->setTexteRecherche($texte);
                                    if ($ret = $classPage->trouvePageRecherche($indexTabLigne, $classPageOnglet))
                                        $this->recherchePremier($onglet);
                                    else
                                        Affichage::messageJS(trad('Aucun résultat'));
                                } else {
                                    Affichage::messageJS($retour['MsgErreur']['#text']);
                                }
                            }
                        }
                        if (! $okWsdl) {
                            if (is_array($retour))
                                print_r($retour);
                            else {
                                Affichage::messageJS(trad('Erreur de l\'appel du WebService de recherche'));
                            }
                        }
                    }
                }
            }
        }
    }

    public function recherchePremier($onglet)
    {
        $nomFolder = '';
        switch ($onglet) {
            case AO_ecran::FOLDER_LIGNE:
                $nomFolder = 'ListLignes';
                break;
        }
        if ($nomFolder != '') {
            if (array_key_exists($nomFolder, $this->listePageRecherche))
                $classPage = $this->listePageRecherche[$nomFolder];
            else
                $classPage = null;
            
            if (array_key_exists($nomFolder, $this->listePageOnglet))
                $classPageOnglet = $this->listePageOnglet[$nomFolder];
            else
                $classPageOnglet = null;
            
            if ($classPage instanceof XmlPageRecherche && $classPageOnglet instanceof XmlPageOnglet) {
                $classPage->initIndexCurseurRecherche();
                
                $this->rechercheSuivant($onglet);
            }
        }
    }

    public function rechercheSuivant($onglet)
    {
        $nomFolder = '';
        switch ($onglet) {
            case AO_ecran::FOLDER_LIGNE:
                $nomFolder = 'ListLignes';
                break;
        }
        if ($nomFolder != '') {
            if (array_key_exists($nomFolder, $this->listePageRecherche))
                $classPage = $this->listePageRecherche[$nomFolder];
            else
                $classPage = null;
            
            if (array_key_exists($nomFolder, $this->listePageOnglet))
                $classPageOnglet = $this->listePageOnglet[$nomFolder];
            else
                $classPageOnglet = null;
            
            if ($classPage instanceof XmlPageRecherche && $classPageOnglet instanceof XmlPageOnglet) {
                
                // Systeme permettant de basculer
                if ($classPage->getIndexCurseur() == - 1)
                    $ageCourante = 0;
                else
                    $ageCourante = $classPageOnglet->getPageCourante();
                
                while (true) {
                    if ($ret = $classPage->nextIndexCurseur()) {
                        $page = $ret['!NoPage'];
                        if ($page != $ageCourante)
                            break;
                    } else
                        break;
                }
                
                if (is_array($ret)) {
                    $page = $ret['!NoPage'];
                    if ($ret['!Index'] == - 1) {
                        
                        if (array_key_exists('ListLignes', $this->wsdlObject) && array_key_exists('Ligne', $this->wsdlObject['ListLignes']))
                            $indexTabLigne = & $this->wsdlObject['ListLignes']['Ligne'];
                        else
                            $indexTabLigne = null;
                        
                        if ($classPage->trouvePageRecherche($indexTabLigne, $classPageOnglet)) {
                            // Rien
                        } else {
                            Affichage::messageJS(trad('Plus de résultat'));
                        }
                    }
                    
                    $this->changePage($onglet, $page);
                } else {
                    Affichage::messageJS(trad('Plus de résultat'));
                }
            }
        }
    }

    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)) {
                        if ($retour = AO::CallWsdlGetAO($this->login, $this->getProperties('NO_AO'), 'LIGNES', $page)) {

                            /*** SPEC 4241 Caractéristiques complémentaires : l'icône des CC est présente dans tous les cas, elle est cachée lorsqu'il n'y a pas de CC  ***/
                            /*
                            $NO_AO = $this->getNumAo();
                            if($NO_AO && isset($retour['AO']['ListLignes']['Ligne']))
                            {
                                // Recherche des CC par ligne avec DOC_TYPE='AOT'
                                if(isset($retour['AO']['ListLignes']['Ligne']['NO_PO'])){
                                    $NO_PO = $retour['AO']['ListLignes']['Ligne']['NO_PO']['#text'];
                                    $listeCCLigne = CaracteristiquesCompl::getListeCCDoc('AOT', $NO_AO, $NO_PO, $_SESSION['id_user']);
                                    $existCC = isset($listeCCLigne) && count($listeCCLigne)>0;
                                    $retour['AO']['ListLignes']['Ligne']['existCC']['#text'] = $existCC;
                                    $retour['AO']['ListLignes']['Ligne']['existCC']['!onclick'] = "window.open('popup_caractCompl.php?action=afficherCcCs&page=AO&DOC_NUM=$NO_AO&doc_line_num=$NO_PO&pg_src=AO_fiche','popup_caractCompl','width=870, height=475'); return false;";
                                }else{
                                    foreach($retour['AO']['ListLignes']['Ligne'] as &$ligne){
                                        $NO_PO = $ligne['NO_PO']['#text'];
                                        $listeCCLigne = CaracteristiquesCompl::getListeCCDoc('AOT', $NO_AO, $NO_PO, $_SESSION['id_user']);
                                        $existCC = isset($listeCCLigne) && count($listeCCLigne)>0;
                                        $ligne['existCC']['#text'] = $existCC;
                                        $ligne['existCC']['!onclick'] = "window.open('popup_caractCompl.php?action=afficherCcCs&page=AO&DOC_NUM=$NO_AO&doc_line_num=$NO_PO&pg_src=AO_fiche','popup_caractCompl','width=870, height=475'); return false;";
                                    }
                                }
                            }
                            */

                            $listeTmp = & $retour['AO']['ListLignes']['Ligne'];
                            $listeLigne = null;
                            
                            if (array_key_exists(0, $listeTmp))
                                $listeLigne = & $listeTmp;
                            else
                                $listeLigne[0] = & $listeTmp;
                            
                            foreach ($listeLigne as & $ligne)
                                $this->ajouteLigneWsdl($ligne, false, $classPage);
                            
                            $classPage->ajoutePage($page);
                        }
                    }
                    
                    $classPage->setPageCourante($page);
                    // Affichage de la page
                    
                    $obj_xml = $this->refresh(AO_ecran::XSL_FILE, null, $onglet);
                }
            }
        }
    }

    /**
     * Pour appeler cette fonction il faut passer le nom de l'object voulu renvoyer en toute logique par le wsdl de magic
     * Ouvrir
     *
     * @param unknown $zone
     */
    public function afficheLoupe($zone)
    {
        if ($nodeXml = $this->rechercheNode($zone, $this->wsdlObject)) {
            $cle = array_keys($nodeXml)[0];
            $value = & $nodeXml[$cle];
            $parent = & $this->getParent($value, $this->wsdlObject);
            if (array_key_exists('!Objet', $value)) 
            {
                switch ($value['!Objet']) {
                    case 'SOCIETE':
                        switch (StdXmlWsdl::getValueZoneInterne($parent['TYPE_SOC_GS'])) {
                            case 'S':
                                echo " OpenPopup('ctrl_liste_societes.php?action=initPopup&popup_id=SOCIETES_USER" . "&formName=" . $this->getFormulaire() . "&backForm=" . $this->getFormulaire() . "&inputField=" . $zone  . "&backAction=change" . "&backMode=form" . "&backPopup=1" . "&backField=" . $zone . "&modeHtml=1" . "','popup_liste_societes_user',700,700);";
                                break;
                            case 'G':
                                // en mode groupe c'est une combo
                                break;
                        }
                        break;
                    case 'ACHETEUR':
                        switch (StdXmlWsdl::getValueZoneInterne($parent['TYPE_SOC_GS'])) {
                            case 'S':
                                if (StdXmlWsdl::getValueZoneInterne($parent['CODE_STE']) == '') {
                                    Affichage::messageJS(trad('Veuillez sélectionner une société ou un groupe de société'));
                                    return;
                                } else {
                                    $urlParam = "&CODE_STE=" . StdXmlWsdl::getValueZoneInterne($parent['CODE_STE']);
                                }
                                break;
                            case 'G':
                                if (StdXmlWsdl::getValueZoneInterne($parent['CODE_STE']) == '') {
                                    Affichage::messageJS(trad('Veuillez sélectionner une société ou un groupe de société'));
                                    return;
                                } else {
                                    $urlParam = "&GRPSOC=" . StdXmlWsdl::getValueZoneInterne($parent['CODE_STE']);
                                }
                                break;
                            default:
                                Affichage::messageJS(trad('Veuillez sélectionner une société ou un groupe de société'));
                                return;
                        }
                        echo "OpenPopup('ctrl_liste_users_panier_transfert.php?action=initPopup&popup_id=ACHETEURS" . "&formName=" . $this->getFormulaire() . "&backForm=" . $this->getFormulaire() . "&inputField={$zone}"  . "&backAction=change" . "&backPopup=1" . "&backField=" . $zone . "&title=" . urlencode(trad('Liste des acheteurs')) . $urlParam . // ATTENTION NOTION STE / NOTION DE GROUPE
"&modeHtml=1" . "','popup_liste_users_transfert_panier',700,600);";
                        break;
                    case 'CENTRE_E':
                        switch (StdXmlWsdl::getValueZoneInterne($parent['TYPE_SOC_GS'])) {
                            case 'S':
                                if (StdXmlWsdl::getValueZoneInterne($parent['CODE_STE']) == '') {
                                    Affichage::messageJS(trad('Veuillez sélectionner une société ou un groupe de société'));
                                    return;
                                } else {
                                    $urlParam = "&CODE_STE=" . StdXmlWsdl::getValueZoneInterne($parent['CODE_STE']);
                                }
                                break;
                            case 'G':
                                if (StdXmlWsdl::getValueZoneInterne($parent['CODE_STE']) == '') {
                                    Affichage::messageJS(trad('Veuillez sélectionner une société ou un groupe de société'));
                                    return;
                                } else {
                                    $urlParam = "&GRPSOC=" . StdXmlWsdl::getValueZoneInterne($parent['CODE_STE']);
                                }
                                break;
                            default:
                                Affichage::messageJS(trad('Veuillez sélectionner une société ou un groupe de société'));
                                return;
                        }
                        echo "OpenPopup('ctrl_liste_ctr_emet.php?action=initPopup&popup_id=CENTRE_E" . "&formName=" . $this->getFormulaire() . "&backForm=" . $this->getFormulaire() . "&inputField={$zone}"  . "&backAction=change" . "&backPopup=1" . "&backField=" . $zone . $urlParam . // ATTENTION NOTION STE / NOTION DE GROUPE
"&modeHtml=1" . "','popup_liste_ctr_emet',900,700);";

                        
                        break;
                    case 'CENTRE_L':
                        switch (StdXmlWsdl::getValueZoneInterne($parent['TYPE_SOC_GS'])) {
                            case 'S':
                                if (StdXmlWsdl::getValueZoneInterne($parent['CODE_STE']) == '') {
                                    Affichage::messageJS(trad('Veuillez sélectionner une société ou un groupe de société'));
                                    return;
                                } else {
                                    $urlParam = "&CODE_STE=" . StdXmlWsdl::getValueZoneInterne($parent['CODE_STE']);
                                }
                                break;
                            case 'G':
                                if (StdXmlWsdl::getValueZoneInterne($parent['CODE_STE']) == '') {
                                    Affichage::messageJS(trad('Veuillez sélectionner une société ou un groupe de société'));
                                    return;
                                } else {
                                    $urlParam = "&GRPSOC=" . StdXmlWsdl::getValueZoneInterne($parent['CODE_STE']);
                                }
                                break;
                            default:
                                Affichage::messageJS(trad('Veuillez sélectionner une société ou un groupe de société'));
                                return;
                        }
                        echo "OpenPopup('ctrl_liste_ctr_emet.php?action=initPopup&popup_id=CENTRE_R" . "&formName=" . $this->getFormulaire() . "&backForm=" . $this->getFormulaire() . "&inputField={$zone}"  . "&backAction=change" . "&backPopup=1" . "&backField=" . $zone . $urlParam . "&modeHtml=1" . "','popup_liste_ctr_emet',900,700);";
                        
                        break;
                    // LANGUES (pas de popup car c'est une combo
                    // DEVISES (pas de popup car c'est une combo
                    // UNITES (pas de popup car c'est une combo
                    case 'GAMMES': // on passe la référence fabricant aussi
                        echo "OpenPopup('ctrl_liste_gammes.php?action=initPopup&popup_id=" . $value['!Objet'] . "&formName=" . $this->getFormulaire() . "&backForm=" . $this->getFormulaire() . "&inputField={$zone}"  . "&backAction=change" . "&backPopup=1" . "&backField=" . $zone . "&modeHtml=1" . "&CODEFABR=" . urldecode(StdXmlWsdl::getValueZoneInterne($parent['COD_FAB'])) . "','popup_de_liste',750,600);";
                        break;
                    case 'FOURNISS':
                        switch (StdXmlWsdl::getValueZoneInterne($parent['TYPE_FG'])) {
                            case 'F':
                                
                                $code_sous_famille = '';
                                $code_art_haplus = '';
                                
                                $code_sous_familleListe = array();
                                $code_art_haplusListe = array();
                                // ListLignes
                                // code_sous_famille code_art_haplus
                                $indiceOnglet = 0;
                                if (array_key_exists('ListLignes', $this->wsdlObject)) {
                                    foreach ($this->wsdlObject['ListLignes'] as $index => & $record) {
                                        if ($index == 'Ligne') { // INTERDICTION ABSOLUE DE METTRE des affectations direct sur pointeur sinon perte de certain niveau
                                            if (array_key_exists(0, $record))
                                                $ptr[$indiceOnglet] = & $record;
                                            else
                                                $ptr[$indiceOnglet][0] = & $record;
                                            
                                            foreach ($ptr[$indiceOnglet] as & $ligne) {
                                                $SSFAMILLE = StdXmlWsdl::getValueZoneInterne($ligne['SSFAMILLE']);
                                                if ($SSFAMILLE != '' && ! array_key_exists($SSFAMILLE, $code_sous_familleListe)) {
                                                    $code_sous_familleListe[$SSFAMILLE] = true;
                                                    $code_sous_famille .= ($code_sous_famille == '' ? '' : '|') . $SSFAMILLE;
                                                }
                                                $CODE_ART = StdXmlWsdl::getValueZoneInterne($ligne['CODE_ART']);
                                                if ($CODE_ART != '' && ! array_key_exists($CODE_ART, $code_art_haplusListe)) {
                                                    $code_art_haplusListe[$CODE_ART] = true;
                                                    $code_art_haplus .= ($code_art_haplus == '' ? '' : '|') . $CODE_ART;
                                                }
                                            }
                                        }
                                    }
                                }
                                
                                echo "OpenPopup('ctrl_liste_frs.php?action=initPopup&popup_id=FOURNISS" . "&formName=" . $this->getFormulaire() . "&backForm=" . $this->getFormulaire() . "&inputField={$zone}"  . "&backAction=change" . "&backPopup=1" . "&backField=" . $zone . "&modeHtml=1" . "&NVIBOXAP=1" . "&editable=true" . ($code_sous_famille != '' ? "&code_sous_famille=" . urlencode($code_sous_famille) : '') . ($code_art_haplus != '' ? "&code_art_haplus=" . urlencode($code_art_haplus) : '') . "','popup_fournisseur',800,650);";
                                break;
                            case 'G':
                                // en mode groupe c'est une combo
                                echo "OpenPopup('ctrl_liste_grpfou.php?action=initPopup&popup_id=GRPFOU" . "&formName=" . $this->getFormulaire() . "&backForm=" . $this->getFormulaire() . "&inputField={$zone}"  . "&backAction=change" . "&backPopup=1" . "&backField=" . $zone . "&modeHtml=1" . "','popup_grpfou',800,650);";
                                break;
                        }
                        break;
                    case 'AO_ENTET':
                        if (StdXmlWsdl::getValueZoneInterne($parent['CODE_STE']) == '') {
                            Affichage::messageJS(trad('Veuillez sélectionner une société ou un groupe de société'));
                            return;
                        } else {
                            $urlParam = "&GrpSoc=" . StdXmlWsdl::getValueZoneInterne($parent['TYPE_SOC_GS'])."&Societe=" . StdXmlWsdl::getValueZoneInterne($parent['CODE_STE']);
                        }
                        echo "OpenPopup('ctrl_liste_ao.php?action=initPopup&popup_id=AO_ENTET" . "&formName=" . $this->getFormulaire() . "&backForm=" . $this->getFormulaire() . "&inputField={$zone}"  . "&backAction=change" . "&backPopup=1" . "&backField=" . $zone . ($urlParam ?? '') . "&modeHtml=1" . "','popup_liste_ao',900,700);";
                        break;
                    default:
                        $listStd = XmlWsdlOutil::getListeStandard($value['!Objet'], $this->getFormulaire(), $zone);
                        if ($listStd != '') {
                            echo $listStd;
                        } else
                            Affichage::messageJS(strBuild(trad('Manque développement loupe sur object : @1@'), $value['!Objet']));
                        break;
                }
            }
        } else if ($nodeXml = $this->rechercheNode($zone, $this->getDataObject())) {
            $cle = array_keys($nodeXml)[0];
            $value = & $nodeXml[$cle];
            
            if ($nodeXmlImpact = $this->rechercheNode($value['!value'], $this->wsdlObject)) {
                $cleImpact = array_keys($nodeXmlImpact)[0];
                $valueImpact = & $nodeXmlImpact[$cleImpact];
                $parent = $this->getParent($valueImpact, $this->wsdlObject);
                
                switch ($value['!nameCtrl']) {
                    case '_LOUPE_ADR':
                        switch (StdXmlWsdl::getValueZoneInterne($parent['TYPE_FG'])) {
                            case 'F':
                                if (StdXmlWsdl::getValueZoneInterne($parent['CODE_FOU']) == '')
                                    Affichage::messageJS('Veuillez d\'abord sélectionner un fournisseur');
                                else
                                    echo "OpenPopup('ctrl_liste_adr_four.php?action=initPopup&popup_id=ADRFOUR" . "&formName=" . $this->getFormulaire() . "&backForm=" . $this->getFormulaire() . "&inputField={$zone}"  . "&backAction=change" . "&backPopup=1" . "&backField={$zone}" . "&modeHtml=1" . 
                                    "&code_frs=" . urlencode(StdXmlWsdl::getValueZoneInterne($parent['CODE_FOU'])) . "&backMode=form" . "&back" . "','win_popup_liste_adr',750,700);";
                                
                                break;
                            case 'G':
                                Affichage::messageJS(trad('Pas d\'adresse secondaire pour un groupe'));
                                break;
                        }
                        break;
                    case '_LOUPE_ADR_SEC':
                        switch (StdXmlWsdl::getValueZoneInterne($parent['TYPE_FG'])) {
                            case 'F':
                                if (StdXmlWsdl::getValueZoneInterne($parent['CODE_FOU']) == '')
                                    Affichage::messageJS(trad('Veuillez d\'abord sélectionner un fournisseur'));
                                else
                                    echo "OpenPopup('ctrl_liste_cont_four.php?action=initPopup&popup_id=CONTFOUR" . "&formName=" . $this->getFormulaire() . "&backForm=" . $this->getFormulaire() . "&inputField={$zone}" . "&editable=true"  . "&backAction=change" . "&backPopup=1" . "&backField={$zone}" . "&modeHtml=1" . 
                                    "&code_frs=" . urlencode(StdXmlWsdl::getValueZoneInterne($parent['CODE_FOU'])) . "&backMode=form" . "','win_popup_liste_cnt',750,700);";
                                
                                break;
                            case 'G':
                                Affichage::messageJS(trad('Pas de liste de contact pour un groupe'));
                                break;
                        }
                }
            } else
                Affichage::messageJS(strBuild(trad('Erreur zone ( @1@ ) non trouvé '), $zone));
        }
    }

    public function &getEMET_CTR()
    {
        return StdXmlWsdl::getValueZoneInterne($this->wsdlObject['EMETTEUR']);
    }

    public function &getLIV_CTR()
    {
        return StdXmlWsdl::getValueZoneInterne($this->wsdlObject['CTR_LIV']);
    }

    /**
     * Mise à jour des zones suite à un changement d'adresse fournisseur
     *
     * @param unknown $parent
     * @param unknown $CODE_FOU
     * @param string $IND_FOU
     */
    public function changeAdresseFournisseur(& $parent, $CODE_FOU, $IND_FOU = null)
    {
        if (is_null($IND_FOU))
            $IND_FOU = '0';
        $sql = 'select * from CONTFOUR with(nolock) ' . 'where CODE_FOU= \'' . ReplaceSqlPointeur($CODE_FOU) . '\' ' . 'and   IND_FOU = ' . ReplaceSqlPointeur($IND_FOU);
        if ($req = (new RequeteSQL($sql, DB_OXASQLDB))->Trouve1()) {
            StdXmlWsdl::setValueXml($parent, $req['NOM'], 'NOM_CTCT');
            StdXmlWsdl::setValueXml($parent, $req['TEL'], 'TEL_CTCT');
            StdXmlWsdl::setValueXml($parent, $req['TELPORT'], 'POR_CTCT');
            StdXmlWsdl::setValueXml($parent, $req['FAX'], 'FAX_CTCT');
            StdXmlWsdl::setValueXml($parent, $req['EMAIL'], 'EMAILCONT');
        }
    }

    public function changeValeurData(& $parent, $zone, $valeurDefault = null)
    {
        if ($zone == 'CODE_FOU') {
            if (is_null($valeurDefault))
                $valeurDefault = StdXmlWsdl::getValueZoneInterne($parent['CODE_FOU']);
            $result = null;
            $typeFg = StdXmlWsdl::getValueZoneInterne($parent['TYPE_FG']);
            if ($typeFg == 'F')
                $result = SqlFrs::rqGetRecordFournis($valeurDefault, true)->Trouve1();
            else
                $result = SqlGestFourniss::rqGetInfoGroupeFournisseur($valeurDefault)->Trouve1();
            
            if (is_array($result)) {
                if (! array_key_exists('!Etat', $parent))
                    $parent['!Etat'] = 'M';
                
                StdXmlWsdl::setValueXml($parent, $valeurDefault, 'CODE_FOU');
                
                if ($typeFg == 'F') {
                    StdXmlWsdl::setValueXml($parent, $result['ADR'], 'ADR');
                    StdXmlWsdl::setValueXml($parent, $result['CPOSTAL'], 'CPOSTAL');
                    StdXmlWsdl::setValueXml($parent, $result['VILLE1'], 'VILLE'); // Mystere ici c'est VILLE1 qu'il faut prend => voir YA si on fait autrement un jour
                    StdXmlWsdl::setValueXml($parent, $result['CODE_PAYS'], 'PAYS');
                    StdXmlWsdl::setValueXml($parent, $result['EMAIL'], 'EMAIL');
                    
                    $this->changeAdresseFournisseur($parent, $valeurDefault);
                } else {
                    StdXmlWsdl::setValueXml($parent, $result['ADR'], 'ADR');
                    StdXmlWsdl::setValueXml($parent, $result['CPOSTAL'], 'CPOSTAL');
                    StdXmlWsdl::setValueXml($parent, $result['VILLE'], 'VILLE'); // Mystere ici c'est VILLE qu'il faut prend => voir YA si on fait autrement un jour
                    StdXmlWsdl::setValueXml($parent, $result['CODE_PAYS'], 'PAYS');
                    StdXmlWsdl::setValueXml($parent, $result['EMAIL'], 'EMAIL');
                }
                
                $envoi = '<HistoFournAOIn>' . '<TYPE_SOC_GS>' . formatStringToXml(StdXmlWsdl::getValueZoneInterne($this->wsdlObject['TYPE_SOC_GS'])) . '</TYPE_SOC_GS>' . '<CODE_STE>' . formatStringToXml(StdXmlWsdl::getValueZoneInterne($this->wsdlObject['CODE_STE'])) . '</CODE_STE>' . '<TYPE_FG>' . formatStringToXml(StdXmlWsdl::getValueZoneInterne($parent['TYPE_FG'])) . '</TYPE_FG>' . '<CODE_FOU>' . formatStringToXml(StdXmlWsdl::getValueZoneInterne($parent['CODE_FOU'])) . '</CODE_FOU>' . '</HistoFournAOIn>';
                
                if ($result = Wsdl::wsdlCallGen('Oxaproc_AO.wsdl', 'AO_FOURN_HISTORIQUE', $envoi, false)) {
                    switch ($result['Statut']['#text']) {
                        case 'O':
                            $parent['ListHistoriqueFourn'] = &$result['ListHistoriqueFourn'];
                            break;
                        default:
                            // print_r($result); fonctionnement anormale coté retour du webservice
                            exit();
                    }
                }
            } else if (trim($valeurDefault) != '')
                if ($typeFg == 'F')
                    Affichage::messageJS(trad('Ce fournisseur n\'existe pas ou n\'est plus valide'));
                else
                    Affichage::messageJS(trad('Ce groupe de fournisseur n\'existe pas ou n\'est plus valide'));
            else {
                $parent['ListHistoriqueFourn'] = null;
                StdXmlWsdl::setValueXml($value, $valeurDefault);
                StdXmlWsdl::setValueXml($parent, '', 'ADR');
                StdXmlWsdl::setValueXml($parent, '', 'CPOSTAL');
                StdXmlWsdl::setValueXml($parent, '', 'VILLE');
                StdXmlWsdl::setValueXml($parent, '', 'PAYS');
                StdXmlWsdl::setValueXml($parent, '', 'EMAIL');
            }
        } else if ($zone == 'CODE_STE') {
            if (StdXmlWsdl::getValueZoneInterne($parent['TYPE_SOC_GS']) == 'S') {
                $codeSte = StdXmlWsdl::getValueZoneInterne($parent['CODE_STE']);
                
                $array = utilisateur::getAllValueInitSessionByUserAndSociete($_SESSION['Session_Login'], $codeSte);
                
                if (is_array($array) && array_key_exists('CTR_EMET', $array))
                    StdXmlWsdl::setValueXml($parent, $array['CTR_EMET'], 'EMETTEUR');
                else
                    StdXmlWsdl::setValueXml($parent, '', 'EMETTEUR');
                
                if (is_array($array) && array_key_exists('CTR_LIV', $array))
                    StdXmlWsdl::setValueXml($parent, $array['CTR_LIV'], 'CTR_LIV');
                else
                    StdXmlWsdl::setValueXml($parent, '', 'CTR_LIV');
            } else {
                $codeGrp = StdXmlWsdl::getValueZoneInterne($parent['CODE_STE']);
                if ($req = SqlDoaSociete::rqGetDoaGroupeSociete($codeGrp)->Trouve1()) {
                    $array = utilisateur::getAllValueInitSessionByUserAndSociete($_SESSION['Session_Login'], $req['SIEGE']);
                    if (is_array($array) && array_key_exists('CTR_EMET', $array))
                        StdXmlWsdl::setValueXml($parent, $array['CTR_EMET'], 'EMETTEUR');
                    else
                        StdXmlWsdl::setValueXml($parent, '', 'EMETTEUR');
                    
                    if (is_array($array) && array_key_exists('CTR_LIV', $array))
                        StdXmlWsdl::setValueXml($parent, $array['CTR_LIV'], 'CTR_LIV');
                    else
                        StdXmlWsdl::setValueXml($parent, '', 'CTR_LIV');
                } else {
                    StdXmlWsdl::setValueXml($parent, '', 'EMETTEUR');
                    StdXmlWsdl::setValueXml($parent, '', 'CTR_LIV');
                }
            }
            
            StdXmlWsdl::setValueXml($parent, '', 'NO_AO_1');

            if ($reqUsr = SqlParam::rqSelectOneDateEnregMDPByUser($_SESSION['Session_Login'])->Trouve1())
                if (BoolSql($reqUsr['ACHETEUR']))
                    StdXmlWsdl::setValueXml($parent, $_SESSION['Session_Login'], 'ACH');
                else
                    StdXmlWsdl::setValueXml($parent, '', 'ACH');
            else
                StdXmlWsdl::setValueXml($parent, '', 'ACH');
        }
    }

    public function controleSaisieListe($zone)
    {
        if ($nodeXml = $this->rechercheNode($zone, $this->wsdlObject)) {
            $cle = array_keys($nodeXml)[0];
            $value = & $nodeXml[$cle];
            
            $parent = & $this->getParent($value, $this->wsdlObject);
            
            $obj_xml = new GenXslt(true);
            
            $valUser = trim(getValue($zone));
            
            $valeur = StdXmlWsdl::reformate($value, $valUser);
            
            $retour = ControleSaisie::checkValueFormat($parent[$cle]['!Format'], $valeur->getValeurOrigine());
            
            
            switch ($cle) {
                // Section concernant l'entete
                case 'NO_AO':
                    if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinalUpper()) {
                        if ($retour['messageErreur'] == '') {
                            if (! array_key_exists('!Etat', $parent))
                                $parent['!Etat'] = 'M';
                            StdXmlWsdl::setValueXml($value, $valeur->getValeurFinalUpper());
                        } else if (trim($valeur->getValeurFinal()) != '')
                            Affichage::messageJS($retour['messageErreur']);
                        
                        $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                        $obj_xml->echoHtml($value['!divZone']);
                    }
                    break;
                case 'TYPE_SOC_GS':
                    if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinalUpper()) {
                        StdXmlWsdl::setValueXml($parent, $valeur->getValeurFinalUpper(), $cle);
                        if (! array_key_exists('!Etat', $parent))
                            $parent['!Etat'] = 'M';
                        
                        if ($valeur->getValeurFinalUpper() == 'S')
                            StdXmlWsdl::setValueXml($parent, $_SESSION['Session_SocUsr'], 'CODE_STE');
                        else
                            StdXmlWsdl::setValueXml($parent, '', 'CODE_STE');
                        
                        $this->changeValeurData($parent, 'CODE_STE');
                        
                        $listeZone = array(
                            'CODE_STE',
                            'ACH',
                            'EMETTEUR',
                            'CTR_LIV',
                            'NO_AO_1'
                        );
                        $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                        foreach ($listeZone as & $zone)
                            $obj_xml->echoHtml($parent[$zone]['!divZone']);
                    }
                    break;
                case 'CODE_STE':
                    switch (StdXmlWsdl::getValueZoneInterne($parent['TYPE_SOC_GS'])) {
                        case 'S': // Controle vis à vis des informations de societe
                            $listeZone = array(
                                $cle,
                                'ACH',
                                'EMETTEUR',
                                'CTR_LIV',
                                'NO_AO_1'
                            );
                            if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinalUpper()) {
                                if ($result = & SqlUsers::rqListSocieteForUser($_SESSION['Session_Login'], $valeur->getValeurFinalUpper())->Trouve1()) {
                                    if (! array_key_exists('!Etat', $parent))
                                        $parent['!Etat'] = 'M';
                                    StdXmlWsdl::setValueXml($parent, $valeur->getValeurFinalUpper(), $cle);
                                    
                                    $this->changeValeurData($parent, 'CODE_STE');
                                } else {
                                    if (trim($valeur->getValeurFinal()) != '')
                                        Affichage::messageJS(trad('Ce code société n\'existe pas'));
                                }
                                
                                $listeZone = array(
                                    $cle,
                                    'ACH',
                                    'EMETTEUR',
                                    'CTR_LIV',
                                    'NO_AO_1'
                                );
                                $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                                foreach ($listeZone as & $zone)
                                    $obj_xml->echoHtml($parent[$zone]['!divZone']);
                            }
                            break;
                        case 'G': // Controle vis à vis des informations de groupe de societe
                            if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinalUpper()) {
                                if ($result = SqlDoaSociete::rqGetDoaGroupeSociete($valeur->getValeurFinalUpper(), $_SESSION['Session_Login'])->Trouve1()) {
                                    if (! array_key_exists('!Etat', $parent))
                                        $parent['!Etat'] = 'M';
                                    StdXmlWsdl::setValueXml($parent, $valeur->getValeurFinalUpper(), $cle);
                                    
                                    // Histoire de siege
                                    $this->changeValeurData($parent, 'CODE_STE');
                                } else {
                                    if (trim($valeur->getValeurFinal()) != '')
                                        Affichage::messageJS(trad('Ce groupe de société n\'existe pas'));
                                }
                                
                                $listeZone = array(
                                    $cle,
                                    'ACH',
                                    'EMETTEUR',
                                    'CTR_LIV'
                                );
                                $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                                
                                foreach ($listeZone as & $zone)
                                    $obj_xml->echoHtml($parent[$zone]['!divZone']);
                            }
                            break;
                        case 'T':
                            break;
                    }
                    break;
                case 'EMETTEUR': // TODO ATTENTION NOTION DE GROUPE DE STE
                    if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinal()) {
                        $typeCodeSte = StdXmlWsdl::getValueZoneInterne($parent['TYPE_SOC_GS']);
                        
                        if ($result = & SqlUsers::rqCentreEmet($valeur->getValeurFinal(), StdXmlWsdl::getValueZoneInterne($parent['CODE_STE']), $typeCodeSte)->Trouve1()) {
                            if (! array_key_exists('!Etat', $parent))
                                $parent['!Etat'] = 'M';
                            StdXmlWsdl::setValueXml($value, $valeur->getValeurFinal());
                        } else {
                            if (trim(getValue($zone)) != '')
                                Affichage::messageJS(trad('Le centre émetteur saisi n\'existe pas, veuillez vérifier'));
                            else
                                StdXmlWsdl::setValueXml($value, $valeur->getValeurFinal());
                        }
                        $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                        $obj_xml->echoHtml($value['!divZone']);
                    }
                    break;
                case 'CTR_LIV':
                    if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinal()) {
                        $typeCodeSte = StdXmlWsdl::getValueZoneInterne($parent['TYPE_SOC_GS']);
                        if ($result = & SqlUsers::rqCentreLivr($valeur->getValeurFinal(), StdXmlWsdl::getValueZoneInterne($parent['CODE_STE']), null, $typeCodeSte)->Trouve1()) {
                            if (! array_key_exists('!Etat', $parent))
                                $parent['!Etat'] = 'M';
                            StdXmlWsdl::setValueXml($value, $valeur->getValeurFinal());
                        } else {
                            if (trim(getValue($zone)) != '')
                                Affichage::messageJS(trad('Le centre de livraison saisi n\'existe pas, veuillez vérifier'));
                            else
                                StdXmlWsdl::setValueXml($value, $valeur->getValeurFinal());
                        }
                        $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                        $obj_xml->echoHtml($value['!divZone']);
                    }
                    break;
                case 'ACH':
                    if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinalUpper()) {
                        if ($result = SqlParam::rqSelectOneDateEnregMDPByUser($valeur->getValeurFinalUpper())->Trouve1()) {
                            StdXmlWsdl::setValueXml($value, $valeur->getValeurFinalUpper());
                        } else if (trim(getValue($zone)) != '')
                            Affichage::messageJS(trad('Ce code utilisateur est inconnu'));
                        
                        $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                        $obj_xml->echoHtml($value['!divZone']);
                    }
                    break;
                case 'TYPEDEL':
                    if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinalUpper()) {
                        if ($valeur->getValeurFinalUpper() == 'D' || $valeur->getValeurFinalUpper() == 'J' || $valeur->getValeurFinalUpper() == 'T') {
                            if (! array_key_exists('!Etat', $parent))
                                $parent['!Etat'] = 'M';
                            StdXmlWsdl::setValueXml($value, $valeur->getValeurFinalUpper());
                        } else {
                            Affichage::messageJS(trad('Valeur de saisie interdite'));
                        }
                        
                        $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                        $obj_xml->echoHtml($value['!divZone']);
                    }
                    break;
                case 'DTE_REP': // 27098 => le contrôle sur la date ,n'était pas pris en compte
                    if ($valeur->isError()) {
                        Affichage::messageJS($valeur->getLibErreur() . "");
                    } else {
                        if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinal()) {
                            if(!verificationDate($valeur->getValeurFinal())) {
                                Affichage::messageJS(trad('La saisie de la date est incohérente.'));
                            }
                            elseif ($valeur->getValeurFinal() < date('Y') . date('m') . date('d')) {
                                Affichage::messageJS(trad('La date de la réponse attendue ne peut pas être anterieure à la date d\'aujourdhui'));
                            } else {
                                StdXmlWsdl::setValueXml($value, $valeur->getValeurFinal());
                                if (! array_key_exists('!Etat', $parent))
                                    $parent['!Etat'] = 'M';
                            }
                        }
                    }
                    
                    $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                    $obj_xml->echoHtml($value['!divZone']);
                    break;
                case 'DTE_VALID_AO':
                case 'VALCHXFOU':
                    if ($valeur->isError()) {
                        Affichage::messageJS($valeur->getLibErreur() . "");
                    } else {
                        if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinal()) {
                            if(!verificationDate($valeur->getValeurFinal())) {
                                Affichage::messageJS(trad('La saisie de la date est incohérente.'));
                            }
                            else{
                                if (! array_key_exists('!Etat', $parent))
                                    $parent['!Etat'] = 'M';
                                StdXmlWsdl::setValueXml($value, $valeur->getValeurFinal());
                            }
                        }
                    }
                    $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                    $obj_xml->echoHtml($value['!divZone']);
                    
                    break;
                case 'COD_LNG':
                    if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinalUpper()) {
                        if ($result = SqlUsers::rqLangues($valeur->getValeurFinalUpper())->Trouve1()) {
                            if (StdXmlWsdl::getValueZoneInterne($parent['CODE_ART']) == '') {
                                if (! array_key_exists('!Etat', $parent))
                                    $parent['!Etat'] = 'M';
                                StdXmlWsdl::setValueXml($value, $valeur->getValeurFinalUpper());
                            } else {
                                if (trim($valeur->getValeurFinal()) != '')
                                    Affichage::messageJS(trad('La saisie du code langue est incorrecte'));
                            }
                        }
                        $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                        $obj_xml->echoHtml($value['!divZone']);
                    }
                    break;
                case 'DEVISE':
                    if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinalUpper()) {
                        if ($result = SqlPanier::rqSqlTableDevise($valeur->getValeurFinalUpper())->Trouve1()) {
                            if (StdXmlWsdl::getValueZoneInterne($parent['CODE_ART']) == '') {
                                if (! array_key_exists('!Etat', $parent))
                                    $parent['!Etat'] = 'M';
                                StdXmlWsdl::setValueXml($value, $valeur->getValeurFinalUpper());
                            } else {
                                if (trim($valeur->getValeurFinal()) != '')
                                    Affichage::messageJS(trad('La saisie du code devise est incorrecte'));
                            }
                        }
                        $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                        $obj_xml->echoHtml($value['!divZone']);
                    }
                    break;
                case 'OBJET_AO':
                    // TOTO Controle de saisie de type data à faire
                    if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinal()) {
                        if ($retour['messageErreur'] == '') {
                            if (! array_key_exists('!Etat', $parent))
                                $parent['!Etat'] = 'M';
                            StdXmlWsdl::setValueXml($value, $valeur->getValeurFinal());
                        } else if (trim($valeur->getValeurFinal()) != '')
                            Affichage::messageJS($retour['messageErreur']);
                        
                        $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                        $obj_xml->echoHtml($value['!divZone']);
                    }
                    break;
                case 'TITRE_AO':
                    // TOTO Controle de saisie de type data à faire
                    if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinal()) {
                        if ($retour['messageErreur'] == '') {
                            if (! array_key_exists('!Etat', $parent))
                                $parent['!Etat'] = 'M';
                            StdXmlWsdl::setValueXml($value, $valeur->getValeurFinal());
                        } else if (trim($valeur->getValeurFinal()) != '')
                            Affichage::messageJS($retour['messageErreur']);
                        
                        $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                        $obj_xml->echoHtml($value['!divZone']);
                    }
                    break;
                case 'COMMENT_AO':
                    if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinal()) {
                        if ($retour['messageErreur'] == '') {
                            if (! array_key_exists('!Etat', $parent))
                                $parent['!Etat'] = 'M';
                            StdXmlWsdl::setValueXml($value, $valeur->getValeurFinal());
                        } else if (trim($valeur->getValeurFinal()) != '')
                            Affichage::messageJS($retour['messageErreur']);
                        
                        $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                        $obj_xml->echoHtml($value['!divZone']);
                    }
                    break;
                case 'BUDG_ENT':
                    if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinal()) {
                        if ($retour['messageErreur'] == '') {
                            if (! array_key_exists('!Etat', $parent))
                                $parent['!Etat'] = 'M';
                            StdXmlWsdl::setValueXml($value, $valeur->getValeurFinal());
                        } else if (trim($valeur->getValeurFinal()) != '')
                            Affichage::messageJS($retour['messageErreur']);
                        
                        $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                        $obj_xml->echoHtml($value['!divZone']);
                    }
                    break;
                case 'REPDEV':
                    if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinal()) {
                        if ($retour['messageErreur'] == '') {
                            if (! array_key_exists('!Etat', $parent))
                                $parent['!Etat'] = 'M';
                            StdXmlWsdl::setValueXml($value, $valeur->getValeurFinal());
                        } else if (trim($valeur->getValeurFinal()) != '')
                            Affichage::messageJS($retour['messageErreur']);
                        
                        $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                        $obj_xml->echoHtml($value['!divZone']);
                    }
                    break;
                case 'AO_PUBLIC':
                    if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinal()) {
                        if ($retour['messageErreur'] == '') {
                            if (! array_key_exists('!Etat', $parent))
                                $parent['!Etat'] = 'M';
                            StdXmlWsdl::setValueXml($value, $valeur->getValeurFinal());
                        } else if (trim($valeur->getValeurFinal()) != '')
                            Affichage::messageJS($retour['messageErreur']);
                        
                        $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                        $obj_xml->echoHtml($value['!divZone']);
                    }
                    break;
                case 'VARIANTE':
                    if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinal()) {
                        if ($retour['messageErreur'] == '') {
                            if (! array_key_exists('!Etat', $parent))
                                $parent['!Etat'] = 'M';
                            
                            StdXmlWsdl::setValueXml($value, $valeur->getValeurFinal());
                        } else if (trim($valeur->getValeurFinal()) != '')
                            Affichage::messageJS($retour['messageErreur']);
                        
                        $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                        $obj_xml->echoHtml($value['!divZone']);
                    }
                    break;
                case 'NO_AO_1':
                    if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinal()) {
                        $params = ['NO_AO' => $valeur->getValeurFinal(), 'GrpSoc' => StdXmlWsdl::getValueZoneInterne($parent['TYPE_SOC_GS']), 'Societe' => StdXmlWsdl::getValueZoneInterne($parent['CODE_STE'])];
                        SqlAo::rqPopupGetAllAO($params, 1);
                        if ($result = SqlAo::rqPopupGetAllAO($params, 1)->TrouveTous()) {
                            if (! array_key_exists('!Etat', $parent))
                                $parent['!Etat'] = 'M';
                            StdXmlWsdl::setValueXml($value, $valeur->getValeurFinal());
                        } else {
                            if (trim(getValue($zone)) != '')
                                Affichage::messageJS(trad('L\'appel d\'offre de référence saisi n\'existe pas, veuillez vérifier'));
                            else
                                StdXmlWsdl::setValueXml($value, $valeur->getValeurFinal());
                        }
                        $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                        $obj_xml->echoHtml($value['!divZone']);
                    }
                    break;
                
                // Section concernant les lignes de l'appel d'offre
                case 'NO_DA':
                    // TOTO Controle de saisie de type data à faire
                    if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinal()) {
                        if ($retour['messageErreur'] == '') {
                            if (! array_key_exists('!Etat', $parent))
                                $parent['!Etat'] = 'M';
                            StdXmlWsdl::setValueXml($value, $valeur->getValeurFinal());
                        } else if (trim($valeur->getValeurFinal()) != '')
                            Affichage::messageJS($retour['messageErreur']);
                        
                        $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                        $obj_xml->echoHtml($value['!divZone']);
                    }
                    break;
                case 'CODE_ART':
                    if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinalUpper()) {
                
                        $id_ligne_doc = $parent['NO_PO']['#text'];
                        $no_ao = $this->getNumAo();
                        if ($retour['messageErreur'] == '') {
                            if ($reqSql = SqlArticle::rqIsArticleHaplus($valeur->getValeurFinal(), true)->Trouve1()) {
                                if (! array_key_exists('!Etat', $parent))
                                    $parent['!Etat'] = 'M';
                                StdXmlWsdl::setValueXml($value, $valeur->getValeurFinal());
                                
                                // Mise à jour des champs annexs REF_FAB DES SSFAMILLE UNITE
                                StdXmlWsdl::setValueXml($parent, $reqSql['DESIGN'], 'DES');
                                StdXmlWsdl::setValueXml($parent, $reqSql['SSFAM'], 'SSFAMILLE');
                                StdXmlWsdl::setValueXml($parent, $reqSql['UNIT'], 'UNITE');
                                StdXmlWsdl::setValueXml($parent, $reqSql['CODEFAB'], 'COD_FAB');
                                StdXmlWsdl::setValueXml($parent, $reqSql['REFARTFAB'], 'REF_FAB');
                                
                                if ($parent['!Etat'] == 'A')
                                    StdXmlWsdl::setValueXml($parent, $this->getPrixReference($parent), 'PRIX_REF');
                                
                                /*** SPEC 4241 Caractéristiques complémentaires : réinitialisation des CC pour la ligne  ***/
                                // supression des CC existant pour la ligne dans CC_LDOC avec DOC_TYPE='AOT'
                                /*
                                SqlCaracteristiquesCompl::rqSupCCDoc('AOT', null, $id_ligne_doc, $_SESSION['id_user'])->ExecuteSql();   
                                // recherche des CC selon les règles d'initialisation (code article, sous-famille, famille)
                                $liste_cc = CaracteristiquesCompl::getListeCCInit($reqSql['SSFAM'], '', $valeur->getValeurFinal());
                                // insertion des CC dans CC_LDOC avec DOC_TYPE='AOT'
                                $SqlListe = new PileSql(DB_OXAPROCDB);
                                CaracteristiquesCompl::InsertListeCC($SqlListe, $liste_cc, 'AOT', $no_ao, $id_ligne_doc, $_SESSION['id_user']);
                                $SqlListe->Commit();
                                // affichage du bouton CC si existance de CC pour la ligne
                                if(count($liste_cc)>0){
                                    echo 'jQuery("#btn_cc_'.$id_ligne_doc.'").show();';
                                    StdXmlWsdl::setValueXml($parent, 1, 'existCC');
                                }else{                                    
                                    echo 'jQuery("#btn_cc_'.$id_ligne_doc.'").hide();';
                                    StdXmlWsdl::setValueXml($parent, 0, 'existCC');
                                }
                                */
                            } else {
                                if ($valeur->getValeurFinal() != '') {
                                    Affichage::messageJS(trad('Ce code article n\'existe pas ou non disponible sur OXA PROC'));
                                } else {
                                    StdXmlWsdl::setValueXml($parent, '', 'CODE_ART');
                                    StdXmlWsdl::setValueXml($parent, '', 'SSFAMILLE');
                                    StdXmlWsdl::setValueXml($parent, '', 'UNITE');
                                    StdXmlWsdl::setValueXml($parent, '', 'COD_FAB');
                                    StdXmlWsdl::setValueXml($parent, '', 'REF_FAB');

                                    /*** SPEC 4241 Caractéristiques complémentaires : suppression des CC de la ligne  ***/
                                    /*
                                    SqlCaracteristiquesCompl::rqSupCCDoc('AOT', null, $id_ligne_doc, $_SESSION['id_user'])->ExecuteSql();
                                    echo 'jQuery("#btn_cc_'.$id_ligne_doc.'").hide();';
                                    StdXmlWsdl::setValueXml($parent, 0, 'existCC');
                                    */
                                }
                            }
                        } else if (trim($valeur->getValeurFinal()) != '')
                            Affichage::messageJS($retour['messageErreur']);
                        
                        $listeZone = array(
                            $cle,
                            'DES',
                            'SSFAMILLE',
                            'UNITE',
                            'REF_FAB',
                            'COD_FAB',
                            'PRIX_REF'
                        );
                        $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                        
                        foreach ($listeZone as & $zone)
                            $obj_xml->echoHtml($parent[$zone]['!divZone']);
                    }
                    break;
                case 'COD_FAB':
                    if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinal()) {
                        if ($result = SqlFrs::rqGetFabricantRS($valeur->getValeurFinal())->Trouve1()) {
                            if (! array_key_exists('!Etat', $parent))
                                $parent['!Etat'] = 'M';
                            StdXmlWsdl::setValueXml($value, $valeur->getValeurFinal());
                            StdXmlWsdl::setValueXml($parent, '', 'COD_GAM');
                        } else if (trim($valeur->getValeurFinal()) != '')
                            Affichage::messageJS(trad('Ce code fabricant est inconnu'));
                        else {
                            StdXmlWsdl::setValueXml($parent, '', 'COD_FAB');
                            StdXmlWsdl::setValueXml($parent, '', 'COD_GAM');
                        }
                        
                        if ($parent['!Etat'] == 'A')
                            StdXmlWsdl::setValueXml($parent, $this->getPrixReference($parent), 'PRIX_REF');
                        
                        $listeZone = array(
                            $cle,
                            'COD_GAM',
                            'PRIX_REF'
                        );
                        $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                        
                        foreach ($listeZone as & $zone)
                            $obj_xml->echoHtml($parent[$zone]['!divZone']);
                    }
                    break;
                case 'DES':
                    if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinal()) {
                        if (StdXmlWsdl::getValueZoneInterne($parent['CODE_ART']) == '') {
                            if (! array_key_exists('!Etat', $parent))
                                $parent['!Etat'] = 'M';
                            StdXmlWsdl::setValueXml($value, $valeur->getValeurFinal());
                        } else {
                            Affichage::messageJS(trad('La modification de la désignation est impossible, présence du code article'));
                        }
                        $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                        $obj_xml->echoHtml($value['!divZone']);
                    }
                    break;
                case 'SSFAMILLE':
                    if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinal()) {
                        if ($result = & SqlArticle::rqGetSousFamille($valeur->getValeurFinal(), true)->Trouve1()) {
                            if (StdXmlWsdl::getValueZoneInterne($parent['CODE_ART']) == '') {
                                if (! array_key_exists('!Etat', $parent))
                                    $parent['!Etat'] = 'M';
                                StdXmlWsdl::setValueXml($value, $valeur->getValeurFinal());

                                /*** SPEC 4241 Caractéristiques complémentaires : réinitialisation des CC pour la ligne  ***/
                                /*
                                $id_ligne_doc = $parent['NO_PO']['#text'];
                                $no_ao = $this->getNumAo();
                                // supression des CC existant pour la ligne dans CC_LDOC avec DOC_TYPE='AOT'
                                SqlCaracteristiquesCompl::rqSupCCDoc('AOT', null, $id_ligne_doc, $_SESSION['id_user'])->ExecuteSql();   
                                // recherche des CC selon les règles d'initialisation (code article, sous-famille, famille)
                                $liste_cc = CaracteristiquesCompl::getListeCCInit($valeur->getValeurFinal());
                                // insertion des CC dans CC_LDOC avec DOC_TYPE='AOT'
                                $SqlListe = new PileSql(DB_OXAPROCDB);
                                CaracteristiquesCompl::InsertListeCC($SqlListe, $liste_cc, 'AOT', $no_ao, $id_ligne_doc, $_SESSION['id_user']);
                                $SqlListe->Commit();
                                // affichage du bouton CC si existance de CC pour la ligne
                                if(count($liste_cc)>0){
                                    echo 'jQuery("#btn_cc_'.$id_ligne_doc.'").show();';
                                    StdXmlWsdl::setValueXml($parent, 1, 'existCC');
                                }else{                                    
                                    echo 'jQuery("#btn_cc_'.$id_ligne_doc.'").hide();';
                                    StdXmlWsdl::setValueXml($parent, 0, 'existCC');
                                }
                                */
                            } else {
                                Affichage::messageJS(trad('Modification du code sous famille impossible, présence du code article'));
                            }
                        } else
                            Affichage::messageJS(trad('Ce code sous famille est inconnu'));
                            
                        $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                        $obj_xml->echoHtml($value['!divZone']);
                    }
                    break;
                case 'QTE':
                    // TOTO Controle de saisie de type data à faire
                    if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinal()) {
                        if ($retour['messageErreur'] == '') {
                            if (! array_key_exists('!Etat', $parent))
                                $parent['!Etat'] = 'M';
                            StdXmlWsdl::setValueXml($value, $valeur->getValeurFinal());
                        } else if (trim($valeur->getValeurFinal()) != '')
                            Affichage::messageJS($retour['messageErreur']);
                        
                        $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                        $obj_xml->echoHtml($value['!divZone']);
                    }
                    break;
                case 'PRIX_REF':
                case 'BUDGET':
                        // TOTO Controle de saisie de type data à faire
                        if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinal()) {
                            if ($retour['messageErreur'] == '') {
                                StdXmlWsdl::setValueXml($value, $valeur->getValeurFinal());
                            } else if (trim($valeur->getValeurFinal()) != '')
                                Affichage::messageJS($retour['messageErreur']);
                            
                            $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                            $obj_xml->echoHtml($value['!divZone']);
                        }
                        break;
                case 'DELAI':
                    // TOTO Controle de saisie de type data à faire
                    if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinal()) {
                        if ($retour['messageErreur'] == '') {
                            if(!verificationDate($valeur->getValeurFinal())) {
                                Affichage::messageJS(trad('La saisie de la date est incohérente.'));
                            }else{
                                if (! array_key_exists('!Etat', $parent))
                                    $parent['!Etat'] = 'M';
                                StdXmlWsdl::setValueXml($value, $valeur->getValeurFinal());
                            }
                        } else if (trim($valeur->getValeurFinal()) != '')
                            Affichage::messageJS($retour['messageErreur']);
                        
                        $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                        $obj_xml->echoHtml($value['!divZone']);
                    }
                    break;
                case 'DELAIJ':
                    // TOTO Controle de saisie de type data à faire
                    if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinal()) {
                        if ($retour['messageErreur'] == '') {
                            if (! array_key_exists('!Etat', $parent))
                                $parent['!Etat'] = 'M';
                            StdXmlWsdl::setValueXml($value, $valeur->getValeurFinal());
                        } else if (trim($valeur->getValeurFinal()) != '')
                            Affichage::messageJS($retour['messageErreur']);
                        
                        $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                        $obj_xml->echoHtml($value['!divZone']);
                    }
                    break;
                case 'DELAIT':
                    if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinal()) {
                        if ($retour['messageErreur'] == '') {
                            if (! array_key_exists('!Etat', $parent))
                                $parent['!Etat'] = 'M';
                            StdXmlWsdl::setValueXml($value, $valeur->getValeurFinal());
                        } else if (trim($valeur->getValeurFinal()) != '')
                            Affichage::messageJS($retour['messageErreur']);
                        
                        $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                        $obj_xml->echoHtml($value['!divZone']);
                    }
                    break;
                case 'NO_PO':
                    if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinal()) {
                        if ($retour['messageErreur'] == '') {
                            if (! array_key_exists('!Etat', $parent))
                                $parent['!Etat'] = 'M';
                            StdXmlWsdl::setValueXml($value, $valeur->getValeurFinal());
                        } else if (trim($valeur->getValeurFinal()) != '')
                            Affichage::messageJS($retour['messageErreur']);
                        
                        $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                        $obj_xml->echoHtml($value['!divZone']);
                    }
                    break;
                case 'REF_FAB':
                    if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinal()) {
                        if ($retour['messageErreur'] == '') {
                            if (! array_key_exists('!Etat', $parent))
                                $parent['!Etat'] = 'M';
                            StdXmlWsdl::setValueXml($value, $valeur->getValeurFinal());
                            
                            if ($parent['!Etat'] == 'A')
                                StdXmlWsdl::setValueXml($parent, $this->getPrixReference($parent), 'PRIX_REF');
                        } else if (trim($valeur->getValeurFinal()) != '')
                            Affichage::messageJS($retour['messageErreur']);
                        
                        $listeZone = array(
                            $cle,
                            'PRIX_REF'
                        );
                        $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                        
                        foreach ($listeZone as & $zone)
                            $obj_xml->echoHtml($parent[$zone]['!divZone']);
                    }
                    break;
                case 'UNITE':
                    if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinalUpper()) {
                        if ($retour['messageErreur'] == '') {
                            if (! array_key_exists('!Etat', $parent))
                                $parent['!Etat'] = 'M';
                            StdXmlWsdl::setValueXml($value, $valeur->getValeurFinalUpper());
                        } else if (trim($valeur->getValeurFinal()) != '')
                            Affichage::messageJS($retour['messageErreur']);
                        
                        $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                        $obj_xml->echoHtml($value['!divZone']);
                    }
                    break;
                // Section concernant la partie de gestion fournisseur
                case 'TYPE_FG':
                    if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinalUpper()) {
                        StdXmlWsdl::setValueXml($parent, $valeur->getValeurFinalUpper(), $cle);
                        if (! array_key_exists('!Etat', $parent))
                            $parent['!Etat'] = 'M';
                        
                        if ($valeur->getValeurFinalUpper() == 'F')
                            StdXmlWsdl::setValueXml($parent, '', 'CODE_FOU');
                        else
                            StdXmlWsdl::setValueXml($parent, '', 'CODE_FOU');
                        
                        $listeZone = array(
                            $cle,
                            'CODE_FOU',
                            'CPOSTAL',
                            'VILLE',
                            'PAYS',
                            'EMAIL'
                        );
                        $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                        foreach ($listeZone as & $zone)
                            if (array_key_exists($zone, $parent) && array_key_exists('!divZone', $parent[$zone]))
                                $obj_xml->echoHtml($parent[$zone]['!divZone']);
                        
                        $obj_xml->echoHtml('CA_' . $value['!divZone'] . '_1');
                        
                        $this->changeValeurData($parent, 'CODE_FOU');
                    }
                    break;
                case 'CODE_FOU':
                    // 16962 13550
                    if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinalUpper()) {
                        $CODE_FOU = $valeur->getValeurFinalUpper();
                        
                        $this->changeValeurData($parent, 'CODE_FOU', $CODE_FOU);
                        
                        $listeZone = array(
                            $cle,
                            'ADR',
                            'CPOSTAL',
                            'VILLE',
                            'PAYS',
                            'EMAIL',
                            'NOM_CTCT',
                            'TEL_CTCT',
                            'FAX_CTCT',
                            'POR_CTCT',
                            'EMAILCONT'
                        );
                        $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml(AO_ecran::FOLDER_FOURNISSEUR));
                        foreach ($listeZone as & $zone)
                            if (array_key_exists($zone, $parent) && array_key_exists('!divZone', $parent[$zone]))
                                $obj_xml->echoHtml($parent[$zone]['!divZone']);
                        
                        $obj_xml->echoHtml('CA_' . $value['!divZone'] . '_1');
                    }
                    break;
                case 'NOM_CTCT':
                case 'TEL_CTCT':
                case 'FAX_CTCT':
                case 'POR_CTCT':
                case 'EMAILCONT':
                case 'CPOSTAL':
                case 'VILLE':
                case 'DCOMP':
                    if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinal()) {
                        if ($retour['messageErreur'] == '') {
                            if (! array_key_exists('!Etat', $parent))
                                $parent['!Etat'] = 'M';
                            StdXmlWsdl::setValueXml($value, $valeur->getValeurFinal());
                        } else {
                            if (! array_key_exists('!Etat', $parent))
                                $parent['!Etat'] = 'M';
                        }
                    }
                    break;
                case 'ADR':
                case 'PARAG':
                case 'PRIX_REF':
                case 'BUDGET':
                case 'TITRE_AV':
                case 'TITRE_ST': // 01 40 08 88 60
                    if (StdXmlWsdl::getValueZoneInterne($parent[$cle]) != $valeur->getValeurFinal()) {
                        if ($retour['messageErreur'] == '') {
                            if (! array_key_exists('!Etat', $parent))
                                $parent['!Etat'] = 'M';
                            StdXmlWsdl::setValueXml($value, $valeur->getValeurFinal());
                        } else {
                            if (trim($valeur->getValeurFinal()) != '')
                                Affichage::messageJS($retour['messageErreur']);
                            
                            $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
                            $obj_xml->echoHtml($value['!divZone']);
                        }
                    }
                    break;
                case 'NO_PO_DA':
                    break;
                default:
                    echo Affichage::messageJS(strBuild(trad('Manque le développement du programme de validation de la zone @1@'), $cle));
                    break;
            }
        } else if ($nodeXml = $this->rechercheNode($zone, $this->getDataObject())) {
            $valUser = trim(strtoupper(getValue($zone)));
            
            $cle = array_keys($nodeXml)[0];
            $value = & $nodeXml[$cle];
            
            if ($nodeXmlImpact = $this->rechercheNode($value['!value'], $this->wsdlObject)) {
                $cleImpact = array_keys($nodeXmlImpact)[0];
                $valueImpact = & $nodeXmlImpact[$cleImpact];
                $parent = & $this->getParent($valueImpact, $this->wsdlObject); // IMPORTANT PERMET LA GRAVURE DANS LA DATA DANS LA REFERENCE
                
                switch ($value['!nameCtrl']) {
                    case '_LOUPE_ADR':
                        switch (StdXmlWsdl::getValueZoneInterne($parent['TYPE_FG'])) {
                            case 'F':
                                // Reccherche des informations d'adresses du fournisseurs en question avec $valUser
                                $CODE_FOU = StdXmlWsdl::getValueZoneInterne($parent['CODE_FOU']);
                                
                                $sql = "select CODE,RS,ADR,CPOSTAL,VILLE1,LIB_PAYS,CODE_PAYS,EMAIL from (" . SqlFournisseur::getSqlListeAdresseFournisseur($CODE_FOU) . ") tmp";
                                
                                $req = new RequeteSQL($sql, DB_OXASQLDB);
                                if ($result = $req->Trouve1()) {
                                    StdXmlWsdl::setValueXml($parent, $result['ADR'], 'ADR');
                                    StdXmlWsdl::setValueXml($parent, $result['CPOSTAL'], 'CPOSTAL');
                                    StdXmlWsdl::setValueXml($parent, $result['VILLE1'], 'VILLE');
                                    StdXmlWsdl::setValueXml($parent, $result['CODE_PAYS'], 'PAYS');
                                    StdXmlWsdl::setValueXml($parent, $result['EMAIL'], 'EMAIL');
                                    
                                    $this->changeAdresseFournisseur($parent, $CODE_FOU);
                                    
                                    $obj_xml = new GenXslt(true);
                                    $listeZone = array(
                                        'ADR',
                                        'CPOSTAL',
                                        'VILLE',
                                        'PAYS',
                                        'EMAIL',
                                        'NOM_CTCT',
                                        'TEL_CTCT',
                                        'FAX_CTCT',
                                        'POR_CTCT',
                                        'EMAILCONT'
                                    );
                                    
                                    $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml(AO_ecran::FOLDER_FOURNISSEUR));
                                    foreach ($listeZone as & $zone)
                                        $obj_xml->echoHtml($parent[$zone]['!divZone']);
                                }
                                
                                break;
                            case 'G':
                                Affichage::messageJS(trad('Pas d\'adresse secondaire pour un groupe'));
                                break;
                        }
                        break;
                    case '_LOUPE_ADR_SEC':
                        switch (StdXmlWsdl::getValueZoneInterne($parent['TYPE_FG'])) {
                            case 'F':
                                // Reccherche des informations d'adresses du fournisseurs en question avec $valUser
                                $CODE_FOU = StdXmlWsdl::getValueZoneInterne($parent['CODE_FOU']);
                                
                                $this->changeAdresseFournisseur($parent, $CODE_FOU, $valUser);
                                
                                $obj_xml = new GenXslt(true);
                                $listeZone = array(
                                    'NOM_CTCT',
                                    'TEL_CTCT',
                                    'FAX_CTCT',
                                    'POR_CTCT',
                                    'EMAILCONT'
                                );
                                
                                $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml(AO_ecran::FOLDER_FOURNISSEUR));
                                foreach ($listeZone as & $zone)
                                    $obj_xml->echoHtml($parent[$zone]['!divZone']);
                                break;
                            case 'G':
                                Affichage::messageJS(trad('Pas d\'adresse secondaire pour un groupe'));
                                break;
                        }
                        break;
                }
            } else
                Affichage::messageJS('erreur');
        }
    }

    public function afficheLigneAvant($onglet, $reference, $affiche)
    {
        switch ($onglet) {
            case AO_ecran::FOLDER_LIGNE:
                if ($nodeXml = & $this->rechercheNode($reference, $this->wsdlObject)) {
                    $parent = & $this->getParent($nodeXml['TITRE_AV'], $this->wsdlObject);
                    
                    $parent['!TITRE_AV'] = ($affiche ? '0' : '1');
                    // Suppression de l'information concernant le titre
                    if ($parent['!TITRE_AV'] == 1) {
                        StdXmlWsdl::setValueXml($parent, '', 'TITRE_AV');
                        if (! array_key_exists('!Etat', $parent))
                            $parent['!Etat'] = 'M';
                    }
                    
                    $this->refresh(AO_ecran::XSL_FILE, false, $onglet);
                }
                break;
        }
    }

    public function afficheOngletPopup()
    {
        $obj_xml = new GenXslt(true);
        
        echo $obj_xml->XslHtml(AO_ecran::XSL_FILE, $this->buildXml());
    }

    public function popupAffiche($fonction)
    {
        $nameFrame = $this->setNomPopup('win_pop_objet');
        
        switch ($fonction) {
            case 'onglet':
                $largeurFenetre = 1024;
                $hauteurFenetre = 800;
                
                $url = 'popup_affiche_objet.php' . '?action=initPopup' . '&form_parent=' . urlencode($this->getFormulaire()) . '&OBJ_SESSION=' . urlencode($this->OBJ_SESSION);
                
                echo "var win_pop = OpenPopup('", $url, "','", $this->getNomPopup(), "','", $largeurFenetre, "','", $hauteurFenetre, "');";
                break;
        }
    }

    public function lanceFonction($fonction)
    {
        switch ($fonction) {
            case 'paramLigne':
                $largeurFenetre = 900;
                $hauteurFenetre = 600;
                
                $url = 'popup_recherche_article.php' . '?action=initPopup' . '&form_parent=' . urlencode($this->getFormulaire()) . '&OBJ_SESSION=' . urlencode($this->OBJ_SESSION);
                
                echo "var win_pop = OpenPopup('", $url, "','win_pop_ajout','", $largeurFenetre, "','", $hauteurFenetre, "');";
                
                break;
        }
    }

    public function afficheLigneSousTotal($onglet, $reference, $affiche)
    {
        switch ($onglet) {
            case AO_ecran::FOLDER_LIGNE:
                if ($nodeXml = & $this->rechercheNode($reference, $this->wsdlObject)) {
                    $parent = & $this->getParent($nodeXml['TITRE_AV'], $this->wsdlObject);
                    
                    $parent['!TITRE_ST'] = ($affiche ? '0' : '1');
                    if ($parent['!TITRE_AV'] == 1) {
                        if (! array_key_exists('!Etat', $parent))
                            $parent['!Etat'] = 'M';
                        StdXmlWsdl::setValueXml($parent, '', 'TITRE_ST');
                    }
                    $this->refresh(AO_ecran::XSL_FILE, false, $onglet);
                }
                break;
        }
    }

    public function reactive($onglet, $reference)
    {
        switch ($onglet) {
            case AO_ecran::FOLDER_LIGNE:
                if ($nodeXml = & $this->rechercheNode($reference, $this->wsdlObject)) {
                    $parent = & $this->getParent($nodeXml['TITRE_AV'], $this->wsdlObject);
                    
                    if (array_key_exists('!_OldEtat', $parent))
                        $parent['!Etat'] = $parent['!_OldEtat'];
                    else
                        unset($parent['!Etat']);
                    
                    $this->refresh(AO_ecran::XSL_FILE, false, $onglet);
                }
                break;
        }
    }

    public function supprime($onglet, $reference)
    {

        switch ($onglet) {
            case AO_ecran::FOLDER_LIGNE:
              
                if ($nodeXml = & $this->rechercheNode($reference, $this->wsdlObject)) 
                {
                    $parent = & $this->getParent($nodeXml['TITRE_AV'], $this->wsdlObject);
                    
                    if (array_key_exists('!Etat', $parent))
                        $parent['!_OldEtat'] = $parent['!Etat'];
                    $parent['!Etat'] = 'S';
                    
                    $this->refresh(AO_ecran::XSL_FILE, false, $onglet);
                }
                break;
            case AO_ecran::FOLDER_FOURNISSEUR:
                if ($nodeXml = & $this->rechercheNode($reference, $this->wsdlObject)) {
                    $parent = & $this->getParent($nodeXml['TYPE_FG'], $this->wsdlObject);
                    
                    $parent['!Etat'] = 'S';
                    
                    $this->refresh(AO_ecran::XSL_FILE, false, $onglet, null, true);
                }
                break;
            case AO_ecran::FOLDER_CLAUSE:
                if ($nodeXml = & $this->rechercheNode($reference, $this->wsdlObject)) {
                    
                    $parent = & $this->getParent($nodeXml['PARAG'], $this->wsdlObject);
                    
                    $parent['!Etat'] = 'S';
                    
                    $this->refresh(AO_ecran::XSL_FILE, false, $onglet);
                }
                break;
            case AO_ecran::FOLDER_DOC_RATTACHE:
                $element = $this->getDataObject();
                if (array_key_exists($onglet, $element)) {
                    $elementSuppression = & $element[$onglet];
                    if (array_key_exists($reference, $elementSuppression)) {
                        $trouve = & $elementSuppression[$reference];
                        
                        $NO_ORDRE = StdXmlWsdl::getValueZoneInterne($trouve['NO_ORDRE']);
                        
                        if ($retour = DocRattache::supprimerDocRattache('AO_ENTET', $this->getNumAo(), $NO_ORDRE)) {
                            switch ($retour['Statut']) {
                                case 'O':
                                    $this->refresh(AO_ecran::XSL_FILE, false, $onglet);
                                    unset($elementSuppression[$reference]);
                                    break;
                                case 'E':
                                    Affichage::messageJS($retour['MsgErreur']);
                                    $this->refresh(AO_ecran::XSL_FILE, false, $onglet);
                                    unset($elementSuppression[$reference]);
                                    break;
                                default:
                                    print_r($retour);
                                    break;
                            }
                        }
                    }
                }
                break;
            case AO_ecran::FOLDER_PIECE_JOINTE:
                $element = $this->getDataObject();
                if (array_key_exists($onglet, $element)) {
                    $elementSuppression = & $element[$onglet];
                    if (array_key_exists($reference, $elementSuppression)) {
                        $trouve = & $elementSuppression[$reference];
                        
                        $NO_ORDRE = StdXmlWsdl::getValueZoneInterne($trouve['NO_ORDRE']);
                        
                        $etat = 'S';
                        $numOrdre = 0;
                        
                        $envoi = '<AOPJIn>' . '<NumAO>' . $this->getNumAo() . '</NumAO>' . '<PJ Etat="' . $etat . '">' . // A M S
($etat == 'A' ? '' : '<NumOrdre>' . $NO_ORDRE . '</NumOrdre>') . '</PJ>' . '</AOPJIn>';
                        
                        if ($result = Wsdl::wsdlCallGen('Oxaproc_AO.wsdl', 'SRM_AO_GESTION_PJ', $envoi)) {
                            if ($result['Retour'] == 'E') {
                                Affichage::messageJS($result['MsgErreur']);
                                $this->refresh(AO_ecran::XSL_FILE, false, $onglet);
                                unset($elementSuppression[$reference]);
                            } else if ($result['Retour'] == 'O') {
                                $this->refresh(AO_ecran::XSL_FILE, false, $onglet);
                                unset($elementSuppression[$reference]);
                            }
                        }
                    }
                }
                break;
            default:
                Affichage::messageJS(strBuild(trad('Manque developpement suppression onglet @1@'), $onglet));
                break;
        }
    }

    public static function stockeFourRetenu($num_ao)
    {
        $result = null;
        if ($ao = SqlAo::rqGetAoEntente($num_ao)->Trouve1()) {
            switch ($ao['TYPE_SG']) {
                case 'S':
                    if ($reqSql = SqlDoaSociete::rqGetSocieteByCode($ao['CODE_STE'])->Trouve1())
                        $ret['!texte'] = $reqSql['RAIS_SOC'];
                    else
                        $ret['!texte'] = '';
                    break;
                case 'G':
                    if ($reqSql = SqlDoaSociete::rqGetDoaGroupeSociete($ao['CODE_STE'])->Trouve1())
                        $ret['!texte'] = $reqSql['RS_GRP'];
                    else
                        $ret['!texte'] = '';
                    
                    $array_filters = array(
                        'GROUPE' => $ao['CODE_STE'],
                        'orderByField' => 'RAIS_SOC'
                    );
                    $option = null;
                    if ($listeSociete = & SqlSociete::rqPopupGetAllSocieteForUser($array_filters, true, false)->TrouveTous())
                        foreach ($listeSociete as & $element)
                            $option[] = array(
                                '!value' => $element['CODE_STE'],
                                '!texte' => $element['RAIS_SOC']
                            );
                    
                    $result['entete'] = array(
                        '!name' => 'CODE_STE',
                        '!value' => '',
                        '!titre' => trad('Choix de la société du groupement') . ' ' . $ret['!texte'] . ' (' . $ao['CODE_STE'] . ')',
                        'option' => $option
                    );
                    break;
            }
            
            if ($listeAoFour = SqlAo::rqAO_FourRetenu($num_ao, null, null, true)->TrouveTous()) {
                foreach ($listeAoFour as $index => & $fourRet)
                    if ($fourRet['TYPE_FG'] == 'F') {
                        if ($req = SqlFrs::rqGetRecordFournis($fourRet['CODE_FOU'])->Trouve1()) {
                            $result['FRS'][$index ++] = array(
                                '!TYPE_FG' => $fourRet['TYPE_FG'],
                                '!CODE' => $fourRet['CODE_FOU'],
                                '!RS' => $req['RS'],
                                '!VILLE' => $req['VILLE'],
                                '!TEL' => $req['TEL'],
                                '!FAX' => $req['FAX'],
                                '!EMAIL' => $req['EMAIL'],
                                '_chk' => array(
                                    '!name' => 'chk_' . $index,
                                    '!value' => '1'
                                )
                            );
                        }
                    } else if ($fourRet['TYPE_FG'] == 'G') {
                        if ($req = SqlGestFourniss::rqGetInfoGroupeFournisseur($fourRet['CODE_FOU'])->Trouve1()) {
                            if ($fouGrp = SqlGestFourniss::rqGetListeFouGrp($fourRet['CODE_FOU'])->TrouveTous()) {
                                $listeFour = null;
                                foreach ($fouGrp as & $four) {
                                    $listeFour[] = array(
                                        '!value' => $four['CODE'],
                                        '!texte' => $four['RS']
                                    );
                                }
                            } else
                                $listeFour = null;
                            
                            $result['FRS'][$index ++] = array(
                                '!TYPE_FG' => $fourRet['TYPE_FG'],
                                '!CODE' => $fourRet['CODE_FOU'],
                                '!RS' => $req['RS'],
                                '!VILLE' => $req['VILLE'],
                                '!TEL' => $req['TEL'],
                                '!FAX' => $req['FAX'],
                                '!EMAIL' => $req['EMAIL'],
                                '_chk' => array(
                                    '!name' => 'chk_' . $index,
                                    '!value' => (is_null($listeFour) ? '0' : '1')
                                ),
                                '_select' => array(
                                    '!name' => 'select_' . $index,
                                    '!value' => '',
                                    'option' => $listeFour
                                )
                            );
                        }
                    }
            }
        }
        
        AO_ecran::saveFournisseurRet($result);
        
        return $result;
    }

    public static function saveFournisseurRet(& $result)
    {
        $_SESSION['AO_FRS_RET'] = serializeSecure($result);
    }

    public static function getFournisseurRet()
    {
        return unserialize($_SESSION['AO_FRS_RET']);
    }

    public static function getContexte()
    {
        return '';
    }
}
