<?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 package.template.php
* Ce fichier contient des methodes de gestion de la template principale+ affcihage d'éléments de saisie
*
* @author Rooty <www.rooty.me|rooty@rooty.me>
* @since 2018/07/06
* @link www.rooty.me
* @version 0.3
* @package package
* @subpackage template
* @copyright Copyright &copy; 2009-2018, Rooty
*/

if ( !defined('SYSTEM_IN') )
{
 die("Hacking attempt");
}

/**
* Fonction withBlocPath
*<P>Remplace un bloc de la template principale par un autre fichier de template<br>
* le chemin du fichier sera donné comme suit $GLOBALS['SYSTEM_TEMPLATE_PATH'].$GLOBALS['SYSTEM_TEMPLATE_DIR'].$type."/".$classe."/".$action.".mxt"
* seul la classe et l'action sont obligatoires
*</P>
* @param chaine nom de la classe
* @param chaine nom de la methode (fichier sans le mxt)
* @param chaine type d'objet (/default object de coordination)
* @param chaine nom du bloc à remplacer (/default DATA)
* @return booleen
*/
function withBlocPath ($classe, $action, $type="object_coordination", $bloc="DATA")
{
	$path=$GLOBALS['SYSTEM_TEMPLATE_PATH'].$GLOBALS['SYSTEM_TEMPLATE_DIR'].$type."/".strtolower($classe)."/".strtolower($action).".mxt";

	if (  $GLOBALS["SYSTEM_TEMPLATE"]->isMxBloc($bloc) )
	{
		$GLOBALS["SYSTEM_TEMPLATE"]->MxBloc($bloc, "appe", $path);
		$GLOBALS["SYSTEM_TEMPLATE"]->WithMxPath($bloc, "relative");
		return true;
	}else{
		return false;
	}
}

/**
*function exitBloc : permet de sortir de revenir à la racine de modelixe pour la Template principale...
* @return booleen
*/
function exitBloc()
{
	// Fin d'inclusion de la template
	if (isset($GLOBALS["SYSTEM_TEMPLATE"]) && is_object($GLOBALS["SYSTEM_TEMPLATE"])){
		if (get_class($GLOBALS["SYSTEM_TEMPLATE"])=="modelixe"){
			$GLOBALS["SYSTEM_TEMPLATE"]->WithMxPath("");	/* réinitialise le path Modelixe après utilisation */
			return true;
		}
	}
	return false;
}

/**
* fonction d'inclusion des titres de pages dans le bloc MX principal
* @return booleen
*/
function mxPageTitle($label, $compl=False)
{
    if (  $GLOBALS["SYSTEM_TEMPLATE"]->isMxBloc("TITLELOAD") && isset($label) )
    {
        $GLOBALS["SYSTEM_TEMPLATE"]->MxBloc("TITLELOAD", "modify", $GLOBALS['SYSTEM_TEMPLATE_PATH'].$GLOBALS['SYSTEM_TEMPLATE_DIR']."title.mxt");
        $GLOBALS["SYSTEM_TEMPLATE"]->WithMxPath("TITLELOAD", "appe");

        if( !$compl )
        {
            if( getMessage($label) )
                $GLOBALS['SYSTEM_TEMPLATE']->MxText("title", getMessage($label));
            else
                $GLOBALS['SYSTEM_TEMPLATE']->MxText("title", $label);
        } else
            $GLOBALS['SYSTEM_TEMPLATE']->MxText("title", getMessage($label)." ".$compl);
        
        $GLOBALS["SYSTEM_TEMPLATE"]->WithMxPath("");
        return true;
    } else {
        $GLOBALS["SYSTEM_TEMPLATE"]->MxBloc("TITLELOAD", "modify", $GLOBALS['SYSTEM_TEMPLATE_PATH'].$GLOBALS['SYSTEM_TEMPLATE_DIR']."title.mxt");
        $GLOBALS['SYSTEM_TEMPLATE']->MxBloc("TITLELOAD", "delete");
        return false;
    }
}

