<?php
  
##############################################################################
# generic.inc                                                                #
# Contains generic functions (e.g. database functions, session management)   #
#                                                                            #
# Copyright ViralGames SARL 2000                                             #
##############################################################################

//include_once($BIB_GLOBAL."bib_db.php3");
include_once($BIB."bib_pdo.php3");
include_once($BIB."bib_email_blacklist.php");


function trackSequence($codeSequence,$libelleSequence){
	global $sess;

//--ON CORRIGE LE COOKIE AU CAS OU IL AURAIT 2T2 MODIFIE
	if($_COOKIE["SEQUENCE_INFO"]!="" 
		&& $_COOKIE["SEQUENCE_INFO"]!="A" 
		&& $_COOKIE["SEQUENCE_INFO"]!="B" 
		&& $_COOKIE["SEQUENCE_INFO"]!="C"
		&& $_COOKIE["SEQUENCE_INFO"]!="D"
		&& $_COOKIE["SEQUENCE_INFO"]!="E"
	)
	{
		$_COOKIE["SEQUENCE_INFO"]="A";
		setcookie("SEQUENCE_INFO","A");
	}

//--entrée dans Sequences
	$query = "SELECT * FROM Sequences WHERE Code=:CODE";
	$args = Array(
		":CODE"=>$codeSequence
	);
	$GLOBALS["vg_pdo"]->query($query,$args);
	$res = $GLOBALS["vg_pdo"]->fetch_assoc();
	if(!$res["Id"]){
	//creation
		$query = "INSERT INTO Sequences(Code,Libelle,Count) VALUES (:CODE,:LIB,1)";
		$args = Array(
			":CODE"=>$codeSequence
			,":LIB"=>$libelleSequence
		);
		$GLOBALS["vg_pdo"]->query($query,$args);
		$SequenceId = $GLOBALS["vg_pdo"]->lastInsertId();
	}else{
	//mise à jour
		$SequenceId = $res["Id"];
		$query = "UPDATE Sequences SET Count=(Count+1) WHERE Id=:ID";
		$args = Array(
			":ID"=>$SequenceId
		);
		$GLOBALS["vg_pdo"]->query($query,$args);
	}

//--entrée dans SequencesTracking
	$query = "SELECT * FROM SequencesTracking WHERE SequenceId=:ID AND IP=:IP AND Browser=:BROWSER";
	$args = Array(
		":ID"=>$SequenceId
		,":IP"=>$_SERVER["REMOTE_ADDR"]
		,":BROWSER"=>$_SERVER["HTTP_USER_AGENT"]
	);
	$GLOBALS["vg_pdo"]->query($query,$args);
	$res = $GLOBALS["vg_pdo"]->fetch_assoc();
	if(!$res["Id"]){
	//creation
		$query = "INSERT INTO SequencesTracking(SequenceId,IP,Browser,Count) VALUES (:ID,:IP,:BROWSER,1)";
		$args = Array(
			":ID"=>$SequenceId
			,":IP"=>$_SERVER["REMOTE_ADDR"]
			,":BROWSER"=>$_SERVER["HTTP_USER_AGENT"]
		);
		$GLOBALS["vg_pdo"]->query($query,$args);
	}else{
	//mise à jour
		$query = "UPDATE SequencesTracking SET Count=(Count+1) WHERE Id=:ID";
		$args = Array(
			":ID"=>$res["Id"]
		);
		$GLOBALS["vg_pdo"]->query($query,$args);
	}

//--entrée dans SequencesMembers
	if(!$_COOKIE["SEQUENCE_INFO"] && $sess->memberid <= 0){
		if(mt_rand(1,2)==1){$mode = "A";}else{$mode = "B";}

		setcookie("SEQUENCE_INFO",$mode);
		$_COOKIE["SEQUENCE_INFO"] = $mode;
	}elseif($sess->memberid > 0){
		setcookie("SEQUENCE_INFO","");
		$_COOKIE["SEQUENCE_INFO"] = "";
	}
	$query = "INSERT INTO SequencesMembers(SequenceId,MemberId,SessId,IP,Browser,Info,Date) VALUES (:ID,:MID,:SID,:IP,:BROWSER,:INFO,:DATE)";
	$args = Array(
		":ID"=>$SequenceId
		,":MID"=>$sess->memberid
		,":SID"=>$sess->sessid
		,":INFO"=>$_COOKIE["SEQUENCE_INFO"]
		,":IP"=>$_SERVER["REMOTE_ADDR"]
		,":BROWSER"=>$_SERVER["HTTP_USER_AGENT"]
		,":DATE"=>date("Y-m-d H:i:s")
	);
	$GLOBALS["vg_pdo"]->query($query,$args);
	
	if($sess->memberid > 0){
		$query = "UPDATE SequencesMembers SET MemberId=:MID WHERE SessId=:SID";
		$args = Array(
			":MID"=>$sess->memberid
			,":SID"=>$sess->sessid		
		);
		$GLOBALS["vg_pdo"]->query($query,$args);
	}
}


