<?php

class GestFourniss_Societes
{

    public static $id_onglet = 'pres_dyn_onglet_societes';

    public static $page_php = 'gest_fourniss_societes.php';

    public static $id_Xml = 'ListSocietes';

    public static $fichier_xml = 'application/xsl/gest_fourniss/gest_fourniss_societes.xsl';

    public static function &BuildXmlUneSociete(& $value, $modifiable, & $fakeID, & $codeFrs)
    {
        $lgChampTexte = GestFourniss::$longueurChampTexte;
        $format = $value['!Format'];
        $objet = $value['!Objet'];
        
        if (is_array($value)) {
            $longueurMax = ControleSaisie::getLongueurChamp($format);
            $valeur = $value['#text'];
            $jsCheckValeur = 'TraiteUrl(\'' . GestFourniss_Societes::$page_php . '?action=checkValue&codeFrs=' . urlencode($codeFrs) . '\', this);';
            $name = 'CODE_STE_' . $fakeID;
        } else {
            // note : le name (qui sert dans le form) est à définir
            $valeur = $value;
        }
        
        $SIRET = '';
        if ('' != $valeur) {
            // Dossier 27092 : un utilisateur doit pouvoir lire un libellé d'une société à laquelle il n' pas accès.
            $reqSql = SqlUsers::rqGetInfoForSTE($valeur)->Trouve1();
            if (is_array($reqSql)) {
                $SIRET = $reqSql['SIRET'];
                $libelleFinal = $reqSql['RAIS_SOC'];
            }
        }
        
        $actifTmp = $modifiable && ('A' == $value['!Etat']);
        $imgonclick = 'OpenPopup(\'ctrl_liste_societes.php?action=initPopup&popup_id=SOCIETES_USER&formName=' . GestFourniss::getIdFormulaire($codeFrs) . '_VALEUR&inputField=' . $name . '&labelField=' . $name . '_lib\',\'popup_liste_societes_user\',900,700);';
        $format = (array_key_exists('!Format', $value)) ? $value['!Format'] : '';
        $objet = (array_key_exists('!Objet', $value)) ? $value['!Objet'] : '';
        
        $compXsl = new ComposantXslTexte($name, $actifTmp, $format, $objet);
        $compXsl->setValeur($valeur, true);
        $compXsl->setLibelleFinal($libelleFinal);
        $compXsl->setLongueurMax($longueurMax);
        $compXsl->setSize($lgChampTexte);
        $compXsl->setAction($jsCheckValeur);
        $compXsl->setImgOnclick($imgonclick);
        $societeCourante = $compXsl->buildXml();
        $societeCourante['!libelle_chp'] = $compXsl->getLibelleFinal();
        $societeCourante['!siret'] = $SIRET;
        
        if ($modifiable) {
            // On ajoute l'action de suppression
            $nameBtn = 'action_supprimer';
            $actionSup = 'CallUrl(\'' . GestFourniss_Societes::$page_php . '?action=Supprime&codeFrs=' . urlencode($codeFrs) . '&id=' . $fakeID . '\');';
            $imgClasse = ComposantXslAction::imgClasseSupprimer_o_sur_b;
            
            $compXsl = new ComposantXslAction($nameBtn);
            $compXsl->setAction($actionSup);
            $compXsl->setImage($imgClasse);
            $societeCourante[$nameBtn] = $compXsl->buildXml();
        }
        $societeCourante['!onclickSupprimer'] = ($modifiable) ? 'CallUrl(\'' . GestFourniss_Societes::$page_php . '?action=Supprime&codeFrs=' . urlencode($codeFrs) . '&id=' . $fakeID . '\');' : '';
        
        return $societeCourante;
    }

    public static function &BuildXml(& $codeFrs, $mode)
    {
        $tableauXml = FicheFournisseurXml::ChargeSession($codeFrs);
        $typeFour = FicheFournisseurXml::GetTypeFournisseur($tableauXml);
        $panelSociete = null;
        
        if ('L' == $mode) {
            $modeLocal = 'L';
        } elseif ('LE' == $mode) {
            // Avant de passer en mode d'édition, on vérifie les droits.
            if ($_SESSION['AdminFournisseur']) // || ('P' != $typeFour && ($_SESSION['AuthModifFournisseur'] || $_SESSION['GestionContactFournisseur'])) || ('P' == $typeFour && ($_SESSION['AuthModifProspect'] || $_SESSION['GestionContactProspect'])))
                $modeLocal = 'LE';
            else
                $modeLocal = 'L';
        }
        
        $modifiableGlobal = $tableauXml['ListSocietes']['!Modifiable'] && 'LE' == $modeLocal;
        $fakeID = 0;
        foreach ($tableauXml['ListSocietes']['CODE_STE'] as & $tmpSociete) {
            $val_societe = array_key_exists('#text', $tmpSociete);
            if (('I' != $tmpSociete['!Etat'] || '' != $val_societe) && 'S' != $tmpSociete['!Etat'])
                // Si l'élément n'est pas supprimé, s'il est en ajout on s'il est rempli
                $panelSociete[] = GestFourniss_Societes::BuildXmlUneSociete($tmpSociete, $modifiableGlobal && $tmpSociete['!Modifiable'], $fakeID, $codeFrs);
            $fakeID ++;
        }
        
        // Pour ne pas afficher le tableu s'il n'y a pas de société.
        if (! is_null($panelSociete))
            $array['content']['societes'] = $panelSociete;
        
        // Pourquoi est-ce qu'on n'utilise pas "this" ou "document.forms.FORM_GEST_FOURNISS.elements[0]" ?
        // => parce que IE9 ne gère pas les éléments ajoutés dynamiquement de la même manière que les autres navigateurs
        if ('L' != $modeLocal) {
            $idBtn = 'btnAjouterSociete';
            $actionBtn = 'TraiteUrl(\'' . GestFourniss_Societes::$page_php . '?action=Ajoute&codeFrs=' . urlencode($codeFrs) . '\', document.getElementById(\'tabInProgress\'));';
            $compXsl = new ComposantXslAction($idBtn);
            $compXsl->setLibelle(Trad('Ajouter une société'));
            $compXsl->setAction($actionBtn);
            $array['content']['btn_ajouter'] = $compXsl->buildXml();
            
            // $array['content']['!onclick_ajouter'] = ('L' != $modeLocal)?'TraiteUrl(\''.GestFourniss_Societes::$page_php.'?action=Ajoute&id='.$name.'\', document.getElementById(\'tabInProgress\'));':'';
        }
        $array['content']['!mode'] = $mode;
        
        return $array;
    }

