<?php
/* 
 * phpMyVisites : website statistics and audience measurements
 * Copyright (C) 2002 - 2006
 * http://www.phpmyvisites.net/ 
 * phpMyVisites is free software (license GNU/GPL)
 * Authors : phpMyVisites team
*/

// $Id: common.functions.php 43 2006-08-21 05:55:50Z matthieu_ $

function getFilenameExtension( $name )
{
	$posDot = strrpos( $name, ".");
	if($posDot===false)
	{
		return $name;
	}
	
	return substr( $name, $posDot + 1);
}

function U2U($szstr)
{
	$matches = array();
	preg_match_all("/%u([0-9,A-F][0-9,A-F][0-9,A-F][0-9,A-F])/i", $szstr, $matches);

	$letters = 255;

	$found = count($matches[0]);
	
	while($found && $letters--)
	{
		$ustr = $matches[0][0];
		$ustrCode = str_replace("%u", "", $ustr);
		
		$astrCode = hexdec($ustrCode);
		$astr = sprintf("&#%d", $astrCode);
		
		$szstr = str_replace($ustr, $astr, $szstr);
		
		$matches = array();
		preg_match_all("/%u([0-9,A-F][0-9,A-F][0-9,A-F][0-9,A-F])/i", $szstr,
		$matches);
		
		$found = count($matches[0]);
	}
	
	return $szstr;
}

function databaseEscape($str)
{
	return mysql_real_escape_string($str);
}


function uncompress( $data, $compressed )
{
	if($compressed == 1)
	{
		//var_dump($data);
		
		// normal case
		if( $return = gzuncompress($data) )
		{
			return $return;
		}
		// case backward compatibility for cookie between 2.1 base64encode and between 2.2
		else
		{
			return base64_decode($data);
		}
	}
	return $data;
}
function compress( $data, $compressed )
{
	if($compressed == 1)
	{
		return gzcompress($data);
	}
	return $data;
}
/**
 * returns the SQL-format date of the timestamp $ts
 * 
 * @param timestamp $ts
 * 
 * @return string date
 */
function getDateFromTimestamp($ts)
{
	return date("Y-m-d", $ts);
}


/**
 * get a variable from the $_REQUEST superglobal
 * 
 * it tests the var type and exit if the variable doesn't have default value and
 * if the type doesn't match
 * 
 * @param string $varName name of the variable
 * @param string $varDefault default value. If '', and if the type doesn't match, exit() !
 * @param string $varType variable type
 */
function getRequestVar($varName, $varDefault=null, $varType="string")
{
	$varDefault = secureVar(stripslashesPmv($varDefault));
	
	if(!isset($_REQUEST[$varName]) || empty($_REQUEST[$varName]))
	{
		if($varDefault===null)
		{
			trigger_error("Error : \$varName '$varName' doesn't have value in \$_REQUEST and doesn't have a" .
					" \$varDefault value", E_USER_ERROR);
			exit();
			return;
		}
		else
		{
			if($varType=="numeric")
			{
				 $varType="string";
			}
			settype($varDefault, $varType);
			return $varDefault;
		}
	}
	else
	{
		$content = secureVar(stripslashesPmv($_REQUEST[$varName]));
		
		if($varType == 'string')
		{
			if(is_string($content)) $ok = true;
		}			
		elseif($varType == 'numeric' || $varType == 'int' || $varType == 'float')
		{
				if(is_numeric($content)) $ok = true;
		}
		elseif($varType == 'array')
		{
				if(is_array($content)) $ok = true;
		}
		else
		{
			$ok=true;
		}
		
		if(!isset($ok))
		{
			if($varDefault===null) 
			{	
				trigger_error("Error : \$varName '$varName' doesn't have a correct type in \$_REQUEST and doesn't " .
						"have a \$varDefault value", E_USER_ERROR);
				exit();
				return;
			}
			else
			{
				if($varType=="numeric")
				{
					 $varType="string";
				}
				settype($varDefault, $varType);
				return $varDefault;
			}
		}
		else
		{
			return $content;
		}
	}
}

/**
 * print message or array in debug mode
 * 
 * @param string $message
 */
function printDebug ($message) {
	if(DEBUG)
	{
		if(!is_scalar($message))
		{
			print("<pre>");
			var_dump($message);
			print("</pre>");
		}
		else
		{
			print($message);
		}
	}
}

/**
 * log page generation performances (queries number and time)
 * 
 * @param int $idSite
 * 
 * @param bool true
 */
function recordDbQueryCount($idSite)
{
	// records query count and time to compute this page
	$res = substr(getMicrotime()-$GLOBALS['time_start'], 0, 4);
	$r = query("INSERT INTO ".T_QUERY_LOG." (idsite, query, time, date, daytime)" .
		" VALUES ('$idSite', '".$GLOBALS['query_count']."', '$res', CURRENT_DATE(), CURRENT_TIME())");
		
	return true;
}



/**
 * operation called by secureVar
 * 
 * @param int|string $var
 * 
 * @return int|string
 */
function secureVarOperation($var)
{
	if(is_array( $var ))
	{
		foreach($var as $key => $value)
		{
			if(is_array($value))
			{
				$var[$key] = secureVarOperation($value);
			}
			else
			{
				$var[$key] = htmlspecialchars(trim($value));
			}
		}
	}
	else
	{
		$var = htmlspecialchars(trim($var));
	}
	
	return databaseSecure($var);
}

function databaseSecure($var)
{
	$db =& Db::getInstance();
	if($db->isReady())
	{
		if(is_array($var))
		{
			foreach($var as $key => $value)
			{
				if(is_array($value))
				{
					$var[$key] = databaseSecure($value);
				}
				else
				{
					$var[$key] = databaseEscape($value);
				}
			}
		}
		else
		{
			$var = databaseEscape($var);
		}
	}
	return $var;
}
/**
 * secures the variable from SQL injection and from cross site scripting
 * 
 * @param int|string|array $var
 * @param int|string|array var secured 
 */
function secureVar($var)
{
	if(is_scalar($var))
	{
		return secureVarOperation($var);
	}
	else if(is_array($var))
	{
		foreach($var as $key => $value)
		{
			$var[$key] = secureVarOperation($value);
		}
		return $var;
	}
	else
	{
		return $var;
	}
}

/**
 * special stripslashes managing fucking magic_quotes
 * 
 * @param string|array $str
 * 
 * @return string|array stripslashed, or not
 */
function stripslashesPmv($str)
{
	if (get_magic_quotes_gpc())
	{
		if(is_array($str))
		{
			foreach($str as $key => $value)
			{
				$str[$key] = stripslashes($value);
			}
			return $str;
		}
		else
		{
			return stripslashes($str);
		}
	}
	else
	{
		return $str;
	}
}


/**
 * set an int or string to a precise length, completing on the left with zero (O)
 * 
 * @param all $id
 * @param int $length
 * 
 * @return string string to length $length
 */
function setToLength($id, $length)
{
	settype($id, 'string');
	$l = strlen($id);
	for($i=0;$i<$length-$l;$i++)
	{
		$id='0'.$id;
	}
	return $id;
}


/**
 * returns seconds since midnight today
 * 
 * @return int seconds since midnight today
 */
function todayTime()
{
	return date("H") * 3600 + date("i") * 60 + date("s");
}
?>