<?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 lib_utils.php
*
*Ce fichier contient les fonctions communes à tous les développements
*
* @author Rooty <www.rooty.me|rooty@rooty.me>
* @link www.rooty.me
* @since 2018/04/02
* @version 0.3
* @package system_utils
* @copyright Copyright &copy; 2009-2018, Rooty
*/
if ( !defined('SYSTEM_IN') )
{
 die("Hacking attempt");
}

/**
* Contrôle l'existence de caractères non autorisés dans une chaîne de caractères
*
* <p>Contrôle l'existence de caractères non autorisés dans une chaîne de caractères</p>
*
* @param chaine
* @param pattern
* @return bolean true/false
*/
function checkDataChars($string, $pattern)
{
	if(preg_match($pattern, $string))
		return false;
	else                  
		return true;
}

/**
*Fonction inverse de "htmlentities()"
*
* <P>Transforme les caractères HTML d'une chaine en caractères courant</P>
*
* @param chaine
*/
function unhtmlentities ($string)
{
    $trans_tbl = get_html_translation_table (HTML_ENTITIES);
    $trans_tbl = array_flip ($trans_tbl);
    $string = str_replace("&rsquo;", "'", $string);
    return strtr ($string, $trans_tbl);
}


/**
*Fonction htmlentities
*
* <P>Transforme les caractères HTML d'une chaine en caractères courant</P>
*
* @param chaine
*/
function htmlentitiesconv( $string )
{
// 	var_dump($string);
	if( !empty($string) && $string != "" )
		return (htmlentities($string, ENT_QUOTES, SYSTEM_DEFAULT_HTMLENTITIES));
	else
		return "";
}

/**
*Fonction inverse de "htmlspecialchars()"
*
* <P>Transforme les caractères HTML d'une chaine en caractères courant</P>
*
* @param chaine
*/
function unhtmlspecialchars( $mixed, $quote_style = ENT_QUOTES ) {
   if(is_array($mixed)){
     return array_map('htmlspecialchars_decode',$mixed, array_fill(0,count($mixed),$quote_style));
  }
  $trans_table = get_html_translation_table( HTML_SPECIALCHARS, $quote_style );
   if( $trans_table["'"] != '&#039;' ) { # some versions of PHP match single quotes to &#39;
       $trans_table["'"] = '&#039;';
   }
   return (strtr($mixed, array_flip($trans_table)));
}

function mktimetodate($timestamp, $mask){
	if( trim($mask)=="" )
		return (int)$timestamp;
	else
		return date($mask, (int)$timestamp);
}

/**
*Fonction strgbtomktime
*
* <P>Transforme une chaine en date</P>
*
* @param chaine
* @return date formatée
*/
function strgbtomktime($in){
	$t = split("/",$in);
	if (count($t)!=3) $t = split("-",$in);
	if (count($t)!=3) $t = split(" ",$in);
	if (count($t)!=3) return -1;
	if (!is_numeric($t[0])) return -1;
	if (!is_numeric($t[1])) return -2;
	if (!is_numeric($t[2])) return -3;
	if ($t[0]<1902 || $t[0]>2037) return -3;

	//echo $t[2]."AZERTY";
	return mktime (0,0,0, $t[1], $t[2], $t[0]);
}

/**
*Fonction strfrtomktime
*
* <P>Transforme une chaine en date</P>
*
* @param chaine
* @return date formatée
*/
function strfrtomktime($in){
	$t = split("/",$in);
	if (count($t)!=3) $t = split("-",$in);
	if (count($t)!=3) $t = split(" ",$in);
	if (count($t)!=3) return -1;
	if (!is_numeric($t[0])) return -1;
	if (!is_numeric($t[1])) return -2;
	if (!is_numeric($t[2])) return -3;
	if ($t[2]<1902 || $t[2]>2037) return -3;
	return mktime (0,0,0, $t[1], $t[0], $t[2]);
}

