<?php

/**------------------------------------------------
*
* Rooty, 2018 <rooty@rooty.me>
*
*
* This software is protected by copyright, please
* read the file COPYRIGHT.
* This program is distributed in the hope that it
* will be useful, but without any warranty; without
* even the implied warranty of merchantability or
* fitness for a particular purpose. Please
* read the file LICENCE.
*
* Fichier Tree.php
*
* Ce fichier contient la classe Tree (classe abastraite de gestion d'arbre pour l'arborescence des groupes et des noeuds)
*
* @author Rooty <www.rooty.me|rooty@rooty.me>
* @link www.rooty.me
* @since 2018/05/17
* @version 0.3
*
* @package system_data
* @subpackage model
* @copyright Copyright &copy; 2004-2005, ARD Limousin
*/

#####################################################################################################
################################# Parametrage
#####################################################################################################
/**
* declaration du system... si cette variable n'est pas définie, les fichier inclus ne marche pas...
* cette variable est déclarée sur la page d'execution du script.
* <p> if ( !defined('SYSTEM_IN') )
* {
* die("Hacking attempt");
* }</p>
*/
if ( !defined('SYSTEM_IN') )
{
 die("Hacking attempt");
}

/**
* Classe Tree
*
* Classe de gestion d'arbre<br>
*
* @package system_data
* @abstract
* @subpackage model
*/
class Tree
{
/**#@+
* @access public
*/

/**
* @var entier
* @desc contient l'id numerique de l'Tree (noeud de création)
*/
var $id = null;

/**
* @var tableau
* @desc tableau des noeud pére
*/
var $tabFather = array();

/**
* @var tableau
* @desc tableau des noeud fils.
*/
var $tabSon = array();

/**#@-*/

/**
*Constructeur de la classe Tree
*<p>Initialise la classe Tree</p>
* @access public
*/
	function __construct()
	{
		$this->id=null;
		$this->tabFather=array();
		$this->tabSon=array();
	}

/**
* "getteur" de l'attribut Id.
* @access public
* @return entier Id du Tree
*/
	function getId()
	{
		return $this->id;
	}

/**
* "setteur" de l'attribut Id.
* @access public
* @param entier Id du Tree
*/
	function setId($Id)
	{
		$this->id=$Id;
	}

/**
* load de l'objet Arbre.
* (utilisé essentiellement pour charger un Tree depuis une base de données)
* @access public
* @param entier identifiant numérique du Tree père
* @param chaine libelle du Tree
* @return booleen chargé ou non chargé
*/
	function doLoad($idCreation, $tabFather, $tabSon)
	{
		if (!Is_Numeric($idCreation) || !Is_array($tabFather) || !Is_array($tabSon) )
		{
			$classe="Tree";
			$message="Erreur dans Tree ";
			addError(2,$classe,$message, __line__, __file__);
			return false;
		}

		$this->id		=$idCreation;
		$this->tabFather	=$tabFather;
		$this->tabSon		=$tabSon;

		return true;
	}

/**
* isSon : est un fils dans l'arbre
*
* @param identifiant du Noeud
* @access public
* @return booleen
*/
	function isSon($id)
	{
		for ($i=0; $i<count($this->tabSon); $i++)
		{
			if ($this->tabSon[$i]->getId()==$id)
				return true;
		}
		return false;
	}

/**
* isFather : est un pere dans l'arbre
*
* @param identifiant du Noeud
* @access public
* @return booleen
*/
	function IsFather($id)
	{
		for ($i=0; $i<count($this->tabFather); $i++)
		{
			if ($this->tabFather[$i]->getId()==$id)
				return true;
		}
		return false;
	}

	//
	// Pour les péres
	//
/**
* getFatherArray: retourne un tableau avec tous les identifiant des péres
*
* <p>Utiliser plutôt la méthode getFather renvoyant une liste d'objet noeud</p>
* @access public
* @return tableau
*/
	function getFatherArray()
	{
		$tab=array();

		for ($i=0; $i<count($this->tabFather); $i++)
		{
			$tab[$i]=$this->tabFather[$i]->getId();
		}
		return $tab;
	}

/**
* getFather: retourne une liste avec tous les groupe péres
*
* @access public
* @return tableau
*/
	function getFather()
	{
		return $this->tabFather;
	}

/**
* getFatherLibellerArray: retourne un tableau avec tous les libelles des péres
*
* @access public
* @return tableau
*/
	function getFatherLibelleArray($langue)
	{
		$tab=array();

		for ($i=0; $i<count($this->tabFather); $i++)
		{
			$tab[$i]=$this->tabFather[$i]->getLibelle($langue);
		}
		return $tab;
	}

