<?php
/**
* Libreria di funzioni comuni. 
* Si tratta di funzioni incluse in quasi tutti gli script e di uso comune in tutta l'applicazione VFront
* 
* @package VFront
* @subpackage Function-Libraries
* @author Mario Marcello Verona <marcelloverona@gmail.com>
* @copyright 2007-2010 M.Marcello Verona
* @version 0.96 $Id: func.comuni.php 888 2010-12-14 20:09:52Z marciuz $
* @license http://www.gnu.org/licenses/gpl.html GNU Public License
*/



/**
 * Pulisce da spazi bianchi, aggiunge gli slash e rimuove eventuali tags i campi inseriti. 
 * Viene utilizzata per ragioni di sicurezza in contesti di invio di dati da parte del client.
 *
 * @param array $post_dom
 * @return array
 */
function pulisci_dom($post_dom){

	if(!is_array($post_dom)){
		
		return false;
	}
	
	while(list($k,$val)=each($post_dom)){
		if(is_array($val)){
			while(list($kk,$valval)=each($val)){
				$_var[$k][$kk]=addslashes(stripslashes(strip_tags(trim($valval))));
			}
		}
		else{
			$_var[$k]=addslashes(stripslashes(strip_tags(trim($val))));
		}
	}
	
	return $_var;
}


/**
 * Dato un numerico indicante l'ID del gruppo viene restituito il nome dello stesso
 *
 * @param int $gid ID del gruppo 
 * @return string Nome del gruppo
 */
function gid2nome_gruppo($gid){
	
	global  $vmreg, $db1;
	
	$q=$vmreg->query("SELECT nome_gruppo FROM {$db1['frontend']}{$db1['sep']}gruppo WHERE gid=".intval($gid));
	list($nome_gr) = $vmreg->fetch_row($q);
	
	return $nome_gr;
	
}

/**
 * Dato oid di tabella recupera il gruppo a cui appartiene
 *
 * @param int $oid ID della tabella
 * @return int gid
 */
function oid2gid($oid){

	global $vmreg, $db1;

	$q=$vmreg->query("SELECT gid FROM {$db1['frontend']}{$db1['sep']}registro_tab WHERE oid=".intval($oid)." LIMIT 1");
	list($gid) = $vmreg->fetch_row($q);

	return $gid;
	
}

/**
 * Codifica la data in base al parametro di configurazione FRONT_DATE_FORMAT
 *
 * @param date $dataISO
 * @param bool $ora
 * @param string $special
 * @return string
 */
function date_encode($dataISO,$ora=false,$special=''){
	
	switch (FRONT_DATE_FORMAT){
		
		case 'ita': return dataITA($dataISO,$ora,$special);
		break;
		
		case 'eng': return dataENG($dataISO,$ora,$special);
		break;
		
		default: return ($ora) ? $dataISO : substr($dataISO,0,10);
	}
}


function date_decode($dataenc){
	
	if(FRONT_DATE_FORMAT) return $dataenc;
	
	$tk0=explode(" ",$dataenc);
	
	$d0=explode("/",$tk0[0]);
	
	$ora0=(isset($tk0[1])) ? " ".$tk0[1] : '';
	
	switch (FRONT_DATE_FORMAT){
		
		case 'ita': return $d0[2].$d0[1].$d0[0].$ora0;
		break;
		
		case 'eng': return $d0[2].$d0[0].$d0[1].$ora0;
		break;
		
		default: return $dataenc;
	}
}






/**
 * Estrae le parti di una data in formato internazionale e restituisce le parti della stessa in un array.
 * Fornisce inoltre un valore di chiave "ita" già pronto con la data in formato italiano.
 *
 * @param string $dataISO
 * @param bool $ora
 * @return array
 */
function dataISO2ITA($dataISO,$ora=false){
	
	$dataITA['d']=substr($dataISO,8,2);
	$dataITA['m']=substr($dataISO,5,2);
	$dataITA['Y']=substr($dataISO,0,4);
	$dataITA['ita']=$dataITA['d']."/".$dataITA['m']."/".$dataITA['Y'];
	
	if($ora){
		$dataITA['h']=substr($dataISO,11,2);
		$dataITA['i']=substr($dataISO,14,2);
		$dataITA['s']=substr($dataISO,17,2);
		$dataITA['ita_noh']=$dataITA['ita'];
		
		$dataITA['ita'].= " alle ".$dataITA['h'].":".$dataITA['i'];
	}
		
	return $dataITA;
}