//gestion de la page suivante via le sequenceur
function gotoSequence($sequence,$playerid=0){

	if(is_numeric($playerid) && $playerid > 0){
		$query = "UPDATE Players SET NextSequence=:SEQUENCE WHERE Id=:PID";
		$args = Array(
			":SEQUENCE"=>$sequence
			,":PID"=>$playerid
		);
		$GLOBALS["vg_pdo"]->query($query,$args);
		
		updateLastTimePlayer($playerid);

		$player = getplayer($playerid);
		return $player;
	}else{
		$_COOKIE["NextSequence"] = $sequence;
		VgSetCookie("NextSequence",$sequence);
		return 0;
	}
	
}



//vérifie à l'inscription si le joueur semble suspect
//retourne une valeur de suspicion
function isSuspect($email,$IP){
	
	global $SUSPECT_MAX_BY_EMAIL, $SUSPECT_MAX_BY_EMAIL_NOTE;
	global $SUSPECT_MAX_BY_IP, $SUSPECT_MAX_BY_IP_NOTE;
	global $GAME_NAME;

	$objet = "Compte suspect sur ".$GAME_NAME;

	//1er critère si l'email de nouvel inscrit est sur le même shéma que d'autre inscrits
	//exemple : sdupuy12@viralgames.fr sera remplacé par sdupuy%@viralgames.fr 
	//Si la personne entre dans ce critère il y a peut de chance qu'il soit innoncent
	//On autorisera tres peu de comptes ayany le même format d'email car il y a très peu de chances que des personnes différentes aient ce meme format
	$email2 = preg_replace('/[0-9]/', '[[:digit:]]*',$email);
	//debug("Email : ".$email);
	$query = "SELECT COUNT(*) AS Total FROM Members WHERE Email REGEXP :EMAIL";
	$args = Array(":EMAIL"=>$email2);
	$GLOBALS["vg_pdo"]->query($query,$args);
	$rowCheck = $GLOBALS["vg_pdo"]->fetch_assoc();
	if($rowCheck["Total"] > $SUSPECT_MAX_BY_EMAIL)
	{
		if($rowCheck["Total"] == ($SUSPECT_MAX_BY_EMAIL+1)){
			$message = "<b>Compte suspect par email sur ".$GAME_NAME." : </b><br>".$email;
			generic_mail("sdupuy@viralgames.fr", $objet, $message);
		}
		
		
		return $SUSPECT_MAX_BY_EMAIL_NOTE;
	}
	else
	{
		//Si il n'entre pas dans le 1er critère, on va vérifier le nombre de personne avec la meme adresse IP. On va être beaucoup plus ouvert sur le nombre de compte car sur un jeu destiné au pro comme ELIOR, un société comme Renault peut avoir plus de 65 comptes innocents avec la même adresse IP
		$query = "SELECT COUNT(*) AS Total FROM Members WHERE IP LIKE :IP";
		$args = Array(":IP"=>$IP);
		$GLOBALS["vg_pdo"]->query($query,$args);
		$rowCheck = $GLOBALS["vg_pdo"]->fetch_assoc();
		if($rowCheck["Total"] > $SUSPECT_MAX_BY_IP){
			
			if($rowCheck["Total"] == ($SUSPECT_MAX_BY_IP+1)){
				$message = "<b>Compte suspect par IP sur ".$GAME_NAME." : </b><br>".$IP;

				generic_mail("sdupuy@viralgames.fr", $objet, $message);
			}

			return $SUSPECT_MAX_BY_IP_NOTE;
			
		}
	}

	return 0;

}



