<?php
/* **
 * @application PhpMyShopping
 * @part        Boutique
 * @file        class.lib.php
 * @path        ./admin/include
 * @author      Stephane DINE <stephane@phpmyshopping.org>
 * @site        http://www.phpmyshopping.org
 * @license     http://www.php.net/license/3_0.txt  PHP License 3.0
 *
 * PHP version 5
 */

class Lib
{
	public    $SQLquery;
	protected $sqli_trace       = true;
	public    $nbmax;
	public    $randImageNumber;
	public    $cfg;
	public    $connexion;
	public    $database;
	public    $query;
	public    $sql;
	public    $debut            = 0;
	private   $sql_trace        = true;
	private   $log              = true;
	public    $msgReturn;
	public    $urlRewriting     = true;
	public    $P_Root;




	/** *****************************************************************************************************************************
	 * Constructeur
	 *
	 * @access public
	 */
	public function Lib()
	{
	}




	/** *****************************************************************************************************************************
	 * Methode setParam
	 *
	 * @desc   Retourne le parametre voulu selon les cles donnees en parametre
	 * @param  string $key1 Premiere cle du tableau
	 * @param  string $key2 Seconde cle du tableau
	 * @return array
	 * @access public
	 */
	public function getParam($key1, $key2)
	{
        if (file_exists('./config.php')) {
            include './config.php';
        } elseif (file_exists('../config.php')) {
            include '../config.php';
        } else {
            include '../../config.php';
        }

        //$this->P_Root = $_SERVER['DOCUMENT_ROOT'];
        $this->cfg['param']['domain_name'] = $cfg['param']['domain_name'];
        $this->cfg['param']['apps_name']   = $cfg['param']['apps_name'];
        $this->cfg['param']['log_level']   = $cfg['param']['log_level'];
        $this->cfg['database']['host']     = $cfg['database']['host'];
        $this->cfg['database']['data']     = $cfg['database']['data'];
        $this->cfg['database']['user']     = $cfg['database']['user'];
        $this->cfg['database']['pass']     = $cfg['database']['pass'];
        //$this->cfg['path']['root']         = $this->P_Root;
        //$this->cfg['path']['lib']          = $this->P_Root.'/lib';
        $this->cfg['url']['root']          = $cfg['url']['root'];
        $this->cfg['mail']['mail_0']       = $cfg['mail']['mail_0'];
        $this->cfg['mail']['mail_1']       = $cfg['mail']['mail_1'];
        $this->cfg['mail']['mail_2']       = $cfg['mail']['mail_2'];
        $this->cfg['mail']['from']         = $cfg['mail']['from'];

        return $this->cfg[$key1][$key2];
	}




	/** *****************************************************************************************************************************
	 * Methode affich_sql
	 *
	 * @desc   Cette methode permet d'afficher en couleur une requete SQL, elle ne sert
	 *         qu'au debugage. Si elle est utilisee dans le code sans parametre, elle
	 *         affichera la derniere requete SQL en cas d'erreur avec les erreur MySQL.
	 *         Si le parametre passe vaut true la requete SQL sera affichee.
	 * @param  bool   $debug
	 * @return string Retourne la requete SQL en couleur et/ou les messages d'erreurs
	 * @access public
	 */
	public function affich_sql($debug = false)
	{
		if ($this->query == false || $debug == true) {
			$affich_sql = '<pre class="debug">';

			if ($this->query == false) {
				$affich_sql .= 'Probl&egrave;me avec la requ&ecirc;te SQL ci-dessous :<br />';
				$affich_sql .= $this->debug_sql('sql',$this->sql,true);
				$error_sql = '<font color="red">mysql_errno() = '.mysql_errno().'<br />mysql_error() = '.wordwrap(mysql_error()).'</font><br />';
			} elseif ($debug == true) {
				$affich_sql .= '<font color="green">Requ�te SQL :</font><br />';
				$affich_sql .= $this->debug_sql('sql',$this->sql,$debug);
			}

			$result = $affich_sql.'<br />'.$error_sql.'</pre>';

			return $result;
		}
	}




	/** *****************************************************************************************************************************
	 * Methode barre_nav_alpha
	 *
	 * @desc   Affiche une barre de navigation avec lettres.
	 * @param  string $critere Paramatres a faire suivre dans l'url (si il y en a biensur)
	 * @param  string $champ   Nom du champ sur lequel le tri se fera
	 * @param  string $sql     Requete SQL pour recuperer les valeurs du champs sur lequel le tri se fera
	 * @param  string $css     Balise css des liens
	 * @param  string $style   Style css des liens
	 * @return string Retourne une barre de navigation alphab�tique selon les donn�es pr�sentes la table voulue.
	 * @access public
	 */
	public function barreNavAlpha($critere, $champ, $sql, $css = '', $style = '')
	{
		$query = $this->query($sql);
		echo $this->affich_sql();

		if (mysql_num_rows($query) > 0) {
			while ($result = mysql_fetch_array($query)) {
				$lettre = strtoupper(substr($result[''.$champ.''], 0, 1));
				$lien = '|&nbsp;<a href="?'.$critere;

				switch($lettre) {
					case '0'; $C0 = $lien.'L=0">0</a>&nbsp;'; break;
					case '1'; $C1 = $lien.'L=1">1</a>&nbsp;'; break;
					case '2'; $C2 = $lien.'L=2">2</a>&nbsp;'; break;
					case '3'; $C3 = $lien.'L=3">3</a>&nbsp;'; break;
					case '4'; $C4 = $lien.'L=4">4</a>&nbsp;'; break;
					case '5'; $C5 = $lien.'L=5">5</a>&nbsp;'; break;
					case '6'; $C6 = $lien.'L=6">6</a>&nbsp;'; break;
					case '7'; $C7 = $lien.'L=7">7</a>&nbsp;'; break;
					case '8'; $C8 = $lien.'L=8">8</a>&nbsp;'; break;
					case '9'; $C9 = $lien.'L=9">9</a>&nbsp;'; break;
					case 'A'; $A = $lien.'L=A">A</a>&nbsp;'; break;
					case 'B'; $B = $lien.'L=B">B</a>&nbsp;'; break;
					case 'C'; $C = $lien.'L=C">C</a>&nbsp;'; break;
					case 'D'; $D = $lien.'L=D">D</a>&nbsp;'; break;
					case 'E'; $E = $lien.'L=E">E</a>&nbsp;'; break;
					case 'F'; $F = $lien.'L=F">F</a>&nbsp;'; break;
					case 'G'; $G = $lien.'L=G">G</a>&nbsp;'; break;
					case 'H'; $H = $lien.'L=H">H</a>&nbsp;'; break;
					case 'I'; $I = $lien.'L=I">I</a>&nbsp;'; break;
					case 'J'; $J = $lien.'L=J">J</a>&nbsp;'; break;
					case 'K'; $K = $lien.'L=K">K</a>&nbsp;'; break;
					case 'L'; $L = $lien.'L=L">L</a>&nbsp;'; break;
					case 'M'; $M = $lien.'L=M">M</a>&nbsp;'; break;
					case 'N'; $N = $lien.'L=N">N</a>&nbsp;'; break;
					case 'O'; $O = $lien.'L=O">O</a>&nbsp;'; break;
					case 'P'; $P = $lien.'L=P">P</a>&nbsp;'; break;
					case 'Q'; $Q = $lien.'L=Q">Q</a>&nbsp;'; break;
					case 'R'; $R = $lien.'L=R">R</a>&nbsp;'; break;
					case 'S'; $S = $lien.'L=S">S</a>&nbsp;'; break;
					case 'T'; $T = $lien.'L=T">T</a>&nbsp;'; break;
					case 'U'; $U = $lien.'L=U">U</a>&nbsp;'; break;
					case 'V'; $V = $lien.'L=V">V</a>&nbsp;'; break;
					case 'W'; $W = $lien.'L=W">W</a>&nbsp;'; break;
					case 'X'; $X = $lien.'L=X">X</a>&nbsp;'; break;
					case 'Y'; $Y = $lien.'L=Y">Y</a>&nbsp;'; break;
					case 'Z'; $Z = $lien.'L=Z">Z</a>&nbsp;'; break;
				}
			}

			$ALL = $lien.'L=%">TOUS</a>&nbsp;';
			$barre = '<div class="'.$css.'" style="'.$style.'">'.$C0.$C1.$C2.$C3.$C4.$C5.$C6.$C7.$C8.$C9.$A.$B.$C.$D.$E.$F.$G.$H.$I.$J.$K.$L.$M.$N.$O.$P.$Q.$R.$S.$T.$U.$V.$W.$X.$Y.$Z.$ALL.'|</div>';
		} else {
			$barre = '&nbsp;';
		}

		return $barre;
	}




	/** *****************************************************************************************************************************
	 * Methode closeDb
	 *
	 * @desc   Ferme la connexion au serveur MySQL et a la base de donnees.
	 * @return bool Retourne vrai en cas de succes et faux en cas d'echec
	 * @access private
	 */
	private function closeDb()
	{
		if ((!empty($this->connexion)) or (isset($this->connexion))) {
			mysql_close($this->connexion);

			return true;
		} else {
			return false;
		}
	}




	/** *****************************************************************************************************************************
	 * Methode connect
	 *
	 * @desc   Initialise la connexion au serveur MySQL et a la base de donnees.
	 * @return string Retourne un message d'erreur en cas d'erreur sinon retourne l'identifiant de connexion
	 * @access private
	 */
	private function connect()
	{
		$this->connexion = mysql_connect($this->getParam('database', 'host'), $this->getParam('database', 'user'), $this->getParam('database', 'pass'));

		if (!$this->connexion) {
			if ((!$this->adminMail) or !isset($this->adminMail)) {
				$this->adminMail = $_SERVER['SERVER_NAME'];
			}

			$error_msg = 'Connexion &eacute;chou&eacute;e, veuillez contacter l\'admin &agrave; l\'adresse suivante :
			<a href="mailto:'.$this->adminMail.'">'.$this->adminMail.'</a>';

			return $error_msg;
			exit;
		} else {
			$this->database = mysql_select_db($this->getParam('database', 'data'), $this->connexion);

			if (!$this->database) {
				$error_msg = 'Database inexistante !';

				return $error_msg;
				exit;
			}
		}

		return $this->connexion;
	}