/**
 * Funzione di trasformazione di data da formato internazionale a formato italiano o con data e la T. 
 * Richiama a sua volta la funzione dataISO2ITA()
 *
 * @param date $dataISO
 * @param bool $ora
 * @param string $special 'string' (mostra la data con la parola ALLE + $ora | 'ods' (caso speciale per l'esportazione open office)
 * @see function dataISO2ITA
 * @return string
 */
function dataITA($dataISO,$ora=false,$special=''){
	
	$d= dataISO2ITA($dataISO,$ora);
	if($ora){
		
		// caso open office export
		if($special=='ods')
			return $d['ita_noh']."T".$d['h'].$d['i'].$d['s'];
		else if($special=='string')
			return $d['ita'];
		else
			return $d['ita_noh']." ".$d['h'].":".$d['i'].":".$d['s'];
	}
	else{
		return $d['ita'];
	}
	
}




/**
 * Estrae le parti di una data in formato internazionale e restituisce le parti della stessa in un array.
 * Fornisce inoltre un valore di chiave "eng" pronto con la data in formato english.
 *
 * @param string $dataISO
 * @param bool $ora
 * @return array
 */
function dataISO2ENG($dataISO,$ora=false){
	
	$dataENG['d']=substr($dataISO,8,2);
	$dataENG['m']=substr($dataISO,5,2);
	$dataENG['Y']=substr($dataISO,0,4);
	$dataENG['eng']=$dataENG['m']."/".$dataENG['d']."/".$dataENG['Y'];
	
	if($ora){
		$dataENG['h']=substr($dataISO,11,2);
		$dataENG['i']=substr($dataISO,14,2);
		$dataENG['s']=substr($dataISO,17,2);
		$dataENG['eng_noh']=$dataENG['eng'];
		
		$dataENG['eng'].= " on ".$dataENG['h'].":".$dataENG['i'];
	}
		
	return $dataENG;
}




/**
 * Funzione di trasformazione di data da formato internazionale a formato english 
 * o con data e altre opzioni relative a $special
 * Richiama a sua volta la funzione dataISO2ENG()
 *
 * @param date $dataISO
 * @param bool $ora
 * @param string $special
 * @see function dataISO2ENG
 * @return string
 */
function dataENG($dataISO,$ora=false,$special=''){
	
	$d= dataISO2ENG($dataISO,$ora);
	if($ora){
		
		// caso open office export
		if($special=='ods')
			return $d['eng_noh']."T".$d['h'].$d['i'].$d['s'];
		else
			return $d['eng_noh']." ".$d['h'].":".$d['i'].":".$d['s'];
	}
	else{
		return $d['eng'];
	}
	
}


/**
 * Funzione interna per la determinazione dei campi coinvolti da una data query SQL
 *
 * @param string $sql
 * @return string
 */
function analisi_select_from($sql){
	
	global  $vmsql, $vmreg;
	
	if(!$vmsql->query_try($sql,true)){
		return false;
	}
	
	// parsing della query
	$campi = preg_replace("|SELECT|i",'',$sql);
	
	list($campi,$monnezza) = preg_split("'[\W]FROM[\W]'i",$campi);

	// quanti campi ci sono?
	if(preg_match('|,|',$campi)){

		$ar_campi=explode(",",$campi);
		
		
		return array(trim($ar_campi[0]),trim($ar_campi[1]));
	}
	else{
		return array(trim($campi));
	}
	
}

/**
 * Utilit� che da un 1:0 restituisce "Si" o "No" con la classe CSS omonima
 *
 * @param int $int
 * @return string
 */
function high_si_no($int){

	return ($int) ? '<span class="si">'._("Yes").'</span>' :  '<span class="no">'._("No").'</span>' ;
}

/**
 * Funzione per generare l'ordinamento delle tabelle secondo una colonna data
 *
 * @param string $etichetta
 * @param int $ord
 * @param string $desc
 */