/**
* fonction d'inclusion des appels de feuilles de styles CSS
* @return booleen
*/
function mxCallCss($arrayCallCss)
{
//     if (  $GLOBALS["SYSTEM_TEMPLATE"]->isMxBloc("CSSLOAD") && is_array($arrayCallCss) && count($arrayCallCss)>0 )
	if ( is_array($arrayCallCss) && count($arrayCallCss)>0 )
    {
        $GLOBALS["SYSTEM_TEMPLATE"]->MxBloc("CSSLOAD", "modify", $GLOBALS['SYSTEM_TEMPLATE_PATH'].$GLOBALS['SYSTEM_TEMPLATE_DIR']."css.mxt");
        $GLOBALS["SYSTEM_TEMPLATE"]->WithMxPath("CSSLOAD", "appe");

        for ($j=0; $j<count($arrayCallCss); $j++)
        {
            if( is_string( $arrayCallCss[$j]) )
            {
// 				var_dump($arrayCallCss[$j]);
                $GLOBALS['SYSTEM_TEMPLATE']->MxText("blocCSS".".hrefcss", $arrayCallCss[$j]);
                $GLOBALS['SYSTEM_TEMPLATE']->MxBloc("blocCSS".".blocIntegrity", "delete");
                $GLOBALS['SYSTEM_TEMPLATE']->MxBloc("blocCSS".".blocOrigin", "delete");
            }elseif( is_array($arrayCallCss[$j]) )
            {
                $GLOBALS['SYSTEM_TEMPLATE']->MxText("blocCSS".".hrefcss", $arrayCallCss[$j]["href"]);
                $GLOBALS['SYSTEM_TEMPLATE']->MxText("blocCSS".".blocIntegrity".".integrity", $arrayCallCss[$j]["integrity"]);
                $GLOBALS['SYSTEM_TEMPLATE']->MxText("blocCSS".".blocOrigin".".origin", $arrayCallCss[$j]["origin"]);
            }
            $GLOBALS['SYSTEM_TEMPLATE']->MxBloc("blocCSS", "loop");
        }
        
        $GLOBALS["SYSTEM_TEMPLATE"]->WithMxPath("");
        return true;
    } else {
        $GLOBALS["SYSTEM_TEMPLATE"]->MxBloc("CSSLOAD", "modify", $GLOBALS['SYSTEM_TEMPLATE_PATH'].$GLOBALS['SYSTEM_TEMPLATE_DIR']."css.mxt");
        $GLOBALS['SYSTEM_TEMPLATE']->MxBloc("CSSLOAD", "delete");
        return false;
    }
}

/**
* fonction d'inclusion des appels de scripts Javascript
* @return booleen
*/
function mxCallJs($arrayCallJs)
{
//     if (  $GLOBALS["SYSTEM_TEMPLATE"]->isMxBloc("JSLOAD") && is_array($arrayCallJs) && count($arrayCallJs)>0 )
	if ( is_array($arrayCallJs) && count($arrayCallJs)>0 )
    {
//         var_dump($arrayCallJs);
        $GLOBALS["SYSTEM_TEMPLATE"]->MxBloc("JSLOAD", "modify", $GLOBALS['SYSTEM_TEMPLATE_PATH'].$GLOBALS['SYSTEM_TEMPLATE_DIR']."js.mxt");
        $GLOBALS["SYSTEM_TEMPLATE"]->WithMxPath("JSLOAD", "appe");

        for ($j=0; $j<count($arrayCallJs); $j++)
        {
            if( is_string( $arrayCallJs[$j]) )
            {
                $GLOBALS['SYSTEM_TEMPLATE']->MxText("blocJS".".hrefjs", $arrayCallJs[$j]);
                $GLOBALS['SYSTEM_TEMPLATE']->MxBloc("blocJS".".blocIntegrity", "delete");
                $GLOBALS['SYSTEM_TEMPLATE']->MxBloc("blocJS".".blocOrigin", "delete");
            }
            elseif( is_array($arrayCallJs[$j]) )
            {
                $GLOBALS['SYSTEM_TEMPLATE']->MxText("blocJS".".hrefjs", $arrayCallJs[$j]["src"]);
                $GLOBALS['SYSTEM_TEMPLATE']->MxText("blocJS".".blocIntegrity".".integrity", $arrayCallJs[$j]["integrity"]);
                $GLOBALS['SYSTEM_TEMPLATE']->MxText("blocJS".".blocOrigin".".origin", $arrayCallJs[$j]["origin"]);
            }
            $GLOBALS['SYSTEM_TEMPLATE']->MxBloc("blocJS", "loop");
        }
        
        $GLOBALS["SYSTEM_TEMPLATE"]->WithMxPath("");
        return true;
    } else {
        $GLOBALS["SYSTEM_TEMPLATE"]->MxBloc("JSLOAD", "modify", $GLOBALS['SYSTEM_TEMPLATE_PATH'].$GLOBALS['SYSTEM_TEMPLATE_DIR']."js.mxt");
        $GLOBALS["SYSTEM_TEMPLATE"]->MxBloc("JSLOAD", 'delete');
        return false;
    }
}

