<?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 navigation.php
*
* Ce fichier contient la classe Navigation
*
* @copyright Copyright &copy; 2004-2005, Initiance
* @since 2004/06/07
* @version 0.3
* @link www.rooty.me
* @package object_plugin
* @subpackage AmaranteHttps
*/
if ( !defined('SYSTEM_IN') )
{
 die("Hacking attempt");
}

/**
* Constante du plugin [Urlrewrite]
*/
define("CONF_PLUGIN_URLREWRITE_NODE", "espace");

/**
* Test de présence du mod_rewrite et de htaccess
*/
if(function_exists("apache_get_modules"))
	 $GLOBALS["CONF_PLUGIN_URL_REWRITE"]=( in_array("mod_rewrite", apache_get_modules()) && file_exists(".htaccess"))?true:false;
else
	$GLOBALS["CONF_PLUGIN_URL_REWRITE"]=(file_exists(".htaccess"))?true:false;

/**
* Classe Navigation
*<P>Déclare les fonctions usuelles de gestion d'url, permettent l'activation de Https ou non</P>
* @package object_plugin
* @subpackage Navigation
*/
class Navigation extends Plugin{

/**
* Constructeur de la classe Plugin
* @access public
*/
	function Navigation(){
		$this->__construct();
	}

/**
* Constructeur de la classe Plugin
* @access public
*/
	function __construct()
	{
		parent::__construct("1.0", "Olivier Devaine", "gestion du la navigation granilim");
	}
/**
* __beforeSessionStart : methode executée avant que la session commence [Urlrewrite]
*<p>Cette methode à pour but d'être surchagée par le plugin<br>
*pour être executée avant l'initialisation du system</p>
* @abstract
* @access public
* @return booleen
*/
	function __beforeSessionStart()
	{
		if($GLOBALS["CONF_PLUGIN_URL_REWRITE"])
		{
			/* Changement de noeud courant */
			if(( isset($_GET["navigationNodeId"]) ) && ($_GET["navigationNodeId"]!=nid()) || ( isset($_GET["nid"]) ) && ($_GET["nid"]!=nid()) )
			{
				if ( (isset($_GET["system"])) && (strpos($_GET["system"], "navigationNode")===false) ){
					$_GET["system"].=",navigationNode";
				}elseif(!isset($_GET["system"])){
					$_GET["system"]="navigationNode";
				}
			}
		}
	}
/**
* __beforeProcess : methode executée avant que le system ne soit executé [Urlrewrite]
*<p>Cette methode à pour but d'être surchagée par le plugin<br>
*pour être executée avant l'execution system</p>
* @abstract
* @access public
* @return booleen
*/
	function __beforeProcess()
	{
		if(isset($_GET["oid"]) && is_numeric($_GET["oid"]))
			$_GET["classe"]=get_class(Navigation::idToSessionCoordinationObject($_GET["oid"]));
	}
	function idToSessionCoordinationObject($id)
	{
		if (is_numeric($id) && is_array($GLOBALS["SYSTEM_CONTROL"]->objectArray)){
			for($i=0;$i<count($GLOBALS["SYSTEM_CONTROL"]->objectArray);$i++){
				if($GLOBALS["SYSTEM_CONTROL"]->objectArray[$i]->getId()==$id){
					return $GLOBALS["SYSTEM_CONTROL"]->objectArray[$i];
				}
			}
		}
		return $GLOBALS["SYSTEM_MANAGER"]["COORDINATION_OBJ"]->createInstance($id);
	}
/**
* __beforeExec gére le cas d'une authentification https (paramétre dans config HTTPS)
*
* si l'utilisateur essaye de se connecter, on annule l'execution de la page <br/>
* on redirige vers la même page en http.
* @access private
*/
	function __beforeExec(){
		if(isset($_GET["system"])){
			if(strpos($_GET["system"],"authSession")!==false && $GLOBALS['CONF_AUTH_SECURE']==true){
				if(dirname($_SERVER["PHP_SELF"])!="." && dirname($_SERVER["PHP_SELF"])!="/"){
					$dir=dirname($_SERVER["PHP_SELF"])."/";
				}else{
					$dir="/";
				}
				// Si tout le système doit être sécurisé ? https sinon http
				$urlTo = ($GLOBALS['CONF_ALL_SECURE']==true)?"https://":"http://";
				$urlTo.= $_SERVER['HTTP_HOST'].$dir;
				systemRedirect($urlTo.$GLOBALS['CONF_PAGE_EXECUTION']);
				if(strpos($_GET["system"],"noExec")!==false){
				}else{
					$_GET["system"].=",noExec";	// permet de ne pas executer l'objet de coordination
				}
			}
			
		}
	}
/**
* formatName utilisé avec UrlRewrite::formatName	[Urlrewrite]
*<p>formate une chaîne (node||CoordinationObject)</p>
*
*@return chaine
*@desc chaine chaine sans caractére spéciaux
*/
	function formatName($ch)
	{
	
		/* Fonction permettant de supprimer les numéros, le point et l'espace à l'affichage */
// 		$ch = eregi_replace("^[[:space:]]*[a-z]+[.)".chr(176)."][[:space:]]+", "", $ch);

        $ch = preg_replace("/^[[:space:]]*[a-z]+[.)".chr(176)."][[:space:]]+/i", "", $ch);
	
		$s = strtolower($ch);
		# Gestion des charactères remplaçables
// 		$s=ereg_replace("à|À|â|Â|ä|Ä","a",$s);
// 		$s=ereg_replace("ç|Ç","c",$s);
// 		$s=ereg_replace("è|È|é|É|ê|Ê|ë|Ë","e",$s);
// 		$s=ereg_replace("î|Î|ï|Ï","i",$s);
// 		$s=ereg_replace("ô|Ô","o",$s);
// 		$s=ereg_replace("ù|Ù|û|Û","u",$s);
// 		# Gestion des espaces
// 		$s=ereg_replace("  | |-|/|,","_",$s);


//         echo $s."<br>";
        $patterns[0] = '/[À|Â|Ä|á|â|à|å|ä]/';
        $patterns[1] = '/[è|È|é|É|ê|Ê|ë|Ë]/';
        $patterns[2] = '/[Î|Ï|í|î|ì|ï]/';
        $patterns[3] = '/[Ô|ó|ô|ò|ø|õ|ö]/';
        $patterns[4] = '/[Ù|Û|ú|û|ù|ü]/';
        $patterns[5] = '/æ/';
        $patterns[6] = '/[ç|Ç]/';
        $patterns[7] = '/ß/';
        $patterns[8] = '/\s+/';
        $replacements[0] = 'a';
        $replacements[1] = 'e';
        $replacements[2] = 'i';
        $replacements[3] = 'o';
        $replacements[4] = 'u';
        $replacements[5] = 'ae';
        $replacements[6] = 'c';
        $replacements[7] = 'ss';
        $replacements[8] = '_';

        $s = preg_replace($patterns, $replacements, $s);
//         echo $s."<br>";
		
		
		$nb=strlen($s);
		$i=0;
		while($i<$nb)
		{
			// Suppression de tous les caractères spèciaux!!!
			if ( ((ord(substr($s,$i,1))<97) || (ord(substr($s,$i,1))>122)) && ((ord(substr($s,$i,1))!=95)) ){
				$s=substr($s,0,$i).substr($s,($i+1));
				$i=0;
				$nb=strlen($s);
			}
			$i++;
		}
		if (strlen($s)>25)
			$s=substr($s,0,25);
	
		return $s;
	}
/**
* Fonction formatUrlNode
*
* Formate l'url pour la navigation dans les noeuds
* @public
* @static
* @param chaine nom de la classe à utiliser...
* @param entier identifiant de l'objet
* @param chaine identifiant du message(optionnel)...
* @return chaine url formatté
*/
	function formatUrlNode($system, $navigationNodeId, $msg="",$param="")
	{
		global $SERVER_NAME, $SCRIPT_NAME, $CONF_PERSISTANT_SECURE;
//		var_dump($GLOBALS["CONF_PLUGIN_URL_REWRITE"]);
		if ($GLOBALS["CONF_PLUGIN_URL_REWRITE"])
		{	// [Urlrewrite]
			if(strtolower($system) == "navigationnode")
			{
				$system = CONF_PLUGIN_URLREWRITE_NODE;
			}
			$currentCode=$GLOBALS["SYSTEM_USER_SESSION"]->langue->getCode();
			
			$Node	=$GLOBALS["SYSTEM_USER_SESSION"]->getNode($navigationNodeId);
			$nodeName = Navigation::formatName($Node->getLibelle($currentCode));
			
			$pageName = ((isset($pageName))?$pageName:"index");
			$url =$nodeName."-". $navigationNodeId."---.htm";

			if($GLOBALS['CONF_URL_KEY']){
				$url =addIdToUrl($url);
			} else {
				$url.="?abs=1";
			}
		
			if ($msg!="")
				$url.="&amp;msg=".$msg;
			if ($param!="")
				$url.="&param=".$param;
		} else {
			$url =$GLOBALS['CONF_PAGE_EXECUTION'];
			if($GLOBALS['CONF_URL_KEY']){
				$url =addIdToUrl($url);
			}else{
				$url.="?abs=1";
			}
			$url.="&amp;sys=".$system."&amp;nid=".$navigationNodeId;
			if ($msg!="")
				$url.="&amp;msg=".$msg;
			if ($param!="")
				$url.="&param=".$param;
		}
		if(dirname($_SERVER["PHP_SELF"])!="." && dirname($_SERVER["PHP_SELF"])!="/")
			$dir=dirname($_SERVER["PHP_SELF"])."/";
		else
			$dir="/";

		if($GLOBALS['CONF_AUTH_SECURE']==true){
			if( (strtolower($system) == "navigationnode") && ( in_array(strtolower($navigationNodeId), $GLOBALS['SYSTEM_NODE_SECURE']) || ($GLOBALS['CONF_ALL_SECURE']==true)) )
			{
				return "https://".$_SERVER['HTTP_HOST'].$dir.htmlentitiesconv(unhtmlentities($url));
			}else{
				return "http://".$_SERVER['HTTP_HOST'].$dir.htmlentitiesconv(unhtmlentities($url));
			}
		}else{
			return "http://".$_SERVER['HTTP_HOST'].$dir.htmlentitiesconv(unhtmlentities($url));
		}
	}

/**
* Fonction formatUrl
*
* Formate l'url pour l'execution d'une methode
* @public
* @static
* @param entier identifiant de l'objet
* @param chaine nom de la classe à utiliser...
* @param chaine nom de la methode à appeler
* @param chaine identifiant du message(optionnel)...
* @return chaine url formatté
*/
	function formatUrl($oid, $className, $methodName, $msg="", $param="", $navigationNodeId=null)
	{
		global $SERVER_NAME, $SCRIPT_NAME, $CONF_PERSISTANT_SECURE;
		if ($GLOBALS["CONF_PLUGIN_URL_REWRITE"])
		{	// [Urlrewrite]
	
			$navigationNodeId = ( (!is_null($navigationNodeId) && is_numeric($navigationNodeId))? $navigationNodeId: nid() );
		
			$objectArray=Navigation::idToSessionCoordinationObject($oid);
			$currentCode  = $GLOBALS["SYSTEM_USER_SESSION"]->langue->getCode();
			
			$Node	=$GLOBALS["SYSTEM_USER_SESSION"]->getNode($navigationNodeId);
			
			$nodeName = Navigation::formatName($Node->getLibelle($currentCode));
			$objName  = Navigation::formatName($objectArray->getName($currentCode));	
			
			$url = $nodeName."-".$navigationNodeId."-".$objName."-".$methodName."-".$oid.".htm";

			if($GLOBALS['CONF_URL_KEY']){
				$url =addIdToUrl($url);
			}else{
				$url.="?abs=1";
			}

			if ($msg!="")
				$url.="&amp;msg=".$msg;
			if ($param!="")
				$url.="&param=".$param;
		}else{
			$url =$GLOBALS['CONF_PAGE_EXECUTION'];
			if($GLOBALS['CONF_URL_KEY']){
				$url =addIdToUrl($url);
				$url.="&amp;oid=".$oid."&amp;classe=".$className."&amp;action=".$methodName;
			}else{
				$url.="?oid=".$oid."&amp;classe=".$className."&amp;action=".$methodName;
			}
			if ($msg!="")
				$url.="&amp;msg=".$msg;

			if ($param!="")
				$url.="&param=".$param;
			if ($navigationNodeId!=null && is_numeric($navigationNodeId))
				$url.="&amp;sys=nid&amp;nid=".$navigationNodeId;
		}

		if(dirname($_SERVER["PHP_SELF"])!="." && dirname($_SERVER["PHP_SELF"])!="/")
			$dir=dirname($_SERVER["PHP_SELF"])."/";
		else
			$dir="/";

		if($GLOBALS['CONF_AUTH_SECURE']==true){
// 			var_dump(strtolower($className).".".strtolower($methodName));
// 			var_dump($GLOBALS['SYSTEM_CLASS_METHOD_SECURE']);
// 			var_dump(in_array(strtolower($className).".".strtolower($methodName), $GLOBALS['SYSTEM_CLASS_METHOD_SECURE']));
			if( ($GLOBALS['CONF_ALL_SECURE']==true) || in_array(strtolower($className).".".strtolower($methodName), $GLOBALS['SYSTEM_CLASS_METHOD_SECURE']) || in_array(strtolower($className), $GLOBALS['SYSTEM_CLASS_SECURE']) || in_array($oid, $GLOBALS['SYSTEM_OID_SECURE']) || in_array($navigationNodeId, $GLOBALS['SYSTEM_NODE_SECURE']) )
			{
// 				return "https://".$_SERVER['HTTP_HOST'].$dir.htmlentitiesconv(unhtmlentities($url));
                return "https://".$_SERVER['HTTP_HOST'].$dir.$url;
			}else{
// 				return "//".$_SERVER['HTTP_HOST'].$dir.htmlentitiesconv(unhtmlentities($url));
                return "//".$_SERVER['HTTP_HOST'].$dir.$url;
			}
		}else{
// 			return "//".$_SERVER['HTTP_HOST'].$dir.htmlentitiesconv(unhtmlentities($url));
            return "//".$_SERVER['HTTP_HOST'].$dir.$url;
		}
	}

/**
* Fonction formatUrl
*
* Formate l'url pour l'execution d'une methode
* @public
* @static
* @param entier identifiant de l'objet
* @param chaine nom de la classe à utiliser...
* @param chaine nom de la methode à appeler
* @param chaine identifiant du message(optionnel)...
* @return chaine url formatté
*/
	function extUrl($url, $oid, $className, $methodName)
	{
		global $SERVER_NAME, $SCRIPT_NAME, $CONF_PERSISTANT_SECURE;

		$navigationNodeId = nid();
		
		if( substr($url, 0, 8) === "https://" ) {
			$url = explode("https://", $url);
			$url = $url[1];
		} elseif( substr($url, 0, 7) === "http://" ) {
			$url = explode("http://", $url);
			$url = $url[1];
		} else
			$url = $url;
			
// 		var_dump($url);

		if($GLOBALS['CONF_AUTH_SECURE']==true){
			if( ($GLOBALS['CONF_ALL_SECURE']==true) || in_array(strtolower($className).strtolower($methodName), $GLOBALS['SYSTEM_CLASS_METHOD_SECURE']) || in_array(strtolower($className), $GLOBALS['SYSTEM_CLASS_SECURE']) || in_array($oid, $GLOBALS['SYSTEM_OID_SECURE']) || in_array($navigationNodeId, $GLOBALS['SYSTEM_NODE_SECURE']) )
			{
// 				return "https://".$_SERVER['HTTP_HOST'].$dir.htmlentitiesconv(unhtmlentities($url));
				return "https://".$url;
			}else{
// 				return "http://".$_SERVER['HTTP_HOST'].$dir.htmlentitiesconv(unhtmlentities($url));
				return "http://".$url;
			}
		}else{
// 			return "http://".$_SERVER['HTTP_HOST'].$dir.htmlentitiesconv(unhtmlentities($url));
			return "http://".$url;
		}
	}


/**
* Fonction formatUrl
*
* Formate l'url pour l'execution d'une methode
* @public
* @static
* @param entier identifiant de l'objet
* @param chaine nom de la classe à utiliser...
* @param chaine nom de la methode à appeler
* @param chaine identifiant du message(optionnel)...
* @return chaine url formatte
*/
	function absoluteUrl($msg="",$param="")
	{
		global $SERVER_NAME, $SCRIPT_NAME, $CONF_PERSISTANT_SECURE;
		if ($GLOBALS["CONF_PLUGIN_URL_REWRITE"])
		{	// [Urlrewrite]
	
			$navigationNodeId = ( (!is_null($navigationNodeId) && is_numeric($navigationNodeId))? $navigationNodeId: nid() );
	
			$objectArray  = Navigation::idToSessionCoordinationObject(oid());
			$currentCode  = $GLOBALS["SYSTEM_USER_SESSION"]->langue->getCode();
	
			$Node	=$GLOBALS["SYSTEM_USER_SESSION"]->getNode($navigationNodeId);
			
			$nodeName = Navigation::formatName($Node->getLibelle($currentCode));
			$objName  = Navigation::formatName($objectArray->getName($currentCode));	
			
			$url = $nodeName."-".$navigationNodeId."-".$objName."-".methodName()."-".$oid.".htm";

			if($GLOBALS['CONF_URL_KEY']){
				$url =addIdToUrl($url);
			}else{
				$url.="?abs=1";
			}
	
			if ($msg!="")
				$url.="&amp;msg=".$msg;
			if ($param!="")
				$url.="&amp;param=".$param;
		} else {
			$url =$GLOBALS['CONF_PAGE_EXECUTION'];
			if($GLOBALS['CONF_URL_KEY']){
				$url =addIdToUrl($url);
			}else{
				$url.="?abs=1";
			}
			if ($msg!="")
				$url.="&amp;msg=".$msg;
	
			if ($param!="")
				$url.="&amp;param=".$param;
		}
		if(dirname($_SERVER["PHP_SELF"])!="." && dirname($_SERVER["PHP_SELF"])!="/")
			$dir=dirname($_SERVER["PHP_SELF"])."/";
		else
			$dir="/";

		if($GLOBALS['CONF_AUTH_SECURE']==true){
			if( in_array(strtolower($nodeName), $GLOBALS['SYSTEM_NODE_SECURE']) || ($GLOBALS['CONF_ALL_SECURE']==true) )
			{
				return "https://".$_SERVER['HTTP_HOST'].$dir.htmlentitiesconv(unhtmlentities($url));
			}else{
				return "http://".$_SERVER['HTTP_HOST'].$dir.htmlentitiesconv(unhtmlentities($url));
			}
		}else{
			return "//".$_SERVER['HTTP_HOST'].$dir.htmlentitiesconv(unhtmlentities($url));
		}
	}
	