	/** *****************************************************************************************************************************
	 * Methode create_field
	 *
	 * @desc   Cette methode permet de creer une ligne de tableau contenant un champ de
	 *         formulaire. Il est possible de definir les alignement dans les cellules de
	 *         la table. Deux types de champs peuvent etre crees :
	 *          - input
	 *          - textarea
	 *         Pour ces deux types de champs, tous les attributs sont definisables.
	 * @param  string $label      Texte place devant le champ
	 * @param  array  $param      Alignement des infos dans les cellules du tableau
	 * @param  string $type_field Type de champ
	 * @param  string $type       Type de donnees
	 * @param  string $name       Nom du champ
	 * @param  int    $size       Taille du champ
	 * @param  int    $maxlength  Taille maximale autorisee dans le champ
	 * @param  string $value      Valeur par defaut
	 * @param  int    $cols       Nombre de colonnes si $type_field = textarea
	 * @param  int    $rows       Nombre de lignes si $type_field = textarea
	 * @param  string $info       Text affiche a droite du champ, est vide par defaut
	 * @param  int    $colspan2   Nombre de colonnes a fusionner
	 * @return string Retourne une ligne de tableau avec un champ de formulaire
	 * @access public
	 */
	public function create_field($label, $param = array('R', 'T', 'L', 'T', '', ''), $type_field = 'input', $type = 'text', $name, $size = 0, $maxlength = 0, $value = '', $cols = 0, $rows = 0, $info = '', $colspan2 = 1)
	{
		$id = $param[4];

		if ($param[5]) {
			$class = ' class="'.$param[5].'"';
		} else {
			$class = '';
		}

		switch ($type_field) {
		case 'input':
			$field = '<input type="'.$type.'" name="'.$name.'" size="'.$size.'" maxlength="'.$maxlength.'" value="'.$value.'" id="'.$id.'"'.$class.'>';
			break;

		case 'textarea':
			$field = '<textarea name="'.$name.'" rows="'.$rows.'" cols="'.$cols.'" id="'.$id.'"'.$class.'>'.$value.'</textarea>';
			break;
		}

		$al = array('L'=>'left','C'=>'center','R'=>'right','T'=>'top','M'=>'middle','B'=>'bottom');
		$field = '<tr bgcolor="#FFFFFF">
		<td align="'.$al[$param[0]].'" valign="'.$al[$param[1]].'">'.$label.'</td>
		<td align="'.$al[$param[2]].'" valign="'.$al[$param[3]].'" colspan="'.$colspan2.'">'.$field.'&nbsp;'.$info.'</td>
		</tr>';

		return $field;
	}




	/** *****************************************************************************************************************************
	 * Methode debug
	 *
	 * @desc   Cette methode affiche les datas donn�es en param�tre
	 * @param  string $string Donn�es � afficher
	 * @param  string $title  Titre affich� en haut du cadre
	 * @param  bool   $affich Si = true on affiche les donn�es
	 * @param  bool   $array  Si = true c'est un tableau sinon du texte normal
	 * @access public
	 */
	public function debug($string, $title = '', $affich = true, $array = true)
	{
		if ($affich == true) {
			echo '<pre class="debug"><b style="color: green;">'.$title.'</b><br /><br />';

			/*if ($array == true) {
				print_r($string);
			} else {
				echo $string;
			}*/

			var_dump($string);

			echo '</pre>';
		}
	}




	/** *****************************************************************************************************************************
	 * Methode debug_sql
	 *
	 * @desc   Cette methode affiche la requ�te SQL
	 * @param  string $SQL_name_query Nom de la requ�te SQL
	 * @param  string $SQL_query      Contient la requ�te SQL
	 * @param  bool   $return_sql     Si false pas d'affichage de la requ�te, sion oui
	 * @return string Retourne la requ�te SQL coloris�e
	 * @access public
	 */
	public function debug_sql($SQL_name_query = 'sql', $SQL_query, $return_sql = true)
	{
		if ($return_sql == true) {
			$SQL_words = array('AND','ASC','PASSWORD','AS','BETWEEN','BY','COUNT','DELETE','DESC',
							   'DISTINCT','FROM','GROUP','INSERT','INTO','LIKE','LIMIT','ORDER',
							   'OR','SELECT','SET','UPDATE','VALUES','WHERE','(',')');

			$SQL_replace_words = array('<font color="#66CCFF">'."\r".'AND</font>',
									   '<font color="#66CCFF">ASC</font>',
									   '<font color="#66CCFF">PASSWORD</font>',
									   '<font color="#66CCFF">AS</font>',
									   '<font color="#66CCFF">BETWEEN</font>',
									   '<font color="#66CCFF">BY</font>',
									   '<font color="#66CCFF">COUNT</font>',
									   '<font color="#66CCFF">DELETE</font>',
									   '<font color="#66CCFF">DESC</font>',
									   '<font color="#66CCFF">DISTINCT</font>',
									   '<font color="#66CCFF">'."\r".'FROM</font>',
									   '<font color="#66CCFF">'."\r".'GROUP</font>',
									   '<font color="#66CCFF">INSERT</font>',
									   '<font color="#66CCFF">INTO</font>',
									   '<font color="#66CCFF">LIKE</font>',
									   '<font color="#66CCFF">'."\r".'LIMIT</font>',
									   '<font color="#66CCFF">ORDER</font>',
									   '<font color="#66CCFF">'."\r".'OR</font>',
									   '<font color="#66CCFF">SELECT</font>',
									   '<font color="#66CCFF">'."\r".'SET</font>',
									   '<font color="#66CCFF">UPDATE</font>',
									   '<font color="#66CCFF">'."\r".'VALUES</font>',
									   '<font color="#66CCFF">'."\r".'WHERE</font>',
									   '<font color="#E3D476">(</font>',
									   '<font color="#E3D476">)</font>');
			$SQL_query = str_replace($SQL_words,$SQL_replace_words,$SQL_query);
			$this->SQL_text = '<font color="blue">'.$SQL_query.';</font>';

			return $this->SQL_text;
		}
	}




	/** *****************************************************************************************************************************
	 * Methode delete_tuple
	 *
	 * @desc   Cette methode permet d'effacer une ligne d'une table.
	 * @param  string $table  Table dans laquelle on efface la ligne
	 * @param  string $where  Champ sur lequel on fait la recherche
	 * @param  string $id     ID de l'enregistrement
	 * @param  string $and    Second champ de condition
	 * @param  string $andVal Valeur pour le second champ de condition
	 * @return bool Retourne vrai si la requete a aboutit sinon faux
	 * @access public
	 */
	public function delete_tuple($table, $where, $id, $and = '', $andVal = '')
	{
		$sql = 'DELETE FROM '.$table.' WHERE '.$where.' = '.$id;

		if ($and) {
			$sql .= ' AND '.$and.' = "'.$andVal.'"';
		}

		if ($this->query($sql) == false) {
			return false;
		} else {
			return true;
		}
	}




	/** *****************************************************************************************************************************
	 * Methode entete
	 *
	 * @desc   Creation de l'entete HTML d'une page.
	 * @param  int    $code_lang Code langue
	 * @param  int    $lang      Langue
	 * @param  int    $charset   Charset de la page
	 * @param  string $title     Titre de la page
	 * @return string Retourne un entete HTML
	 * @access public
	 */
	public function entete($lg = 1, $lang = 1, $charset = 1, $title=  'ADMIN')
	{
		$tab_lg = array('en','fr');
		$tab_lang = array('en-EN','fr-FR');
		$tab_charset = array('iso-8859-15','utf-8');

		$entete = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
		<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="'.$tab_lg[$lg].'" lang="'.$tab_lang[$lang].'">
		<head>
		<meta http-equiv="Content-Type" content="text/html; charset='.$tab_charset[$charset].'" />
		<title>'.$title.'</title>';

		return $entete;
	}




	/** *****************************************************************************************************************************
	 * Methode form_login
	 *
	 * Retourne un formulaire permettant de saisir un login et un mot de passe.
	 * Si $error_msg contient des donnees, elles seront affichees avec le formulaire.
	 *
	 * @param string $action     fichier traitant les donnees apres l'envoi du formulaire
	 * @param string $error_msg  donnees qui seront affichees si donnees en parametre
	 *
	 * @return string  retourne le formulaire HTML
	 */
	function form_login($action = '', $error_msg = '')
	{
		$form = '<h2 class="form_login">Identification</h2>';

		if ($error_msg) {
			$form .= '<h2 class="ErrorMsg">'.$error_msg.'</h2>';
		}

		$form .= '<form action="'.$action.'" method="post" style="margin: 0px">
		<table align="center" cellspacing="1" cellpadding="5" border="0" bgcolor="#AEA696">
		  <tr bgcolor="#FFFFFF">
			<td align="right">Username</td>
			<td><input type="text" name="Username" size="20" maxlength="30"></td>
		  </tr>
		  <tr bgcolor="#FFFFFF">
			<td align="right">Password</td>
			<td><input type="password" name="Password" size="20" maxlength="30"></td>
		  </tr>
		  <tr>
			<td align="center" colspan="2" bgcolor="#E8E5DE"><input type="submit" value="Login"></td>
		  </tr>
		</table>
		</form>';

		return $form;
	}