/**
* fonction d'inclusion des appels de code Javascript brut
* @return booleen
*/
function mxRawJs($arrayRawJs)
{
// 	var_dump($arrayRawJs);
//     if (  $GLOBALS["SYSTEM_TEMPLATE"]->isMxBloc("JSRAWLOAD") && is_array($arrayRawJs) && count($arrayRawJs)>0 )
	if (  is_array($arrayRawJs) && count($arrayRawJs)>0 )
    {
//         var_dump($arrayRawJs);
        $GLOBALS["SYSTEM_TEMPLATE"]->MxBloc("JSRAWLOAD", "modify", $GLOBALS['SYSTEM_TEMPLATE_PATH'].$GLOBALS['SYSTEM_TEMPLATE_DIR']."jsraw.mxt");
        $GLOBALS["SYSTEM_TEMPLATE"]->WithMxPath("JSRAWLOAD", "appe");

        for ($j=0; $j<count($arrayRawJs); $j++)
        {
//             if( is_string( $arrayRawJs[$j]) )
//             {
// 				var_dump($arrayRawJs);
                $GLOBALS['SYSTEM_TEMPLATE']->MxText("blocRawJS".".contentjs", $arrayRawJs[$j]);
//             }
            $GLOBALS['SYSTEM_TEMPLATE']->MxBloc("blocRawJS", "loop");
        }
        
        $GLOBALS["SYSTEM_TEMPLATE"]->WithMxPath("");
        return true;
    } else {
        $GLOBALS["SYSTEM_TEMPLATE"]->MxBloc("JSRAWLOAD", "modify", $GLOBALS['SYSTEM_TEMPLATE_PATH'].$GLOBALS['SYSTEM_TEMPLATE_DIR']."jsraw.mxt");
        $GLOBALS["SYSTEM_TEMPLATE"]->MxBloc("JSRAWLOAD", 'delete');
        return false;
    }
}