	function protocol()
	{
		if(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1) || isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&  $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
			return $protocol = 'https://';
			else return $protocol = 'http://';
	}
}

	//
	// Déclaration des fonction d'url (alias du plugin Navigation)
	//
/**
* Fonction formatUrlNode
*
* Formate l'url pour la navigation dans les noeuds
* @param chaine nom de la classe à utiliser...
* @param entier identifiant de l'objet
* @param chaine identifiant du message(optionnel)...
* @return chaine url formatté
*/
if (!function_exists("formatUrlNode"))	// permet la redeclaration au niveau du plugin
{
	function formatUrlNode($system, $navigationNodeId, $msg="",$param="")
	{
		return Navigation::formatUrlNode($system, $navigationNodeId, $msg, $param);
	}
}

/**
* Fonction formatUrl
*
* Formate l'url pour l'execution d'une methode
* @param entier identifiant de l'objet
* @param chaine nom de la classe à utiliser...
* @param chaine nom de la methode à appeler
* @param chaine identifiant du message(optionnel)...
* @return chaine url formatté
*/
if (!function_exists("formatUrl"))	// permet la redeclaration aux niveau du plugin
{
	function formatUrl($oid, $className, $methodName, $msg="",$param="", $navigationNodeId=null)
	{
		return Navigation::formatUrl($oid, $className, $methodName, $msg, $param, $navigationNodeId);
	}
}