function updateLastTimePlayer($playerid){
	$query = "UPDATE Players SET LastTime=:DATE WHERE Id=:PID";
	$args = Array(
		":PID"=>$playerid
		,":DATE"=>date("Y-m-d H:i:s")
	);
	$GLOBALS["vg_pdo"]->query($query,$args);
	$player = getplayer($playerid);
}

function debug($str, $date = "no_date")
{
	global $ARCHIVES_DIR, $SCRIPT_NAME, $VG_DEBUG_THREAD;
	
	if ($date == "no_date")
		$date = date("Y-m-d H:i:s", my_local_time());

	if (empty($VG_DEBUG_THREAD))
		$VG_DEBUG_THREAD = substr(md5(uniqid("")), 0, 8);
	
	$fd = fopen($ARCHIVES_DIR."debug.txt", "a");
	fwrite($fd, $date." > ".$SCRIPT_NAME." > ".$VG_DEBUG_THREAD." > ".$str."\n");
	fclose($fd);
	
}


function VgSetCookie($name,$value,$time=""){
	if($time=="")
		$time = (time()+60*60*24*30);

	if(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == on)
		setcookie($name, $value, $time, "", "", true, true);
	else
		setcookie($name, $value, $time, "", "", false, true);
}

##############
# Date utils #
##############

# Il y a un décalage horaire entre virtuaVia et l'heure francaise
#(7 heures)
function my_local_time()
{
	global $JETLAG;
	return time()+$JETLAG;
}

# Returns the difference in seconds between the date
# and now. The date is a string with format yyyy-mm-dd hh:mm:ss
function time_diff_now($date) {
  $now = my_local_time();
  $year = intval(strtok($date, "- :"));
  $month = intval(strtok("- :"));
  $day = intval(strtok("- :"));
  $hour = intval(strtok("- :"));
  $minute = intval(strtok("- :"));
  $second = intval(strtok("- :"));
  $old = mktime($hour, $minute, $second, $month, $day, $year);
  return $now - $old;
}

# Returns the difference in seconds between the two dates
# The dates are strings with format yyyy-mm-dd hh:mm:ss
function time_diff($olds, $news) {
  $year = intval(strtok($olds, "- :"));
  $month = intval(strtok("- :"));
  $day = intval(strtok("- :"));
  $hour = intval(strtok("- :"));
  $minute = intval(strtok("- :"));
  $second = intval(strtok("- :"));
  $old = mktime($hour, $minute, $second, $month, $day, $year);

  $year = intval(strtok($news, "- :"));
  $month = intval(strtok("- :"));
  $day = intval(strtok("- :"));
  $hour = intval(strtok("- :"));
  $minute = intval(strtok("- :"));
  $second = intval(strtok("- :"));
  $new = mktime($hour, $minute, $second, $month, $day, $year);

  return $new - $old;
}

#################
# Session class #
#################
class Session {
  # Session Id
  var $sessid;
  # Member Id (if user is a member)
  var $memberid = -1;
  # Guest Id (if user has come through a guest email)
  var $guestid;
	
	# stocke l'origine de la session
	var $origine;
	
  # Add the session id to the URL
  # and the debug variable (this is internally used)
  function url($url, $args) {
    global $debug;
     
   if (isset($debug)) {
      return $url."?".$args."&debug=".$debug;
    } else if($args) {
      return $url."?".$args;
    }else
    	return $url;
  }

  # Creates a popup link for the modification of the password but without constructing the link
  function popup_password2($url, $args, $fragment = "") 
  {
    global $GAME_PAGE;
    global $debug;
    if (!empty($fragment)) $fragment = "#" . $fragment;
      return "javascript: var tt=window.open('" . 
	$this->url($url, $args) . $fragment . 
	  "','','scrollbars=yes,width=510,height=380,screenX=10,left=10,screenY=20,top=20,resizable=yes');";
  }


