<?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 CoordinationObj.php
*
*Ce fichier contient la classe CoordinationObj
*
* @author Rooty <www.rooty.me|rooty@rooty.me>
* @link www.rooty.me
* @since 2004/04/14
* @version 0.3
* @package system_coordination
* @copyright Copyright &copy; 2009-2018, Rooty
*/
/**
* Modified by Guillaume Tessier <gui.tessier@wanadoo.fr>
* Since 2005/08/01
* Ajout de deux méthodes (setAllRow4Import et getAllRow4Export) ces deux méthodes abstraites 
* nous servent à restaurer et sauvegarder des données d'un outil.
*/
#####################################################################################################
################################# 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 CoordinationObj
*classe de gestion des objets génériques
* @package system_coordination
*/
class CoordinationObj
{
/**
* @var entier
* @desc ID de l'object (note la fonction oid permet de récuperer l'identifiant de l'objet executé sur la page)
* @access private
*/
var $id			= null;

/**#@+
* @var chaine
* @access private
*/

/*
* @desc date de création de l'objet
*/
var $create = null;

/*
* @desc posséseur de l'objet
*/
var $owner = null;

/*
* @desc node de création
*/
var $node = null;

/*
* @desc Icone de l'objet
*/
var $icone = null;

##################################################################################################################
############################################ Content Manadgement
##################################################################################################################
/*
* @desc type de l'objet (nom de la classe affectée à l'objet)
*/
var $contentType= null;

/*
* @desc Nom de l'objet
*/
var $name= null;

/*
* @desc Resume de l'objet
*/
var $resume= null;

/*
* @desc contenu de l'objet
*/
var $data= null;

/*
* @desc Mots clé de l'objet (valable pour des contenus systems)
*/
var $keyWord= null;

/*
* @desc date de parution
*/
var $parution= null;

/*
* @desc date d'archivage
*/
var $archivage= null;

/**#@-*/
	//
	// Constructor
	//
/**
* Constructeur de la classe CoordinationObj
*<p>Initialise CoordinationObj</p>
*/
	function __construct()
	{
		$this->id			=0;
		# les param suivants ne sont pas à saisir(récupérées par la session)
		$this->owner			=uid();
		$this->node			=nid();
		$this->create			=date("Y-m-d H:i:s");
		$this->icone			="";
		# Variables de configuration de l'objet
		$this->contentType		="";
		$this->name			=new XLangueChaine("");
		$this->resume			="";
		$this->data			=array();		# Initialise la structure de données
		$this->keyWord			="";
		$this->parution			="";
		$this->archivage		="";
	}

/**
* getId: Recupere l'identifiant
* @access public
* @return entier
*/
	function getId()
	{
		return $this->id;
	}

/**
* setId: Affecte l'identifiant
* @access public
* @param entier id
* @return booleen
*/
	function setId($id)
	{
		if (is_numeric($id))
		{
			$this->id = $id;
			return true;
		}else{
			return false;
		}
	}

/**
* getNode noeud de création de l'objet (sert à l'admin)
* @access public
* @return entier
*/
	function getNode()
	{
		return $this->node;
	}

/**
* setNode noeud de création de l'objet (sert à l'admin)
* @access public
* @param entier id
* @return booleen
*/
	function setNode($id)
	{
		if (is_numeric($id))
		{
			$this->node = $id;
			return true;
		}else{
			return false;
		}
	}

/**
* getIcone: retourne l'icone de l'objet
* @access public
* @return chaine
* @desc chaine
*/
	function getIcone()
	{
		return $this->icone;
	}

/**
*setIcone: affecte l'icone de l'objet
* @access public
* @param chaine path vers l'icone
* @return booleen
*/
	function setIcone($src)
	{
		$this->icone=$src;
		return true;
	}

/**
* getContentType: type d'objet utilisé
* @access public
* @return entier
* @desc 0 ou 1
*/
	function getContentType()
	{
		return $this->contentType;
	}

/**
* setContentType: affecte le type de l'objet
* @param chaine Nom de la classe!
* @access public
* @return booleen
*/
	function setContentType($src)
	{
		$this->contentType=$src;
		return true;
	}

/**
* "getteur" de l'attribut libelle.
* @access public
* @return chaine XML
*/
	function getXmlName()
	{
		return $this->name->getSql();
	}

/**
* "getteur" de l'attribut libelle.
* @access public
* @param chaine langue à récupérer
* @return chaine libelle du Noeud
*/
	function getName($langue)
	{
		return $this->name->getLanguage($langue);
	}

/**
* "setteur" de l'attribut libelle.
* @access public
* @param chaine langue pour le libellé à insérer
* @param chaine libelle (pas de code Html)
* @return booleen
*/
	function setName($langue, $libelle)
	{
		$this->name->setLanguage($langue, $libelle);
		return true;
	}

/**
* getresume: Resume de l'objet - description rapide
*
* @access public
* @return entier
* @desc 0 ou 1
*/
	function getResume()
	{
		return $this->resume;
	}

/**
* setresume: affecte le resume de l'objet
*
* @param chaine resume de l'objet
* @access public
* @return booleen
*/
	function setResume($src)
	{
		$this->resume=$src;
		return true;
	}

/**
* getXMLdata: retourne la source de données propre à l'objet (XML)
*
* @access public
* @return chaine chaine au format XML
*/
	function getAllData()
	{
		return addslashes(serialize($this->data));
	}

/**
* setXMLdata: affecte la source de données propre à l'objet (XML)
*
* @param chaine chaine au format XML
* @access public
* @return booleen
*/
	function setAllData($src)
	{
		# On load from string....
		if (is_string($src))
		{
			$this->data=unserialize($src);
			return true;
		}else{
			return false;
		}
	}

/**
* getData: retourne la valeur de la chaine
* @param chaine nom de la variable
* @access public
* @return chaine valeur de la donnée
*/
	function getData($pathVariable)
	{
		if (isset($this->data[$pathVariable]))
		{
			return (is_array($this->data[$pathVariable]))?$this->data[$pathVariable]:stripslashes($this->data[$pathVariable]);
		}else{
			return "";
		}
	}

/**
* setData : affecte la source de données propre à l'objet (XML)
*
* @param chaine nom de la variable
* @param chaine valeur de l'element
* @access public
* @return booleen
*/
	function setData($nom,$value)
	{
		$this->data[$nom]=$value;
		return false;
	}

/**
* getkeyWord: retourne la chaine de mots clés de l'objet
*
* @access public
* @return chaine
*/
	function getKeyWord()
	{
		return $this->keyWord;
	}

/**
* setkeyWord: affecte la chaine de mots clé
*
* @param chaine Mot clés
* @access public
* @return booleen
*/
	function setKeyWord($src)
	{
		$this->keyWord=$src;
		return true;
	}

/**
* getparution: retourne la date (format GB Y-m-d)
*
* @access public
* @return chaine
*/
	function getParution()
	{
		return $this->parution;
	}

/**
* setparution: affecte la date (format GB Y-m-d)
*
* @param chaine Mot clés
* @access public
* @return booleen
*/
	function setParution($src)
	{
		$this->parution=$src;
		return true;
	}

/**
* getparution: retourne la date (format GB Y-m-d)
*
* @access public
* @return chaine
*/
	function getArchivage()
	{
		return $this->archivage;
	}

/**
* setparution: affecte la date (format GB Y-m-d)
*
* @param chaine Mot clés
* @access public
* @return booleen
*/
	function setArchivage($src)
	{
		$this->archivage=$src;
		return true;
	}

/**
* doLoad: Charge un objet à partir de ses éléments
* @access public
* @param entier id
* @param date date de création
* @param chaine propriétaire
* @param chaine noeud de création
* @param chaine path vers l'icone
* @param chaine nom de la classe de l'objet
* @param chaine nom de l'objet
* @param chaine resumé de l'objet
* @param chaine contenu de l'objet
* @param chaine mot clé de l'objet
* @param date date de parution
* @param date date d'archivage
* @return booleen
*/
	function doLoad($id, $create, $owner, $node, $icone, $contentType, $name, $resume, $data, $keyWord, $parution, $archivage)
	{
		$this->setId($id);
		$this->create=$create;
		$this->owner=$owner;
		$this->node=$node;
		$this->setIcone($icone);
		$this->setContentType($contentType);
		$this->name->setSql($name);
		$this->setResume($resume);
		$this->setAllData($data);
		$this->setKeyWord($keyWord);
		$this->setParution($parution);
		$this->setArchivage($archivage);

		return true;
	}

/**
* isLoaded: Objet chargée ?
*
* @access public
* @return booleen
*/
	function isLoaded()
	{
		return (($this->id!=0 && Is_numeric($this->id))? true:false);
	}

/**
* configurePrint (affichage du form de modification ou de creation de l'objet...)
* @param chaine url de redirection du formulaire
* @param chaine url de retour
* @param entier groupe de création
* @param entier noeud de création
* @access public
* @return chaine code message
*/
	function configurePrint($url, $urlReturn, $groupIdPass, $nodeIdPass, $tabForbiddenPass)
	{
		/* gestion de la Template */
		addMessageFile("adminobject.ini");
		addMessageFile("adminnode.ini");
		addMessageFile("object.ini");
		
		/* gestion du lib en fonction de la langue courante */
		$currentCode=$GLOBALS["SYSTEM_USER_SESSION"]->langue->getCode();
		$defaultCode=$GLOBALS["SYSTEM_DEFAULT_LANGUAGE_CODE"];

		/* Récuperation du noeud à administrer sinon noeud d'entrée de l'admin */
		$nodeId=($this->getData("nodeId")!="")?$this->getData("nodeId"):eid();
		$groupId=($this->getData("groupId")!="")?$this->getData("groupId"):1; 		/* Tous les Groupes par défaut */

		# --> A voir en fonction des restrictions des objets
		/* Creation du Tree d'admin */
		$myTree			=$GLOBALS["SYSTEM_MANAGER"]["TREE_NODE"]->createInstance($nodeIdPass);

		/* Verification de l'existance du Tree */
		if ( !is_object($myTree) ){
			if ( $myTree->isLoaded()==false ){
				return "WrongArgument";
			}
		}

		/* Récupération de toutes les langues actives */
		$tab=$GLOBALS["SYSTEM_MANAGER"]["LANGUAGE"]->createLanguageList();

		// --> recuperation du treeNode correspondant au noeurd
		$tabTreeNode[0]=$myTree;		//--> treeNodeUnique....
// 		printTabTreeNode($tabTreeNode, $this->getNode(), "NODE", "node_id", false, '');
		printTabTreeNode($tabTreeNode, $this->getNode(), "NODE", "node_id", false, "", "", "class=\"form\" required=\"true\" title=\"".htmlspecialchars(getMessage("TxtNodeIn"), ENT_QUOTES)."\"");
		/* -- Fin d'affichage des noeud d'ajout */

		$GLOBALS['SYSTEM_TEMPLATE']->MxAttribut("urlAction", $url);
		$GLOBALS['SYSTEM_TEMPLATE']->MxAttribut("urlActionReturn", $urlReturn);

		$value	=get_class($this);
		$name	=getMessage("class".$value);
		$name	=( (isset($name)) && ($name!="") )?$name:$value;

// 		var_dump($value);
// 		var_dump($name);
// 		var_dump($this->getId());
// 		var_dump($this->getName($currentCode));
// 		var_dump($this->getIcone());
		
		$GLOBALS['SYSTEM_TEMPLATE']->MxText("TxtContentType", $name);
		$GLOBALS['SYSTEM_TEMPLATE']->MxAttribut("contentType", get_class($this));
		$GLOBALS['SYSTEM_TEMPLATE']->MxAttribut("objectId", $this->getId());
		
		
// 		$GLOBALS['SYSTEM_TEMPLATE']->MxText("resumeValue", $this->getResume());
		$GLOBALS["SYSTEM_TEMPLATE"]->MxFormField("resumeValue", "textarea", "resumeValue", $this->getResume(), "class=\"form\" required=\"true\" title=\"".htmlspecialchars(getMessage("resumeObject"), ENT_QUOTES)."\"", getMessage("resumeObject"));
		
		$GLOBALS['SYSTEM_TEMPLATE']->MxText("keyWordValue", $this->getKeyWord());
		$GLOBALS["SYSTEM_TEMPLATE"]->MxFormField("keyWordValue", "textarea", "keyWordValue", $this->getKeyWord(), "class=\"form\" required=\"true\" title=\"".htmlspecialchars(getMessage("keywordObject"), ENT_QUOTES)."\"", getMessage("keywordObject"));
		
		$GLOBALS['SYSTEM_TEMPLATE']->MxAttribut("parutionValue", $this->getParution());
		$GLOBALS['SYSTEM_TEMPLATE']->MxAttribut("archivageValue", $this->getArchivage());

		# Affichage de la liste déroulante
		# Détermine le chemin des icones
		$chemintotal = $GLOBALS['CONF_DATA_PATH']."data/image/icons/object/";

		# Lecture du dossier correspondant aux icones
		$handle  = @opendir($chemintotal);
		while ($file = @readdir($handle))
		{
			if($file !="" && $file !="." && $file !=".." && (substr($file, -3)== "gif" || substr($file,-3)=="jpg" || substr($file,-4)=="jpeg" || substr($file,-3)=="png"))
			{
				$tabIcone[$file]=$file;
			}
		}
		@closedir($handle);
		asort($tabIcone);
		if ( $this->getIcone() == "") $nodeIcone = "defaultobject.gif"; else $nodeIcone = $this->getIcone();
		$GLOBALS['SYSTEM_TEMPLATE']->MxSelect("icone", "iconeN", $nodeIcone, $tabIcone, 'Icône de l\'espace', '', 'onchange="javascript:imgPicto();" id="iconeN"', "class=\"form\" title=\"".htmlspecialchars(getMessage("TxtImage"), ENT_QUOTES)."\"", getMessage("TxtImage"));
		$GLOBALS["SYSTEM_TEMPLATE"]->MxImage("pictoObject", $chemintotal.$nodeIcone, $nodeIcone, "name=\"pictoObject\" id=\"pictoObject\"");

		for ($i=0; $i<count($tab);$i++)
		{
			$img =$tab[$i]->getIcone();
			$GLOBALS["SYSTEM_TEMPLATE"]->MxImage("blocName.pictoLanguage", $img);
			//Récupère le nom de l'objet dans la langue correspondante à la boucle
			$testnamenodeprint = $GLOBALS['SYSTEM_TEMPLATE']->MxAttribut("blocName.namelanguagevalue", htmlentitiesconv($this->getName($tab[$i]->getCode(), ENT_QUOTES)));
// 			$GLOBALS['SYSTEM_TEMPLATE']->MxAttribut("blocName.nameInput", "name".$tab[$i]->getCode());
			$GLOBALS["SYSTEM_TEMPLATE"]->MxFormField("blocName.nameInput", "text", "name".$tab[$i]->getCode(), $this->getName($tab[$i]->getCode()), "class=\"form\" required=\"true\" title=\"".htmlspecialchars(getMessage("nameObjectList"), ENT_QUOTES)."\"", getMessage("nameObjectList"));
			$GLOBALS['SYSTEM_TEMPLATE']->MxBloc("blocName", "loop");
		}
		return "";
	}

/**
* deletePrint (affichage du form de suppression de l'objet...)
* @param chaine url de redirection du formulaire
* @param chaine url de retour
* @param entier groupe de création
* @param entier noeud de création
* @access public
* @return chaine chaine vide
*/
	function deletePrint($url, $urlReturn, $groupIdPass, $nodeIdPass, $tabForbiddenPass)
	{
		/* gestion de la Template */
		addMessageFile("adminobject.ini");

		$GLOBALS['SYSTEM_TEMPLATE']->MxAttribut("urlAction", $url);
		$GLOBALS['SYSTEM_TEMPLATE']->MxAttribut("urlActionReturn", $urlReturn);

		/* gestion du lib en fonction de la langue courante */
		$currentCode=$GLOBALS["SYSTEM_USER_SESSION"]->langue->getCode();
		$defaultCode=$GLOBALS["SYSTEM_DEFAULT_LANGUAGE_CODE"];

		$lib=$this->getName($currentCode);
		if ($lib=="")
		{
			$lib=$this->getName($defaultCode);
		}
		$GLOBALS['SYSTEM_TEMPLATE']->MxText("ObjectName", $lib);
		$GLOBALS['SYSTEM_TEMPLATE']->MxAttribut("contentType", get_class($this));
		$GLOBALS['SYSTEM_TEMPLATE']->MxAttribut("objectId", $this->getId());
		$GLOBALS['SYSTEM_TEMPLATE']->MxText("resumeValue", $this->getResume());
		$GLOBALS['SYSTEM_TEMPLATE']->MxText("keyWordValue", $this->getKeyWord());

		ExitBloc();
		return "";
	}

/**
* __createObject: affichage du formulaire de création de l'objet
* @param chaine url de redirection du formulaire
* @param chaine url de retour
* @param entier groupe de création
* @param entier noeud de création
* @access public
* @return chaine code Message
*/
	function __createObject($url, $urlReturn, $groupIdPass, $nodeIdPass, $tabForbiddenPass)
	{
		withBlocPath("CoordinationObj", "configuration");
		$end=$this->configurePrint($url, $urlReturn, $groupIdPass, $nodeIdPass, $tabForbiddenPass);
		ExitBloc();
		return $end;
	}

/**
* __execCreateObject: Enregistre l'objet dans la Bd...
*<P>Remarque: l'objet doit recevoir ses args en POST</P>
*<P>Note: cette methode se sert de $GLOBALS["SYSTEM_MANAGER"]["COORDINATION_OBJ"]</P>
* @param entier groupe de création
* @param entier noeud de création
* @access public
* @return chaine code Message
*/
	function __execCreateObject($groupIdPass, $nodeIdPass, $tabForbiddenPass)
	{
		$tabCodeLangue=array();
		$isValid=true;
		$this->contentType = get_class($this);
		$this->icone = (isset($_POST["iconeN"]))?(htmlentitiesconv($_POST["iconeN"])):"";
		# Variables de configuration de l'objet

		/* Pour le nom de l'objet... */
		while (list($key, $val) = each($_POST)) {
			if (!(strpos($key, "name")===false))							// on a trouvé un nom pour une langue
			{
				if ( $val!="" )
				{
					$tabCodeLangue[]=strtolower(str_replace("name", "",$key));					// on stocke le tableau des codes pour test
					// on ajoute le lib
					$this->setName(str_replace("name", "",$key), $val);
				}
			}
		}
		if ( !(in_array(strtolower($GLOBALS["SYSTEM_DEFAULT_LANGUAGE_CODE"]),$tabCodeLangue)) )
		{
			$isValid=false;
		}
		$this->resume = (isset($_POST["resume"]))?$_POST["resume"]:"";
		$this->keyWord   = (isset($_POST["keyWord"]))?$_POST["keyWord"]:"";
		$this->parution  = (isset($_POST["parution"]))?$_POST["parution"]:"";
		$this->archivage = (isset($_POST["archivage"]))?$_POST["archivage"]:"";
		if ((isset($_POST["node_id"])) && (is_numeric($_POST["node_id"])))
		{
			$this->node = $_POST["node_id"];
		}else{
			$isValid=false;
		}
		if ($isValid==true)
		{
			$TmpObject=$GLOBALS["SYSTEM_MANAGER"]["COORDINATION_OBJ"]->insertInstance($this);
			$this->setId($TmpObject->getId());

			return "msgSave";
		}else{
			return "wrongArgument";
		}
	}

/**
* __updateObject: retourne la chaine d'affichage de modification de l'objet (/défaut)
* @param chaine url de redirection du formulaire
* @param chaine url de retour
* @param entier groupe de création
* @param entier noeud de création
* @access public
* @return chaine code Message
*/
	function __updateObject($url, $urlReturn, $groupIdPass, $nodeIdPass, $tabForbiddenPass)
	{
		withBlocPath("CoordinationObj", "configuration");
		$end=$this->configurePrint($url, $urlReturn, $groupIdPass, $nodeIdPass, $tabForbiddenPass);
		ExitBloc();
		return $end;
	}

/**
* __execUpdateObject: Enregistre l'objet en modification
*<P>Note: cette methode se sert de $GLOBALS["SYSTEM_MANAGER"]["COORDINATION_OBJ"]</P>
* @param entier groupe de création
* @param entier noeud de création
* @access public
* @return chaine code Message
*/
	function __execUpdateObject($groupIdPass, $nodeIdPass, $tabForbiddenPass)
	{
		$tabCodeLangue=array();
		$isValid=true;
		$this->contentType = get_class($this);
		$this->setId((isset($_POST["objectId"]))?($_POST["objectId"]):Null);

		if ( (is_null($this->getId())) || ($this->getId()==0) )
			$isValid=false;

		$this->icone = (isset($_POST["iconeN"]))?(htmlentitiesconv($_POST["iconeN"])):"";
		# Variables de configuration de l'objet

		/* Pour le nom de l'objet... */
		while (list($key, $val) = each($_POST)) {
			if (!(strpos($key, "name")===false))							// on a trouvé un nom pour une langue
			{
				if ( $val!="" )
				{
					$tabCodeLangue[]=strtolower(str_replace("name", "",$key));					// on stocke le tableau des codes pour test
					// on ajoute le lib
					$this->setName(str_replace("name", "",$key), $val);
				}
			}
		}
		if ( !(in_array(strtolower($GLOBALS["SYSTEM_DEFAULT_LANGUAGE_CODE"]), $tabCodeLangue)) )
		{
			$isValid=false;
		}

		$this->resume = (isset($_POST["resume"]))?$_POST["resume"]:"";
		$this->keyWord   = (isset($_POST["keyWord"]))?$_POST["keyWord"]:"";
		$this->parution  = (isset($_POST["parution"]))?$_POST["parution"]:"";
		$this->archivage = (isset($_POST["archivage"]))?$_POST["archivage"]:"";
		if ((isset($_POST["node_id"])) && (is_numeric($_POST["node_id"])))
		{
			$this->node = $_POST["node_id"];
		}else{
			$isValid=false;
		}
		if ($isValid==true)
		{
			$TmpObject=$GLOBALS["SYSTEM_MANAGER"]["COORDINATION_OBJ"]->updateInstance($this);

			/* Gestion de la recherche, ajout de la contextualisation de la lib */
			/* if(file_exists($CONF_LIB_PATH."lib/package/search.php")){
				includePackage("search.php");
				$methods = getAllRights($this->contentType);
				if(count($methods)){
					Search::updSearch("", $this->getContentType(), $methods, $this->getName("FR"), $this->getResume(), $this->getKeyWord(), -1, $this->getId());
				}
			} */
			/* Fin recherche */
			return "msgSave";
		}else{
			return "wrongArgument";
		}
	}

/**
* __deleteObject: retourne la chaine d'affichage de suppression de l'objet (/défaut)
* @param chaine url de redirection du formulaire
* @param chaine url de retour
* @param entier groupe de création
* @param entier noeud de création
* @access public
* @return chaine code Message
*/
	function __deleteObject($url, $urlRetour, $groupId, $nodeId, $tabForbiddenPass)
	{
		withBlocPath("CoordinationObj", "delete");
		$end=$this->deletePrint($url, $urlRetour, $groupId, $nodeId, $tabForbiddenPass);
		ExitBloc();
		return $end;
	}

/**
* __execDeleteObject: Supprime l'objet de la source de données principale
*<P>Note: cette methode se sert de $GLOBALS["SYSTEM_MANAGER"]["COORDINATION_OBJ"]</P>
* @param entier groupe de création
* @param entier noeud de création
* @access public
* @return chaine code Message
*/
	function __execDeleteObject($groupId, $nodeId, $tabForbiddenPass)
	{
		$tabCodeLangue=array();
		$isValid=true;

		if ($this->isLoaded()==true)
		{
			/* Suppression des droits de l'objet... */
			if ($this->deleteObjectRight())
			{
				$this->setId(0);
				return "msgDelete";
			}else{
				return "msgError";
			}
		}else{
			return "wrongArgument";
		}
	}

/**
* __execAddRight: Supprime l'objet de la source de données principale
*<P>Note: cette methode se sert de $GLOBALS["SYSTEM_MANAGER"]["RIGHT"]</P>
* @param entier noeud
* @param entier id user
* @param entier groupe de création
* @param chaine nom de methode
* @access public
* @return chaine code Message
*/
	function __execAddRight($node_id, $user_id, $group_id, $method_name)
	{
		$tabCodeLangue=array();
		$isValid=true;

		if ($this->isLoaded()==true)
		{
			$arrayClass=get_class_methods( get_class($this) );
			// si la methode est valide!!!
			if ( ( (in_array($method_name, $arrayClass)) && (!(strpos($method_name, "action")===false)) ))
			{
				$NewRight=new Right();
				$NewRight->setNodeId($node_id);
				$NewRight->setUserId($user_id);
				$NewRight->setGroupId($group_id);
				$NewRight->setObjectId( $this->getId() );
				$NewRight->setClassName( get_class($this) );
				$NewRight->setMethodName($method_name);

				//Enregistrement!!!
				$NewRight=$GLOBALS["SYSTEM_MANAGER"]["RIGHT"]->saveInstance($NewRight);

				// Suppression de la cache
				if( DATA_ACCES_CACHE_PERMISSION )
					$GLOBALS["SYSTEM_MANAGER"]["PERMISSION_CACHE"]->emptyCache();

				return "msgSave";
			}else{
				return "wrongArgument";
			}
		}else{
			return "wrongArgument";
		}
	}

/**
* __execUpdateRight: Sur modification d'un droit
*<P>Note: cette methode se sert de $GLOBALS["SYSTEM_MANAGER"]["RIGHT"]</P>
*<P>Non utilise actuellement</P>
* @access public
* @param entier id
* @param entier noeud
* @param entier id user
* @param entier groupe de création
* @param chaine nom de methode
* @return chaine code Message
*/
	function __execUpdateRight($rightId, $node_id, $user_id, $group_id, $method_name)
	{
		$RightToUpdate=$GLOBALS["SYSTEM_MANAGER"]["RIGHT"]->createInstance($rightId);

		if ($RightToUpdate->getObjectId()==$this->getId())
		{
			$RightToUpdate->setNodeId($node_id);
			$RightToUpdate->setUserId($user_id);
			$RightToUpdate->setGroupId($group_id);
			$RightToUpdate->setObjectId( $this->getId() );
			$RightToUpdate->setClassName( get_class($this) );

			 //Maj
			$RightToUpdate=$GLOBALS["SYSTEM_MANAGER"]["RIGHT"]->saveInstance($RightToUpdate);
			//Suppression de la cache
			if( DATA_ACCES_CACHE_PERMISSION )
				$GLOBALS["SYSTEM_MANAGER"]["PERMISSION_CACHE"]->emptyCache();
			return "msgUpdated";
		}else{
			return "wrongArgument";
		}
	}

/**
* __execDeleteRight: Supprime l'objet de la source de données principale
*<P>Note: cette methode se sert de $GLOBALS["SYSTEM_MANAGER"]["RIGHT"]</P>
* @access public
* @param entier id
* @return chaine code Message
*/
	function __execDeleteRight($rightId)
	{
		$RightToDelete=$GLOBALS["SYSTEM_MANAGER"]["RIGHT"]->createInstance($rightId);

		if ($RightToDelete->getObjectId()==$this->getId())
		{
			 //Effacage
			$RightToDelete=$GLOBALS["SYSTEM_MANAGER"]["RIGHT"]->deleteInstance($RightToDelete);
			//Suppression de la cache
			if( DATA_ACCES_CACHE_PERMISSION )
				$GLOBALS["SYSTEM_MANAGER"]["PERMISSION_CACHE"]->emptyCache();

			return "msgDelete";
		}else{
			return "wrongArgument";
		}
	}

/**
* deleteObjectRight : detruit tous les droits de l'objet
* @access public
* @return booleen
*/
	function deleteObjectRight()
	{
		/* On récupere tous les droits pour l'objet */
		$tabRight=$GLOBALS["SYSTEM_MANAGER"]["RIGHT"]->getInstanceFromObjectId($this->getId());
		/* Suppression des droits de l'objet... */
		for ($i=0; $i<count($tabRight); $i++)
		{
			$GLOBALS["SYSTEM_MANAGER"]["RIGHT"]->deleteInstance($tabRight[$i]);
		}
		// Suppression de la cache
		if( DATA_ACCES_CACHE_PERMISSION )
			$GLOBALS["SYSTEM_MANAGER"]["PERMISSION_CACHE"]->emptyCache();

		return true;
	}

##################################################################
#### Utilitaire
##################################################################

/**
* getAllRights
*<P>recherche tous les droits disponible pour la classe de l'objet courant</P>
*<P>retourne un tableau de droits</P>
* @param chaine classname (nom de  la classe)
* @access public
* @return tableau (tableau des droits)
*/
	function getAllRights(){
		$tab = get_class_methods(get_class($this));
		foreach($tab as $key=>$val){
			if(strncmp("action", $val, 6)) unset($tab[$key]);
		}
		return $tab;
	}

###################################################################
#### Pour la recuperation des données -> deprecie
###################################################################
/**
* __getDataCoordination : récupere un obj DataCoordination<br/>
* @access public
* @deprecated
* @return objet objet DataCoordination
*/
	function __getDataCoordination()
	{
		return new DataCoordination();
	}

/**
* getAllRow4Export : recupere tous les enregistrements utilisé par l'objet de coordination 
* le tableau est constiué de la nom_du_champ=valeur_du_champ
* Si aucune données n'est à exporter, la méthode return null
* @access public
* @deprecated
* @param entier id
* @return tableau Associatif
*/
	function getAllRow4Export(){
		return null;
	}

/**
* setAllRow4Import : Insert les donnes en provenance du tableau associatif
* le tableau est constiué de la nom_du_champ=valeur_du_champ
* Si les enregistrements se sont bien sauvegardés, return true
* @access public
* @deprecated
* @param boolean
*/
	function setAllRow4Import($tableau){
		return true;
	}
}

