<?php
// ----------------------------------------------------------------------------------------------------
//			Mod Classement des Sites 
//
//      par Saint-pere  <saintpere5 AT hotmail POINT com> http://www.yep-yop.com
//
//     premiere distribution le Dimanche 26 Février 2006
//
// ----------------------------------------------------------------------------------------------------

class ClassClassement
{
	var $sites_par_pages;
	var $max_pages;
	var $file_max_size;
	var $authorized_extensions;
	var $repertoire_destination;
	var $largeur_max;
	var $hauteur_max;
	var $titre;
	var $url;
	var $banniere;
	var $desc;
	
	function ClassClassement($sites_par_pages,$max_pages,$file_max_size,$authorized_extensions,$repertoire_destination,$largeur_max,$hauteur_max)
	{
		$this->sites_par_pages 			= $sites_par_pages;
		$this->max_pages 				= $max_pages;
		$this->file_max_size 			= $file_max_size;
		$this->authorized_extensions 	= $authorized_extensions;
		$this->repertoire_destination	= $repertoire_destination;
		$this->largeur_max 				= $largeur_max;
		$this->hauteur_max 				= $hauteur_max;
		$titre = $url = $banniere = $desc = 0;
	}
	
	//
	// fournis la date du premier jour de la semaine courante
	
	function debutsem($n=0)
	{
		if (mktime(0,0,0,date('m'),date('d')-date('w')+1-$n*7,date("Y")) > time()) return 'true'; else return 'false';
	}

	//
	// Transforme un temps Timestamp en ecriture Humaine
	
	function calcul_hours($temps)
	{
		//combien d'heures ?
		$hours = floor($temps / 3600);
		
		//combien de minutes ?
		$min = floor(($temps - ($hours * 3600)) / 60);
		if ($min < 10)	$min = '0'.$min;
		
		//combien de secondes
		$sec = $temps - ($hours * 3600) - ($min * 60);
		if ($sec < 10)	$sec = '0'.$sec;        
		return $hours.'h'.$min.'m'.$sec.'s';
	}