	/** *****************************************************************************************************************************
	 * Methode insert_sql
	 *
	 * Execute une requete SQL. Les donnees transmisent seront inserees dans la table dont
	 * le nom est donne en premier parametre. Le deuxieme parametre doit etre un tableau a
	 * deux dimensions, ex :
	 * $champ = array('Champ1'=>'Valeur 1',
	 *                'Champ2'=>'Valeur 2');
	 * Le troisieme parametre est le type d'encryption que l'on souhaite utiliser pour, par
	 * exemple l'encryption d'un mot de passe. Par defaut on utilise PASSWORD mais les choix
	 * suivant sont aussi possibles : PASSWORD - OLD_PASSWORD - MD5 - SHA1 - ENCRYP
	 *
	 * @param string $table      table dans laquelle les donnees seront inserees
	 * @param array  $champ      donnees a inserer sous forme de tableau bi-dimensionel
	 * @param string $type_pass  type d'encryption
	 *
	 * @return int  retourne l'identifiant de l'enregistrement ajoute
	 */
	function insert_sql($table, $champ, $type_ident = 'SHA1')
	{
		while (list($key, $val) = each($champ)) {
			if ($key == 'Password') {
				$val2 = $val;
				$val = 'password';
			}

			$fieldlist .= $key.', ';

			switch (strtolower($val)) {
			case 'password':
				$val = $type_ident.'("'.$val2.'")';
				break;

			case 'null':
				break;

			case '$set$':
				$f = 'field_'.$key;
				$val = "'".($$f ? implode(',', $$f) : '')."'";
				break;

			default:
				if (is_string($val)) {
					$val = addslashes($val);
				}

				$val = '\''.$val.'\'';
				break;
			}

			if (empty($funcs[$key])) {
				$valuelist .= $val.', ';
			} else {
				$valuelist .= $funcs[$key]($val).', ';
			}
		}

		$fieldlist = ereg_replace(', $', '', $fieldlist);
		$valuelist = ereg_replace(', $', '', $valuelist);
		$sql = 'INSERT INTO '.$table.' ('.$fieldlist.') VALUES ('.$valuelist.')';


		if ($this->query($sql) == true) {
			return mysql_insert_id();
		} else {
			return false;
		}
	}




	/** *****************************************************************************************************************************
	 * Methode isSiren
	 *
	 * @desc   Validation du num�ros d'identification des entreprises (SIREN)
	 * @param  int $siren Numero a verrifier
	 * @access public
	 * @return bool
	 */
	function isSiren($siren)
	{
		$siren = str_replace(' ', '', $siren);

		if (strlen($siren) != 9 || !is_numeric($siren)) {
			return false;
		}

		$total = 0;

		for ($i = 0; $i < 9; $i++) {
			$temp = substr($siren, $i, 1);

			if ($i % 2 == 1) {
				$temp *= 2;

				if ($temp > 9) {
					$temp -= 9;
				}
			}

			$total += $temp;
		}

		return (($total % 10) == 0);
	}




	/** *****************************************************************************************************************************
	 * Methode isSiret
	 *
	 * @desc   Validation du num�ros d'identification des �tablissements(SIRET)
	 * @param  int $siret Numero a verrifier
	 * @access public
	 * @return bool
	 */
	function isSiret($siret)
	{
		$siret = str_replace (' ', '', $siret);

		if (strlen($siret) != 14 || !is_numeric($siret)) {
			return false;
		}

		$siren = substr($siret, 0, 9);

		if (!$this->isSiren($siren)) {
			return false;
		} else {
			return true;
		}
	}




	/** *****************************************************************************************************************************
	 * Methode identification
	 *
	 * Verrifie la validitee d'un identifiant et d'un mot de passe donnes en paramatres
	 * Le premier parametre contient l'identifiant, le second le mot de passe, le troisieme
	 * est le type d'encryption que l'on souhaite utiliser pour, par exemple l'encryption
	 * d'un mot de passe. Par defaut on utilise PASSWORD mais les choix suivant sont aussi
	 * possibles : PASSWORD - OLD_PASSWORD - MD5 - SHA1 - ENCRYP
	 * Le quatrieme parametre doit contenir le nom de la table ou les identifiants et les
	 * mots de passes sont stockes.
	 *
	 * @param string $username   identifiant
	 * @param string $password   mot de passe
	 * @param string $type_pass  type d'encryption du mot de passe
	 * @param string $table      table contenant les identifiants
	 *
	 * @return int ou bool  retourne l'identifiant de l'user ou faux si il ne se trouve pas
	 *                      dans la table
	 */
	function identification($username, $password, $type_pass = 'SHA1', $table = 'User')
	{
		$sql = 'SELECT ID_User, Mail, Status
				FROM '.$table.'
				WHERE Username = "'.$username.'"
				AND Password = '.$type_pass.'("'.$password.'")'; // AND Status  "3"
		$query = $this->query($sql);
		echo $this->affich_sql();
		$result = @mysql_fetch_array($query);

		if (!$result || $result == 0) {
			return false;
		} else {
			return $result;
		}
	}




	/** *****************************************************************************************************************************
	 * Methode adminShopIdent
	 *
	 * @desc   Verrifie la validitee d'un identifiant et d'un mot de passe donne en paramatres
	 * @param  string $username Identifiant
	 * @param  string $password Mot de passe
	 * @return int ou bool Retourne l'identifiant de l'user ou faux si il ne se trouve pas dans la table
	 */
	public function adminShopIdent($username, $password)
	{
		$sql = 'SELECT ID_ShopAdmin, Status FROM ShopAdmin WHERE Username = "'.$username.'" AND Password = SHA1("'.$password.'")';
		$query = $this->query($sql);
		$result = mysql_fetch_array($query);

		if (!$result || $result == 0) {
			return false;
		} else {
			return $result;
		}
	}




	/** *****************************************************************************************************************************
	 * Methode liste_select
	 *
	 * Genere et retourne une liste deroulante
	 *
	 * @param string $name      nom du champ <select>
	 * @param string $field     liste des champs donnes sous forme de tableau array()
	 * @param string $table     nom de la table dans laquelle prendre les donnees
	 * @param string $order     ordre d'affichage des donnees
	 * @param string $compar    valeur compar�e avec le premier champ de la requ�te SQL
	 * @param bool   $new_line  si = true -> nouvelle(s) ligne(s) ajoutee(s) sinon rien
	 * @param array  $value     tableau contenant le libelle et la valeur affiches dans la ou les lignes
	 * @param string $new_sql   si besoin d'envoyer une autre requete SQL
	 * @param bool   $select    si true = on genere le tag <select>
	 * @param string $separ1    caractere de separation affiche dans la liste entre le champ 1 et 2
	 * @param string $separ2    caractere de separation affiche dans la liste entre le champ 2 et 3
	 *
	 * @return string  retourne une liste deroulante
	 */
	public function liste_select($name, $field, $table, $order, $compar, $new_line = false, $line = array(), $new_sql = '', $select = true, $separ1 = '', $separ2 = '')
	{
		if ($select == true) {
			$list = '<select name="'.$name.'" size="1" id="'.$name.'">';
		} else {
			$list = '';
		}

		// ligne supplementaire affichee seulement si la variable $option contient quelque chose
		if ($new_line == true) {
			while (list($option, $value) = each($line)) {
				$list .= '<option value="'.$value.'">'.$option.'</option>'."\r\n";
			}
		}

		// generation de la liste de champ pour la requete
		for ($a = 0; $a < count($field); $a++) {
			$listField .= $field[$a].', ';
		}

		$listField = substr($listField, 0, -2);

		// generation des lignes suivantes
		if (!$new_sql) {
			$sql = 'SELECT '.$listField.' FROM '.$table.' ORDER BY '.$order.' ASC';
		} else {
			$sql = $new_sql;
		}

		$query = $this->query($sql);
		while ($result = @mysql_fetch_array($query)) {
			$list .= '<option value="'.$result[$field[0]].'"';
			if ($result[$field[0]] == $compar) {
				$list .= ' selected="selected">'.$result[$field[1]].' '.$separ1.' '.$result[$field[2]].' '.$separ2.' '.$result[$field[3]];
			} else {
				$list .= '>'.$result[$field[1]].' '.$separ1.' '.$result[$field[2]].' '.$separ2.' '.$result[$field[3]];
			}
			$list .= '</option>'."\r\n";
		}

		$list .= '</select>';

		return $list;
	}




	/** *****************************************************************************************************************************
	 * Methode menu_droite
	 *
	 * Genere un menu selon ce qui est donne en parametre, c'est a dire un tableau a deux
	 * dimensions contenant en premier index le lien vers lequel pointera l'element du menu
	 * et en valeur le texte affiche pour le lien.
	 *
	 * @param array $menu   structure du menu sous forme de tableau a deux dimensions
	 *
	 * @return string  retourne un tableau HTML contenant le menu
	 */
	// public function menu_droite($menu)
	// {
		// $menu_tbl = '<table style="margin: 3px;" border="0" cellpadding="0" cellspacing="2" width="150">'."\r".'<tbody>'."\r";

		// foreach ($menu as $key => $val) {
			// if (substr($key,0,3) == 'CAT') {
				// $menu_tbl .= '<tr>
				// <td colspan="2" nowrap="nowrap" align="left"><strong style="color: rgb(108, 100, 84);">'.$val.'</strong></td>
				// </tr>'."\r";
			// } else {
				// $menu_tbl .= '<tr>
				// <td width="13" nowrap="nowrap" align="left"><img src="./images/li.gif" alt="" border="0" height="13" width="11" /></td>
				// <td align="left"><a href="'.$key.'">'.$val.'</a><br></td>
				// </tr>'."\r";
			// }
		// }

		// $menu_tbl .= '</tbody>'."\r".'</table>'."\r";

		// return $menu_tbl;
	// }




	/** *****************************************************************************************************************************
	 * Methode pied_page
	 *
	 * Genere le contenu HTML en pied de page
	 *
	 * @return string  retourne le contenu du pied de page
	 */
	public function pied_page()
	{
		//$sitename   = $this->sitedomaine.'.'.$this->sitenametld;
		//$mail       = strtolower($this->mailuser.'@'.$sitename);
		$pied_page  = '<table border="0" cellpadding="0" cellspacing="0" width="100%">
		<tbody><tr><td bgcolor="#6c6454" height="1"></td></tr></tbody>
		</table>
		<!--<p class="copyright"><a href="mailto:'.$mail.'">'.$mail.'</a></p>-->
		</body>
		</html>';

		return $pied_page;
	}




	/** *****************************************************************************************************************************
	 * Methode last_id
	 *
	 * Retourne la valeur de l'auto increment de la derniere
	 * requete SQL traitee
	 *
	 * @return int  retourne l'auto increment de la requete SQL
	 */
	public function last_id()
	{
		$id = mysql_insert_id($this->connect());

		return $id;
	}