#########################################################################
############### DataCoordination -> deprecie
#########################################################################
/**
* Classe DataCoordination
*classe d'échange de données pour export ou entre classe
* @package system_coordination
*/
class DataCoordination
{
/**
* Constructeur PHP5
*/
	function __construct()
	{
	}

/**
* retourne un tableau avec toutes les sources d'info récupérables
*Cette methode permet entre autre de récupérer les types d'infos...<br/>
*Dans le cas de la newsletter par exemple, la classe se sert :<br/>
* - d'une liste d'abonnées<br/>
* - d'une liste de mail ou newsletter<br/>
*Le tableau renverra donc array(0=>newsletter, 1=>account)<br/>
* @access public
* @return tableau
*/
	function getDataSource()
	{
		return array();
	}

/**
* retourne la source d'info par défaut
*Cette methode permet entre autre de récupérer les types d'infos...<br/>
*Dans le cas de la newsletter par exemple, la classe se sert :<br/>
* - d'une liste d'abonnées<br/>
* - d'une liste de mail ou newsletter<br/>
*Le tableau renverra donc array(0=>newsletter, 1=>account)<br/>
* @access public
* @return tableau
*/
	function getDefaultDataSource()
	{
		$tab=$this->getDataSource();
		if (is_array($tab)) return $tab[0];
		else return "";
	}

/**
* recupere 1 enregistrement avec l'id=id
*le tableau est constiué de la clé=nom de l'info + valeur<br/>
*Des champs sont en plus données (balises obligatoires rss):<br/>
* - rssTitle=titre de l'info<br/>
* - rssDescription=description/resume<br/>
* - rssLink=lien du site<br/>
* +
* - id identifiant d'accés unique
* Par défaut la dataSource doit être la source de donnée principale de l'obj
* @access public
* @param entier id
* @param chaine
* @return tableau
*/
	function getRow($id, $dataSource="")
	{
		return array();
	}

/**
* recupere tous les enregistrement sous forme de tableau
*le tableau est constiué de la clé=nom de l'info + valeur
*Des champs sont en plus données (balises obligatoires rss):<br/>
* - rssTitle=titre de l'info<br/>
* - rssDescription=description/resume<br/>
* - rssLink=lien du site<br/>
* +
* - id identifiant d'accés unique
* Par défaut la dataSource doit être la source de donnée principale de l'obj
* @access public
* @param chaine
* @return tableau
*/
	function getAllRow($dataSource="")
	{
		return array();
	}

/**
* recupere un texte formaté RSS
* Par défaut la dataSource doit être la source de donnée principale de l'obj
* @access public
* @param chaine
* @return chaine
*/
	function getRssFile($dataSource="")
	{
		$GLOBALS['SYSTEM_TEMPLATE_MAIN']="rss";
		return $this->fileGenerator( $GLOBALS["CONF_DATA_PATH"]."data/global/rss.mxt" );
	}

/**
* recupere un texte formaté Xml
* Par défaut la dataSource doit être la source de donnée principale de l'obj
* @access public
* @param chaine
* @return chaine
*/
	function getXmlFile($dataSource="")
	{
		$GLOBALS['SYSTEM_TEMPLATE_MAIN']="xml";
		return $this->fileGenerator( $GLOBALS["CONF_DATA_PATH"]."data/global/xml.mxt" );
	}

/**
* recupere un texte formaté Cvs
* Par défaut la dataSource doit être la source de donnée principale de l'obj
* @access public
* @param chaine
* @return chaine
*/
	function getCvsFile($dataSource="")
	{
		$GLOBALS['SYSTEM_TEMPLATE_MAIN']="cvs";
		return $this->fileGenerator( $GLOBALS["CONF_DATA_PATH"]."data/global/cvs.mxt" );
	}

/**
* format un fichier à partir des infos de getAllRow
* Par défaut la dataSource doit être la source de donnée principale de l'obj
* @access protected
* @param chaine path
* @param chaine
* @param chaine 
* @return chaine
*/
	function fileGenerator( $filePathMxt, $dataSource="", $blockPath="")
	{
		/* Ajout d'un point si nécessaire */
		$blockPath=( ($blockPath!="") && (substr($blockPath, (strlen($blockPath)-1),1)!=".") )?$blockPath.".":$blockPath;

		if (file_exists($filePathMxt))
		{
			$Tpl=new ModeliXeQware($filePathMxt);
			$Tpl->setModelixe(true);

			/* gestion du lib en fonction de la langue courante */
			$currentCode=$GLOBALS["SYSTEM_USER_SESSION"]->langue->getCode();
			$defaultCode=$GLOBALS["SYSTEM_DEFAULT_LANGUAGE_CODE"];

			/* Tableau id => nom de la brique */
			if ($GLOBALS["SYSTEM_CONTROL"]->currentCoordinationObject->getName($currentCode) != "")
				$name = $GLOBALS["SYSTEM_CONTROL"]->currentCoordinationObject->getName($currentCode);
			else
				$name = $GLOBALS["SYSTEM_CONTROL"]->currentCoordinationObject->getName($defaultCode);

			/* Pour les informations génériques */
			$Tpl->MxText("title", $name);
			$Tpl->MxText("description", $GLOBALS["SYSTEM_CONTROL"]->currentCoordinationObject->getResume());
			$Tpl->MxText("link", $_SERVER["SERVER_NAME"]);
			$Tpl->MxText("language", $currentCode);
			$Tpl->MxText("generator", "Granilim/DataCoordination/fileGenerator V0.9");

			/* Pour tous les enregistrements */
			$tab=$this->getAllRow($dataSource);

			if (count($tab)>0)
			{
				for ($i=0; $i<count($tab); $i++)
				{
					foreach($tab[$i] as $key=>$val)
					{
						if ($Tpl->IsMxBloc("LINE.COL") && (strpos($key,"rss")===false))
						{
							$Tpl->MxText($blockPath."LINE.COL.".$key."Name", $key);
							$Tpl->MxAttribut($blockPath."LINE.COL.".$key."Name", $key);
							$Tpl->MxText($blockPath."LINE.COL.".$key, $val);
							$Tpl->MxAttribut($blockPath."LINE.COL.".$key, $val);
							$Tpl->MxText($blockPath."LINE.COL.baliseBegin", "<".str_replace("rss", "", $key).">");
							$Tpl->MxText($blockPath."LINE.COL.value", $val);
							$Tpl->MxText($blockPath."LINE.COL.baliseEnd", "</".str_replace("rss", "", $key).">");
							$Tpl->MxBloc("LINE.COL", "loop");
						}
						/* Cas Balise Rss */
						elseif($Tpl->IsMxBloc("LINE.COLRSS") && (strpos($key,"rss")!==false) )
						{
							$Tpl->MxText($blockPath."LINE.COLRSS.baliseBegin", "<".strtolower(str_replace("rss", "", $key)).">");
							$Tpl->MxText($blockPath."LINE.COLRSS.value", htmlspecialchars($val));
							$Tpl->MxText($blockPath."LINE.COLRSS.baliseEnd", "</".strtolower(str_replace("rss", "", $key)).">");
							$Tpl->MxBloc("LINE.COLRSS", "loop");
						}
					}
					$Tpl->MxBloc("LINE", "loop");
				}
			}else{
				$Tpl->MxBloc("LINE", "delete");
			}
			/* On y applique le système de message !! */
			$GLOBALS["SYSTEM_MESSAGE"]->execPrinting($Tpl);
			return $Tpl->MxWrite();
		}else{
			return "";
		}
	}
}
?>