  # return JS string to open a new window, no text arg 
  function popup2($url, $args, $fragment = "", $width = 379, $height = 300, $scrollbar = "yes", $resizable = "yes") {

    if (!empty($fragment)) $fragment = "#" . $fragment;
      return "javascript: var tt=window.open('" . 
	$this->url($url, $args) . $fragment . 
	  "','','scrollbars=".$scrollbar.",width=".$width.",height=".$height.",screenX=0,left=0,screenY=0,top=0,resizable=".$resizable."');";
  }

  # popup without connection
  function popup3($url, $args, $fragment = "", $width = 512, $height = 530, $scrollbar = "yes", $resizable = "yes") {

    if (!empty($fragment)) $fragment = "#" . $fragment;
      return "javascript: var tt=window.open('" . 
	$this->url2($url, $args) . $fragment . 
	  "','','scrollbars=".$scrollbar.",width=".$width.",height=".$height.",screenX=0,left=0,screenY=0,top=0,resizable=".$resizable."');";
  }

  # Same as link but does not display the tag (only the url)
  function link3($url, $args, $fragment = "") 
  {
    global $GAME_PAGE;
    global $debug;
    if (!empty($fragment)) $fragment = "#" . $fragment;
    if (isset($debug)) 
	{
      return $this->url($url, $args) . $fragment;
    }
	else
	{
      return $this->url($url, $args) . $fragment;
    }
  }

	# génère un lien de déconnexion (url sans la session + suppression du cookie si SESSION_WITH_COOKIE=true
	function link4($url, $args, $fragment = "") 
	{
		if (!empty($fragment))
			$fragment = "#" . $fragment;
	
		return $this->url2($url, $args) . $fragment;
	}
  
  # Same as url but with no session id (for reinitialization)
  function url2($url, $args) {
    global $debug;
    if (!empty($args)) $args = "?" . $args;
    if (isset($debug)) {
      return "$url$args&debug=$debug";
    } else {
      return "$url$args";
    }
  }

  # Print the url the result of the post has to be sent to 
  # Add an external debug variable
  function action($url, $fragment = "") {
    global $GAME_PAGE, $debug;
    if (!empty($fragment)) $fragment = "#" . $fragment;
    if (isset($debug)) {
      return $url . $fragment;
#*      return "$GAME_PAGE?url=". urlencode($url) ."&debug=$debug$fragment";
    } else {
#*      return "$GAME_PAGE?url=". urlencode($url) . "$fragment";
      return $url . $fragment;
    }
  }

  # Create an hidden field containing the session id
  # Add an internal debug variable
  function hfield() {
    global $debug;
    return "<input type=\"hidden\" name=\"sessid\" value=\"" .
      urlencode($this->sessid) . "\">";
    if (isset($debug)) {
      return "<input type=\"hidden\" name=\"debug\" value=\"$debug\">";
    }
  }