	//
	// Pour les fils
	//
/**
* getSonOfIdPereArray: retourne un tableau avec tous les identifiant des fils (strict)
*
* <p>Utiliser plutôt la méthode getSonOfIdPere renvoyant une liste d'objet noeud</p>
* @access public
* @deprecated
* @return tableau des identifiants fils...
*/
	function getSonOfIdPereArray($id)
	{
		$tab=array();
		$k=0;

		for ($i=0; $i<count($this->tabSon); $i++)
		{
			if ($this->tabSon[$i]->getIdPere()==$id)
			{
				$tab[]=$this->tabSon[$i]->getId();
			}
		}
		return $tab;
	}

/**
* getSonOfIdPere: retourne une liste de tous les noeuds des fils
*
* @access public
* @return tableau des objet noeuds fils...
*/
	function getSonOfIdPere($id)
	{
		$tab=array();

		for ($i=0; $i<count($this->tabSon); $i++)
		{
			if ($this->tabSon[$i]->getIdPere()==$id)
			{
				$tab[]=$this->tabSon[$i];
			}
		}
		return $tab;
	}

/**
* getSonArray: retourne un tableau avec tous les identifiant des fils
*
* <p>Utiliser plutôt la méthode getSon renvoyant une liste d'objet noeud</p>
* @deprecated
* @access public
* @return tableau
*/
	function getSonArray()
	{
		$tab=array();

		for ($i=0; $i<count($this->tabSon); $i++)
		{
			$tab[]=$this->tabSon[$i]->getId();
		}
		return $tab;
	}

/**
* getSon: retourne une liste de tous les objets noeud des fils
*
* @access public
* @return tableau
*/
	function getSon()
	{
		return $this->tabSon;
	}

/**
* getSonLibellerArray: retourne un tableau avec tous les libelle des fils
* @access public
* @return tableau
*/
	function getSonLibelleArray($langue)
	{
		$tab=array();

		for ($i=0; $i<count($this->tabSon); $i++)
		{
			$tab[$i]=$this->tabSon[$i]->getLibelle($langue);
		}
		return $tab;
	}

	//
	// Générique
	//
/**
* getLibelleFromNode: retourne le nom du noeud
*
* @param identifiant du Noeud
* @access public
* @return chaine
*/
	function getLibelleFromNode($id, $langue)
	{
		for ($i=0; $i<count($this->tabFather); $i++)
		{
			if ($this->tabFather[$i]->getId()==$id)
				return $this->tabFather[$i]->getLibelle($langue);
		}

		for ($i=0; $i<count($this->tabSon); $i++)
		{
			if ($this->tabSon[$i]->getId()==$id)
				return $this->tabSon[$i]->getLibelle($langue);
		}
		return "";
	}

/**
* getLibelle: retourne le nom du noeud
*
* Alias de getLibelleFromNode
* @param identifiant du Noeud
* @access public
* @return chaine
*/
	function getLibelle($id, $langue)
	{
		return ($this->getLibelleFromNode($id, $langue));
	}

/**
* getDomainFromNode: retourne le domaine du noeud
*
* @param identifiant du Noeud
* @access public
* @return chaine
*/
	function getDomainFromNode($id)
	{
		for ($i=0; $i<count($this->tabFather); $i++)
		{
			if ($this->tabFather[$i]->getId()==$id)
				return $this->tabFather[$i]->getDomain();
		}

		for ($i=0; $i<count($this->tabSon); $i++)
		{
			if ($this->tabSon[$i]->getId()==$id)
				return $this->tabSon[$i]->getDomain();
		}
		return "";
	}

/**
* getDomain: retourne le domaine du noeud
*
* Alias de getDomainFromNode
* @param identifiant du Noeud
* @access public
* @return chaine
*/
	function getDomain($id)
	{
		return ($this->getDomainFromNode($id));
	}

/**
* getNodeId : retourne l'objet noeud
*
* <p>Utiliser getNode</p>
* @deprecated
* @param identifiant du Node
* @access public
* @return objet noeud
*/
	function getNodeId($id)
	{
		return $this->getNode($id);
	}

/**
* getNode : retourne l'objet noeud
*
* @param identifiant du Node
* @access public
* @return objet noeud
*/
	function getNode($id)
	{
		for ($i=0; $i<count($this->tabSon); $i++)
		{
			if ($this->tabSon[$i]->getId()==$id)
				return $this->tabSon[$i];
		}

		for ($i=0; $i<count($this->tabFather); $i++)
		{
			if ($this->tabFather[$i]->getId()==$id)
				return $this->tabFather[$i];
		}

		$classe="TreeNode";
		$message="Erreur de l'id ".$id;
		addError(2,$classe,$message, __line__, __file__);

		$new=new Node();
		return $new;
	}

/**
* getAllNodeId retourne un tableau avec tous les noeud concernes par l'arborescence
* @access public
* @return tableau
*/
	function getAllNodeId($subNodeId=0)
	{
		$tab=array();

		for ($i=0; $i<count($this->tabFather); $i++)
		{
			$tab[]=$this->tabFather[$i]->getId();
		}

		if ($subNodeId==0)
		{
			for ($i=0; $i<count($this->tabSon); $i++)
			{
				$tab[]=$this->tabSon[$i]->getId();
			}
		}else{
			$tab=array_merge($this->getAllIdForNavigationId($subNodeId), $tab);
		}
		return $tab;
	}
}
?>