function table_sort($etichetta,$ord,$desc=""){
	
	$getord= (isset($_GET['ord'])) ? (int) $_GET['ord'] : $ord;
	$sort = (isset($_GET['sort'])) ? $_GET['sort'] : 0;
	
	if($desc!=""){
		
		$title="title=\"$desc\"";		
	}
	else{
		$title="";
	}
	
	if(isset($_GET['ord']) && $ord==$_GET['ord']){
		
		$class="tab-ord";	
		if($sort=="d"){
				return "<a class=\"$class desc\" href=\"".$_SERVER['PHP_SELF']."?gid=".$_GET['gid']."&amp;ord=$ord&amp;sort=a\" $title>$etichetta</a>";
			}
			else {
			
				return "<a class=\"$class asc\" href=\"".$_SERVER['PHP_SELF']."?gid=".$_GET['gid']."&amp;ord=$ord&amp;sort=d\" $title>$etichetta</a>";;
		}
		
	}
	else{
		return "<a href=\"".$_SERVER['PHP_SELF']."?gid=".$_GET['gid']."&amp;ord=$ord&amp;sort=a\" $title>$etichetta</a>";	
	}
	
}



/**
 * Funzione di debug. 
 * Scrive in un file di testo le query o il testo che viene passato con il parametro $sql
 * E' utile soprattutto in operazioni di tipo AJAX.
 *
 * @param string $sql
 * @param string $filename
 */
function rpc_debug($sql,$filename="./rpc.debug.txt"){
	
	global $RPC_DEBUG;
	
	if($RPC_DEBUG){
		
		if($fp=@fopen($filename,"a")){
			
			fwrite($fp,date("Y-m-d H:i:s")." --- ".str_replace(array("\n","\r")," ",$sql)."\n");
			fclose($fp);
		}
	}
}



/**
 * Funzione di scrittura del log delle operazioni compiute mediante le maschere di VFront
 * E' dipendente dal parametro $RPC_LOG, definito nel file di configurazione (default conf/conf.vfront.php)
 *
 * @param string $op 'select'|'insert'|'delete'|'update'|'ripristino'
 * @param string $tabella
 * @param int $uid
 * @param int $gid
 * @param string $info_pk
 * @param bool $storico
 * @param string $storico_pre
 * @param string $storico_post
 * @param string $info_browser
 * @return mixed
 */
