<?php

class StdXmlWsdl extends Properties
{

    const ACTION_LOUPE = '?action=zoomListe",this.previousSibling);';

    const ACTION_CTRL_SRV = '?action=valideInfoListe",this);';

    // const ACTION_LOUPE = '?action=zoomListe",this.nextSibling);';
    
    /**
     *
     * @param unknown $node
     * @param unknown $zone
     * @param string $contexte
     * @param string $visible
     *            (Dans le cas de présence d'un contexte la gestion de la visibilite est faite la function surcharge isZoneAffiche defaut : TRUE)
     * @param string $actif
     *            (Dans le cas de présence d'un contexte la gestion du champ actif ou pas est faite la function surcharge isZoneActive defaut : false)
     * @return multitype:NULL unknown string Ambigous <string, boolean> multitype:multitype:string multitype:string Ambigous <string, unknown, string, NULL>
     */
    public static function getNouvelleZone($contexte)
    {
        $contexte->newIndice();
        
        return array(
            '!nameZone' => 'id_zone_' . $contexte->getZoneIndice(),
            '!divZone' => 'div_id_zone_' . $contexte->getZoneIndice()
        
        );
    }

    public static function getXmlValueZone(& $node, $zone, $contexte = null, $visible = false, $actif = true)
    {
        if (is_null($contexte))
            $contexteSaisie = null;
        else {
            $contexteSaisie = $contexte->getContexteEcran();
            $actif = $contexte->isZoneActive($zone, $node);
            $visible = $contexte->isZoneAffiche($zone, $node);
        }
        
        $value = StdXmlWsdl::getValueZoneInterne($node[$zone]);
        
        if (! array_key_exists('!nameZone', $node[$zone]) && ! is_null($contexte)) {
            foreach (StdXmlWsdl::getNouvelleZone($contexte) as $index => $valeur)
                $node[$zone][$index] = $valeur;
        }
        
        // Obtenir la liste des zones par nameZone et aussi par name
        
        $ret = array(
            '!divZone' => $node[$zone]['!divZone'],
            '!nameZone' => $node[$zone]['!nameZone'],
            '!name' => $zone,
            '!nameCtrl' => $zone,
            '!value' => StdXmlWsdl::getValueZone($node[$zone]),
            '!Format' => $node[$zone]['!Format']
        );
        
        $retourLoupe = 'Traite("' . $contexteSaisie->getPrgRetour() . StdXmlWsdl::ACTION_LOUPE;
        
        if (! is_null($contexte) && is_null($contexte->getCustoListe($node, $zone, $ret)))
            if (array_key_exists($zone, $node) && array_key_exists('!Objet', $node[$zone])) {
                switch ($node[$zone]['!Objet']) {
                    case 'COUNTRY':
                        if ($result = SqlUsers::rqGetAllCountry()->TrouveTous())
                            foreach ($result as & $ligne_pays)
                                $ret['option'][] = array(
                                    '!value' => & $ligne_pays['CODE_PAYS'],
                                    '!texte' => & $ligne_pays['LIBELLE']
                                );
                        
                        break;
                    case 'FOURNISS':
                        if (! is_null($contexte) && ! is_null($contexte->getTypeListe($node, $zone))) {
                            if ($contexte->getTypeListe($node, $zone) == 'GROUPFRS') {
                                if ($reqSql = & SqlGestFourniss::rqGetInfoGroupeFournisseur($value)->Trouve1())
                                    $ret['!texte'] = $reqSql['RS'];
                                else
                                    $ret['!texte'] = '';
                                
                                if (is_null($contexte) || ! is_null($contexte->getTypeListe($node, $zone))) {
                                    if ($contexteSaisie instanceof ContexteEcran) {
                                        $ret['!aide'] = $retourLoupe;
                                    }
                                    $ret['!action'] = 'Traite("' . $contexteSaisie->getPrgRetour() . StdXmlWsdl::ACTION_CTRL_SRV;
                                } else {
                                    $actif = false;
                                    $visible = false;
                                }
                                break;
                            }
                        }
                        if ($reqSql = & SqlFrs::rqGetRecordFournis($value)->Trouve1())
                            $ret['!texte'] = $reqSql['RS'];
                        else
                            $ret['!texte'] = '';
                        
                        if (is_null($contexte) || ! is_null($contexte->getTypeListe($node, $zone))) {
                            if ($contexteSaisie instanceof ContexteEcran) {
                                $ret['!aide'] = $retourLoupe;
                            }
                            $ret['!action'] = 'Traite("' . $contexteSaisie->getPrgRetour() . StdXmlWsdl::ACTION_CTRL_SRV;
                        } else {
                            $actif = false;
                            $visible = false;
                        }
                        
                        break;
                    case 'DEVISES':
                        if ($reqSql = SqlPanier::rqGetAllDevise()->TrouveTous())
                            foreach ($reqSql as & $element)
                                $ret['option'][] = array(
                                    '!value' => $element['CODE_DEVI'],
                                    '!texte' => $element['LIBELLE']
                                );
                        $ret['!action'] = 'Traite("' . $contexteSaisie->getPrgRetour() . StdXmlWsdl::ACTION_CTRL_SRV;
                        break;
                    case 'LANGUES':
                        if ($reqSql = SqlUsers::rqLangues()->TrouveTous())
                            foreach ($reqSql as & $element)
                                $ret['option'][] = array(
                                    '!value' => $element['COD_LNG'],
                                    '!texte' => $element['LIBELLE']
                                );
                        $ret['!action'] = 'Traite("' . $contexteSaisie->getPrgRetour() . StdXmlWsdl::ACTION_CTRL_SRV;
                        break;
                    case 'SOCIETE':
                        // ATTENTION DANS LE CADRE DES AO cela peut etre aussi la liste des groupes de société
                        if (! is_null($contexte) && ! is_null($contexte->getTypeListe($node, $zone))) {
                            if ($contexte->getTypeListe($node, $zone) == 'SOCIETE')
                                if ($reqSql = & SqlDoaSociete::rqGetSocieteByCode($value)->Trouve1())
                                    $ret['!texte'] = $reqSql['RAIS_SOC'];
                                else
                                    $ret['!texte'] = '';
                            else if ($contexte->getTypeListe($node, $zone) == 'GROUPSOC')
                                if ($reqSql = & SqlDoaSociete::rqGetDoaGroupeSociete($value)->Trouve1())
                                    $ret['!texte'] = $reqSql['RS_GRP'];
                                else
                                    $ret['!texte'] = '';
                        }
                        
                        if (! is_null($contexte) && ! is_null($contexte->getTypeListe($node, $zone))) {
                            if ($contexte->getTypeListe($node, $zone) == 'SOCIETE') {
                                if ($contexteSaisie instanceof ContexteEcran)
                                    $ret['!aide'] = $retourLoupe;
                            } else if ($contexte->getTypeListe($node, $zone) == 'GROUPSOC') {
                                $ret['option'][] = array(
                                    '!value' => '',
                                    '!texte' => trad('Votre Choix')
                                );
                                
                                if ($reqSql = SqlDoaSociete::rqGetDoaGroupeSociete(null, $_SESSION['Session_SocUsr'])->TrouveTous())
                                    foreach ($reqSql as & $element)
                                        $ret['option'][] = array(
                                            '!value' => $element['CODE_GRP'],
                                            '!texte' => $element['RS_GRP']
                                        );
                            }
                            $ret['!action'] = 'Traite("' . $contexteSaisie->getPrgRetour() . StdXmlWsdl::ACTION_CTRL_SRV;
                        } else {
                            $actif = false;
                            $visible = false;
                        }
                        break;
                    case 'CLAUSIER':
                        if (array_key_exists('!Format', $node) && $node['!Format'] == 'A3000') {
                            // EN RIEN FAIRE CAR ON NE PASSE PAR LE SYSTEME MEMO
                        } else {}
                        $ret['!action'] = 'Traite("' . $contexteSaisie->getPrgRetour() . StdXmlWsdl::ACTION_CTRL_SRV;
                        break;
                    case 'DEVISES':
                        if ($reqSql = & SqlPanier::rqSqlTableDevise($value)->Trouve1())
                            $ret['!texte'] = $reqSql['LIBELLE'];
                        else
                            $ret['!texte'] = '';
                        $ret['!action'] = 'Traite("' . $contexteSaisie->getPrgRetour() . StdXmlWsdl::ACTION_CTRL_SRV;
                        break;
                    case 'CENTRE_E':
                    case 'CENTRE_L':
                        if ($reqSql = & SqlCentreGene::getInfoOnCentre($value)->Trouve1())
                            $ret['!texte'] = $reqSql['RAIS_SOC'];
                        else
                            $ret['!texte'] = '';
                        
                        if (is_null($contexte) || ! is_null($contexte->getTypeListe($node, $zone))) {
                            if ($contexteSaisie instanceof ContexteEcran) {
                                $ret['!aide'] = $retourLoupe;
                            }
                            $ret['!action'] = 'Traite("' . $contexteSaisie->getPrgRetour() . StdXmlWsdl::ACTION_CTRL_SRV;
                        } else {
                            $actif = false;
                            $visible = false;
                        }
                        
                        break;
                    
                    case 'AO_ENTET':
                        if (is_null($contexte) || ! is_null($contexte->getTypeListe($node, $zone))) {
                            if ($contexteSaisie instanceof ContexteEcran) {
                                $ret['!aide'] = $retourLoupe;
                            }
                            $ret['!action'] = 'Traite("' . $contexteSaisie->getPrgRetour() . StdXmlWsdl::ACTION_CTRL_SRV;
                        } else {
                            $actif = false;
                            $visible = false;
                        }
                        
                        break;
                    case 'CENTRE_R':
                        if ($reqSql = & SqlCentreGene::getInfoOnCentre($value)->Trouve1())
                            $ret['!texte'] = $reqSql['RAIS_SOC'];
                        else
                            $ret['!texte'] = '';
                        if ($contexteSaisie instanceof ContexteEcran)
                            $ret['!aide'] = "var win_pop = OpenPopup('ctrl_liste_ctr_emet.php?action=initPopup&popup_id=CENTRE_R&formName=session_user&inputField={$zone}&labelField=lib_{$zone}&CODE_STE=001','popup_liste_ctr_emet',900,700);";
                        break;
                    case 'CENTRE':
                        if ($reqSql = & SqlCentreGene::getInfoOnCentre($value)->Trouve1())
                            $ret['!texte'] = $reqSql['RAIS_SOC'];
                        else
                            $ret['!texte'] = '';
                        // OpenPopup('ctrl_liste_ctr_emet.php?action=initPopup&popup_id=CENTRE_E&formName=session_user&inputField=CTR_EMET&labelField=CTR_EMET_RS&CODE_STE=001','popup_liste_ctr_emet',900,700);
                        
                        break;
                    case 'ACHETEUR':
                        if ($reqSql = SqlParam::rqSelectOneDateEnregMDPByUser($value)->Trouve1())
                            $ret['!texte'] = $reqSql['NOM'];
                        else
                            $ret['!texte'] = '';
                        
                        if (is_null($contexte) || ! is_null($contexte->getTypeListe($node, $zone))) {
                            if ($contexteSaisie instanceof ContexteEcran) {
                                $ret['!aide'] = $retourLoupe;
                            }
                            $ret['!action'] = 'Traite("' . $contexteSaisie->getPrgRetour() . StdXmlWsdl::ACTION_CTRL_SRV;
                        } else {
                            $actif = false;
                            $visible = false;
                        }
                        break;
                    case 'LANGUES':
                        if ($reqSql = & SqlUsers::rqLangues($value)->Trouve1())
                            $ret['!texte'] = $reqSql['LIBELLE'];
                        else
                            $ret['!texte'] = '';
                        $ret['!action'] = 'Traite("' . $contexteSaisie->getPrgRetour() . StdXmlWsdl::ACTION_CTRL_SRV;
                        break;
                    case 'ARTICLES':
                        if (is_null($contexte) || $contexte->getZoneLibellAutomatique($node[$zone]['!Objet']))
                            if ($reqSql = & SqlArticle::rqIsArticleHaplus($value)->Trouve1())
                                $ret['!texte'] = $reqSql['DESIGN'];
                            else
                                $ret['!texte'] = '';
                        
                        if (is_null($contexte) || ! is_null($contexte->getTypeListe($node, $zone))) {
                            if ($contexteSaisie instanceof ContexteEcran) {
                                $ret['!aide'] = $retourLoupe;
                            }
                            $ret['!action'] = 'Traite("' . $contexteSaisie->getPrgRetour() . StdXmlWsdl::ACTION_CTRL_SRV;
                        } else {
                            $actif = false;
                            $visible = false;
                        }
                        break;
                    case 'SSFAMILL':
                        if ($reqSql = & SqlPanier::rqGetRecordSSFAMILL($value)->Trouve1())
                            $ret['!texte'] = $reqSql['DESIGNAT'];
                        else
                            $ret['!texte'] = '';
                        if (is_null($contexte) || ! is_null($contexte->getTypeListe($node, $zone))) {
                            if ($contexteSaisie instanceof ContexteEcran) {
                                $ret['!aide'] = $retourLoupe;
                            }
                            $ret['!action'] = 'Traite("' . $contexteSaisie->getPrgRetour() . StdXmlWsdl::ACTION_CTRL_SRV;
                        } else {
                            $actif = false;
                            $visible = false;
                        }
                        
                        break;
                    case 'FABRICAN':
                        if ($reqSql = & SqlArticle::rqGetFabricant($value)->Trouve1()) {
                            $ret['!texte'] = $reqSql['RS'];
                        } else
                            $ret['!texte'] = '';
                        if (is_null($contexte) || ! is_null($contexte->getTypeListe($node, $zone))) {
                            if ($contexteSaisie instanceof ContexteEcran) {
                                $ret['!aide'] = $retourLoupe;
                            }
                            $ret['!action'] = 'Traite("' . $contexteSaisie->getPrgRetour() . StdXmlWsdl::ACTION_CTRL_SRV;
                        } else {
                            $actif = false;
                            $visible = false;
                        }
                        break;
                    case 'GAMMES':
                        $codeFabricant = $contexte->getValueZoneInterne($node, $zone, 'FABRICAN', $node[$zone]['!Objet']);
                        if ($reqSql = & SqlArticle::rqGetFabricantGamme($codeFabricant, $value)->Trouve1())
                            $ret['!texte'] = $reqSql['DESIGN'];
                        else
                            $ret['!texte'] = '';
                        if (is_null($contexte) || ! is_null($contexte->getTypeListe($node, $zone))) {
                            if ($contexteSaisie instanceof ContexteEcran) {
                                $ret['!aide'] = $retourLoupe;
                            }
                            $ret['!action'] = 'Traite("' . $contexteSaisie->getPrgRetour() . StdXmlWsdl::ACTION_CTRL_SRV;
                        } else {
                            $actif = false;
                            $visible = false;
                        }
                        break;
                    
                    case 'UNITES':
                        if ($reqSql = & SqlArticle::rqIsUniteHaplus($value)->Trouve1())
                            $ret['!texte'] = $reqSql['LIBELLE'];
                        else
                            $ret['!texte'] = '';
                        
                            if ($reqSql = SqlPanier::rqGetListeUnites()->TrouveTous())
                            $z = 0 ; 
                            foreach ($reqSql as & $element)
                            {
                                if($z == 0)
                                {
                                    $ret['option'][] = array(
                                        '!value' => '',
                                        '!texte' =>''
                                    );
                                }
                                else
                                {
                                    $ret['option'][] = array(
                                        '!value' => & $element['unit'],
                                        '!texte' => & $element['unit']
                                    );
                                }

                                $z ++; 
                            }
                        $ret['!action'] = 'Traite("' . $contexteSaisie->getPrgRetour() . StdXmlWsdl::ACTION_CTRL_SRV;
                        break;

                    default:
                        echo $value;
                        print_r($node[$zone]);
                        exit();
                }
            } else {
                switch ($zone) {
                    case 'TYPE_SOC_GS':
                        $ret['!action'] = 'Traite("' . $contexteSaisie->getPrgRetour() . StdXmlWsdl::ACTION_CTRL_SRV;
                        $ret['option'] = array(
                            array(
                                '!value' => 'G',
                                '!texte' => trad('Groupe')
                            ),
                            array(
                                '!value' => 'S',
                                '!texte' => trad('Société')
                            )
                            // array('!value' => 'T', '!texte' => trad('Tous')), A finir plus tard
                        );
                        break;
                    case 'TYPE_FG':
                        $ret['!action'] = 'Traite("' . $contexteSaisie->getPrgRetour() . StdXmlWsdl::ACTION_CTRL_SRV;
                        $ret['option'] = array(
                            array(
                                '!value' => 'G',
                                '!texte' => trad('Groupe')
                            ),
                            array(
                                '!value' => 'F',
                                '!texte' => trad('Fournisseur')
                            )
                            // array('!value' => 'T', '!texte' => trad('Tous')), A finir plus tard
                        );
                        break;
                    case 'existCC':
                        $ret['!onclick'] = $node[$zone]['!onclick'] ?? '';
                        $visible = $ret['!texte'] = $node[$zone]['#text'];
                        break;
                    default:
                        $ret['!action'] = 'Traite("' . $contexteSaisie->getPrgRetour() . StdXmlWsdl::ACTION_CTRL_SRV;
                        break;
                }
            }
        
        if ($actif) {
            if (array_key_exists('!Modifiable', $node[$zone])) {
                $actif = BoolSql($node[$zone]['!Modifiable']);
            } else
                $actif = false;
        }
        $ret['!visible'] = $visible;
        $ret['!actif'] = $actif;
        
        if (! is_null($contexte) && ($complementXsl = $contexte->getXslAttributeZone($node, $zone, $visible, $actif)))
            foreach ($complementXsl as $index => & $suite)
                $ret[$index] = $suite;
        
        return $ret;
    }