/**
* Fonction formatUrl
*
* Formate l'url pour l'execution d'une methode
* @param entier identifiant de l'objet
* @param chaine nom de la classe à utiliser...
* @param chaine nom de la methode à appeler
* @param chaine identifiant du message(optionnel)...
* @return chaine url formatté
*/
if (!function_exists("absoluteUrl"))	// permet la redeclaration aux niveau du plugin
{
	function absoluteUrl($msg="",$param="")
	{
		return Navigation::absoluteUrl($msg, $param);
	}
}

/**
* Fonction extUrl
*
* Formate l'url pour l'execution d'une methode
* @param entier identifiant de l'objet
* @param chaine nom de la classe à utiliser...
* @param chaine nom de la methode à appeler
* @param chaine identifiant du message(optionnel)...
* @return chaine url formatté
*/
if (!function_exists("extUrl"))	// permet la redeclaration aux niveau du plugin
{
	function extUrl($url, $oid, $className, $methodName)
	{
		return Navigation::extUrl($url, $oid, $className, $methodName);
	}
}

if (!function_exists("protocol"))	// permet la redeclaration aux niveau du plugin
{
	function protocol() {
	    if(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1) || isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&  $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')  return $protocol = 'https://'; else return $protocol = 'http://';
	}
}
?>