function rpc_log($op,$tabella,$uid,$gid,$info_pk='',$storico=true,$storico_pre='',$storico_post='',$info_browser=''){
	
	global $RPC_LOG, $db1,  $vmsql, $vmreg;

	$ID_LOG=null;
	
	if($RPC_LOG){
		
		if(!in_array($op,array('select','insert','delete','update','ripristino','duplicazione','import'))){
			
			$op='sconosciuta';			
		}
		
		$gid= (int) $gid;
		$uid = (int) $uid;
		
		switch($op){
			
			case 'ripristino': 
			
					
			
					$id_record = $info_pk;
			
						$sql="INSERT INTO {$db1['frontend']}{$db1['sep']}log (op,tabella,uid,gid,id_record,info_browser) 
						  VALUES ('$op','$tabella',$uid,$gid,'$id_record','$info_browser')";
					
					$test=$vmreg->query_try($sql,false);
			break;	
			
			case 'sconosciuta': 
			
					$id_record = $info_pk;
			
						$sql="INSERT INTO {$db1['frontend']}{$db1['sep']}log (op,tabella,uid,gid,id_record,info_browser) 
						  VALUES ('$op','$tabella',$uid,$gid,'$id_record','$info_browser')";
					
					$test=$vmreg->query_try($sql,false);
			break;	
			
			case 'duplicazione': 
			
					$id_record = $info_pk;
			
						$sql="INSERT INTO {$db1['frontend']}{$db1['sep']}log (op,tabella,uid,gid,id_record,info_browser,storico_post) 
						  VALUES ('$op','$tabella',$uid,$gid,'$id_record','$info_browser','$storico_post')";
					
					$test=$vmreg->query_try($sql,false);
			break;	
			
					
			case 'import': 
			case 'insert': 
			
				$id_record = $info_pk;
			
					if($storico){
						$storico_post=$vmreg->escape($storico_post);
						$sql="INSERT INTO {$db1['frontend']}{$db1['sep']}log (op,tabella,uid,gid,storico_post,id_record,info_browser) 
						  VALUES ('$op','$tabella',$uid,$gid,'$storico_post','$id_record','$info_browser')";
					}else{
						
						$sql="INSERT INTO {$db1['frontend']}{$db1['sep']}log (op,tabella,uid,gid,id_record,info_browser) 
						  VALUES ('$op','$tabella',$uid,$gid,'$id_record','$info_browser')";
					}
					
					$test=$vmreg->query_try($sql,false);
					$ID_LOG=$vmreg->insert_id("{$db1['frontend']}{$db1['sep']}log",'id_log');
			break;
			
			
			case 'delete':
					
					if($storico){
						
						$condizione='';
						$id='';
						
							foreach ($info_pk as $k=>$val){
								$val=$vmsql->escape(vf_utf8_decode($val));
								$condizione.=" $k='$val' AND";
								$id.=$val."|";
							}
							
							$condizione=substr($condizione,0,-3);
							$id=substr($id,0,-1);
						
						
						$q_storico_pre=$vmsql->query("SELECT * FROM $tabella WHERE $condizione");
						
						$RS_pre=$vmsql->fetch_assoc($q_storico_pre);
						
						$storico_pre=$vmreg->escape(serialize($RS_pre));
						
						$sql="INSERT INTO {$db1['frontend']}{$db1['sep']}log (op,tabella,uid,gid,id_record,storico_pre,info_browser) 
							  VALUES ('$op','$tabella',$uid,$gid,'$id','$storico_pre','$info_browser')";
					}
					else{

						$condizione='';
						$id='';
						
							foreach ($info_pk as $k=>$val){
								$val=$vmreg->escape($val);
								$condizione.=" $k='$val' AND";
								$id.=$val."|";
							}
							
							$condizione=substr($condizione,0,-3);
							$id=substr($id,0,-1);
				
						
						$sql="INSERT INTO {$db1['frontend']}{$db1['sep']}log (op,tabella,uid,gid,id_record,info_browser) 
							  VALUES ('$op','$tabella',$uid,$gid,'$id','$info_browser')";
					}
					
					$test=$vmreg->query_try($sql,false);
					
					$ID_LOG=$vmreg->insert_id("{$db1['frontend']}{$db1['sep']}log",'id_log');
					
			break;
			
			
			case 'update':
					
					if($storico){
						
						$condizione='';
						$id='';
						
							foreach ($info_pk as $k=>$val){
								$val=$vmreg->escape($val);
								$condizione.=" $k='$val' AND";
								$id.=$val."|";
							}
							
							$condizione=substr($condizione,0,-3);
							$id=$vmreg->escape(substr($id,0,-1));
						
						
						$q_storico_pre=$vmsql->query("SELECT * FROM $tabella WHERE $condizione");
						
						$RS_pre=$vmsql->fetch_assoc($q_storico_pre);
						
						$storico_pre=$vmreg->escape(serialize($RS_pre));
						$storico_post=$vmreg->escape($storico_post);
						
						$sql="INSERT INTO {$db1['frontend']}{$db1['sep']}log (op,tabella,uid,gid,id_record,storico_pre,storico_post,info_browser) 
							  VALUES ('$op','$tabella',$uid,$gid,'$id','$storico_pre','$storico_post','$info_browser')";
						$test=$vmreg->query_try($sql,false);
						
						$ID_LOG=$vmreg->insert_id("{$db1['frontend']}{$db1['sep']}log",'id_log');
						
					}
					else{

						$condizione='';
						$id='';
						
							foreach ($info_pk as $k=>$val){
								$val=$vmreg->escape($val);
								$condizione.=" $k='$val' AND";
								$id.=$val."|";
							}
							
							$condizione=substr($condizione,0,-3);
							$id=substr($id,0,-1);
				
						
						$sql="INSERT INTO {$db1['frontend']}{$db1['sep']}log (op,tabella,uid,gid,id_record,info_browser) 
							  VALUES ('$op','$tabella',$uid,$gid,'$id','$info_browser')";
						
						$test=$vmreg->query_try($sql,false);
						
						$ID_LOG=$vmreg->insert_id("{$db1['frontend']}{$db1['sep']}log",'id_log');
						
					}
			break;
			
			
		}
		
		
	}
	else{
		rpc_debug("Operazione $op saltata");
	}
	
	return $ID_LOG;
}