    public static function reformate(& $nodeControle, $valeur)
    {
        $RetourSaisie = new RetourSaisie();
        $RetourSaisie->setValeurOrigine($valeur);
        
        if (false !== stripos($nodeControle['!Format'], 'N')) {
            $valeur = str_replace(' ', '', $valeur);
            $valeur = str_replace(',', '.', $valeur);
            $RetourSaisie->setValeurOrigine($valeur);
            $RetourSaisie->setValeurFinal($valeur);
        } else if ($nodeControle['!Format'] == 'L') {
            if ($valeur == 'on' || $valeur == '1' || $valeur == 'true')
                $valeur = '1'; // ATTENTION YA / EDP 09/11/2016 Bug coté magic donc on stocke 1 et pas true pour des logicials
            else
                $valeur = '0'; // ATTENTION YA / EDP 09/11/2016 Bug coté magic donc on stocke 0 et pas false pour des logicials
            $RetourSaisie->setValeurFinal($valeur);
        } else if ($nodeControle['!Format'] == 'D') {
            if ($valeur == '') {
                $valeur = '';
                $RetourSaisie->setValeurFinal($valeur);
            } else if (ControleSaisie::isDateValideFormat($valeur)) {
                $valeur = convertDateUserToSql($valeur);
                $RetourSaisie->setValeurFinal($valeur);
            } else {
                $RetourSaisie->setErreur(trad('Saisie de la date incorrecte') . ' (' . $RetourSaisie->getValeurOrigine() . ')');
            }
        } else
            $RetourSaisie->setValeurFinal($valeur);
        
        // Controle du format de la zone afin de valider que la donnée que l'on veut rentrer est bien dans le format attendue
        
        return $RetourSaisie;
    }

    public static function getValueZone($node)
    {
        if (array_key_exists('!Format', $node) && $node['!Format'] == 'D') {
            if (array_key_exists('#text', $node))
                if ($node['#text'] == '00000000')
                    $ret = '';
                else
                    $ret = convertDateSqlToFr($node['#text']);
            else
                $ret = '';
        } else if (array_key_exists('#text', $node))
            $ret = $node['#text'];
        else
            $ret = '';
        
        return $ret;
    }

    public static function &getValueZoneInterne(& $node)
    {
        if (is_array($node))
            if (array_key_exists('#text', $node))
                $ret = $node['#text'];
            else if (array_key_exists('!value', $node))
                $ret = $node['!value'];
            else
                $ret = '';
        else
            $ret = '';
        
        return $ret;
    }

    public static function setValueXml(& $node, $value, $champ = null)
    {
        if (is_null($champ)) {
            $node['#text'] = $value;
        } else {
            // $info = & $node[$champ];
            // $info['#text'] = & $value;
            $node[$champ]['#text'] = trim($value);
        }
    }
}
