<?php

class GestionFavorisSuivi
{

    const act_enregistre_recherche = 'EnregistreFavoris';

    const act_supprimer_recherche = 'SupprimerFavoris';

    const act_modifier_recherche = 'ModifierFavoris';

    const act_rafraichir_liste = 'RafraichirFavoris';

    const act_charger_favori = 'ChargerFavoris';

    const prefixe_id_div_favoris = 'id_div_favoris_';

    const prefixe_id_btn_favoris = 'id_btn_favoris_';

    const prefixe_id_liste_favoris = 'id_liste_favoris_';

    const prefixe_id_lib_favoris = 'id_lib_favoris_';

    const prefixe_id_div_maj = 'id_div_maj_';

    const prefixe_id_id_maj = 'id_id_maj_';

    const prefixe_id_lib_maj = 'id_lib_maj_';

    private $type_suivi;

    private $callback;

    private $id_div_favoris;

    private $id_btn_favoris;

    private $id_div_liste;

    private $id_div_maj;

    private $id_lib_maj;

    private $id_liste_favoris;

    private $id_form;

    private $id_user;

    function __construct(& $type_suivi, & $id_form)
    {
        $this->type_suivi = $type_suivi;
        $this->id_form = $id_form;
        $this->callback = EcranSuivi::$callbackRecherche;
        $this->id_div_favoris = GestionFavorisSuivi::getIdDiv($this->type_suivi);
        $this->id_btn_favoris = GestionFavorisSuivi::prefixe_id_btn_favoris . $type_suivi;
        $this->id_div_maj = GestionFavorisSuivi::prefixe_id_div_maj . $type_suivi;
        $this->id_lib_maj = GestionFavorisSuivi::prefixe_id_lib_maj . $type_suivi;
        $this->id_id_maj = GestionFavorisSuivi::prefixe_id_id_maj . $type_suivi;
        $this->id_lib_favoris = GestionFavorisSuivi::prefixe_id_lib_favoris . $type_suivi;
        $this->id_liste_favoris = GestionFavorisSuivi::prefixe_id_liste_favoris . $type_suivi;
        $this->id_user = utilisateur::getID();
    }

    function &getIdListe()
    {
        return $this->id_liste_favoris;
    }

    function &getIdLibelle()
    {
        return $this->id_lib_favoris;
    }

    function &getIdDivMaj()
    {
        return $this->id_div_maj;
    }

    function &getIdLibMaj()
    {
        return $this->id_lib_maj;
    }

    function &getIdIdMaj()
    {
        return $this->id_id_maj;
    }

    static function &getIdDiv(& $type_suivi)
    {
        $result = GestionFavorisSuivi::prefixe_id_div_favoris . $type_suivi;
        return $result;
    }

    function &getUrlRafraichirListe()
    {
        $js = 'CallUrlAsync("' . $this->callback . '?action=' . GestionFavorisSuivi::act_rafraichir_liste . '&type_suivi=' . $this->type_suivi . '&form=' . $this->id_form . '");';
        return $js;
    }

    function &getUrlChargerRecherche(& $ID_REQUETE)
    {
        $js = 'CallUrlAsync("' . $this->callback . '?action=' . GestionFavorisSuivi::act_charger_favori . '&type_suivi=' . $this->type_suivi . '&form=' . $this->id_form . '&ID_REQUETE=' . $ID_REQUETE . '");';
        return $js;
    }

    function &getUrlSupprimerRecherche(& $ID_REQUETE)
    {
        $js = 'TraiteUrlAsync("' . $this->callback . '?action=' . GestionFavorisSuivi::act_supprimer_recherche . '&form=' . $this->id_form . '&ID_REQUETE=' . $ID_REQUETE . '", document.forms["' . $this->id_form . '"].elements[0]);';
        return $js;
    }