	function mise_a_jour_lundi()
	{
			global $db;
			$date = time();
			// On recupere toutes les infos de la semaine 
			$sql = 'SELECT id_site,votes,clics FROM '.AREABB_CLASS_SITE .' ORDER BY votes DESC, clics DESC';
			if( !($result = $db->sql_query($sql)) )
			{
				message_die(GENERAL_ERROR, 'Could not update classification information', '', __LINE__, __FILE__, $sql);
			}
			$place = array();
			$votes_semaines = array();
			$i = 0;
			while( $row = $db->sql_fetchrow($result) )
			{
				$i++;
				$votes_semaines[] = $row;
				$place[] = $i;
			}
			// on mets à jour la table de la semaine
			$max_sites = sizeof($votes_semaines);
			for ($i=0;$i< $max_sites;$i++)
			{
				$sql = 'INSERT INTO '.AREABB_CLASS_SEM.' (id_site,place,votes,clics,date) 
						VALUES ('.$votes_semaines[$i]['id_site'].','.$place[$i].','.$votes_semaines[$i]['votes'].','.$votes_semaines[$i]['clics'].',\''.$date.'\')';
				if( !($result = $db->sql_query($sql)) )
				{
					message_die(GENERAL_ERROR, 'Could not update classification information', '', __LINE__, __FILE__, $sql);
				}
			}
			// On nettoie la table des sites
			$sql = 'UPDATE '.AREABB_CLASS_SITE. ' SET votes=0, clics=0';
			if( !($result = $db->sql_query($sql)) )
			{
				message_die(GENERAL_ERROR, 'Could not update classification information', '', __LINE__, __FILE__, $sql);
			}
			// On nettoie la table des IP histoire d'economiser un peu de DB
			$sql = 'DELETE FROM '.AREABB_CLASS_SITE_IP. ' WHERE date < \''.$date.'\'';
			if( !($result = $db->sql_query($sql)) )
			{
				message_die(GENERAL_ERROR, 'Could not update classification information', '', __LINE__, __FILE__, $sql);
			}
	}

	function pagination($action)
	{
		global $db,$lang,$start,$HTTP_GET_VARS,$id_squelette,$phpEx;
		
		// Construction de la pagination
		$sql = 'SELECT id_site FROM '.AREABB_CLASS_SITE ;
		if( !($result = $db->sql_query($sql)) )
		{
			message_die(GENERAL_ERROR, 'Could not query recent classification information', '', __LINE__, __FILE__, $sql);
		}
		$nbre = $db->sql_numrows($result);
		if ($nbre == 0 ) $nbre = 1;
		// nbre de pages dans notre site..
		$nbre_pages = ceil($nbre/$this->sites_par_pages);
		
		
		// Test si on dépasse pas notre limite max permise.. .
		if ($nbre_pages > $this->max_pages) $nbre_pages = $this->max_pages;

		// On construit les numéros cliquables de la pagination
		unset($pagination);
		FOR ($i=0;$i<$nbre_pages;$i++)
		{
			if (ceil($start/$this->sites_par_pages) == $i)
			{
				$pagination .= '<b>&nbsp;'.($i+1).'</b>';
			}else{
				$depart = ($this->sites_par_pages*($i+1)-$this->sites_par_pages);
				$pagination .= '&nbsp;<a href="'.append_sid(NOM_CLASSEMENT.'.'.$phpEx.'?salle='.$id_squelette.'&action='.$action.'&start='.$depart).'" alt="'.$lang['page_suivante'].'">'.($i+1).'</a>';
			}
		}
		return $pagination;
	}
		
	//
	// On verifie si le user demandé est déjà inscrit

	function verification_site_unique($id)
	{
		global $db;
		$sql = 'SELECT id_site FROM '. AREABB_CLASS_SITE.' WHERE id_user='.$id;
		if( !($result = $db->sql_query($sql)) )
		{
			message_die(GENERAL_ERROR, 'Could not query recent classification information', '', __LINE__, __FILE__, $sql);
		}
		if (($db->sql_numrows($result)) >= 1) return false; else return true; 
	}

	//
	// On vérifie que le site demandé existe
	
	function verification_existance_id_site($vote)
	{
		global $db;
		$sql = 'SELECT id_site FROM '. AREABB_CLASS_SITE.' WHERE id_site='.$vote;
		if( !($result = $db->sql_query($sql)) )
		{
			message_die(GENERAL_ERROR, 'Could not check classification information', '', __LINE__, __FILE__, $sql);
		}
		return (($db->sql_numrows($result)) == 1)?  true : false;
	}

	//
	// On récupère l'IP la plus probable du visiteur..
	
	function get_ip() 
	{
		global $HTTP_SERVER_VARS;
	    if (isset($HTTP_SERVER_VARS['HTTP_CLIENT_IP'])){ 
	        return $HTTP_SERVER_VARS['HTTP_CLIENT_IP']; 
	    }elseif(isset($HTTP_SERVER_VARS['HTTP_X_FORWARDED_FOR'])){ 
	        return $HTTP_SERVER_VARS['HTTP_X_FORWARDED_FOR']; 
	    }else{ 
	        return $HTTP_SERVER_VARS['REMOTE_ADDR']; 
	    }
	}
	
	//
	// On s'assure que la personne n'a pas déjà votée.
	
	function verification_vote_24h($id_site)
	{
		global $db;
		
		$sql = 'SELECT ip FROM ' . AREABB_CLASS_SITE_IP . ' 
				WHERE ip=\''.$this->get_ip().'\'
				AND	id_site=\''.$id_site.'\'			
				AND date > \''.(time()-86400).'\' 
				ORDER BY date DESC LIMIT 1';
		if( !($result = $db->sql_query($sql)) )
		{
			message_die(GENERAL_ERROR, 'Could not check classification information', '', __LINE__, __FILE__, $sql);
		}
		return ($db->sql_numrows($result) > 0)? false : true;
	}

	//
	// On log le vote
	
	function maj_traceur_ip($id_site)
	{
		global $db;
		$sql = 'INSERT INTO ' . AREABB_CLASS_SITE_IP .' (ip,date,id_site) VALUES (\''.$this->get_ip().'\',\''.time().'\','.$id_site.')';
		if( !($result = $db->sql_query($sql)) )
		{
			message_die(GENERAL_ERROR, 'Could not check classification information', '', __LINE__, __FILE__, $sql);
		}
		return true;
	}
	
	//
	// Suppression des caractères interdits
	
	function nettoyage_chaine($str1)
	{
		return addslashes(htmlspecialchars($str1));
	}
	
	//
	// Télécharge l'image, la redimensionne et la stocke sur le serveur..

	function downimage()
	{
		global $HTTP_POST_FILES;
		$type_image = $HTTP_POST_FILES['banniere']['type'];
		switch($type_image)
		{
			case 'image/gif':	$type = '.gif';	break;
			case 'image/jpeg':	$type = '.jpg';	break;
			case 'image/png':	$type = '.png';break;
			default:			$type = false;	return;	
		}
		if (!file_exists($this->repertoire_destination.$HTTP_POST_FILES['banniere']['name']))
		{
			$finfichier2 = $HTTP_POST_FILES['banniere']['name'];
		}else{
			$date = date('ymdhis');
			$finfichier2 =$date.$type;
		}
		
		$image = $this->repertoire_destination.'tmp/'.$finfichier2;
		if (is_uploaded_file($HTTP_POST_FILES['banniere']['tmp_name']))
		{
			move_uploaded_file($HTTP_POST_FILES['banniere']['tmp_name'], $image);
		}	
		switch($type_image)
		{
			case 'image/gif':	$img = imagecreatefromgif($image); break;
			case 'image/jpeg':	$img = imagecreatefromjpeg($image);break;
			case 'image/png':	$img = imagecreatefrompng($image); break;
			default: $type = false;	break;
		}
	    
		$taille = getimagesize($image);
		$largeur = $taille['0'];
		$hauteur = $taille['1'];

		// si une dimension est plus grande que voulu
		if (($largeur>$this->largeur_max) || ($hauteur>$this->hauteur_max))
		{
			//si elle est plus large que la normale
			if ($largeur > $this->largeur_max)
			{
				$largeur2 = $this->largeur_max;
				$hauteur2 = round(($this->largeur_max * $hauteur) / $largeur);
				$largeur = $largeur2;
				$hauteur = $hauteur2;
			}
			//si elle est plus haute que la normale
			if ($hauteur > $this->hauteur_max)
			{
				$hauteur2 = $this->hauteur_max;
				$largeur2 = round(($this->hauteur_max * $largeur) / $hauteur);			
				$largeur = $largeur2;
				$hauteur = $hauteur2;
			}
		
			$img3 = imagecreate($largeur,$hauteur);
			imagecopyresized($img3, $img, 0, 0, 0, 0, $largeur, $hauteur, $taille['0'], $taille['1']);
			
			switch($type_image)
			{
				case 'image/gif': 	imagegif($img3,$this->repertoire_destination.'tmp/'.$finfichier2,90);	break;
				case 'image/jpeg': 	imagejpeg($img3,$this->repertoire_destination.'tmp/'.$finfichier2,90);	break;
				case 'image/png':	imagepng($img3,$this->repertoire_destination.'tmp/'.$finfichier2,90);	break;
				default: $type = false;	break;
			}
		}
		copy ($this->repertoire_destination.'tmp/'.$finfichier2, $this->repertoire_destination.$finfichier2);
		unlink($this->repertoire_destination.'tmp/'.$finfichier2);
		return $finfichier2;
	}

	function verification_saisie($edition=0)
	{
		global $lang,$HTTP_POST_VARS,$HTTP_POST_FILES;
		if (($HTTP_POST_VARS['titre'] != '') && ($HTTP_POST_VARS['url'] != '') && ($HTTP_POST_VARS['desc'] != ''))
		{
			// vérifie qu'un fichier a bien été soumis
			if (isset($HTTP_POST_FILES) && is_array($HTTP_POST_FILES)) 
			{
				// pas d'erreur lors de l'upload
				if ($HTTP_POST_FILES['banniere']['error'] == UPLOAD_ERR_OK)  
				{
					// vérifie la taille en octets
					if ($HTTP_POST_FILES['banniere']['size'] <= $this->file_max_size)
					{
						// vérifie l'extension du fichier recu
						switch($HTTP_POST_FILES['banniere']['type'])
						{
							case 'image/gif':	$type = 'gif';	break;
							case 'image/jpeg':	$type = 'jpg';	break;
							case 'image/png':	$type = 'png';	break;
							default:			$type = ''; 	break;
						}						
						if (in_array($type,$this->authorized_extensions))
						{ 
							// On renvoit les données nettoyées
							$this->titre =			$HTTP_POST_VARS['titre'];  
							$this->url =			$HTTP_POST_VARS['url'];
							if (!ereg("^http://(.*)",$this->url)) $this->url = "http://".$this->url;		
							$this->desc =			$HTTP_POST_VARS['desc'];  
								
							// on stocke l'image réduite à la taille de 500*200 dans /images/bannieres/
							$this->banniere = 		$this->downimage();
							$message = 				'OK';
						}
						else 
						{
							$message = sprintf($lang['class_type'],implode(', ',$this->authorized_extensions));
						}
					}else{
						$message = sprintf($lang['class_grosse'],ceil($this->file_max_size/1024)); 
					}
				}else if ($edition == 1 && $HTTP_POST_VARS['banniere'] == ''){
					// On renvoit les données nettoyées
					$this->titre =  		$HTTP_POST_VARS['titre'];  
					$this->url = 			$HTTP_POST_VARS['url'];
					if ( !ereg("^http://(.*)",$this->url) ) $this->url = 'http://'.$this->url;
					$this->desc = 			$HTTP_POST_VARS['desc'];  
					$this->banniere = 		'';
					$message = 				'OK';
				}else{
					unset($erreur);
					switch ($HTTP_POST_FILES['banniere']['error'])
					{
	                   case 1: 
	                   case 2: $erreur =  sprintf($lang['class_grosse'],ceil($this->file_max_size/1024)); break;
	                   case 3: // UPLOAD_ERR_PARTIAL
							$erreur =  " L'envoi du fichier a été interrompu pendant le transfert !"; break;
	                   case 4: // UPLOAD_ERR_NO_FILE
							$erreur =  " Le fichier que vous avez envoyé a une taille nulle !"; 
					}
           			$message = $lang['class_upload'].$erreur;
				}
			}else{
				$message = $lang['class_banniere'];
			}
		}else{
			$message = $lang['class_champs'];	
		}
		return $message ;		
	}
	
	//
	// On prépare l'Edition d'une fiche..
	
	function prepare_edit($result=null,$type=null)
	{
		global $db,$template,$userdata;
		if ($result == null)
		{
			$sql = 'SELECT * FROM '. AREABB_CLASS_SITE .' 
				WHERE ';
			$sql .= ($type == null)? 'id_user='.$userdata['user_id']:'id_site='.$type;
			$sql .= ' limit 0,1';
			if( !($resultat = $db->sql_query($sql)) )
			{
				message_die(GENERAL_ERROR, 'Could not query recent classification information', '', __LINE__, __FILE__, $sql);
			}
		}
		$row = $db->sql_fetchrow($result) ;
		$template->assign_vars(array(
			'TITRE' 	=> $row['titre_site'],
			'URL' 		=> $row['url_site'],
			'DESC' 		=> $row['description'],
			'BANNIERE' 	=> '<img src="'.$this->repertoire_destination.$row['banniere'].'" border="0" align="center" />'
		));	
		return true;
	}
	
	//
	// On affiche une ligne de code retour en fonction de 3 paramétres :
	// l'ID du site, le slogan demandé et une image..
	
	function code_vote($id_site,$slogan,$banniere='')
	{
		global $template,$board_config,$id_squelette,$phpEx;
		$code = '<a href="http://'.$board_config['server_name'].$board_config['script_path'].NOM_CLASSEMENT.'.'.$phpEx.'?salle='.$id_squelette.'&action=vote&site='.$id_site.'" title="'.$slogan.'" target="_blank" />'; 
		$code .= ($banniere != '')? '<img src="'.$banniere.'" border="0" alt="'.$slogan.'" />': $slogan ;
		$code .= '</a>';
		
		$template->assign_block_vars('code_source', array(
			'CODE' 		=> $code			
		));
		return true;
	}
}
?>