/**
*Fonction datefrtogb
*
* <P>Transforme une date au format fr en date au format gb</P>
*
* @param chaine
* @param "d" pour date ou "h" heure
* @return date formatée
*/
Function datefrtogb($date,$format="d")
{
	$jour_date = substr($date,0,2);
	$mois_date = substr($date,3,2);
	$annee_date = substr($date,6,4);
	if ($format == "h")
	{	//$heure_date = date(" H\:i\:s");
		$heure_date = substr($date,10,9);
		$date_sortie = $annee_date."-".$mois_date."-".$jour_date.$heure_date;
	}
	else
	{
		$date_sortie = $annee_date."-".$mois_date."-".$jour_date;
	}
	if ($date_sortie=='00-00-0000' || $date_sortie=='--')
	{	$date_sortie = "";
	}
	return ($date_sortie);
}

/**
*Fonction datefrtogb
*
* <P>Transforme une date au format gb en date au format fr</P>
*
* @param chaine
* @return date formatée
*/
Function dategbtofr($date,$format="d")
{
	$jour_date = substr($date,8,2);
	$mois_date = substr($date,5,2);
	$annee_date = substr($date,0,4);
	$date_sortie = $jour_date."/".$mois_date."/".$annee_date;
	if ($format == "h")
	{	//$heure_date = date(" H\:i\:s");
		$heure_date = substr($date,10,9);
		$date_sortie = $jour_date."-".$mois_date."-".$annee_date.$heure_date;
	}
	else
	{
		$date_sortie = $jour_date."-".$mois_date."-".$annee_date;
	}

	if ($date_sortie=='00/00/0000' || $date_sortie=='//')
	{$date_sortie = "";}
	return ($date_sortie);
}

/**
*Fonction redirect
*
* <P>Redirige vers l'URL spécifiée</P>
*
* @param chaine
* @param booléen encoder au format url
* @desc url de redirection
*/
function redirect($url,$encode=false)
{
	if ($encode === true)
		$url=urlencode($url);
	if (headers_sent())
	{
		$str="\n<SCRIPT LANGUAGE=\"JAVASCRIPT\" TYPE=\"text/javascript\">\n";
		$str.="document.location.href=\"$url\";\n";
		$str.="</SCRIPT>";
		echo $str;
	}
	else
	{
		header("location:".$url);
	}
}

/**
*Fonction redirect_maintenance
*
* <P>Redirige vers la page de maintenance du site</P>
*
*/
function redirectMaintenance()
{
	redirect($GLOBALS['CONFIG_MAINTENANCE']);
}

/**
*Fonction redirect
*
* <P>Redirige vers la page d'erreur du site</P>
*
*/
function redirectErreur()
{
	redirect($GLOBALS['CONFIG_ERREUR']);
}

/**
* GetAnId
*<p>Créer un identifiant à partir de microtime</p>
*
* @param entier longueur de  l'identifiant
* @return chaine chaine cryptée à partir de la source de l'objet
*/
function getAnId($lenght=8)
{
	$id = "";
	$pool = "0123456789";
	srand((double) microtime() * 1000000);
	for($index = 0; $index < $lenght; $index++)
	{
		$id .= substr($pool,(rand()%(strlen($pool))),1);
	}
	return(intval($id));
}

/**
* Verifie si la chaine est une date (GB ou FR aa/mm/jj)
*
* @param chaine (chaine supposée être une date)
* @return chaine
*/
function Is_date($str)
{
//     echo $str."<br>";
// 	$tab=split("[\ \:/-]", $str);
    $tab=preg_split('/[- :]/',$str);
// 	print_r($tab);
// 	echo count($tab);
	if (count($tab)!=6)
	{
		return false;
	}
	//$heure=split(":",$tab[2]);
	for ($i=0; $i<count($tab); $i++)
	{
		if (!Is_numeric($tab[$i]))
			return false;
	}
	return true;
}

/**
* Petite fonction de debuggage permettant d'afficher le resultat d'un booléen
* @param booleen valeur a afficher
*/
function testBool($val)
{
	if ($val) echo '<font color="#00A000"><b>VRAI</b></font>';
		else echo '<font color="#FF0000"><b>FAUX</b></font>';
}