/**
* affichage d'un object, ou tableau dans une template et à partir de block (la methode __mxPrint($block, $tpl) d'un objet permet d'ajouter des éléments d'affichage contextuels)
* @todo a tester absolument!!!
* @access public
* @return booleen
*/
function MxPrint($obj, $block, $tpl="")
{
	$block=( ($block!="") && (substr($block, strlen($block)-1, 1)!=".") )?($block."."):$block;
	$tpl=(is_object($tpl))?$tpl:$GLOBALS["SYSTEM_TEMPLATE"];
	$tabToPrint=array();

	if (is_object($obj)){
		$tabToPrint=get_object_vars($obj);

		if( in_array("__mxprint", get_class_methods(get_class($obj))) )
			$obj->__mxPrint($block.strtoupper(get_class($obj)), $tpl);

	}elseif(is_array($obj)){
		$tabToPrint=$obj;
	}

	foreach($tabToPrint as $key=>$val){
		if(is_object($val)){
			MxPrint($block.strtoupper(get_class($val)), $tpl);
			$tpl->MxBlock($block.strtoupper(get_class($val)), "loop");
		}elseif(is_array($val)){
			MxPrint($block.strtoupper($key), $tpl);
			$tpl->MxBlock($block.strtoupper($key), "loop");
		}else{
			$tpl->MxText($block.$key, htmlentitiesconv($value) );
			$tpl->MxAttribut($block.$key, htmlentitiesconv($value) );
		}
	}

	if (is_object($obj)){
		if( in_array("__mxprint", get_class_methods(get_class($obj))) ){
			$obj->__mxPrint($block.strtoupper(get_class($obj)), $tpl);
		}
	}
}

/**
*function printTabTreeGroup permet d'afficher une liste déroulante avec les groupes associés
*
*/
function printTabTreeGroup($tabTreeGroup, $selected, $MxBlocName="GROUP", $name="group_id", $opt='', $default='', $multiple='', $class='form')
{
	global $SYSTEM_TEMPLATE;

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

	for ($i=0; $i<count($tabTreeGroup); $i++)
	{
		$lib="";
		$buff="";

		/* Affichage du chemin si plusieurs entrées */
		if (count($tabTreeGroup)>1)
		{
			$tabFather=$tabTreeGroup[$i]->getFatherArray();
			$separ="";
			for ($j=(count($tabFather)-1);$j>=0;$j--)
			{
				$buff=$separ.$tabTreeGroup[$i]->getLibelleFromGroup($tabFather[$j], $currentCode);

				if ($buff=="")
					$lib.=$separ.$tabTreeGroup[$i]->getLibelleFromGroup($tabFather[$j], $defaultCode);
				else
					$lib.=$buff;
				$separ="/";
			}
		}else{
			$lib=$tabTreeGroup[$i]->getLibelleFromGroup($tabTreeGroup[$i]->getId(), $currentCode);
			if ($lib=="")
				$lib=$tabTreeGroup[$i]->getLibelleFromGroup($tabTreeGroup[$i]->getId(), $defaultCode);
		}

		/*Fonction permettant de supprimer les numeros, le point et l'espace à l'affichage*/
// 		$lib = eregi_replace("^[[:space:]]*[a-z]+[.)".chr(176)."][[:space:]]+", "", $lib);
        $lib = preg_replace("/^[[:space:]]*[a-z]+[.)".chr(176)."][[:space:]]+/i", "", $lib);
		$tabSel[$tabTreeGroup[$i]->getId()]=$char.$lib;
		$tabSel=printTreeGroupSon($tabSel, $tabTreeGroup[$i], $selected, $tabTreeGroup[$i]->getId(), "--", $MxBlocName);
	}	
	$GLOBALS['SYSTEM_TEMPLATE']->MxSelect($MxBlocName, $name, $selected, $tabSel, $default, $multiple, $opt, "class=\"".$class."\"");
}

/**
*function PrintTabTreeGroup permet d'afficher une liste déroulante avec les groupes associés
*
*/
function printTreeGroupSon($tabSel, $TreeGroup, $selected, $id, $char="--", $MxBlocName="GROUP")
{
	global $SYSTEM_TEMPLATE;

	$charAdd="--";
	$arrayLevel=$TreeGroup->getSonOfIdPereArray($id);

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

	for ($i=0; $i<count($arrayLevel);$i++)
	{
		$lib=$TreeGroup->getLibelleFromGroup($arrayLevel[$i], $currentCode);
		if ($lib=="")
			$lib=$TreeGroup->getLibelleFromGroup($arrayLevel[$i], $defaultCode);
		$tabName[$i]=$lib;
	}

	asort($tabName);
	reset($tabName);

	for ($i=0; $i<count($arrayLevel); $i++)
	{
		/*Fonction permettant de supprimer les numeros, le point et l'espace à l'affichage*/
// 		$tabName[$i] = eregi_replace("^[[:space:]]*[a-z]+[.)".chr(176)."][[:space:]]+", "", $tabName[$i]);
        $tabName[$i] = preg_replace("/^[[:space:]]*[a-z]+[.)".chr(176)."][[:space:]]+/i", "", $tabName[$i]);
	}

	while (list($i, $lib) = each($tabName))
	{
		$tabSel[$arrayLevel[$i]]=$char.$lib;
		$tabSel=printTreeGroupSon($tabSel, $TreeGroup, $selected, $arrayLevel[$i], $char.$charAdd, $MxBlocName);
	}
	return $tabSel;
}