	/** *****************************************************************************************************************************
	 * Methode query
	 *
	 * Execute la requete SQL donnee en parametre et retourne son identifiant
	 * Si $this->sql_trace vaut true, toutes les requetes SQL seront loguees
	 * dans le fichier donne en parametre dans $this->sql_trace_file
	 *
	 * @param int $this->query  identifiant de la requete SQL
	 *
	 * @return int  retourne l'identifiant de la requete SQL
	 */
	public function query($sql)
	{
		$this->sql = $sql;
		$this->query = mysql_query($this->sql, $this->connect());

		if ($this->sql_trace == true) {
			$this->mysql_trace($this->sql);
		}

		return $this->query;
	}




	/** *****************************************************************************************************************************
	 * Methode mysql_trace
	 *
	 * @desc   Permet de loguer toutes les requetes SQL dans un fichier de log
	 * @param  string $sql       Requete SQL a loguer
	 * @param  string $$log_file Fichier de log
	 * @return bool  retourne vrai ou faux en cas d'echec a l'ouverture du fichier
     * @access public
	 */
	 public function mysql_trace($sql, $log_file = '/tmp/query.sql')
	 {
		 $fp = @fopen($log_file, 'a+');

         if ($fp != false) {
             $search  = array(CHR(9), '    ');
             $replace = array('', '');
             $query   = str_replace($search, $replace, $sql);

		     @fwrite($fp, '  --  ['.date('Y-m-d H:i:s').'] :'."\n".trim($query).';');
		     @fwrite($fp, CHR(10));
		     @fwrite($fp, '-----------------------------------------------------------------------------------------------------------------------------');
		     @fwrite($fp, CHR(10));
    		 @fclose($fp);

		     return true;
         } else {
             return false;
         }
	 }




	/** *****************************************************************************************************************************
	 * Methode update_sql
	 *
	 * Execute une requete SQL en update sur la table donnee en premier parametre. Le second
	 * parametre contient les donnees sous forme de tableau a deux dimensions. En troisieme
	 * parametre vient l'ID de l'enregistrement a modifier et en dernier parametre le type
	 * d'encryption utilisee si besoin est. Par defaut on utilise PASSWORD. Les choix possibles
	 * sont : PASSWORD - OLD_PASSWORD - MD5 - SHA1 - ENCRYP
	 *
	 * @param string $table      table ou se trouve les donnees a modifier
	 * @param array  $champ      liste des champs et leur valeurs sous forme de tableau bi-dimensionel
	 * @param string $where      identifiant de l'enregistrement a modifier
	 * @param string $type_pass  type d'encryption
	 *
	 * @return bool  retourne vrai
	 */
	function update_sql($table, $champ, $where, $type_pass = 'SHA1')
	{
		while(list($key, $val) = each($champ)) {
			if ($key == 'Password') {
				if ($val) {
					$val2 = $val;
					$val3 = 'Password = '.$type_pass.'("'.$val2.'"), ';
				}
			}

			if (is_string($val)) {
				$val = addslashes($val);
			}

			$list_values .= $key.' = "'.$val.'", ';
		}

		$list_values = substr($list_values.$val3,0,-2);
		$sql = 'UPDATE '.$table.' SET '.$list_values.' WHERE ID_'.$table.' = '.$where;
		$this->query($sql);
		echo $this->affich_sql();

		return true;
	}




	/** *****************************************************************************************************************************
	 * Methode myutf8_encode
	 *
	 * Convertit les caracteres accentues en utf-8
	 *
	 * @param string $str caractere a retourner encode
	 *
	 * @return string  retourne le caractere en utf-8
	 */
	function myutf8_encode($str)
	{
		$cp1252_map = array(
		"\xc2\x80" => "\xe2\x82\xac", /* EURO SIGN */
		"\xc2\x82" => "\xe2\x80\x9a", /* SINGLE LOW-9 QUOTATION MARK */
		"\xc2\x83" => "\xc6\x92",     /* LATIN SMALL LETTER F WITH HOOK */
		"\xc2\x84" => "\xe2\x80\x9e", /* DOUBLE LOW-9 QUOTATION MARK */
		"\xc2\x85" => "\xe2\x80\xa6", /* HORIZONTAL ELLIPSIS */
		"\xc2\x86" => "\xe2\x80\xa0", /* DAGGER */
		"\xc2\x87" => "\xe2\x80\xa1", /* DOUBLE DAGGER */
		"\xc2\x88" => "\xcb\x86",     /* MODIFIER LETTER CIRCUMFLEX ACCENT */
		"\xc2\x89" => "\xe2\x80\xb0", /* PER MILLE SIGN */
		"\xc2\x8a" => "\xc5\xa0",     /* LATIN CAPITAL LETTER S WITH CARON */
		"\xc2\x8b" => "\xe2\x80\xb9", /* SINGLE LEFT-POINTING ANGLE QUOTATION */
		"\xc2\x8c" => "\xc5\x92",     /* LATIN CAPITAL LIGATURE OE */
		"\xc2\x8e" => "\xc5\xbd",     /* LATIN CAPITAL LETTER Z WITH CARON */
		"\xc2\x91" => "\xe2\x80\x98", /* LEFT SINGLE QUOTATION MARK */
		"\xc2\x92" => "\xe2\x80\x99", /* RIGHT SINGLE QUOTATION MARK */
		"\xc2\x93" => "\xe2\x80\x9c", /* LEFT DOUBLE QUOTATION MARK */
		"\xc2\x94" => "\xe2\x80\x9d", /* RIGHT DOUBLE QUOTATION MARK */
		"\xc2\x95" => "\xe2\x80\xa2", /* BULLET */
		"\xc2\x96" => "\xe2\x80\x93", /* EN DASH */
		"\xc2\x97" => "\xe2\x80\x94", /* EM DASH */
		"\xc2\x98" => "\xcb\x9c",     /* SMALL TILDE */
		"\xc2\x99" => "\xe2\x84\xa2", /* TRADE MARK SIGN */
		"\xc2\x9a" => "\xc5\xa1",     /* LATIN SMALL LETTER S WITH CARON */
		"\xc2\x9b" => "\xe2\x80\xba", /* SINGLE RIGHT-POINTING ANGLE QUOTATION*/
		"\xc2\x9c" => "\xc5\x93",     /* LATIN SMALL LIGATURE OE */
		"\xc2\x9e" => "\xc5\xbe",     /* LATIN SMALL LETTER Z WITH CARON */
		"\xc2\x9f" => "\xc5\xb8");    /* LATIN CAPITAL LETTER Y WITH DIAERESIS*/

		return strtr(utf8_encode($str), $cp1252_map);
	}




	/** *****************************************************************************************************************************
	 * Methode myutf8_decode
	 *
	 * Convertit les caracteres utf-8 en caracteres lisibles
	 *
	 * @param string $str caractere a retourner decode
	 *
	 * @return string  retourne le caractere normal
	 */
	function myutf8_decode($str)
	{
		$cp1252_map = array(
		"\xe2\x82\xac" => "\xc2\x80", /* EURO SIGN */
		"\xe2\x80\x9a" => "\xc2\x82", /* SINGLE LOW-9 QUOTATION MARK */
		"\xc6\x92" => "\xc2\x83",     /* LATIN SMALL LETTER F WITH HOOK */
		"\xe2\x80\x9e" => "\xc2\x84", /* DOUBLE LOW-9 QUOTATION MARK */
		"\xe2\x80\xa6" => "\xc2\x85", /* HORIZONTAL ELLIPSIS */
		"\xe2\x80\xa0" => "\xc2\x86", /* DAGGER */
		"\xe2\x80\xa1" => "\xc2\x87", /* DOUBLE DAGGER */
		"\xcb\x86" => "\xc2\x88",     /* MODIFIER LETTER CIRCUMFLEX ACCENT */
		"\xe2\x80\xb0" => "\xc2\x89", /* PER MILLE SIGN */
		"\xc5\xa0" => "\xc2\x8a",     /* LATIN CAPITAL LETTER S WITH CARON */
		"\xe2\x80\xb9" => "\xc2\x8b", /* SINGLE LEFT-POINTING ANGLE QUOTATION */
		"\xc5\x92" => "\xc2\x8c",     /* LATIN CAPITAL LIGATURE OE */
		"\xc5\xbd" => "\xc2\x8e",     /* LATIN CAPITAL LETTER Z WITH CARON */
		"\xe2\x80\x98" => "\xc2\x91", /* LEFT SINGLE QUOTATION MARK */
		"\xe2\x80\x99" => "\xc2\x92", /* RIGHT SINGLE QUOTATION MARK */
		"\xe2\x80\x9c" => "\xc2\x93", /* LEFT DOUBLE QUOTATION MARK */
		"\xe2\x80\x9d" => "\xc2\x94", /* RIGHT DOUBLE QUOTATION MARK */
		"\xe2\x80\xa2" => "\xc2\x95", /* BULLET */
		"\xe2\x80\x93" => "\xc2\x96", /* EN DASH */
		"\xe2\x80\x94" => "\xc2\x97", /* EM DASH */
		"\xcb\x9c" => "\xc2\x98",     /* SMALL TILDE */
		"\xe2\x84\xa2" => "\xc2\x99", /* TRADE MARK SIGN */
		"\xc5\xa1" => "\xc2\x9a",     /* LATIN SMALL LETTER S WITH CARON */
		"\xe2\x80\xba" => "\xc2\x9b", /* SINGLE RIGHT-POINTING ANGLE QUOTATION*/
		"\xc5\x93" =>"\xc2\x9c",      /* LATIN SMALL LIGATURE OE */
		"\xc5\xbe" => "\xc2\x9e",     /* LATIN SMALL LETTER Z WITH CARON */
		"\xc5\xb8" => "\xc2\x9f");    /* LATIN CAPITAL LETTER Y WITH DIAERESIS*/

		return strtr(utf8_decode($str), $cp1252_map);
	}




	/** *****************************************************************************************************************************
	 * Methode password_generator
	 *
	 * Genere une chaine de caractere aleatoire
	 *
	 * @param string $long  longueur de la chaine
	 * @param string $car   caracteres servants a composer la chaine
	 *
	 * @return string  retourne une chaine de caractere aleatoire
	 */
	function password_generator($long = 8, $car = '0123456789abcdefghijklmnopqrstuvwxyz')
	{
		mt_srand((double)microtime() * 1000000);
		$chaine = '';

		if($long > 0) {
			while(strlen($chaine) < $long) {
				$chaine.= $car[mt_rand(0, strlen($car)-1)];
			}
		}

		return $chaine;
	}




