<?php

class XmlWsdlOutil extends Properties
{

    public $wsdlObject;

    // IMPERATIF en public CAR y a des functions sleep au dessus et le __sleep ne fonction que sur public
    public $formulaire = '';

    public $mode = '';

    public $modeCreation = false;

    public $modeMiseAjour = false;

    public $dataObject = null;

    public $nomPopup = null;

    /**
     * ULTRA IMPORTANT DE METTRE EN PUBLIC car cet indicateur permet de gerer les nom de zones de manière dynamique
     * 
     * @var unknown
     */
    public $indice = 0;

    public $objectOk = false;

    public $errorMessage = '';

    public $ongletAffiche = null;

    public $modePopup = false;

    /**
     * Fonction définissant si la zone peut etre enable ou pas
     *
     * @param unknown $zone
     * @return boolean
     */
    public function isZoneActive($zone, & $node)
    {
        if (array_key_exists('!Modifiable', $node[$zone])) {
            $actif = BoolSql($node[$zone]['!Modifiable']);
        } else
            $actif = false;
        
        return $actif;
    }

    public function initalize()
    {
        $this->dataObject = null;
    }

    public function &getDataObject()
    {
        return $this->dataObject;
    }

    public function &getZone($classObjet, $indexData, $zoneXml)
    {
        if (is_null($this->dataObject) || ! is_array($this->dataObject) || ! array_key_exists($classObjet, $this->dataObject))
            $this->dataObject[$classObjet] = array();
        
        if (! is_array($this->dataObject[$classObjet]) || ! array_key_exists($indexData, $this->dataObject[$classObjet]))
            $this->dataObject[$classObjet][$indexData] = array();
        
        if (! is_array($this->dataObject[$classObjet][$indexData]) || ! array_key_exists($zoneXml, $this->dataObject[$classObjet][$indexData]))
            $this->dataObject[$classObjet][$indexData][$zoneXml] = array();
        
        $element = & $this->dataObject[$classObjet][$indexData][$zoneXml];
        
        if (! array_key_exists('!nameZone', $element)) {
            foreach (StdXmlWsdl::getNouvelleZone($this) as $index => $valeur)
                $element[$index] = $valeur;
            
            $element['!name'] = $zoneXml;
            $element['!nameCtrl'] = $zoneXml;
        }
        
        return $element;
    }

    public function removeDataObject($classObjet)
    {
        if (is_null($classObjet))
            $this->dataObject = null;
        else {
            $this->dataObject[$classObjet] = null;
        }
    }

    /**
     * Defini si la zone est active ou pas
     * 
     * @see XmlWsdlOutil::isZoneActive()
     */
    public function isZoneAffiche($zone, & $node)
    {
        return true;
    }

    public function setFormulaire($nomFormulaire)
    {
        $this->formulaire = $nomFormulaire;
    }

    public function getFormulaire()
    {
        return $this->formulaire;
    }

    public function setNomPopup($nomPopup)
    {
        $this->nomPopup = $nomPopup;
    }

    public function getNomPopup()
    {
        return $this->nomPopup;
    }

    public function &rechercheNode($zone, & $arrayXml)
    {
        if (is_array($arrayXml))
            foreach ($arrayXml as $index => & $node)
                if (is_array($node) && array_key_exists('!nameZone', $node)) {
                    if ($node['!nameZone'] == $zone) {
                        /**
                         * EDP NE PAS TOUCHER a la mise en place de la référence ici, car sinon duplication memoire du résultat et
                         * donc perte de la reference dans le noeud principal enregistré en session
                         */
                        $retour = array(
                            $index => & $node
                        );
                        return $retour;
                    }
                } else if ($retour = XmlWsdlOutil::rechercheNode($zone, $node))
                    return $retour;
        
        $retour = null;
        return $retour;
    }

    public function &getParent(& $nodeArecherche, & $arbo)
    {
        $retour = null;
        if (is_array($arbo))
            foreach ($arbo as $index => & $node)
                if (is_array($node))
                    if (array_key_exists('!nameZone', $node)) {
                        if (is_array($nodeArecherche) && array_key_exists('!nameZone', $nodeArecherche) && $nodeArecherche['!nameZone'] == $node['!nameZone'])
                            return $arbo;
                    } else {
                        $retour = & $this->getParent($nodeArecherche, $node);
                        if (! is_null($retour))
                            return $retour;
                    }
                else {
                    $retour = & $this->getParent($nodeArecherche, $node);
                    if (! is_null($retour))
                        return $retour;
                }
        
        return $retour;
    }