/**
*function PrintTabTreeNode permet d'afficher une liste déroulante avec les groupes associés
*
*/
function printTabTreeNode($tabTreeGroup, $selected, $MxBlocName="NODE", $name="node_id", $parentTree=false, $opt='', $default='', $attr='')
{
	global $SYSTEM_TEMPLATE;

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

	for ($i=0; $i<count($tabTreeGroup); $i++)
	{
		if ($parentTree==true)
			$tabFather=$tabTreeGroup[$i]->getFatherArray();
		else
			$tabFather=array($tabTreeGroup[$i]->getId());

		$separ="";

		for ($j=(count($tabFather)-1);$j>=0;$j--)
		{
			$lib=$separ.$tabTreeGroup[$i]->getLibelleFromNode($tabFather[$j], $currentCode);
			if ($lib=="")
				$lib=$separ.$tabTreeGroup[$i]->getLibelleFromNode($tabFather[$j], $defaultCode);

			/*Fonction permettant de supprimer les numeros, le point et l'espace à l'affichage*/
// 			$lib = eregi_replace("^[[:space:]]*[a-z]+[.)".chr(176)."][[:space:]]+", "", $lib);
            $lib = preg_replace("/^[[:space:]]*[a-z]+[.)".chr(176)."][[:space:]]+/i", "", $lib);
			$tabSel[($tabFather[$j])]=$lib;
			$separ.="--";
		}
		$tabSel=printTreeNodeSon($tabSel, $tabTreeGroup[$i], $selected, $tabTreeGroup[$i]->getId(), $separ, $MxBlocName);
	}
	$GLOBALS['SYSTEM_TEMPLATE']->MxSelect($MxBlocName, $name, $selected, $tabSel, $default, '', $opt, $attr);
}

/**
*function PrintTabTreeNode permet d'afficher une liste déroulante avec les groupes associés
* @return tableau
*/
function printTreeNodeSon($tabSel, $TreeGroup, $selected, $id, $char="--", $MxBlocName="NODE")
{
	global $SYSTEM_TEMPLATE;

	$charAdd="--";
	$arrayLevel=$TreeGroup->getSonOfIdPereArray($id);

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

	for ($i=0; $i<count($arrayLevel);$i++)
	{
		$lib=$TreeGroup->getLibelleFromNode($arrayLevel[$i], $currentCode);

		if ($lib=="")
			$lib=$TreeGroup->getLibelleFromNode($arrayLevel[$i], $defaultCode);

		$tabName[$i]=$lib;
	}

	asort($tabName);
	reset($tabName);

	for ($i=0; $i<count($arrayLevel); $i++)
	{
		/*Fonction permettant de supprimer les numeros, le point et l'espace ïżœl'affichage*/
// 		$tabName[$i] = eregi_replace("^[[:space:]]*[a-z]+[.)".chr(176)."][[:space:]]+", "", $tabName[$i]);
		$tabName[$i] = preg_replace("/^[[:space:]]*[a-z]+[.)".chr(176)."][[:space:]]+/i", "", $tabName[$i]);
	}

	while (list($i, $lib) = each($tabName))
	{
		$tabSel[$arrayLevel[$i]]=$char.$lib;
		$tabSel=printTreeNodeSon($tabSel, $TreeGroup, $selected, $arrayLevel[$i], $char.$charAdd, $MxBlocName);
	}
	return $tabSel;
}

