<?php
#=
/*
Copyright 2002, Daniel Deycard, Jacques Messines, Stéphanie Roussel, Jean-Marie Treins


This file is part of GiBii/Melia.
GiBii/Melia is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

GiBii/Melia is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with GiBii/Melia; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

Modifié par Fabien NGUYEN

****************************************************************************/

if (!isset($util_inc)) {
$util_inc=1;

//pour la traduction spécifique de ce script
define("IMPOS_ACC","Impossible d'acc&eacute;der à la base %s <br />");
define("OUV_SESSION","Ouvrir une nouvelle session");

//constantes utilisables dans tous les scripts
define("ALPHA","ABCDEFGHIJKLMNOPQRSTUVWXYZ");
define("NUM","0123456789");
define("ALPHANUM",ALPHA.NUM);
define("ACCENTS_AVEC","ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÝàáâãäåæçèéêëìíîïðñòóôõöùúûüýÿ");
define("ACCENTS_SANS","AAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaaceeeeiiiionooooouuuuyy");
define("ACCENTS_MINUS_AVEC","àâäéèêëîïôöùûüçñ");
define("ACCENTS_MINUS_SANS","aaaeeeeiioouuucn");

define("PONCTUATION","?',\" "); //ponctuation trouvée dans les noms et que l'on veut éliminer



function dbg($nomvar='',$comment='') {
if ($nomvar) {
    global $$nomvar;
    $temp=nl2br(print_r($$nomvar,true));
    $temp=str_replace("  ","&nbsp;",$temp);
    print "<br /><font color=\"red\"><b>$nomvar $comment : </b></font>";
    print $temp;print "<br />\n";
    }
else {
    print "<hr /><b>";print "SESSION : </b>";print_r($_SESSION);print "<br />\n";
    print "<br /><b>";print "POST : </b>";print_r($_POST);print "<br />\n";
    print "<br /><b>";print "GET : </b>";print_r($_GET);print "<hr />\n";
    }
}

function dbgv($valeur,$comment='') {
print "<br /><font color=\"magenta\"><b>- $comment : </b></font>";print_r($valeur);print "<br />\n";
}


//Mettre une ou plusieurs variables en session.
//Syntaxe comme session_register mais...
//  - marche dans toutes les versions de PHP !
//  - suppose que les variables mises en session sont affectées AVANT L'APPEL
//  - si les variables de session sont modifiées, sesion_puts doit être appelé à nouveau
function session_puts() { //nombre variable de paramètres (noms de variables)
for ($i=0;$i<func_num_args();$i++) {
    $nomvar=func_get_arg($i);     //ex : $nomvar="a" et $a='AAA'
    global $$nomvar;              //global $a;
    $_SESSION[$nomvar]=$$nomvar;   //$_SESSION['a']='AAA'; PHP>=4.1 ou register_globals=0ff
    }
}


function aneantir_session() {
@session_start(); //effet pervers : session start crée $_SESSION impossible à détruire !
//détruire les éventuelles variables globales (php<=4.2 et register_globals=On)
//utilisation de each car foreach travaille sur une copie du tableau qui n'est donc pas modifié
foreach($_SESSION as $cle => $v) {     //$session['a']=8   $cle='a'
    global $$cle;                     //global $a
    unset($$cle);                     //unset($a)
}
$_SESSION=array();
session_unset();                 //quelques couches de plus
session_destroy();               //pour assurer...
}

function recuprequest() { //récupère REQUEST (cad GET et POST)
if (isset($_REQUEST)) $request=&$_REQUEST;
else $request=array();
foreach($request as $cle=>$valeur) {
    global $$cle; $$cle=$valeur;
    //attention : le global transporte au niveau 0, pas à une fonction
    //appelante éventuelle (qui devra faire global (...) elle-aussi).
    }
return $request;
}

function recupvars() {   //ordre GPS
//récupérer $_GET, $_POST et $_SESSION en variables globales)
//suppose que les variables superglobales $_XXX existent (PHP >4.2 ?)
recuprequest();
if (isset($_SESSION)) {
    foreach($_SESSION as $cle=>$valeur) {
        global $$cle;
        $$cle=$valeur;
        }
    }
}

function reconnecter($msg,$suite) {
    print "<html><head>";
    print "<title>Reconnecter</title>";
    if (isset($_SESSION['etab_theme']))
        $href='../themes/'.$_SESSION['etab_theme'].'/b2i.css';
    else
        $href='../include/general.css';
    print "<link rel=\"stylesheet\" href=\"$href\">\n";
    print "</head><body class=\"arialadmin \">";
    print "<form  id=\"formz\" target=\"_top\" name=\"form1\" action=\"$suite\" method=\"post\">\n";
    print "<p style=\"text-align:center\">$msg</p>";
          print "<p style=\"text-align:center\">\n";
    print "<input type=\"submit\" class='coul' name=\"newessai\" value=\"Ouvrir une nouvelle session\" accesskey=\"O\" tabindex=\"1 \" />\n";
    print "</form>";
    print "<script type=\"text/javascript\">document.form1.newessai.focus();</script>";
    print "</p></body></html>";
    exit();
    }


function garder($etab,$compte,$code,$login='') {
    //noter l'erreur dans une table (erreurs_logins)
    //on peut l'utiliser ici même pour bloquer les multiples logins erronés successifs
    //alert("GARDER : $code\n");

    $tip=explode(',',$_SERVER['REMOTE_ADDR']);
    $ip=ip2long($tip[0]);
    if ($login) $log=", login='$login' ";
    else $log='';
    query("INSERT INTO erreurs_logins SET quand=NOW(), ip=$ip,
                compte_id=$compte, etab_id=$etab, code='$code' $log");
}


function vosPapiers() {
    return sha1($_SERVER['HTTP_USER_AGENT'].$_SERVER['REMOTE_ADDR']);
}


function verifierSession() {
    @session_start();
    //print_r($_SESSION);
    if (empty($_SESSION['etab_id'])) {
        garder(0,0,'PAG');
        return 'Accès anormal à cette page ou numéro d\'établissement anormal';
        }
    if (!isset($_SESSION['secure'])) {
        garder($_SESSION['etab_id'],$_SESSION['sess_compte_id'],'PER');
        return 'Session détruite par PHP (durée limite dépassée) ou cookie périmé.';
        }
    if (vosPapiers()!=$_SESSION['secure']) {
        garder($_SESSION['etab_id'],$_SESSION['sess_compte_id'],'XSS');
        return "Problème d'en-tête du navigateur (XSS) : ".$_SERVER['HTTP_USER_AGENT'];
        }
    if (time()-$_SESSION['last_access']>$_SESSION['etab_sess_timeout']) {
        garder($_SESSION['etab_id'],$_SESSION['sess_compte_id'],'TMO');
        return 'Durée accordée par GiSCCo dépassée.';
        }
    $_SESSION['last_access']=time();
    return '';
}


function opensession($statut,$boutonlogin=true) {
//récupération des variables (GET, POST, SESSION)
//le flot html ne doit pas avoir démarré
global $host,$user,$mdp,$db;
connecte($host,$user,$mdp,$db);
$msg_sess=verifierSession();                          //redémarre la session
if ($statut=="Sadmin") {
    $LOGIN="./index.php";
    $etab_id=0;
    }
else {
    global $etab_id;            //lorsqu'il est défini
    if (isset($etab_id))   ;    //rien
    elseif (isset($_SESSION['etab_id'])) $etab_id=$_SESSION['etab_id'];
    elseif (isset($_COOKIE['etab_id'])) $etab_id=$_COOKIE['etab_id'];
    else $etab_id=0;
    if ($etab_id) $LOGIN="../login/login.php?etab_id=$etab_id";
    else $LOGIN="../index.php";
    }

if ($msg_sess) {        //VérifierSession a foiré
    //if ($boutonlogin)   //on propose la reconnexion
    if ($boutonlogin) reconnecter($msg_sess,$LOGIN);
    else exit();
    //else exit();
    }

global $sess_statut;    //sera globalisé dans recupvars, mais ce global
                        //permet de la retrouver aussi dans ce script opensession !

recupvars();            //globalise les variables de session (mais elles sont inacessibles
                        //à cette fonction, sauf $sess_statut grâce au global ci-dessus).

//jak
if (!isset($etab_id))  $etab_id=0; //je ne vois pas l'intérêt !!! dd

if (isset($sess_statut)) {
    $mess="Statut $sess_statut - Statut attendu=$statut";
    $cptgarder=$_SESSION['sess_compte_id'];
    $codegarder='STA';
    $result=(($sess_statut==$statut) || ($sess_statut=="Sadmin"));
}
else {
    $mess='Session expirée ou invalide.';
    $cptgarder=0;
    $codegarder='EXP';
    $result=false;

}

if (!$result) {
   //pas de session en cours et il faut se reloger en abandonnant le programme appelant
   if ($boutonlogin) { //un seul bouton login et un seul log
       garder($etab_id,$cptgarder,$codegarder);
       reconnecter($mess,$LOGIN);
       }
   else exit();
   }

inclureTraduction(); //paramètre inutile maintenant. Avant : $_SERVER['SCRIPT_NAME']

//print "<br />";print_r($_SESSION);print "<br />";
}

function boutonlogin($url) {
global $etab_id, $entree_SSO;
print "<p style=\"text-align:right\"><form name='formo2' method=\"post\" target='_top' action='$url?etab_id=$etab_id'>\n";
if (isset($_SESSION['etab_id'])) $msg_btn="Déconnexion"; else $msg_btn="Ouvrir une nouvelle session";
if ((@$_SESSION['etab_typauth_id']==3) and ($entree_SSO==1)) $msg_btn="Retour au portail";
print "<input class='coul' type='submit' name='bout' value='".$msg_btn."' accesskey='".substr($msg_btn,0,1)."' />";
print "</form></p>";
}

function connecte($host,$user,$mdp,$db) {
$link  = @mysql_connect($host, $user, $mdp)
         or
         die ("Impossible d'accéder à la base $db <br>".mysql_error());
if (!@mysql_select_db($db, $link))
    die("Impossible de sélectionner la base $db");
return $link;
}


function connexion($db) {
global $host,$user,$mdp;
if (isset($host)) return connecte($host,$user,$mdp,$db);
else return connecte("localhost","root","",$db);
}


function query($sql) {
//print "$sql<br />";
$res=@mysql_query ($sql) or
     die ("<p><b>Echec de la requête SQL : </b><br>$sql<br><b>".mysql_error()."</b></p>");
return $res;
}


function getparams($avecsession=true) {
//récupération des paramètres globaux à mettre (éventuellement) en variables de session,
//même s'ils ne sont pas tous utiles tout le temps.
//connecte($host,$user,$mdp,$db); //déjà réalisée au niveau au-dessus

$sql_param="SELECT param_nom,param_type,param_val FROM _params_globaux";
$resparam=query($sql_param);
while (list($PARAM_NOM, $param_type, $param_val)=mysql_fetch_array($resparam)) {
    //Exemple : $PARAM_NOM=="etab_nb_validations"
    //$$PARAM_NOM==$etab_nb_validations
    global $$PARAM_NOM;
    switch ($param_type) {
        case "s" : $$PARAM_NOM=stripslashes($param_val);break;
        case "i" : $$PARAM_NOM=(int) $param_val;break;
        case "a" : break;  //à faire
        }
    //pas de session pour les param_tag=2, ça ne touche que sadmin..
    if ($avecsession) session_puts($PARAM_NOM);
    }
$sess_ascol=ascol();
}

function getparams_etab($id) {
//récupération des paramètres de l'établissement à mettre en variables de session,
//même s'ils ne sont pas tous utiles tout le temps.
$resparam=query("SELECT * FROM etablissements WHERE etab_id=$id;");
//A ce niveau, on doit avoir un seul enregistrement à décortiquer
$resetab=mysql_fetch_array($resparam);

//Combien de champs ?
$nbfields=mysql_num_fields($resparam);
for ($i=0; $i<$nbfields; $i++) {
    $name=mysql_field_name($resparam,$i);
    $param_type=mysql_field_type($resparam,$i);
    //Préfixer les variables avec 'etab_' pour éviter les confusions
    if (substr($name, 0, 4)!="etab") $sessvar="etab_".$name;   //sauf $etab_id
    else $sessvar=$name;

    global $$sessvar;
    switch ($param_type) {
        case "string": case "datetime": $$sessvar=stripslashes($resetab["$name"]);break;
        case "int" : $$sessvar=(int) $resetab["$name"];break;
        case "array" : break;  //à faire
        }
    session_puts($sessvar);
    }//fin de lecture de
}

function getparams_auth($etab_id) {
global $host,$user,$mdp,$db;
//récupération des paramètres globaux à mettre en variables de session,
//même s'ils ne sont pas tous utiles tout le temps.
connecte($host,$user,$mdp,$db);
$resparam=query("SELECT param_nom,param_type,param_val FROM _params_auth
                    WHERE etab_id=$etab_id");
while (list($PARAM_NOM, $param_type, $param_val)=mysql_fetch_array($resparam)) {
    //Exemple : $PARAM_NOM=="etab_nb_validations"
    //$$PARAM_NOM==$etab_nb_validations
    global $$PARAM_NOM;
    switch ($param_type) {
         case "s" : $$PARAM_NOM=stripslashes($param_val);break;
         case "i" : $$PARAM_NOM=(int) $param_val;break;
         case "a" : break;  //à faire
         }
     session_puts($PARAM_NOM);
    }
}

function repertoire($r,$remonte) {
$t=explode('/',$r); //ex : [0]=usr [1]=b2i [2]=login [3]=login.php
$u='';
for ($i=0;$i<count($t)-$remonte;$i++) $u.=$t[$i].'/';
$u=str_replace("//","/",$u);
return $u;
}

/* A garder pour une autre occasion
function getscriptpath() {
//surtout utile pour les LOAD DATA
    $ch=$_SERVER["PATH_TRANSLATED"];
    $ch=stripslashes($ch);
    $ok=ereg_replace("\\\\","/",$ch);
    $ok=ereg_replace("//","/",$ch);

    $ok=substr($ok,0,strrpos($ok,'/')); //dernier slash
    $ok=substr($ok,0,strrpos($ok,'/')); //avant-dernier
    return $ok;
}
*/

//Chemin relatif du fichier contenant cette fonction (et donc des fichiers
//qu'on aura mis à côté) à partir du répertoire du script lancé (prog principal)
//ex :  cette fonction est dans A=.../www/b2i/include
//      le script appelant est dans B=.../www/b2i/sadmin/maj
//      la fonction retourne le chemin pour aller de B à A : ../../include

function inclureTraduction() {
$replangue=$_SESSION['sess_reptraduction'];  // .../b2i/langues/fr/
foreach(get_included_files() as $fichier) {  //ex : /.../b2i/eleve_choix.php ou un include
    //pour le cas serveur Windows avec param=__FILE__
    $freplace=str_replace("\\",'/',$fichier);
    $strrchr=strrchr($freplace,'/');         // /eleve_choix.php
    $r=substr($strrchr,1);                   //  eleve_choix.php
    $ficlangues=$replangue.'fr.'.$r;         // .../b2i/langues/fr/fr.eleve_choix.php
    //print "<font color=red>";print $ficlangues;print "</font><br />";
    if (file_exists($ficlangues)) {
        //print "inclus<br>";
        include_once($ficlangues);  //les define sont visibles à tous les niveaux
        }
    }
}


function ouSeTrouveCetteFonction() {
$repinc=str_replace('\\','/',realpath(dirname(__FILE__)));
$reppoint=str_replace('\\','/',realpath(dirname('.')));

$trepinc=explode("/",$repinc);
$treppoint=explode("/",$reppoint);
$plusbas=array_diff($trepinc,$treppoint);
$plushaut=array_diff($treppoint,$trepinc);
$descente=implode("/",$plusbas).'/';
$montee=str_repeat('../',count($plushaut));
return $montee.$descente;
}


function onVientDeLaMemePage() {
return (basename($_SERVER['HTTP_REFERER']) == basename($_SERVER['SCRIPT_NAME'])); 
}

function normernom($nom) {
return deponctuer(desaccentuer(strtolower($nom)));  //déponctuation très partielle pour l'instant
}

function posebouton(&$table,$nombouton) {
global $graphique;
$params=$table[$nombouton];
if ($_SESSION['sess_statut']=='Sadmin') {
    $graphique=true;
    //On ne fait rien, $graphique est lu au début de la page sadmin_bas
    //$graphique=false;
    }
else {
    if ($_SESSION['etab_typauth_id']==2 && !$params['ldap']) return false;
    if ($_SESSION['etab_typauth_id']==3 && !$params['cas']) return false;
    $graphique=!$_SESSION['etab_menus_CSS'];
    }

if (isset($params['enabled']) && $params['enabled']) return false;
/*par ex. pour le bouton "Traiter les incertains", on a :
        'enabled' => $_SESSION['oui_incertains']==1
  et par suite on affichera le bouton lorsque le résultat sera vrai.
  Il y a d'autres cas analogues
*/

if (isset($params['href']))$href=" href=\"".$params['href']."\" ";
else $href='javascript:void(0);';
if (isset($params['onclick'])) $onclick=" onclick=\"".$params['onclick']."\" ";
else $onclick='';
 
$title=$params['title'];

if ($graphique) {     //paramètre de l'étab pour le choix du mode gr / CSS
    $pgraph=$params['gr'];
    $src=$pgraph['src'];
    }
else {
    $pgraph=$params['css'];
    $txt_bouton=$pgraph['txt_bouton'];
    }
$class_td=$pgraph['class_td'];
if ($class_td)
    $class_td="class=\"$class_td\"";
if (isset($pgraph['class_a'])) {
    $class_a=$pgraph['class_a'];
    if ($class_a) $class_a="class=\"$class_a\"";
    }
if (isset($params['target']))
    $target=$params['target']; else $target='_self';
if ($target)
    $target="target=\"$target\"";

print "<td $class_td>";

if (isset($params['vide']))
	$vide=$params['vide']; else $vide=false;

if ($graphique) {
    //if ($href=="href=\"\"" && $title=="") {    // cas du bouton vide test à revoir
    if ($vide) {    // cas du bouton vide    
        print "<img src=\"$src\" border=\"0\" />";
        }
    else {
        print "<a $href $onclick $target>";
        print "<img src=\"$src\" border=\"0\" title=\"$title\"/>";
        print "</a>\n";
        }
    }
else {
    if ($class_td!="bouton_vide") {
        print "<a $class_a $href $onclick $target Title=\"$title\">$txt_bouton</a>\n";
        }
    }
print "</td>\n";
return true; //ce qui signifie que le bouton a été affiché.
}

/*
function redirige($url){
die('<meta http-equiv="refresh" content="0;URL='.$url.'">');
}
*/
function retour($url,$finpage="") {
 //   print "<p style=\"text-align : center;\">\n";
    print "<br/> \n";
    print "<table border =\"0\" width=\"100%\"><tr><td align = \"center\">\n";
    print "<form action=\"$url\" method=\"post\">\n";
    print "<input class=\"coul\" type=\"submit\" name=\"retour\" value=\"Retour\" accesskey=\"R\">\n";
    print "</form>$finpage\n";
    print "</td></tr></table>\n";
}

function champ_dans_table($champ,$table,$base) {
//utiliser APRES une connexion à la base de données
$resf=mysql_list_fields($base,$table);
$nbfields=mysql_num_fields($resf);
$ret=false;
for ($i=0;$i<$nbfields;$i++) {
    if  (mysql_field_name($resf,$i)==$champ) {
        $ret=true;
        break;
        }
    }
mysql_free_result($resf);
return $ret;
}

function table_dans_base($table,$base) {
//utiliser APRES une connexion à la base de données
$ress=mysql_list_tables($base);
while (list($temp)=mysql_fetch_array($ress))
   if ($temp==$table) return true;
return false;
}

function dbexists($host,$user,$mdp,$db) {
$link  = @mysql_connect($host, $user, $mdp);
if (@mysql_select_db($db, $link)) return true;
else return false;
}

function itemacquis($eleve_id,$item_id,$disc_id=-1) {
if ($disc_id==-1) $et=''; else $et=" and disc_id=$disc_id";
$resacq=query("SELECT * FROM resultats
               WHERE eleve_id=$eleve_id
                 and item_id=$item_id
                 $et");
return (mysql_num_rows($resacq)!=0);
}


function bool($check_result) {
     //transforme les 'on' des checkbox par des 1
     if ($check_result=='on') $res=1;
     else $res=0;
     return $res;
}

function getlibperso($etab_id,$item_id)     {
     //retourne le libellé perso s'il existe, le vide sinon
     $libperso="";
     //On suppose une connexion mysql faite
     $resperso=query("SELECT libelle FROM libelles_perso WHERE etab_id=$etab_id and item_id=$item_id;");
     if (mysql_num_rows($resperso)>0) {
         $rowperso=mysql_fetch_array($resperso);
         $libperso=$rowperso["libelle"];
     }
     return $libperso;
}

//$repaussi==true ~> efface aussi $rep
//retourne true si tout s'est bien passé,
//false si un fichier est resté (problème de permission ou attribut lecture sous Win
//dans tous les cas, le maximum possible est supprimé.
function deltree($rep,$repaussi=true) {
static $niv=0;
$niv++;
if (!is_dir($rep)) return false;
$handle=opendir($rep);
if (!$handle) return false;
while ($entree=readdir($handle)) {
    if (is_dir($rep.'/'.$entree)) {
        if ($entree!='.' && $entree!='..') {
            $ok=deltree($rep.'/'.$entree);
        }
        else $ok=true;
    }
    else {
        $ok=@unlink($rep.'/'.$entree);
    }
}
closedir($handle);
$niv--;
if ($niv || $repaussi) $ok &= @rmdir($rep);
return $ok;
}

function creertousrep($fic) {
//crée tous les répertoires intermédiaires s'il n'existent pas
//$fic est de la forme '../rep1/rep2/.../repn/bloub' et sont créés :
//../rep1, ../rep1/rep2, ../rep1/rep2/.../repn
//bloub peut ne pas exister ($fic se termine par / donc c'est un rép.)
$p=strpos($fic,'/');
while ($p<strlen($fic) && $p=strpos($fic,'/',$p+1)) {
    //print substr($fic,0,$p);
    if (!is_dir($fic)) @mkdir(substr($fic,0,$p),0777);
}
return $fic;
}

function getfilepath($fichier,$chemin1,$chemin2) {
$r=$chemin1.$fichier;
//alert($r);
//Retourne le chemin du fichier s'il est dans chemin1, sinon dans chemin2
if (!file_exists($r)) $r=$chemin2.$fichier;
return $r;
}


function comboetabs($change) {
   global $cetab;   //cetab est aussi le nom du champ
    //Print "dans cette liste :  ";
    //$change à 1 permet de valider dans un formulaire
    //$dis=disabled pour désactiver
   if ($change==1) {
       $chan="onchange=\"submit();\" ";
       } else $chan="";
   $sql="SELECT * FROM etablissements ORDER BY etab_id;";
   $resultetabs=query($sql);

   print "<select name=\"cetab\" size=\"1\"  style=\"font-size: 8pt;\" $chan>\n";
   //Première ligne vide
   //$selected=($id_selected==0) ? "selected" : "";
   $selected="";
   print "<option $selected value='0'>&nbsp;</option>";
   //print "Nombre d'étabs= ".mysql_num_rows($resultetabs);
   while ($rowrel=mysql_fetch_array($resultetabs)) {
       $etab_id=$rowrel["etab_id"];
       $rne_id=$rowrel["rne"];
       $nom=$rowrel["nom"];
       $ville=$rowrel["ville"];
       //if ($selected) echo
       if ((isset($cetab)) and ($cetab==$etab_id)) $selected=" selected "; else $selected="";
       print "<option value='$etab_id'  $selected>";
       $lignetab=stripslashes($etab_id." -  ".$nom." ".$ville);
       print $lignetab;
       print "</option>\n";
       }
   mysql_free_result($resultetabs);
   print "</select>";
}


function ascol() {
  //retourne l'année scolaire en cours
  //$moisref est le mois de rentrée scolaire !
  global $MOIS_RENTREE;
  //print "<br>mois rentrée = $MOIS_RENTREE<br>";
  $today= getdate();
  $mois=$today['mon'];
  $an=$today['year'];
  if ($mois<$MOIS_RENTREE-1) $an--;
  return $an;
}



function prepare_download($fichier) {
//Ajout de Bea
 // Test du navigateur : IE ou autre ?
 if(strpos($_SERVER['HTTP_USER_AGENT'],'MSIE'))
 {
    header('Content-Type: application/force-download');
 }
 else
 {
    header('Content-Type: application/octet-stream');
 }
	
//utilisable seulement dans un script dont les seules sorties (print)
//constituent le contenu du $fichier
header('Content-Type: application/octetstream');
header('Content-Disposition: filename="'.$fichier.'"');
header('Pragma: no-cache');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Transfer-Encoding: binary');
}

function superflush() {
static $numero=0;
//pour vider les buffers qui précèdent
print "<span id=\"abraracourcix$numero\">".str_repeat(chr(0),5000)."</span>\n";
print "<script language=\"javascript\">
        var tagdiv=document.getElementById('abraracourcix$numero');
        //alert(tagdiv);
        tagdiv.innerHTML='';
       </script>\n";
flush(); //buffer inaccessible de PHP (4 Ko)
$numero++;
}

//retourne une chaîne donnant les caractéristiques de la session précédente
function oldsession() {
global $sess_precdate,$sess_nbsessions,$sess_machinecliente,$sess_ip,$MODULE;
//affiché dans chaque frame haute, ligne 1 colonne 3
$num_session_prec=$sess_nbsessions;

$ret="<p style=\"text-align:right;
                 font-family:sans-serif;
                 font-style:italic;
                 font-size:x-small;\">\n";
if ($num_session_prec==0) {
    $ret.="<strong>Première session avec $MODULE.</strong>";
}

else {
    $ret.="<strong>Session précédente</strong> : n°$num_session_prec";
    $ret.="<br />le $sess_precdate<br />";
    if (!empty($sess_ip) && $sess_ip=="127.0.0.1") $ret.="depuis le serveur $MODULE.";
    else {
        if (!empty($sess_ip)) $ret.=$sess_ip;
        if (!empty($sess_machinecliente)) $ret.=" (".$sess_machinecliente.").";
    }
}
$ret.="</p>\n";
return $ret;
}

//stocke dans comptes les caractéristiques de la session précédente
function enregistre_session($compte_id) {
//enregistre la précédente session dans la table compte (un seul niveau)
$ip4=$_SERVER['REMOTE_ADDR'];
$tip=explode(',',$ip4);
$ip4=$tip[0];
$mac=gethostbyaddr($ip4);
//$mac="ouioui";
$tmac=explode('.',$mac);
$mac=$tmac[0];
$timestamp=strtotime("now");
$ip=ip2long($ip4);
query("UPDATE comptes
          SET actif=1,
              nbsessions=nbsessions+1,
              precdate=$timestamp,
              ip='$ip',
              machinecliente='".secs($mac)."'
        WHERE compte_id=$compte_id");

//enregistre aussi dans une table non interfacée, pour retrouver les malotrus usurpateurs
query("INSERT INTO connexions SET compte_id=$compte_id, quand=NOW(), ip='".secs($ip)."', machinecliente='".secs($mac)."'");
}


// Envoie un mail à $to avec le sujet $subject de $from en utilisant un modele txt ou html (fichier $modele)

function envoi_mail($from, $to, $cc, $subject, $modele, $var1, $var2="" ) {
//Le message est constitué des différentes lignes du modèle,
//où les variables [[var1]] et [[var2]] seront remplacéeés par $var1 et $var2
$message="";
//ouvrir en lecture le fichier $modele
$resfile=fopen($modele,'r');

//lire chaque ligne en remplaçant les variables
  while (!feof ($resfile)) {
   $buffer = fgets($resfile);
   //remplacer   [[var1]] et [[var2]]
   $buffer=str_replace('[[var1]]',$var1,$buffer);
   if ($var2!="") $buffer=str_replace('[[var2]]',$var2,$buffer);
   $message.=$buffer;
   }
fclose($resfile);
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
$headers .= "From: ".$from."\r\n";
if ($cc!='') $headers .= "Cc: ".$cc."\r\n";

$ret=@mail($to,$subject,$message,$headers);
if (!isset($ret)) $ret=false;
return $ret;
//return $message;
}

function get_oui_incertains() {
global $etab_id,$oui_incertains;
$e=mysql_num_rows(query("SELECT * FROM eleves WHERE tag=1 and etab_id=$etab_id LIMIT 1"));
$p=mysql_num_rows(query("SELECT * FROM profs WHERE tag=1 and etab_id=$etab_id LIMIT 1"));
$oui_incertains=0;
if ($e) $oui_incertains|=1;
if ($p) $oui_incertains|=2;
session_puts('oui_incertains');
return $oui_incertains;
}


function getmicrotime() {
  list($msec, $sec)=explode(" ",microtime());
  return ((float)$msec  + (float)$sec);
}

// renvoie une chaîne désaccentuée
function strip_accents($ch) {
$accents='àâäéèêëîïôöùûüçñ';
$sansacc='aaaeeeeiioouuucn';
for ($i=0;$i<strlen($ch);$i++)  {
    $p=strpos($accents,$ch[$i]);
    if ($p!==false) $ch[$i]=$sansacc[$p];
    }
return $ch;
}

function vbase100($v) { //pour calculer et normaliser le numéro de version : 4.3.5 devient 40305
$tv=explode('.',$v);

if (!isset($tv[2]))  $tv[2]=0; //pour la première fois que x.y passera en x.y.z
if (!isset($tv[1]))  $tv[1]=0;

//On considère que la version est un nombre en base 100 (ce qui suppose que
//la version v.w.x est telle que v, w et x sont inférieurs à 100.
//le maximum est inférieur à 1.0.0.0 (base 100) = 100^3 (base 10) donc... pas d'overflow !

return 10000*$tv[0]+100*$tv[1]+$tv[2];
}

function desaccentuer($s) {  //Remplace "ÀÁàá ab AB ./:" par ""AAaa ab AB ./:"
for ($i=0;$i<strlen($s);$i++)
    if (($p=strpos(ACCENTS_AVEC,$s[$i]))!==false) $s[$i]=substr(ACCENTS_SANS,$p,1);
return $s;
}

function deponctuer($s) {
return preg_replace('/['.PONCTUATION."]/","",$s);
}

function pluriel($nb) {
return ($nb>1)? 's':'';
}

function submit_bouton($nom,$libelle,$actif) {
if ($actif) $disabled=''; else $disabled='disabled="disabled"';
print "<input type=\"submit\" name=\"$nom\" value=\"$libelle\" $disabled />\n";
}

function submit_activer($nomcomplet) {  // exemple : 'form1.boutonsubmit'
print "<script  langage=\"javascript\">\n
        if (document.$nomcomplet) document.$nomcomplet.disabled='';\n
       </script>\n";
}

function get_theme_defaut($id){
global $etab_theme_defaut;
$sql=query("SELECT theme FROM etablissements WHERE etab_id=$id;");
$result=mysql_fetch_array($sql);
$etab_theme_defaut=$result[0];
}

function get_theme_user_defaut($id){
global $theme_user_defaut;
$sql=query("SELECT theme FROM comptes WHERE compte_id=$id;");
$result=mysql_fetch_array($sql);
$theme_user_defaut=$result[0];
}

//sécuriser la valeur d'un champ (anti-injection SQL pour une chaîne)
function secs($valeur) {
if (get_magic_quotes_gpc()) {
   $valeur = stripslashes($valeur);
   }
$v=mysql_real_escape_string($valeur);
return $v;
}

function seci($valeur) {
$v=(int) $valeur;
return $v;
}

function get_enginemysql() {
//Retourne ENGINE=MYISAM pour MySQL au moins 4.1.2
static $engine=NULL;
if ($engine==NULL) {
	$versionmysql=mysql_get_server_info();
	if ($versionmysql>="4.1.2") $engine=" ENGINE=MYISAM ";
	else $engine="";	
	}
return 	$engine;
}

function piratage() {
//rien pour l'instant (version 5.1)
}

	
} //if isset  1°) (ne pas supprimer !!!) 2°) DOIT ETRE EN DERNIER DANS LE SCRIPT !!!!!


?>