  # Locally redirect to appropriate page
  # This function has to be called before any output is made !!
  # NOTE : redirections are used only at the server to server level
  # (only the customer's server is redirected and not the user's browser)
  # Add an external (AND internal debug variable??)
  function redirect($page, $args, $fragment = "") {
    global $debug, $HTTP_USER, $HTTP_PWD;
    if (!empty($fragment)) $fragment = "#" . $fragment;
#*    $page = "http://$HTTP_USER:$HTTP_PWD@" . substr($page, 7, strlen($page));
    $text = "Location: $page?sessid=" . urlencode($this->sessid);
    if (isset($args)) $text = $text . "&$args";
    if (isset($debug)) $text = $text . "&debug=$debug";
    header($text . $fragment);
    exit();
  }

# Load session data and check validity
function load($sessid)
{
	global $SESSION_EXPIRATION_TIME, $SESSION_EXPIRATION_TIME_PERCENT_LIMIT;

	if(!$sessid){$sessid = $_COOKIE["sessid"];}
	
	$query = "SELECT * FROM Sessions WHERE SessId = :SID";
	$args = Array(":SID"	=> 	$sessid );
	$GLOBALS["vg_pdo"]->query($query,$args);
	$res = $GLOBALS["vg_pdo"]->fetch_assoc();

	
	# si la session est OK on charge les infos
	# si la requete a échoué res['Time'] vaut false = -1 et le résultat sera forcément < my_local_time()
	# si la session a expirée on ne la retire pas car se sera fait automatiquement par le prochain create_session
	$iTime = my_local_time();

	if ($res["Time"] + $SESSION_EXPIRATION_TIME > $iTime) 
	{
		$this->sessid = $sessid;
		$this->memberid = $res["MemberId"];
		$this->guestid = $res["GuestId"];
		$this->uid = $res["uid"];
		$this->origine = $res["Origine"];
		
		# SESSION_EXPIRATION_TIME_PERCENT_LIMIT est le pourcentage max de SESSION_EXPIRATION_TIME qu'il ne faut pas dépasser
		# exemple, pour une session de 60 minutes on va dire qu'à partir de 45 min il faut mettre à jour la session
		# ie, SESSION_EXPIRATION_TIME_PERCENT_LIMIT vaut 75 (75%), au dela de 75% du temps d'expiration de la session, il faut la remettre à jour
		if ($res["Time"] + $SESSION_EXPIRATION_TIME * $SESSION_EXPIRATION_TIME_PERCENT_LIMIT / 100 < $iTime){
			$query = "UPDATE Sessions SET Time=:TIME WHERE SessId=:SID";
			$args = Array(
				":TIME"	=>	$iTime 
				,":SID"	=> 	$this->sessid 
			);
			$GLOBALS["vg_pdo"]->query($query,$args);
		}

		return true;
	}
	else
	{
		#debug("exp session : resTime : ".$res["Time"]." iTime : ".$iTime);
		return false;
	}
}
  
	# sauve les infos de la session en cours
	# uid : spécifie un uid pour la session (sécurité)
	# $withCookie : on va stoker l'id de session dans un cookie
	function save($uid = 0)
	{
		global $SESSION_EXPIRATION_TIME, $SESSION_WITH_COOKIE;
	
		# on sauve les infos de la session en cours
		$query = "UPDATE Sessions SET MemberId = :MID, GuestId = :GID, uid = :UID, Origine = :ORIGINE WHERE SessId = :SID";
		$args = Array(
			":MID"		=>	$this->memberid
			,":GID"		=>	$this->guestid
			,":UID"		=>	$uid
			,":ORIGINE"	=>	$this->origine
			,":SID"	=>	$this->sessid
		);
		$GLOBALS["vg_pdo"]->query($query,$args);

		# si on demande un stokage avec cookie
		if ($SESSION_WITH_COOKIE)
		{
			VgSetCookie("sessid", $this->sessid);
		}
		
		# on en profite pour faire le ménage :
		# on arrive en général ici après une phase d'authentification (login) ou d'inscription
		
		# on autorise qu'une seule session par joueur
		$this->clear_similar_sessions();
		
		# à chaque nouvelle connexion d'un joueur on fait un garbage collector sur toutes les sessions
		$query = "DELETE FROM Sessions WHERE Time < :TIME";
		$args = Array(":TIME"=>(my_local_time() - $SESSION_EXPIRATION_TIME));
		$GLOBALS["vg_pdo"]->query($query,$args);

	}

	function protect_params($params)
	{
	$this->sgn = md5_sign_string($params);
	return $this->sgn;
	}

	function check_uid($uid)
	{
	return (!((strlen($uid)<= 0) || ($this->uid != $uid)));
	}

	function check_sgn($sgn, $params)
	{
	return md5_check_string($sgn,$params);
	}

  function gen_uid($param)
  {
  	global $MD5_UID_KEY;
  	return md5($param.$MD5_UID_KEY);
  }
  
  # Update session data
  function update($uid="") {
    $time = my_local_time();
	if ($uid != "")
	    $query = "UPDATE Sessions SET Time=:TIME, uid=:UID WHERE SessId=:SID";
	else
	    $query = "UPDATE Sessions SET Time=:TIME WHERE SessId=:SID";

	$args = Array(
			":TIME"=>$time
			,":UID"=>$uid
			,"SID"=>$this->sessid
	);
    $GLOBALS["vg_pdo"]->query($query,$args);
  }

  function reinit($msg) {
    global $LOGIN_PAGE;
    $this->create_session();
    $this->redirect($LOGIN_PAGE, "msg=" .urlencode($msg));
  }