	/** *****************************************************************************************************************************
	 * Methode randImage
	 *
	 * @desc   Creation d'une image avec un chiffre genere aleatoirement
	 * @return string
	 * @access public
	 */
	public function randImage()
	{
		$this->randImageNumber = rand(1000, 9999);
		$_SESSION['randImageNumber'] = $this->randImageNumber;
		$pic = ImageCreate(40, 18);
		$col1 = ImageColorAllocate($pic, 255, 255, 255);
		$text_color = imagecolorallocate($pic, 0, 0, 0);
		imagestring($pic, 4, 3, 1,  $this->randImageNumber, $text_color);
		ImagePNG($pic,'./images/randImage.png');
		ImageDestroy($pic);
	}




	/** *****************************************************************************************************************************
	 * Methode randValue
	 *
	 * Retourne une valeur aleatoire
	 */
	function randValue($min = null, $max = null)
	{
		static $seeded;

		if (!$seeded) {
			mt_srand((double)microtime()*1000000);
			$seeded = true;
		}

		if (isset($min) && isset($max)) {
			if ($min >= $max) {
				return $min;
			} else {
				return mt_rand($min, $max);
			}
		} else {
			return mt_rand();
		}
	}




	/** *****************************************************************************************************************************
	 * Methode remplace_car_accentue
	 */
	function remplace_car($chaine)
	{
		$car = array("�" => "Y", "�" => "u", "�" => "A", "�" => "A", "�" => "A", "�" => "A", "�" => "A", "�" => "A",
					 "�" => "A", "�" => "C", "�" => "E", "�" => "E", "�" => "E", "�" => "E", "�" => "I", "�" => "I",
					 "�" => "I", "�" => "I", "�" => "D", "�" => "N", "�" => "O", "�" => "O", "�" => "O", "�" => "O",
					 "�" => "O", "�" => "O", "�" => "U", "�" => "U", "�" => "U", "�" => "U", "�" => "Y", "�" => "s",
					 "�" => "a", "�" => "a", "�" => "a", "�" => "a", "�" => "a", "�" => "a", "�" => "a", "�" => "c",
					 "�" => "e", "�" => "e", "�" => "e", "�" => "e", "�" => "i", "�" => "i", "�" => "i", "�" => "i",
					 "�" => "o", "�" => "n", "�" => "o", "�" => "o", "�" => "o", "�" => "o", "�" => "o", "�" => "o",
					 "�" => "u", "�" => "u", "�" => "u", "�" => "u", "�" => "y", "�" => "y", "(" => "", ")" => "",
					 "&" => "and", " " => "", "'" => "", "\\" => "", "/" => "-", "á" => "a", "ý" => "a", "ð" => "a",
					 "." => "", "," => "", "[" => "", "]" => "", "{" => "", "}" => "", "?" => "", "*" => "", ":" => "",
					 "!" => "", "@" => "a", "%" => "", "#" => "");
		$chaine = strtr($chaine, $car);
		return $chaine;
	}




	/** *****************************************************************************************************************************
	 * Methode change_casse
	 */
	function change_casse($chaine, $parametre1 = '', $parametre2 = '', $parametre3 = '', $parametre4 = '')
	{
		switch($parametre1) {
		case 'UFS': $chaine1 = ucfirst(strtolower($chaine));
			break;

		case 'SU':  $chaine1 = strtoupper($chaine);
			break;

		case 'UWS': $chaine1 = ucwords(strtolower($chaine));
			break;

		case 'SL':  $chaine1 = strtolower($chaine);
			break;
		}

		if ($parametre2 == 'RC') {
			$chaine2 = $this->remplace_car($chaine1);
		} else {
			$chaine2 = $chaine1;
		}

		if ($parametre3 == 'RT') {
			$chaine3 = rtrim($chaine2);
		} else {
			$chaine3 = $chaine2;
		}

		switch($parametre4) {
		case 'UE': $chaine4 = urlencode($chaine3);
			break;

		case 'UD': $chaine4 = urldecode($chaine3);
			break;

		default:   $chaine4 = $chaine3;
			break;
		}

		return $chaine4;
	}




	/** *****************************************************************************************************************************
	 * Methode Log
	 *
	 * @desc   Enregistrement des actions
	 * @param  array  $data  Donnees a enregistrer
     * @param  string $file  Fichier appele
     * @param  int    $level Niveau de log
	 *                        0 -> debugage
	 *                        1 -> normal
	 * @return bool   true
	 * @access public
	 */
	public function log($file = '', $data = array(), $level = 0)
	{
		if ($this->log == true) {
            foreach ($data as $k => $v) {
                if (is_array($v)) {
                    foreach ($v as $x => $y) {
                        $d .= $x.'='.$y.'|';
                    }
                } else {
                    $d .= $k.'='.$v.'|';
                }
            }

			$sql = 'INSERT INTO Log (Data, IPAddress, Level, Seconde, File)
					VALUES ("'.substr($d, 0, -1).'",
                            "'.$_SERVER['REMOTE_ADDR'].'",
                            '.$level.', "'.substr(microtime(), 0, 10).'",
                            "'.substr($file, strripos($file, '/') + 1).'")';

			if ($level >= $this->getParam('param', 'log_level'))  {
				$this->query($sql);
			}

			return true;
		}
	}




	/** *****************************************************************************************************************************
	 * Methode viewImage
	 *
	 * Affiche une image si le parametre $action vaut view,
	 * sinon si il vaut help on affiche la signifocation des images
	 *
	 * @param string $action     view = affichage de l'image, help = affichage de l'aide
	 * @param int    $imgNumber  Index de l'image a afficher
	 *
	 * return string
	 */
	function viewImage($action = 'view', $imgNumber = 0)
	{
		$arrayImgName  = array('edit2.png', 'del2.png', 'T.png', 'S.png', 'A.png', 'L.png', 'D.png');
		$arrayImgTitle = array('Modifier les donn&eacute;es',
							   'Effacer les donn&eacute;es',
							   'Attente de confirmation du membre',
							   'Attente de cr&eacute;ation du sous-domaine par l\'admin',
							   'Actif',
							   'Bloqu&eacute;/Inactif',
							   'Effac&eacute;');

		if ($action == 'help') {
			$imgHelp = '<div width="100%" style="text-align: left; color: #C0424A;"><h3>Signification des ic&ocirc;nes :</h3><br />';

			for ($cpt1 = 0; $cpt1 < count($arrayImgName); $cpt1++) {
				$imgHelp .= '&nbsp;&nbsp;<img src="./images/'.$arrayImgName[$cpt1].'" alt="'.$arrayImgTitle[$cpt1].'" title="'.$arrayImgTitle[$cpt1].'" />
				<b>::</b>&nbsp;'.$arrayImgTitle[$cpt1].'<br />';
			}

			$imgHelp .= '</div>';

			return $imgHelp;
		}
	}




	/** *****************************************************************************************************************************
	 * Methode arrayUnset
	 *
	 * Supprime du tableau $array la cle $index
	 *
	 * @param array  $array  Tableau a trier
	 * @param string $index  Cle a enlever
	 *
	 * return array
	 */
	function arrayUnset($array, $index)
	{
		foreach ($array as $key => $val) {
			if ($key != $index) {
				$res[$key] = $val;
			}
		}

		return $res;
	}




	/** *****************************************************************************************************************************
	 * Methode getField
	 *
	 * @desc   Retourne la valeur du champ $returnField de la table $table
	 * @param  string $table       Ttable dans laquelle on effectue la requete
	 * @param  string $returnField Champ dont on veut recuperer la valeur
	 * @param  string $searchField Champ sur lequel on effectue la recherche
	 * @param  string $value       Valeur a rechercher
	 * @return string/int
	 * @access public
	 */
	public function getField($table, $returnField, $searchField, $value)
	{
		$sql = 'SELECT '.$returnField.' FROM '.$table.' WHERE '.$searchField.' = "'.$value.'"';
		$query = $this->query($sql);

		if ($query == false) {
			return false;
		} else {
			$result = @mysql_fetch_array($query);
			echo $this->affich_sql();
			return $result[0];
		}
	}




	/** *****************************************************************************************************************************
	 * Methode getMultiFields
	 *
	 * @desc   Retourne la valeur du champ $returnField de la table $table
	 * @param  string $table       Ttable dans laquelle on effectue la requete
	 * @param  string $fieldsList  Liste des champs dont on veut recuperer les valeurs
	 * @param  string $searchField Champ sur lequel on effectue la recherche
	 * @param  string $value       Valeur a rechercher
	 * @return string/int
	 * @access public
	 */
	public function getMultiFields($table, $fieldsList, $searchField, $value)
	{
		$sql = 'SELECT '.$fieldsList.' FROM '.$table.' WHERE '.$searchField.' = "'.$value.'"';
		$query = $this->query($sql);

		if ($query == false) {
			return false;
		} else {
			$result = @mysql_fetch_array($query);
			echo $this->affich_sql();
			return $result;
		}
	}




	/** *****************************************************************************************************************************
	 * Methode rewriteUrl
	 *
	 * @desc   Retourne une URL reecrite
	 * @param  string $file Fichier vers lequel on pointe snas l'extension de celui-ci
	 * @param  string $url  URL a reecrire
	 * @return string
	 * @access public
	 */
	public function rewriteUrl($url)
	{
		if ($this->urlRewriting == true) {
			$file = substr($url, 0, strpos($url, '.'));
			$url = substr($url, strpos($url, '.'));
			$url = rtrim(trim($url));
			$car = array('�' => 'a', '�' => 'a', '�' => 'a', '�' => 'a', '�' => 'a', '�' => 'a', '�' => 'a', '�' => 'c', '�' => 'e',
						 '�' => 'e', '�' => 'e', '�' => 'e', '�' => 'i', '�' => 'i', '�' => 'i', '�' => 'i', '�' => 'o', '�' => 'n',
						 '�' => 'o', '�' => 'o', '�' => 'o', '�' => 'o', '�' => 'o', '�' => 'o', '�' => 'u', '�' => 'u', '�' => 'u',
						 '�' => 'u', '�' => 'y', '�' => 'y', '.php?' => '-', '.php3?' => '-','.php4?' => '-','.php5?' => '-',
						 '&' => '-', '=' => '-', ' ' => '-');
			$url = strtr($url, $car);
			$newUrl = $file.$url.'.html';
		} else {
			$newUrl = $url;
		}

		return $newUrl;
	}