/**
*function PrintTabUser permet d'afficher une liste déroulante avec les Utilisateurs associés
*<P>se sert de <br>
*MxAttribut : UserId<br>
*Optionnel<br>
*Mxtext : UserFirstName<br>
*MxText : UserLastName<br>
*MxText : UserLoginName
*</P>
*<P>Les utilisateurs sont triés par ordre Alpha sur le firstName</P>
* @param tableau objets utilisateurs
* @param entier identifiant du selectionné
* @param chaine nom du bloc Mx a utiliser
* @return booleen
*/
function printTabUser($tabUser, $selected, $MxBlocName="USER", $name="user_id", $opt='', $default='', $class='form')
{
	global $SYSTEM_TEMPLATE;

	/* Pour le Tri/Nom */
	$tabName=array();
	$tabValue=array();

	for ($i=0; $i<count($tabUser);$i++)
	{
		$lib=$tabUser[$i]->getFirstName();
		$tabName[$i]=$lib;
	}

	asort($tabName);
	reset($tabName);
	$j=0;

	// Pour l'affichage
	while (list($i, $lib) = each($tabName))
	{
		if (is_object($tabUser[$i]))
		{
			$tabValue[$tabUser[$i]->getId()]=htmlentitiesconv($tabUser[$i]->getFirstName()." ".$tabUser[$i]->getLastName());
			$j++;
		}
		$GLOBALS['SYSTEM_TEMPLATE']->MxSelect($MxBlocName, $name, $selected, $tabValue, $default, '', $opt, "class=\"".$class."\"");
	}
	return true;
}

/**
*function PrintTabCommProfiles permet d'afficher une liste déroulante avec des Profils de communauté
*<P>se sert de <br>
*MxAttribut : UserId<br>
*Optionnel<br>
*Mxtext : UserFirstName<br>
*MxText : UserLastName<br>
*MxText : UserLoginName
*</P>
*<P>Les utilisateurs sont triés par ordre Alpha sur le firstName</P>
* @param tableau objets utilisateurs
* @param entier identifiant du selectionné
* @param chaine nom du bloc Mx a utiliser
* @return booleen
*/
function printTabCommProfiles($selected='', $MxBlocName="COMMPROFILES", $name="commprofile_id", $opt='', $default='Profil par défaut', $attr='')
{
	global $SYSTEM_TEMPLATE;
	$arrayCommProfiles = array("blog"=>"Blog", "asso"=>"Association", "vitrine"=>"Vitrine", "ecommerce"=>"E-commerce");
	
	asort($arrayCommProfiles);
// 	reset($arrayCommProfiles);
	
	$GLOBALS['SYSTEM_TEMPLATE']->MxSelect($MxBlocName, $name, $selected, $arrayCommProfiles, $default, '', $opt, $attr);

	return true;
}

/**
* lineStyle : applique les style de ligne des tableaux
* utiliser dans un block (tableau), l'attribut lineStyle qui fera référence aux classes: lineStyle1 && lineStyle2
* @param tableau objets utilisateurs
* @param entier identifiant du selectionné
* @param chaine nom du bloc Mx a utiliser
* @return booleen
*/
function lineStyle($block){
	static $tab;
	$tab[$block]=(isset($tab[$block])?$tab[$block]:0);
	if( ($tab[$block]%2) && (isset($GLOBALS["SYSTEM_TEMPLATE"]))){
		$GLOBALS["SYSTEM_TEMPLATE"]->MxAttribut($block.".lineStyle", "lineStyle1");
	}elseif((isset($GLOBALS["SYSTEM_TEMPLATE"]))){
		$GLOBALS["SYSTEM_TEMPLATE"]->MxAttribut($block.".lineStyle", "lineStyle2");
	}
	$tab[$block]++;
}
?>