/**
 * Funzione di ordinamento dei valori di una matrice 
 * secondo una colonna scelta in ordine ascendente o discendente
 * Funziona con una logica simile a l'SQL
 *
 * @param array $matrice La matrice data
 * @param string $campo Il nome del campo
 * @param string $tipo Metodo di ordinamento (ASC o DESC) 
 * @return array La nuova matrice ordinata
 */
function ordina_matrice($matrice,$campo,$tipo="ASC"){
	
	if(!is_array($matrice) || count($matrice)<2 ){
		return $matrice;
	}
	
	// Scorre la matrice
	foreach($matrice as $k=>$ar){
		$new[$k]=array($ar[$campo],$ar);
	}
	
	if($tipo=="DESC"){
		rsort($new);
	}else{
		sort($new);
	}
	
	$ordinata=array();
	
	while(list($k,$ar)=each($new)){
		
		$ordinata[$k]=$new[$k][1];
	}	
	
	return $ordinata;
	
}



/**
 * Testa se il permesso/i specificato in $perm � posseduto dall'utente
 *
 * @param mixed $perm permesso o array di permessi
 * @return bool
 */
function permesso($perm){
	
	// sempre e comunque gli amministratori possono accedere
	if($_SESSION['user']['livello']==3) return true;

	// DEBUG... per ora restituisce sempre vero...
//	return true;

	if(!is_array($_SESSION['user']['permessi'])) $_SESSION['user']['permessi']=array();
	
	if(is_string($perm)){
		
		return (in_array($perm,$_SESSION['user']['permessi'])) ? true:false;
	}
	elseif(is_array($perm)){
		
		foreach($perm as $p){
			if(!in_array($p,$_SESSION['user']['permessi'])) return false;
		}
		
		return true;
	}
}


/**
 * Testa se l'utente = admin
 *
 * @return bool
 */
function is_admin(){
	
	return ($_SESSION['user']['livello']>=3) ? true:false;
}


function vf_utf8_encode($string){
	
	//return (defined(FRONT_ENCODING) && strtoupper(FRONT_ENCODING)=='UTF-8') ? $string : utf8_encode($string);
	
	return $string;
}


function vf_utf8_decode($string){
	
	//return (defined(FRONT_ENCODING) && strtoupper(FRONT_ENCODING)!='UTF-8') ? utf8_decode($string) : $string;
	
	return $string;
}


function is_true($v){

	if($v===1 || $v==='1' || $v==='t' || $v===true)	return true;
	else return false;
}



function is_false($v){

	if($v===0 || $v==='0' || $v==='f' || $v===null || $v===false)	return true;
	else return false;
}


function db_error_log($obj){

		$fp=fopen(FRONT_ERROR_LOG,"a");
		$towrite='';

		if(is_array($obj->errors)){

			foreach($obj->errors as $e){

				// prende il tipo query (SELECT , INSERT, UPDATE, DELETE) se il tipo � diverso ahi ahi
				$tipo_query = substr(trim($e['sql']), 0 , strpos(trim($e['sql'])," "));


				// restituisci la query che ha dato errore
				$sql_una_linea = trim(preg_replace("'\s+'"," ",$e['sql']));

				// Scrittura del file di errore
				$towrite.= "[".$e['date']."]\t"
							. $e['file']."\t"
							. $_SERVER['HTTP_HOST']. " (".$_SERVER['SERVER_ADDR']. ")\t"
							. "<".$tipo_query . ">\t"
							. $obj->dbtype."\t"
							. $e['code'] . "\t"
							. $e['msg'] . "\t"
							. $sql_una_linea. "\n";
			}
		
			fwrite($fp,$towrite);

		}

		fclose($fp);

}

?>