	/** *****************************************************************************************************************************
	 * Methode moisFrancais
	 *
	 * @desc   Retourne le nom du mois en francais
	 * @param  srting $mois Mois sur deux chiffres
	 * @return string
	 * @access public
	 */
	function moisFrancais($mois)
	{
		$moisFr = array('01' => 'janvier',
						'02' => 'f&eacute;vrier',
						'03' => 'mars',
						'04' => 'avril',
						'05' => 'mai',
						'06' => 'juin',
						'07' => 'juillet',
						'08' => 'ao&ucirc;t',
						'09' => 'septembre',
						'10' => 'octobre',
						'11' => 'novembre',
						'12' => 'd&eacute;cembre');

		return $moisFr[$mois];
	}




	/** *****************************************************************************************************************************
	 * Methode makeSelectLoop
	 *
	 * @desc   Methode permettant de creer une liste pour un select
	 * @param  int    $nbLoop        Nombre de tours dans la boucle
	 * @param  string $selectedValue Valeur a selectionner
	 * @return string
	 * @access public
	 */
	public function makeSelectLoop($nbLoop = 10, $selectedValue = '')
	{
		for ($cpt = 1; $cpt < $nbLoop; $cpt++) {
			if ($cpt == $selectedValue) {
				$loop .= '<option value="'.$cpt.'" selected="selected">'.$cpt.'</option>';
			} else {
				$loop .= '<option value="'.$cpt.'">'.$cpt.'</option>';
			}
		}

		return $loop;
	}




	/** *****************************************************************************************************************************
	 * Methode sendMail
	 *
	 * @desc   Methode permettant d'envoyer un mail
	 * @param  string $userType   Type de user auquel on envoi le mail, C -> Customer ou S -> ShopCustomer
	 * @param  int    $id         Identifiant de l'user
	 * @param  int    $mailNumber Numero du mail a envoyer
	 * @access public
	 */
	public function sendMail($userType = 'C', $id, $mailNumber)
	{
		/**
		 * Recuperation des donnees user
		 */
		if ($userType == 'C') {
			$table = 'Customer';
		} else {
			$table = 'ShopCustomer';
		}

		$sql       = 'SELECT FirstName, LastName, Email FROM '.$table.' WHERE ID_'.$table.' = '.$id;
		$query     = $this->query($sql);
		$result    = @mysql_fetch_array($query);
		$firstname = $result['FirstName'];
		$lastname  = $result['LastName'];
		$email_to  = $result['Email'];


		/**
		 * Entete du mail HTML, l'en-tete Content-type doit etre defini
		 */
		$headers  = 'MIME-Version: 1.0'."\r\n";
		$headers .= 'Content-type: text/html; charset=iso-8859-1'."\r\n";
		$headers .= 'From: Admin <'.$this->cgf['mail']['from'].'>'."\r\n";
		$headers .= 'Cc: '.$this->cgf['mail']['fromcc']."\r\n";


		/**
		 * Types de mails dispos
		 */
		switch($mailNumber) {
		case 1:
			$subject = '[CLIENT] - Confirmation de votre inscription sur la boutique';
			$message = 'Confirmation de votre inscription sur la boutique';
			break;

		case 2:
			$subject = '[CLIENT] - Confirmation de l\'enregistrement de votre commande';
			$message = 'Confirmation de l\'enregistrement de votre commande';
			break;

		case 3:
			$subject = '[ADMIN BOUTIQUE] - Nouvelle commande a traiter';
			$message = 'Nouvelle commande a traiter';
			break;
		}

		/**
		 * Envoi du mail
		 */
		mail($email_to, $subject, $message, $headers);
	}




	/** *****************************************************************************************************************************
	 * Methode sendEmail
	 *
	 * @desc   Methode envoyant un mail dont le corps et le sujet sont recuperes dans la table Mail
	 * @param  int    $id   Identifiant du mail
	 * @param  string $to   Adresse distinataire
	 * @param  string $from Adresse expediteur
	 * @param  array  $d    Donnees pour la substitution des tags
	 * @return array
	 * @access public
	 */
	public function sendEmail($id = 1, $to, $from, $d)
	{
		$sql = 'SELECT Subject, Body FROM Mail WHERE ID_Mail = '.$id;
		$query = $this->query($sql);
		$result = mysql_fetch_array($query);

		switch($id) {
		case 3:
			$tags = array('{CIVILITE}', '{NOM}', '{LIEN_BOUTIQUE}', '{IDENTIFIANT}', '{MOT_DE_PASSE}');
			$data = array($d['Gender'], $d['FirstName'], $d['ShopLink'], $d['Login'], $d['Password']);
			break;

		case 6:
			$tags = array('{CIVILITE}', '{NOM}', '{TEXTE}', '{SUJET}');
			$data = array($d['Gender'], $d['FirstName'], $d['Text'], $d['Subject']);
			break;

		case 7:
			$tags = array('{NUMERO_COMMANDE}', '{DATE_CREATION}');
			$data = array($d['BillNumber'], $d['CreationDate']);
			break;

		case 13:
			$tags = array('{IDENTIFIANT}', '{MOT_DE_PASSE}');
			$data = array($d['Login'], $d['Password']);
			break;

		case 14:
			$tags = array('{NOM_BOUTIQUE}', '{SUJET_DEMANDE}', '{CLIENT}', '{EMAIL}', '{TELEPHONE}', '{QUESTION}');
			$data = array($d['nom_boutique'], $d['sujet_demande'], $d['client'], $d['email'], $d['telephone'], $d['question']);
			break;
		}

		$subject = str_replace($tags, $data, $result['Subject']);
		$body    = str_replace($tags, $data, $result['Body']);

		if (mail($to, $this->myutf8_decode($subject), $this->myutf8_decode($body), 'From: '.$from)) {
			return true;
		} else {
			return false;
		}
	}




	/** *****************************************************************************************************************************
	 * Methode barreNav
	 *
	 * @desc   Generation d'une barre de navigation par pages avec fleches
	 * @param  string $table     Table sur laquel on recupere le nombre de tuples
	 * @param  string $fichier   Nom du fichier pour utiliser correctement l'url rewriting
	 * @param  string $criteres  Noms des variables avec leur valeurs a passer aux pages suivantes
	 * @param  int    $debut     Nombre de debut pour la fourchette de tri
	 * @param  int    $nb_page   Nombre de chiffres dans la barre de navigation, par defaut 20
	 * @param  string $css_i     Classe CSS pour la balise "i"
	 * @param  string $where_ext -> si = true le nombre de ligne est donne en parametre
	 *                              $where contiendra le nombre de lignes renvoyees par une requete externe
	 *                           -> si = false la requ�te SQL est interne � la fonction ex: $where = 'champ LIKE "value"'
	 * @param  string $sql       Requete SQL externe a la methode
	 * @param  string $img_path  Chemin vers les images des fleches
	 * @param  string $css_a     Classe CSS pour les balise "a"
	 * @param  bool   $li        Si true on insere la balise <li>
	 * @param  string $css_href  Classe CSS pour les liens chiffre
	 * @return string
	 * @access public
	 */
	public function barreNav($table, $fichier, $criteres, $debut = 0, $nb_page = 20, $css_i = '', $where_ext = false, $sql = '', $img_path = './images', $css_a = '', $li = false, $css_href = '')
	{
		if ($where_ext == false) {
			if ($sql) {
				$query = $this->query($sql);
			} else {
				$query = $this->query('SELECT COUNT(*) FROM '.$table);
			}

			$num_nb = mysql_fetch_array($query);
			$nbtotal = $num_nb[0];
		} else {
			$nbtotal = $sql;
		}

		if ($li == true) {
			$li_b = '<li>';
			$li_e = '</li>';
		} else {
			$li_b = '&nbsp;';
			$li_e = '&nbsp;';
		}

		$i_next  = $this->printImage($img_path, '/arrow_right');
		$i_back  = $this->printImage($img_path, '/arrow_left');
		$i_begin = $this->printImage($img_path, '/arrow_left_end');
		$i_end   = $this->printImage($img_path, '/arrow_right_end');

		$f_next  = '<img src="'.$img_path.$i_next['name'].'" alt="Suivant" />';
		$f_back  = '<img src="'.$img_path.$i_back['name'].'" alt="Pr&eacute;c&eacute;dant" />';
		$f_begin = '<img src="'.$img_path.$i_begin['name'].'" alt="D&eacute;but" />';
		$f_end   = '<img src="'.$img_path.$i_end['name'].'" alt="Fin" />';

		$bar = '';

		if ($nbtotal > $this->nbmax) {
			/**
			 * Retour au debut
			 */
			if ($debut >= $this->nbmax) {
				$bar .= $li_b.'<a'.$css_a.' href="'.$this->rewriteUrl($fichier.'?debut=0'.$criteres).'">'.$f_begin.'</a>'.$li_e;
			}

			/**
			 * Precedent
			 */
			if ($debut >= $this->nbmax) {
				$bar .= $li_b.'<a'.$css_a.' href="'.$this->rewriteUrl($fichier.'?debut='.($debut - $this->nbmax).$criteres).'">'.$f_back.'</a>'.$li_e;
			}

			/**
			 * Affichage des numeros de pages
			 */
			if ($debut >= ($nb_page * $this->nbmax)) {
				$cpt_fin = ($debut / $this->nbmax) + 1;
				$cpt_deb = $cpt_fin - $nb_page + 1;
			} else {
				$cpt_deb = 1;
				$cpt_fin = (int)($nbtotal / $this->nbmax);
				if (($nbtotal % $this->nbmax) != 0) $cpt_fin++;
				if ($cpt_fin > $nb_page) $cpt_fin = $nb_page;
			}

			for ($cpt = $cpt_deb; $cpt <= $cpt_fin; $cpt++) {
				if ($cpt == ($debut / $this->nbmax) + 1) {
					$bar .= $li_b.'<em'.$css_i.'>'.$cpt.'</em>'.$li_e;
				} else {
					$bar .= $li_b.'<span><a'.$css_href.' href="'.$this->rewriteUrl($fichier.'?debut='.(($cpt - 1) * $this->nbmax).$criteres).'">'.$cpt.'</a></span>'.$li_e;
				}
			}

			/**
			 * Suivant
			 */
			if ($debut + $this->nbmax < $nbtotal) {
				$bar .= $li_b.'<a'.$css_a.' href="'.$this->rewriteUrl($fichier.'?debut='.($debut + $this->nbmax).$criteres).'">'.$f_next.'</a>'.$li_e;
			}

			/**
			 * Vers la fin
			 */
			$fin = ($nbtotal - ($nbtotal % $this->nbmax));

			if (($nbtotal % $this->nbmax) == 0) $fin = $fin - $this->nbmax;
			if ($fin != $debut) {
				$bar .= $li_b.'<a'.$css_a.' href="'.$this->rewriteUrl($fichier.'?debut='.$fin.$criteres).'">'.$f_end.'</a>'.$li_e;
			}
		}

		return $bar;
	}