/**
* addToLog
* @param chaine ligne à inserer
* @param fichier fichier formaté "log/auth.log"
* @access private
* @return booleen
*/
function addToLog($message, $logFile)
{
	global $CONF_LOG_PATH;
	if ($logFile!="")
	{
		if (file_exists($CONF_LOG_PATH.$logFile) && is_writable($CONF_LOG_PATH.$logFile))
		{
			$file=new File($CONF_LOG_PATH.$logFile, "a");
			$file->addLine($message);
			$file->close();
			return true;
		}
	}
	return false;
}

/**
* Fonction d'alias d'ajout de l'id.... à une ulr
*<P>Si l'id n'existe pas il est crée pour la redirection</P>
* @param chaine url a modifier
* @access public
* @return chaine
*/
function addIdToUrl($url, $non_html_amp = false)
{
	global $SYSTEM_IP;
	if (isset($GLOBALS["SYSTEM_USER_SESSION"]))
	{
		$url=$GLOBALS["SYSTEM_USER_SESSION"]->addIdToUrl($url);
		return $url;
	}else{
		addError(4, "Lib utils", "Impossible de TROUVER SYSTEM_USER_SESSION?!!!!!!!", __line__, __file__);
		return $url;
	}
}

/**
* Fonction objectSearch
*<P>recherche un object dans un tableau ou un tableau de tableau</P>
*<P>retourne un tableau de pos</P>
* @param chaine url a modifier
* @access public
* @return tableau (tableau des indices de reférence)
*/
function objectSearch($needle, $haystack, $strict=false)
{
	$retour=array();
	if(!is_array($haystack)) array();
	for($i=0; $i<count($haystack);$i++)
	{
		if (is_array($haystack[$i]))
		{
			$retour=objectSearch($needle, $haystack[$i], $strict);
			if (is_array($retour) && count($retour)>0 )
			{
				$retour[]=$i;
				return $retour;
			}
		}
		elseif($strict)
		{
			if ( (get_class($haystack[$i])==get_class($needle)) && ($needle==$haystack[$i]) ) return array($i);
		}else{
			if ($needle==$haystack[$i]) return array($i);
		}
	}
	return array();
}

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

/**
* Function permettant de verifié la validité d'un mail saisi
* @access public
* @return chaine chaine code message
*/

	function checkMail($email){

		/*Récupération des messages utilisateurs*/
		addMessageFile("user.ini");
               /* gestion du lib en fonction de la langue courante */
                $currentCode=$GLOBALS["SYSTEM_USER_SESSION"]->langue->getCode();
                $defaultCode=$GLOBALS["SYSTEM_DEFAULT_LANGUAGE_CODE"];
                /* fin récupération des codes par defaut */

		$email = strtolower($email);
	
		if (strlen($email) < 6){ return $email." : ".getMessage("ajaxCourrielTooShort");}
		if (strlen($email) > 255) {return $email." : ".getMessage("ajaxCourrielTooLong");}
		if (!ereg("@", $email)){ return $email." : ".getMessage("ajaxCourrielNoArobase");}
		if (preg_match_all("/([^a-zA-Z0-9_\@\.\-])/i", $email, $trouve))
		{
			return $email." : ".getMessage("ajaxCourrielBadChars")."(".implode(", ", $trouve[0]).").";
		}
		if (!preg_match("/^([a-z0-9_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,4}\$/i", $email))
		{
			return $email." : ".getMessage("ajaxCourrielWrongFormat");
		}
		list($compte, $domaine)=split("@", $email, 2);
		if (!checkdnsrr($domaine, "MX"))
		{
			return $email." : $domaine ".getMessage("ajaxCourrielNoMX");
		}
		return "Valide";;
	}
	
	function checkProvenance($method){
		$prov = false;
		if( isset($_SESSION['redirect']) ) {
			if( stristr($_SESSION['redirect'], $method) ) $prov = true; else $prov = false;
		} else { $prov = false; }
		return $prov;
	}
?>