    public function saveSession($name)
    {
        $_SESSION[$name] = serializeSecure($this);
        $this->restoreClassSession();
    }

    public function restoreClassSession()
    {}

    public static function getSession($name)
    {
        return unserializeSecure($_SESSION[$name]);
    }

    /**
     *
     * @param unknown $node
     * @param unknown $zone
     * @param unknown $typeObjectWsdl
     * @param unknown $ret
     */
    public function getCustoListe(& $node, & $zone, & $ret)
    {
        return null;
    }

    /**
     *
     * @param unknown $node
     * @param unknown $zone
     *            example CODEGAMME
     * @param unknown $objetArecherche
     *            exemple FABRICANT
     * @param unknown $objectCible
     *            exemple GAMMES
     */
    public function getValueZoneInterne($node, $zone, $objetArecherche, $objectCible)
    {
        Affichage::messageJS('Manque développement pour ' . $objetArecherche . ' => ' . $objectCible . '   zone : ' . $zone);
    }

    /**
     *
     * @param unknown $mode
     */
    public function setMode($mode)
    {
        $this->mode = $mode;
    }

    public function getMode()
    {
        return $this->mode;
    }

    public function nouvelEnregistrement()
    {
        return false;
    }

    public function annulerEnregistrement()
    {
        return false;
    }

    public function setModeCreation($modeCreation)
    {
        $this->modeCreation = $modeCreation;
    }

    public function setModeMiseAjour($modeMiseAjour)
    {
        $this->modeMiseAjour = $modeMiseAjour;
    }

    public function isModeCreation()
    {
        return $this->modeCreation;
    }

    public function isModeMiseAjour()
    {
        return $this->modeMiseAjour;
    }

    /**
     * Fonction de raffraichissement
     * 
     * @param unknown $xslFichier
     * @return GenXslt
     */
    public function &refresh($xslFichier, $modeScroll = true, $ongletBase = null, $ongletAffiche = null, $displayBlock = null)
    {
        $obj_xml = new GenXslt(true);
        $this->removeDataObject($ongletBase);
        
        $retour = $this->buildXml($ongletBase);
        $obj_xml->XslHtml($xslFichier, $retour);
        
        foreach ($retour['ecran']['onglet'] as & $onglet) {
            if (is_null($this->nomPopup))
                $prefix = '';
            else
                $prefix = 'Oxa_getDevice().popList["' . $this->nomPopup . '"].';
            
            if (is_null($ongletBase) || $ongletBase == $ongletBase) {
                $templateName = $onglet['!templateName'];
                $visible = $onglet['!visible'];
                $id = $onglet['entete']['!id'];
                $idSujet = 'id_' . $id . '_sujet';
                $idCorps = 'id_' . $id . '_corps';
                
                if ($visible) {
                    if (! is_null($ongletBase)) {
                        echo 'var objScr = ', $prefix, 'document.getElementById("id_', $id, '_scroll");';
                        echo 'var indexScroll = (objScr ? objScr.scrollTop : 0);';
                    }
                    
                    $obj_xml->echoHtml($idSujet, $prefix);
                    $obj_xml->echoHtml($idCorps, $prefix);
                    
                    if (! is_null($ongletBase)) { // IMPERATIF redemander l'id car il a reconstitué par les echo
                        echo 'var objScr = ', $prefix, 'document.getElementById("id_', $id, '_scroll");';
                        echo 'if(objScr) objScr.scrollTop = indexScroll;';
                    }
                }
                $idScr = 'id_' . $id;

                Affichage::displayElement($idScr, $visible, '', $displayBlock);
                
                if (array_key_exists('toolbar', $onglet['entete'])) {
                    if (array_key_exists('element', $onglet['entete']['toolbar']) && is_array($onglet['entete']['toolbar']['element'])) {
                        if ($modeScroll)
                            foreach ($onglet['entete']['toolbar']['element'] as & $elementToolbar) {
                                if ($elementToolbar['!type'] == 'agrandir') {
                                    if (array_key_exists('!selected', $elementToolbar) && $elementToolbar['!selected'] == 1)
                                        $mode = true;
                                    else
                                        $mode = false;
                                    // agr_tag_0
                                    Affichage::setAttribut('agr_' . $id, 'checked', $mode);
                                    if ($mode) {
                                        echo 'window.scroll(0,0);';
                                    }
                                    break;
                                }
                            }
                    }
                }
            }
        }
        //Affichage::displayAo($ongletBase);
        if (is_null($ongletBase))
            $obj_xml->echoHtml(AO_ecran::ID_TITRE);
        return $obj_xml;
    }