	/** *****************************************************************************************************************************
	 * Methode barre_nav_product
	 *
	 * @desc   Generation d'une barre de navigation par pages avec fleches
	 * @param  string $table     Table sur laquel on recupere le nombre de tuples
	 * @param  string $fichier   Nom du fichier pour utiliser correctement l'url rewriting
	 * @param  string $criteres  Noms des variables avec leur valeurs a passer aux pages suivantes
	 * @param  int    $debut     Nombre de debut pour la fourchette de tri
	 * @param  int    $nb_page   Nombre de chiffres dans la barre de navigation, par defaut 20
	 * @param  string $css_i     Classe CSS pour la balise "i"
	 * @param  string $where_ext -> si = true le nombre de ligne est donne en parametre
	 *                              $where contiendra le nombre de lignes renvoyees par une requete externe
	 *                           -> si = false la requ�te SQL est interne � la fonction ex: $where = 'champ LIKE "value"'
	 * @param  string $sql       Requete SQL externe a la methode
	 * @return string
	 * @access public
	 */
	public function barre_nav_product($table, $fichier, $criteres, $debut = 0, $nb_page = 20, $css_i = '', $where_ext = false, $sql = '')
	{
		if ($where_ext == false) {
			if ($sql) {
				$query = $this->query($sql);
			} else {
				$query = $this->query('SELECT COUNT(*) FROM '.$table);
			}

			$num_nb = mysql_fetch_array($query);
			$nbtotal = $num_nb[0];
		} else {
			$nbtotal = $sql;
		}

		if ($nbtotal > $this->nbmax) {
			/**
			 * Retour au debut
			 */
			if ($debut >= $this->nbmax) {
				$bar .= '<div class="button2-right"><div class="start"><a href="'.$this->rewriteUrl($fichier.'?debut=0'.$criteres).'">Debut</a></div></div>';
			} else {
				$bar .= '<div class="button2-right off"><div class="start"><span>Debut</span></div></div>';
			}

			/**
			 * Precedent
			 */
			if ($debut >= $this->nbmax) {
				$bar .= '<div class="button2-right"><div class="prev"><a href="'.$this->rewriteUrl($fichier.'?debut='.($debut - $this->nbmax).$criteres).'">Prec</a></div></div>';
			} else {
				$bar .= '<div class="button2-right off"><div class="prev"><span>Prec</span></div></div>';
			}

			/**
			 * Affichage des numeros de pages
			 */
			if ($debut >= ($nb_page * $this->nbmax)) {
				$cpt_fin = ($debut / $this->nbmax) + 1;
				$cpt_deb = $cpt_fin - $nb_page + 1;
			} else {
				$cpt_deb = 1;
				$cpt_fin = (int)($nbtotal / $this->nbmax);
				if (($nbtotal % $this->nbmax) != 0) $cpt_fin++;
				if ($cpt_fin > $nb_page) $cpt_fin = $nb_page;
			}

			$bar .= '<div class="button2-left"><div class="page">';

			for ($cpt = $cpt_deb; $cpt <= $cpt_fin; $cpt++) {
				if ($cpt == ($debut / $this->nbmax) + 1) {
					$bar .= '<span>'.$cpt.'</span>';
				} else {
					$bar .= '<a href="'.$this->rewriteUrl($fichier.'?debut='.(($cpt - 1) * $this->nbmax).$criteres).'">'.$cpt.'</a>';
				}
			}

			$bar .= '</div></div>';

			/**
			 * Suivant
			 */
			if ($debut + $this->nbmax < $nbtotal) {
				$bar .= '<div class="button2-left"><div class="next"><a href="'.$this->rewriteUrl($fichier.'?debut='.($debut + $this->nbmax).$criteres).'">Suivant</a></div></div>';
			} else {
				$bar .= '<div class="button2-left off"><div class="next"><span>Suivant</span></div></div>';
			}

			/**
			 * Vers la fin
			 */
			$fin = ($nbtotal - ($nbtotal % $this->nbmax));

			if (($nbtotal % $this->nbmax) == 0) $fin = $fin - $this->nbmax;

			if ($fin != $debut) {
				$bar .= '<div class="button2-left"><div class="end"><a href="'.$this->rewriteUrl($fichier.'?debut='.$fin.$criteres).'">Fin</a></div></div>';
			} else {
				$bar .= '<div class="button2-left off"><div class="end"><span>Fin</span></div></div>';
			}
		}

		return $bar;
	}




	/** *****************************************************************************************************************************
	 * Methode byteConvert
	 *
	 * @desc   Convertion de taille de fichier
	 * @param  int $bytes Taille a convertir
	 * @return string Retourne la taille convertie
	 * @access protected
	 */
	public function byteConvert($bytes)
	{
		if ($bytes <= 0) {
			return '0 Byte';
		}

		$convention = 1000; //[1000->10^x|1024->2^x]
		$s = array('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB');
		$e = floor(log($bytes, $convention));

		return round($bytes / pow($convention, $e), 2).' '.$s[$e];
	}




	/** *****************************************************************************************************************************
	 *
	 * Methode pour les fonctions mysqli
	 *
	 ***************************************************************************************************************************** */




	/** *****************************************************************************************************************************
	 * Methode SQLconnect
	 *
	 * @desc   Initialise la connexion au serveur MySQL et a la base de donnees.
	 * @return int Retourne l'identifiant de connexion MySQL en cas de succes ou false en cas d'echec
	 * @access protected
	 */
	protected function SQLconnect()
	{
		$connect = mysqli_connect($this->getParam('database', 'host'),
								  $this->getParam('database', 'user'),
								  $this->getParam('database', 'pass'),
								  $this->getParam('database', 'data'));

		return $connect;
	}




	/** *****************************************************************************************************************************
	 * Methode SQLquery
	 *
	 * @desc   Execute la requete SQL donnee en parametre et Retourne son identifiant
	 *         Si $this->sql_trace vaut true, toutes les requetes SQL seront loguees
	 *         dans le fichier donne en parametre dans $this->sql_trace_file
	 * @param  string $query Requete SQL a executer
	 * @return int Retourne l'identifiant de la requete SQL
	 * @access public
	 */
	public function SQLquery($query)
	{
		$this->SQLquery = $query;
		$this->resultQuery = mysqli_query($this->SQLconnect(), $this->SQLquery);

		if ($this->sql_trace == true) {
            $this->mysql_trace($this->SQLquery);
		}

		return $this->resultQuery;
	}




	/** *****************************************************************************************************************************
	 * Methode SQLclose
	 *
	 * @desc   Ferme la connexion au serveur MySQL et a la base de donnees.
	 * @access private
	 */
	private function SQLclose()
	{
		mysqli_close($this->SQLconnect());
	}




	/** *****************************************************************************************************************************
	 * Methode writeImage
	 *
	 * @desc   Met en place une image pour un produit donne
	 * @param  array  $image      Image a traiter
	 * @param  string $image_name Nom de l'image
	 * @param  array  $imgSize    Infos de l'image a traiter (Largeur, Hauteur, Destination)
	 * @access public
	 */
	public function writeImage($image, $image_name, $imgSize)
	{
		/**
		 * Recuperation de la largeur de l'image
		 *
		 * Index 0 --> Largeur
		 * Index 1 --> Hauteur
		 * Index 2 de getimagesize() --> 1 = GIF, 2 = JPG, 3 = PNG, 5 = PSD, 6 = BMP, 7 = TIFF
		 */

		for ($i = 0; $i < count($imgSize); $i++) {
			$width  = $imgSize[$i][0];
			$height = $imgSize[$i][1];
			$path   = $imgSize[$i][2];

			$thumbnail = $path.'/'.$image_name;
			$imgInfo = getimagesize($image);

			/**
			 * Si la taille reel de l'image est plus petite que la taille voulue, on evite le redimensionnement
			 */
			if (($imgInfo[0] < $imgSize[3][0]) or ($imgInfo[1] < $imgSize[3][1])) {
				$imgSize[3][0] = $imgInfo[0];
				$imgSize[3][1] = $imgInfo[1];
			}

			if ($imgInfo[2] == 2) {
				/**
				 * Calcul de la taille de l'image
				 */
				@$ratio_orig = $imgInfo[0] / $imgInfo[1];

				if ($width / $height > $ratio_orig) {
					@$width = $height * $ratio_orig;
				} else {
					@$height = $width / $ratio_orig;
				}

				$image_p = @imagecreatetruecolor($width, $height);

				switch($imgInfo[2]) {
				case 1:
					$image2 = @imagecreatefromgif($image);
					@imagecopyresampled($image_p, $image2, 0, 0, 0, 0, $width, $height, $imgInfo[0], $imgInfo[1]);
					@imagegif($image_p, $thumbnail.'.gif', 50);
					break;

				case 2:
					$image2 = @imagecreatefromjpeg($image);
					@imagecopyresampled($image_p, $image2, 0, 0, 0, 0, $width, $height, $imgInfo[0], $imgInfo[1]);
					@imagejpeg($image_p, $thumbnail.'.jpg', 50);
					break;

				case 3:
					$image2 = @imagecreatefrompng($image);
					@imagecopyresampled($image_p, $image2, 0, 0, 0, 0, $width, $height, $imgInfo[0], $imgInfo[1]);
					@imagepng($image_p, $thumbnail.'.png', 50);
					break;

				default:
					$image2 = @imagecreatefromjpeg($image);
					@imagecopyresampled($image_p, $image2, 0, 0, 0, 0, $width, $height, $imgInfo[0], $imgInfo[1]);
					@imagejpeg($image_p, $thumbnail.'.jpg', 50);
				}
			} else {
				return false;
				exit;
			}
		}

		return true;
	}