    function &buildLignesXml()
    {
        $arrayRecherche = array();
        $idSuppr = 'supprimer_recherche';
        $imgSuppr = ComposantXslAction::img_picto_supprimer;
        $idCharger = 'charger_recherche';
        $imgCharger = ComposantXslAction::img_picto_charger;
        
        $reqSql = SqlSaveRequeteSuivi::rqSelectRequeteSuivi($this->id_user, $this->type_suivi)->TrouveTous();
        
        foreach ($reqSql as &$recherche) {
            //
            // Bouton charger
            //
            $actioncharger = $this->getUrlChargerRecherche($recherche['ID_REQUETE']);
            $compChargerRecherche = new ComposantXslAction($idCharger);
            $compChargerRecherche->setImage($imgCharger);
            $compChargerRecherche->setAction($actioncharger);
            
            //
            // Bouton supprimer
            //
            $actionEnregistrer = $this->getUrlSupprimerRecherche($recherche['ID_REQUETE']);
            $compSupprimerRecherche = new ComposantXslAction($idSuppr);
            $compSupprimerRecherche->setImage($imgSuppr);
            $compSupprimerRecherche->setAction($actionEnregistrer);
            
            $arrayRecherche[] = array(
                '!compteur' => Trad('Exécution') . ' : ' . $recherche['COMPTEUR'] . ' ' . trad('fois'),
                '!libelle' => $recherche['LIBELLE'],
                '!date_crea' => convertDateSqlToFr($recherche['DATE_CREA']),
                '!date_modif' => convertDateSqlToFr($recherche['DATE_MODIF']),
                GestionFavorisSuivi::act_supprimer_recherche => $compSupprimerRecherche->buildXml(),
                GestionFavorisSuivi::act_charger_favori => $compChargerRecherche->buildXml()
            );
        }
        return $arrayRecherche;
    }

    function &buildXml()
    {
        $array = array();
        
        $libelleLgMax = 256;
        $libelleTaille = 64;
        
        // MAJ Recherche / zone de l'id
        $compIdMAJ = new ComposantXslTexte($this->id_id_maj);
        $visible = false;
        $compIdMAJ->setVisible($visible);
        
        // MAJ Recherche / zone du libellé
        $compLibelleMAJ = new ComposantXslTexte($this->id_lib_maj);
        $compLibelleMAJ->setLongueurMax($libelleLgMax);
        $compLibelleMAJ->setSize($libelleTaille);
        
        // MAJ Recherche / bouton mise à jour
        $idModifier = GestionFavorisSuivi::act_modifier_recherche;
        // $actionModifier = 'TraiteUrlAsync("'.$this->callback.'?action='.GestionFavorisSuivi::act_modifier_recherche.'&'.$this->id_id_maj.'=" + encodeURI(document.getElementById("'.$this->id_id_maj.'").value + "&'.$this->id_lib_maj.'=" + encodeURI(document.getElementById("'.$this->id_lib_maj.'").value), document.forms["'.$this->id_form.'"].elements[0]);';
        $actionModifier = 'TraiteUrlAsync("' . $this->callback . '?action=' . GestionFavorisSuivi::act_modifier_recherche . '&' . $this->id_id_maj . '=" + encodeURI(document.getElementById("' . $this->id_id_maj . '").value + "&' . $this->id_lib_maj . '=" + encodeURI(document.getElementById("' . $this->id_lib_maj . '").value)), document.forms["' . $this->id_form . '"].elements[0]);';
        
        $compModifierRecherche = new ComposantXslAction($idModifier);
        $compModifierRecherche->setLibelle(Trad('Mise à jour'));
        $compModifierRecherche->setEstPrimaire(true);
        $compModifierRecherche->setAction($actionModifier);
        
        // Nouvelle recherche / zone du libellé
        $compLibelleRecherche = new ComposantXslTexte($this->id_lib_favoris);
        $compLibelleRecherche->setLongueurMax($libelleLgMax);
        $compLibelleRecherche->setSize($libelleTaille);
        
        // Bouton enregistrer
        $idEnregistrer = GestionFavorisSuivi::act_enregistre_recherche;
        $actionEnregistrer = 'TraiteUrlAsync("' . $this->callback . '?action=' . GestionFavorisSuivi::act_enregistre_recherche . '&' . $this->id_lib_favoris . '=" + encodeURI(document.getElementById("' . $this->id_lib_favoris . '").value), document.forms["' . $this->id_form . '"].elements[0]);';
        $compEnregistrerRecherche = new ComposantXslAction($id);
        $compEnregistrerRecherche->setLibelle(Trad('Enregistrer la recherche'));
        $compEnregistrerRecherche->setEstPrimaire(true);
        $compEnregistrerRecherche->setAction($actionEnregistrer);
        
        $actionSwitch = 'collapseExpandMenu("' . $this->id_div_favoris . '","' . $this->id_btn_favoris . '","img_reduire_16x16","Masquer la zone recherche","img_develop_16x16","Developper la zone recherche");';
        
        $array = array(
            '!id_div' => $this->id_div_favoris,
            '!id_btn' => $this->id_btn_favoris,
            '!actionSwitch' => $actionSwitch,
            '!enregistrementPossible' => 1,
            '!id_div_formulaire' => $this->id_div_favoris,
            '!id_div_maj' => $this->id_div_maj,
            'lib_maj' => $compLibelleMAJ->buildXml(),
            'btn_maj' => $compModifierRecherche->buildXml(),
            'id_maj' => $compIdMAJ->buildXml(),
            '!id_liste_favoris' => $this->id_liste_favoris,
            'libelleRecherche' => $compLibelleRecherche->buildXml(),
            GestionFavorisSuivi::act_enregistre_recherche => $compEnregistrerRecherche->buildXml(),
            'liste' => $this->buildLignesXml()
        );
        
        return $array;
    }