	function create_session()
	{
		global $SESSION_EXPIRATION_TIME, $SESSION_SERVER_ID, $ORIGINE;
		
		# grace à SESSION_SERVER_ID on est sur de l'unicité de la session créée
		$this->sessid = md5(uniqid($SESSION_SERVER_ID.mt_rand()));
		
		# on l'insère en bdd
		$query = "INSERT INTO Sessions (SessId, Time, MemberId, GuestId, Origine) VALUES (:SID, :TIME, '-1', '0', :ORIGINE)";
		$args = Array( 
			":SID"=>$this->sessid
			,":TIME"=>my_local_time()
			,":ORIGINE"=>$ORIGINE
		);
		$GLOBALS["vg_pdo"]->query($query,$args);

		$this->save();

	}
	
	# supprime toutes les sessions ayant le même memberid sauf la session en cours
	function clear_similar_sessions()
	{
		if ($this->memberid > 0){
			$query = "DELETE FROM Sessions WHERE MemberId=:MID AND SessId != :SID";
			$args = Array(":MID"=>$this->memberid,":SID"=>$this->sessid);
			$GLOBALS["vg_pdo"]->query($query, $args);
		}
	}
	
}
##############################################################
# Session management functions                               #
##############################################################

# Validate the session at the begining of a page
# sessid is the session id contained in the URL (or passed via a POST)
# require is 1 when authentication is required, 0 otherwise
# Validate the session at the begining of a page
# sessid is the session id contained in the URL (or passed via a POST)
# require is 1 when authentication is required, 0 otherwise
function open_page($sessid, $require = 0)
{
	//echo 'ds fct : '.$sessid.'<br />' ;
	$sess = new Session;
	
	if(!$sessid){$sessid = $_COOKIE["sessid"];}
	
	# si sessid n'est pas nul
	if ($sessid != "")
	{
		//debug('sess non null') ;
    	# si on arrive à charger la session, on la retourne
    	# avant on vérifie si on la met à jour
    	if ($sess->load($sessid))
    	{
			//debug('sess charge') ;
    		return $sess;
    	}
    }

	# il n'a pas de sessid, on lui en crée
	if ($require == 1)
	{
		//debug("require=1 mais il n'a pas de sessid ");
		$sess->memberid = -1;
	}
	else
	{
		//debug('sess cree') ;
		$sess->create_session();
	}
	
	return $sess;
}

function close_page($sess, $uid="")
{
	# on ne va forcer le update que si uid est présent
	# sinon l'update de la session se fait dans open_page
	if ($uid != "")
		$sess->update($uid);		
}


##############################################################
# Utility functions                                          #
##############################################################

############
# php_self
# permet d'obtenir l'url de la page où on est
function php_self()
{
	global $PHP_SELF,$SERVER_URL;
	
	# on decoupe php_self pour récuperer juste le nom du script
	$aHere = explode("/",$PHP_SELF);
	
	# on retourne l'equivalent de ce qu'il y a dans $MACHIN_PAGE
	# il ne reste plus qu'à comparer pour voir où on est
	return $SERVER_URL.$aHere[count($aHere)-1];
}

# Return the member row for this member (from member id)
function getmember($id) {
  $query = "SELECT * FROM Members WHERE Id = :ID";

  $args = Array(":ID"=>$id);
  $row = $GLOBALS["vg_pdo"]->query($query,$args);

  return $GLOBALS["vg_pdo"]->fetch_assoc();
}

# Return the member row for this member (from player id)
function getmember2($id) {
  $query = "SELECT * FROM Players WHERE Id = :ID";
  $args = Array(":ID"=>$id);
  $row = $GLOBALS["vg_pdo"]->query($query,$args);
  $player = $GLOBALS["vg_pdo"]->fetch_assoc();

  return getmember($player[MemberId]); 
}

# Return the player row for this member
function getplayer($memberid) {
  $query = "SELECT * FROM Players WHERE MemberId = :ID";
  
  $args = Array(":ID"=>$memberid);
  $row = $GLOBALS["vg_pdo"]->query($query,$args);

  return $GLOBALS["vg_pdo"]->fetch_assoc();
}