	/** *****************************************************************************************************************************
	 * Methode printImage
	 *
	 * @desc   Verifie l'existance d'une image et l'affiche
	 * @param  string $path    Chemin ou se trouve l'image
	 * @param  string $name    Nom de l'image
	 * @param  array/bool $img Retourne les infos sur l'image
	 * @access public
	 */
	public function printImage($path, $name)
	{
		if (file_exists($path.$name.'.jpg')) {
			$ext = '.jpg';
		} else if (file_exists($path.$name.'.png')) {
			$ext = '.png';
		} else if (file_exists($path.$name.'.gif')) {
			$ext = '.gif';
		} else {
			return false;
		}

		$infoImg = getimagesize($path.$name.$ext);

		$img['path']   = $path;
		$img['name']   = $name.$ext;
		$img['width']  = $infoImg[0];
		$img['height'] = $infoImg[1];

		return $img;
	}




	/** *****************************************************************************************************************************
	 * Methode countryList
	 *
	 * @desc   Affichage de la liste des pays
	 * @param  int $ID_Country Identifiant du pays affiche dans la liste select
	 * @return string
	 * @access public
	 */
	public function countryList($ID_Country = 75)
	{
		$sql = 'SELECT ID_Country, CountryName FROM Country WHERE Status = "A" ORDER BY CountryName ASC';
		$countryList = $this->liste_select('ID_Country', array('ID_Country', 'CountryName'), 'Country', '', $ID_Country, false, '', $sql, false);

		return $countryList;
	}




	/** *****************************************************************************************************************************
	 * Methode genderList
	 *
	 * @desc   Affichage de la liste des civilites
	 * @param  int $ID_Gender Identifiant de la civilite affichee dans la liste select
	 * @return string
	 * @access public
	 */
	public function genderList($ID_Gender = 1)
	{
		$genderList = $this->liste_select('ID_Gender', array('ID_Gender', 'GenderName'), 'Gender', 'GenderName', $ID_Gender, false);

		return $genderList;
	}




	/** *****************************************************************************************************************************
	 * Methode CalculateTimestampFromCurrDatetime
	 *
	 * @author Abhishek Kumar Srivastava <abhisheksrivastava@fastmail.fm>
	 * @desc   Det timestamp from current date time
	 * @param  string $DateTime
	 * @return string
	 * @access public
	 */
	function CalculateTimestampFromCurrDatetime($DateTime = -1)
	{

		if ($DateTime == -1 || $DateTime == '' || $DateTime == '0000-00-00 00:00:00' || $DateTime == '0000-00-00') {
			$DateTime = date("Y-m-d H:i:s");
		}

		$NewDate['year'] = substr($DateTime,0,4);
		$NewDate['month'] = substr($DateTime,5,2);
		$NewDate['day'] = substr($DateTime,8,2);
		$NewDate['hour'] = substr($DateTime,11,2);
		$NewDate['minute'] = substr($DateTime,14,2);
		$NewDate['second'] = substr($DateTime,17,2);

		return mktime($NewDate['hour'], $NewDate['minute'], $NewDate['second'], $NewDate['month'], $NewDate['day'], $NewDate['year']);
	}




	/** *****************************************************************************************************************************
	 * Methode CalculateDateDifference
	 *
	 * @author Abhishek Kumar Srivastava <abhisheksrivastava@fastmail.fm>
	 * @desc   Calculate date difference
	 * @param  string $TimestampFirst
	 * @param  string $TimestampSecond
	 * @return string
	 * @access public
	 */
	function CalculateDateDifference($TimestampFirst, $TimestampSecond = -1)
	{
		if ($TimestampSecond == -1) {
			$TimestampSecond = $this->CalculateTimestampFromCurrDatetime();
		}

		if ($TimestampSecond < $TimestampFirst) {
			$TempTimestamp = $TimestampFirst;
			$TimestampFirst = $TimestampSecond;
			$TimestampSecond = $TempTimestamp;

			$NegativeDifference = true;
		} else {
			$NegativeDifference = false;
		}

		list($Year1, $Month1, $Day1) = split('-', date('Y-m-d', $TimestampFirst));
		list($Year2, $Month2, $Day2) = split('-', date('Y-m-d', $TimestampSecond));
		$Time1 = (date('H',$TimestampFirst)*3600) + (date('i',$TimestampFirst)*60) + (date('s',$TimestampFirst));
		$Time2 = (date('H',$TimestampSecond)*3600) + (date('i',$TimestampSecond)*60) + (date('s',$TimestampSecond));

		$YearDiff = $Year2 - $Year1;
		$MonthDiff = ($Year2 * 12 + $Month2) - ($Year1 * 12 + $Month1);

		if ($Month1 > $Month2) {
			$YearDiff -= 1;
		} elseif ($Month1 == $Month2) {
			if ($Day1 > $Day2) {
				$YearDiff -= 1;
			} elseif ($Day1 == $Day2) {
				if ($Time1 > $Time2) {
					$YearDiff -= 1;
				}
			}
		}

		// handle over flow of month difference
		if ($Day1 > $Day2) {
			$MonthDiff -= 1;
		} elseif ($Day1 == $Day2) {
			if ($Time1 > $Time2) {
				$MonthDiff -= 1;
			}
		}

		$DateDifference = Array();
		$TotalSeconds = $TimestampSecond - $TimestampFirst;

		$WeekDiff = floor(($TotalSeconds / 604800));
		$DayDiff = floor(($TotalSeconds / 86400));

		if ($NegativeDifference == true) {
			$DateDifference['years'] = ($YearDiff == 0) ? $YearDiff : -($YearDiff);
			$DateDifference['months'] = ($MonthDiff == 0) ? $MonthDiff : -($MonthDiff);
			$DateDifference['weeks'] = ($WeekDiff == 0) ? $WeekDiff : -($WeekDiff);
			$DateDifference['days'] = ($DayDiff == 0) ? $DayDiff : -($DayDiff);
		} else {
			$DateDifference['years'] = $YearDiff;
			$DateDifference['months'] = $MonthDiff;
			$DateDifference['weeks'] = $WeekDiff;
			$DateDifference['days'] = $DayDiff;
		}

		return $DateDifference;
	}




	/** *****************************************************************************************************************************
	 * Methode sous_menu
	 *
	 * @desc   Generation et affichage du sous-menu pour les differentes parties de l'admin
	 * @param  array $n Numero de l'element a retourner
	 * @return srting
	 * @access public
	 */
	public function sous_menu($n)
	{
		$menu = '<div class="menu">';

		for ($i = 0; $i < count($n); $i++) {
            $link = array(1  => array('', '?C1=AD&C2=AD&C3=list',   'Liste des admins',                       'admin.png'),
                          2  => array('', '?C1=AD&C2=AD&C3=insert', 'Cr&eacute;er un admin',                  'add.png'),
                          3  => array('', '?C1=CA&C2=CA&C3=list',   'Liste des cat&eacute;gories',            'categorie.png'),
                          4  => array('', '?C1=CA&C2=CA&C3=insert', 'Cr&eacute;er une cat&eacute;gorie',      'add.png'),
                          5  => array('', '?C1=CA&C2=SC&C3=list',   'Liste des cat&eacute;gories',            'sous_categorie.png'),
                          6  => array('', '?C1=CA&C2=SC&C3=insert', 'Cr&eacute;er une sous-cat&eacute;gorie', 'add.png'),
                          7  => array('', '?C1=CA&C2=AR&C3=list',   'Liste des articles',                     'article.png'),
                          8  => array('', '?C1=CA&C2=AR&C3=insert', 'Cr&eacute;er un article',                'add.png'),
                          9  => array('', '?C1=CO&C2=TA&C3=list',   'Liste des taxes',                        'taxe.png'),
                          10 => array('', '?C1=CO&C2=TA&C3=insert', 'Cr&eacute;er une taxe',                  'add.png'),
                          11 => array('', '?C1=FE&C2=TR&C3=list',   'Liste des transporteurs',                'transporteur.png'),
                          12 => array('', '?C1=FE&C2=TR&C3=insert', 'Cr&eacute;er un transporteur',           'add.png'),
                          13 => array('', '?C1=FE&C2=ZG&C3=list',   'Liste des zones de livraison',           'zone.png'),
                          14 => array('', '?C1=FE&C2=ZG&C3=insert', 'Cr&eacute;er une zone de livraison',     'add.png'),
                          15 => array('', '?C1=FE&C2=FO&C3=list',   'Liste des formules',                     'formule.png'),
                          16 => array('', '?C1=FE&C2=FO&C3=insert', 'Cr&eacute;er une formule',               'add.png'),
                          17 => array('', '?C1=FE&C2=PT&C3=list',   'Liste des tarifications',                'poids.png'),
                          18 => array('', '?C1=FE&C2=PT&C3=insert', 'Cr&eacute;er une tarification',          'add.png'));

            if ($link[$n[$i]][3]) {
                $img = '<img src="./images/'.$link[$n[$i]][3].'" alt="" title="" width="12" height="12" />';
            } else {
                $img = '';
            }

            $menu .= $img.'&nbsp;<a href="'.$link[$n[$i]][0].$link[$n[$i]][1].'">'.$link[$n[$i]][2].'</a>&nbsp;';
		}

		$menu .= '</div>';

		return $menu;
	}



}
?>