    private function &prepareData(& $data)
    {
        $result = array();
        $msgErreur = '';
        $chaineValeur = '';
        $champsSuivi = EcranSuivi::getListeChamps($this->type_suivi);
        foreach ($champsSuivi as & $champs)
            if (substr_count('||', GetValue($champs) . '---') > '0') { // on ajoute les '---' pour être sur que la chaine n'est pas nul
                $msgErreur = Trad("Vous ne pouvez pas enregistrer une recherche avec les caractères || dans l'un des champs.");
                break;
            } else
                $chaineValeur .= $champs . '=' . GetValue($champs) . '||';
        $result = array(
            'msgErreur' => & $msgErreur,
            'chaineValeur' => & $chaineValeur
        );
        return $result;
    }

    function &enregistrerRecherche(& $data)
    {
        $msgErreur = '';
        $idRequete = '';
        // voir suivi_doc.php, ligne 1610
        $nomRecherche = trim($data[$this->id_lib_favoris]);
        if ('' != $nomRecherche) {
            $arrayData = $this->prepareData($data);
            $chaineValeur = $arrayData['chaineValeur'];
            $msgErreur = $arrayData['msgErreur'];
            if ('' == $msgErreur) {
                // enregistrement de la requête dans la base
                $code_ste = $data[ChampRecherche::Societe];
                $sql = SqlSaveRequeteSuivi::rqInsertRequeteSuivi($this->id_user, $this->type_suivi, $code_ste, $nomRecherche, $chaineValeur);
                $sql[0]->ExecuteSql();
                $idRequete = $sql[1];
            }
        } else
            $msgErreur = trad('Veuillez renseigner un nom pour la requête favorite');
        
        $result = array(
            'msgErreur' => $msgErreur,
            'idRequete' => $idRequete
        );
        return $result;
    }

    function &supprimerRecherche($id_requete)
    {
        SqlSaveRequeteSuivi::rqDeleteRequeteSuivi($id_requete)->ExecuteSql();
    }

    function &modifierRecherche($data)
    {
        $msgErreur = '';
        $id_requete = $data[$this->getIdIdMaj()];
        $libelle = trim(urldecode($data[$this->getIdlibMaj()]));
        if ('' != $libelle) {
            $arrayData = $this->prepareData($data);
            $chaineValeur = $arrayData['chaineValeur'];
            $msgErreur = $arrayData['msgErreur'];
            if ('' == $msgErreur) {
                // enregistrement de la requête dans la base
                $code_ste = $data[ChampRecherche::Societe];
                SqlSaveRequeteSuivi::rqUpdateRequeteSuivi($id_requete, $code_ste, $libelle, $chaineValeur)->ExecuteSql();
            }
        } else
            $msgErreur = trad('Veuillez renseigner un nom pour la requête favorite');
        return $msgErreur;
    }

    function &buildRafraichirListeXml()
    {
        $array = array();
        $array['action'] = GestionFavorisSuivi::act_rafraichir_liste;
        $array['liste'] = $this->buildLignesXml();
        return $array;
    }

    function &chargerFavoris($id_requete)
    {
        // recupération des données de la requête favorite
        $contenu_req = SqlSaveRequeteSuivi::rqSelectContenuRequeteSuivi($id_requete)->Trouve1();
        $libelle = $contenu_req['LIBELLE'];
        
        // on organise les valeurs de la requête dans un tableau
        $tab_val = array();
        $valeur = explode('||', $contenu_req['VALEUR']);
        foreach ($valeur as & $val) {
            $tableau = explode('=', $val);
            $tab_val[$tableau[0]] = mb_substr($val, (mb_strlen($tableau[0])) + 1);
        }
        $champs_suivi = EcranSuivi::getListeChamps($this->type_suivi);
        
        $array = array(
            'champs_suivi' => EcranSuivi::getListeChamps($this->type_suivi),
            'libelle' => & $libelle,
            'tab_val' => & $tab_val
        );
        
        return $array;
    }
}