    public function newIndice()
    {
        $this->indice ++;
    }

    public function getZoneIndice()
    {
        return $this->indice;
    }

    public function setObjectOk($isOk)
    {
        $this->objectOk = $isOk;
    }

    public function isObjectOk()
    {
        return $this->objectOk;
    }

    public function setErrorMessage($errorMessage)
    {
        $this->errorMessage = $errorMessage;
    }

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

    public function setOngletAffiche($ongletAffiche)
    {
        $this->ongletAffiche = $ongletAffiche;
    }

    public function getOngletAffiche()
    {
        return $this->ongletAffiche;
    }

    public function getZoneLibellAutomatique($object)
    {
        return true;
    }

    public function setModePopup($modePopup)
    {
        $this->modePopup = $modePopup;
    }

    public function isModePopup()
    {
        return $this->modePopup;
    }

    /**
     *
     * @param unknown $zone
     * @param unknown $visible
     * @param unknown $actif
     * @return NULL
     */
    public function getXslAttributeZone($node, $zone, $visible, $actif)
    {
        return null;
    }

    /**
     * Liste des appels principaux standard
     *
     * @param unknown $nomObjectWsdl
     * @param unknown $nomFormulaire
     * @param unknown $retourZone
     * @return string
     */
    public static function getListeStandard($nomObjectWsdl, $nomFormulaire, $retourZone)
    {
        $retour = '';
        switch ($nomObjectWsdl) {
            case 'ARTICLES':
                $retour = " OpenPopup('ctrl_liste_art.php?action=initPopup&popup_id=ARTICLES_HAPLUS" . "&formName=" . $nomFormulaire . "&backForm=" . $nomFormulaire . "&inputField={$retourZone}"  . "&backAction=change" . "&backPopup=1" . "&backField=" . $retourZone . "&modeHtml=1" . "','popup_liste_article',800,700);";
                $largeurFenetre = 540;
                $hauteurFenetre = 600;
                $url = "ctrl_liste_art.php?action=initPopup&popup_id=ARTICLES_HAPLUS&form_parent=" . $nomFormulaire . "&champ={$retourZone}" . "&prg_appel=" . urlencode('AO_fiche.php?action=valideInfoListe');
                
                //$retour = "var win_pop = window.open('{$url}','win_pop','width={$largeurFenetre},height={$hauteurFenetre}');";
                break;
            case 'FABRICAN':
            case 'FABRICANT':
                $largeurFenetre = 540;
                $hauteurFenetre = 600;
                $url = "liste_fab.php?form_parent=" . $nomFormulaire . "&champ={$retourZone}" . "&prg_appel=" . urlencode('AO_fiche.php?action=valideInfoListe');
                
                $retour = "var win_pop = window.open('{$url}','win_pop','width={$largeurFenetre},height={$hauteurFenetre}');";
                
                break;
            case 'SSFAMILL':
                //$retour = "OpenPopup('ctrl_liste_sous_familles.php?action=initPopup&popup_id=" . 'SSFAMILL' . "&formName=" . $nomFormulaire . "&backForm=" . $nomFormulaire . "&inputField={$retourZone}"  . "&backAction=change" . "&backPopup=1" . "&backField=" . $retourZone . "&modeHtml=1" . "','popup_de_liste',750,600);";
                $largeurFenetre = 540;
                $hauteurFenetre = 600;
                $url = "ctrl_liste_sous_familles.php?action=initPopup&popup_id=ARTICLES_HAPLUS&form_parent=" . $nomFormulaire . "&champ={$retourZone}" . "&prg_appel=" . urlencode('AO_fiche.php?action=valideInfoListe');
                
                $retour = "var win_pop = window.open('{$url}','win_pop','width={$largeurFenetre},height={$hauteurFenetre}');";
                break;
            default: 
                break;
        }


        return $retour;
    }

    public function &getWsdlArray()
    {
        return $this->wsdlObject;
    }
}