# Return the player row from this player id
function getplayer2($playerid) {
  $query = "SELECT * FROM Players WHERE Id = :ID";
   
  $args = Array(":ID"=>$playerid);
  $row = $GLOBALS["vg_pdo"]->query($query,$args);

  return $GLOBALS["vg_pdo"]->fetch_assoc();
}

# Return rank of the player in the high scores
function rank($player) {
  $query = "SELECT COUNT(*) AS Number FROM Players WHERE Score > :SCORE OR (Score = SCORE AND Time <= :TIME)";
  

  $args = Array(":SCORE"=>$player[Score], ":TIME"=>$player[Time]);
  $row = $GLOBALS["vg_pdo"]->query($query,$args);

  $result = $GLOBALS["vg_pdo"]->fetch_assoc();

  return $result[Number];
}

# Return an array of email adresses extracted from the string
function extractemail($email) {
	return split("[,;\n]",$email);
}

# Check whether the email is in the right format
# $checkLevel : niveau de vérification :
# 0 : syntaxique (default)
# 1 : domain suffix ok 
# 2 : domain exists (MX ou non)
# 3 : essaye de se connecter dessus

function checkemail($email, $checkLevel = 0)
{
	global $EmailDomainBL;

	$email = strtolower($email);
	# vérifie la syntaxe
	$res = preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+([\.][a-z0-9-]{2,30})+/", $email);
	if ($res){
		if ($checkLevel >= 1){			
			# vérifie le domaine
			list ( $Username, $Domain ) = split ("@",$email);
			if(!in_array($Domain, $EmailDomainBL)){
				
				if ($checkLevel >= 2){
					if (checkdnsrr($Domain, "MX"))
						return true;
					else
						return false;
				}else
					return true;
			}else
				return false;				
		}else
			return true;			
	}else
	    return false;
}


# Extracts the date with the format dd/mm/yyyy from a mysql date field

function date_mysql($datefield) {
//	preg_match("/(\d{4})\-(\d{2})\-(\d{2})/i",$datefield,$splittedfield);
ereg("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})",$datefield,$splittedfield);
	return $splittedfield[3]."/".$splittedfield[2]."/".$splittedfield[1];
}

# Extracts the time with the format hh"h"mm from a mysql date field

function time_mysql($datefield) {
//	preg_match("/(\d{2}):(\d{2}):(\d{2})/i",$datefield,$splittedfield);
ereg("([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})",$datefield,$splittedfield);
	return $splittedfield[1]."h".$splittedfield[2];
}

# returns the number of guests the player (from his Id) has invited

function guests_number($playerId)
{
  $query = "SELECT COUNT(Id) AS Number FROM Guests WHERE FatherPId=:PLAYERID";

  $args = Array(":PLAYERID"=>$playerId);
  $GLOBALS["vg_pdo"]->query($query,$args);

  $result = $GLOBALS["vg_pdo"]->fetch_assoc();

  return $result[Number];
}

# ferme la popup et rafraîchit la fenêtre principale
function closePopupAndRedirect($urlRedirect = "")
{
	# s'il n'y a pas d'url de redirection on rafraîchit la fenêtre principale
	if ($urlRedirect == "")
		return "<script>window.opener.history.go(0);window.close();</script>";
	else
		return "<script>window.opener.location.replace('".$urlRedirect."');window.close();</script>";
}


# Signature d'une chaine de characteres
function md5_sign_string($params)
{
	global $MD5_SESS_KEY;

	$sgn = urlencode(md5($params.$MD5_SESS_KEY));
  return $sgn;
}

# Check d'une chaine signée
function md5_check_string($sgn, $params)
{
	global $MD5_SESS_KEY;
  	
	if ($sgn == md5($params.$MD5_SESS_KEY))
	{
		return true;
	}
	else
	{
		return false;
	}
}

# cette fonction ajoute des slash à toutes les valeurs du tableau tArgs
# ce sont par exemple toutes les valeurs args retournée par wddx qui ne sont pas automatiquement slashes
function clearArgs(&$args)
{
	foreach($args as $key => $val)
		if (!is_array($val))
   			$args[$key] = addslashes(trim($val));
}

?>