    public static function &checkValue(& $codeFrs, & $format, & $objet, & $codeTmp, & $value)
    {
        $valeurModifiee = '';
        $messageErreur = '';
        
        $values = explode('_', $codeTmp);
        $code = 'CODE_STE';
        $id = $values[count($values) - 1];
        
        $tableauXml = FicheFournisseurXml::ChargeSession($codeFrs);
        
        // // On passe par la vérification standard
        $resultatTest = ControleSaisie::checkValue($format, $objet, $value);
        
        $infosComplementaires = & $resultatTest['infosComplementaires'];
        $libelleValeur = & $resultatTest['libelleValeur'];
        $valeurModifiee = & $resultatTest['valeurModifiee'];
        $messageErreur = & $resultatTest['messageErreur'];
        
        // Vérification spécialisée de l'écran
        // if ('' == $messageErreur) {
        // switch($code) {
        // case 'CODE_STE':
        // if (is_array($infosComplementaires)) {
        // Affichage::innerHTML($codeTmp.'_lib', $infosComplementaires['RAIS_SOC']);
        // Affichage::innerHTML($codeTmp.'_siret', $infosComplementaires['SIRET']);
        // $valeurModifiee = '';
        // }
        // break;
        // }
        // }
        if ('' == $messageErreur) {
            // On met à jour l'info dans le tableau xml
            $fakeID = 0;
            foreach ($tableauXml['ListSocietes']['CODE_STE'] as & $societe) {
                if ($id == $fakeID) {
                    // Nous avons trouvé le bon enregistrement
                    $societe['#text'] = $value;
                    FicheFournisseurXml::SauvegardeSession($tableauXml);
                    break;
                }
                $fakeID ++;
            }
        }
        
        $result = array(
            'valeurModifiee' => & $valeurModifiee,
            'libelleValeur' => & $libelleValeur,
            'messageErreur' => & $messageErreur
        );
        return $result;
    }

    public static function Ajoute(& $codeFrs)
    {
        $messageErreur = '';
        
        $tableauXml = FicheFournisseurXml::ChargeSession($codeFrs);
        $derniereCle = - 1;
        $idx = 0;
        
        // On parcoure la tableau pour avoir un exemplaire de fiche et un numéro d'ID et on en fait une copie (pas de référence)
        foreach ($tableauXml['ListSocietes']['CODE_STE'] as $key => $value) {
            if (0 == $idx) {
                $modele = $value;
                $idx ++;
            }
        }
        // On vide le modèle
        $modele['!Etat'] = 'A'; // C'est un ajout
        $modele['!Modifiable'] = true;
        $modele['#text'] = '';
        
        // On place le tableau dans les données
        $tableauXml['ListSocietes']['CODE_STE'][] = & $modele;
        
        // On sauvegarde la nouvelle donnée
        FicheFournisseurXml::SauvegardeSession($tableauXml);
        
        return $messageErreur;
    }

    public static function RafraichitAffichage(& $codeFrs)
    {
        $mode = 'LE';
        $tableauXml = FicheFournisseurXml::ChargeSession($codeFrs);
        $typeFrs = FicheFournisseurXml::GetTypeFournisseur($tableauXml);
        // $codeFrs = FicheFournisseurXml::GetCodeFournisseur($tableauXml);
        $id_content = GestFourniss_Identity::getIdPanelSociete($codeFrs);
        
        $array = GestFourniss_Societes::BuildXml($codeFrs, $mode);
        $genXsl = new GenXslt(true);
        Affichage::innerHTMLPointeur($id_content, $genXsl->XslHtml(GestFourniss_Societes::$fichier_xml, $array));
    }

    public static function &Supprime(& $codeFrs, & $id)
    {
        $messageErreur = '';
        $tableauXml = FicheFournisseurXml::ChargeSession($codeFrs);
        $fakeID = 0;
        foreach ($tableauXml['ListSocietes']['CODE_STE'] as $key => & $value) {
            if ($key == $id) {
                switch ($value['!Etat']) {
                    case 'I': // C'est un contact qui existait avant l'édition de la fiche, on le taggue comme supprimé
                        $value['!Etat'] = 'S';
                        break;
                    case 'A': // C'est un contact qui n'existait pas avant l'édition de la fiche, on le supprime du tableau
                        unset($tableauXml['ListSocietes']['CODE_STE'][$key]);
                        break;
                }
                FicheFournisseurXml::SauvegardeSession($tableauXml);
                break;
            }
            $fakeID ++;
        }
        return $messageErreur;
    }
}