<?php

class TreeView extends CatalogueSessionObject implements BaseXmlDocument
{

    const TR_SECTION = 'section';

    const TR_TITRE = 'titre';

    var $doc = null;

    var $open = true;

    var $cache = false;

    var $pageUrl = null;

    var $serXml = null;

    var $actionPhp = 'sel_tr';

    /**
     * Class permettant la modelisation d'un tree view incluant la gestion de sous niveau d'arborescence
     * sur la base du document xml dont la modelisation est interne à la classe et utilisé au travers de la xsl de base de la gestion du treeview
     * qui appele une template qui doit matché avec le node name : <b>section/titre</b>
     *
     * Cette class est en extends de CatalogueSessionObject qui sert à stocker / restore / identifier coté HTML un object
     * 
     * @author edp
     *        
     */
    function __construct()
    {
        $this->doc = new XmlDocument();
    }

    public function __sleep()
    {
        $this->serXml = serializeSecure($this->getDocument()->saveXml());
        return array_keys(get_object_vars($this));
    }

    public function __wakeup()
    {
        $xml = unserializeSecure($this->serXml);
        $this->doc->loadXmlString($xml);
        $this->serXml = null;
    }

    function setActionPhp($actionPhp)
    {
        $this->actionPhp = & $actionPhp;
        return $this;
    }

    function getActionPhp()
    {
        return $this->actionPhp;
    }

    function setCallBack($pageUrl)
    {
        $this->pageUrl = $pageUrl;
        return $this;
    }

    function isCache()
    {
        return $this->cache;
    }

    function setCache($cache)
    {
        $this->cache = $cache;
        return $this;
    }

    /**
     * Permet de recuperer le root du document
     */
    public function &getDocument()
    {
        if ($this->pageUrl != null) {
            $this->getRootDoc()->setAttribute('actionSrv', $this->getActionPhp());
            $this->getRootDoc()->setAttribute('pageCall', $this->pageUrl);
        }
        return $this->doc->getDocument();
    }

    private function setUniq($element)
    {
        $id = CatalogueSessionObject::getUniqId();
        $element->setAttribute('id', $id);
        
        return $id;
    }

    public function addRoot($texte)
    {
        $root = $this->doc->AddSection($this->getDocument(), $texte);
        $this->setIdObject($this->setUniq($root));
        return $root;
    }

    public function getRootDoc()
    {
        return $this->doc->getDocument()->documentElement;
    }

    public function setTexte($element, $texte)
    {
        $element->setAttribute('texte', $texte);
        return $this;
    }

    public function setToolTip($element, $texte)
    {
        $element->setAttribute('tooltip', $texte);
        return $this;
    }

    public function addPere($nodeBase)
    {
        $element = $this->doc->AddElementValue($nodeBase, TreeView::TR_SECTION);
        $element->setAttribute('open', $this->open ? 1 : 0);
        $this->setUniq($element);
        
        /**
         * Creation du noeud permettant la gestion spécifique du titre
         */
        
        return $element;
    }

    public function getCacheElement($id)
    {
        if ($this->isCache()) {
            try {
                $xpath = new DOMXPath($this->getDocument());
                if ($noeud_list = $xpath->query("//*[@id='{$id}']"))
                    foreach ($noeud_list as $noeud)
                        return $noeud;
            } catch (DOMException $e) {
                // echo $e->getMessage();
                $ok = false;
            }
        }
        
        return null;
    }

    /**
     * Donne le noeud permettant de qualifier le titre d'un noeud du treeview
     * qui cree alors au niveau de la xsl un match nommé : <b>titre</b
     * 
     * @param unknown $element
     * @return unknown|un
     */
    public function getNodeTitre($element)
    {
        if ($element->hasChildNodes())
            foreach ($element->childNodes as $p)
                if ($p->nodeName == TreeView::TR_TITRE)
                    return $p;
        
        return $this->doc->AddSection($element, TreeView::TR_TITRE);
    }

    /**
     * Indique pour le systeme que le mode par defaut
     * de la creation d'un parent est en mode ouvert true ou mode fermé false
     * 
     * @param unknown $open
     */
    public function setOpenFolder($open)
    {
        $this->open = $open;
        return $this;
    }

    /**
     * Retour l'array xml du treeView
     */
    function getXmlArray()
    {
        return SopaClientOxa::domnode_to_array($this->getDocument()->documentElement, false);
    }
}
