sondages. attention, les includes sont récupérés mais pas encore en templates cvs...
authorx2000habouzit <x2000habouzit>
Sun, 8 Feb 2004 12:38:25 +0000 (12:38 +0000)
committerx2000habouzit <x2000habouzit>
Sun, 8 Feb 2004 12:38:25 +0000 (12:38 +0000)
configs/mails.conf
include/sondage.footer.inc.php [new file with mode: 0644]
include/sondage.header.inc.php [new file with mode: 0644]
include/sondage.requetes.inc.php [new file with mode: 0644]
include/sondage.utils.inc.php [new file with mode: 0644]
include/valid_sondages.inc.php
templates/include/form.valid.sondages.tpl [new file with mode: 0644]
templates/mails/valid.sondages.tpl [new file with mode: 0644]

index ba897ca..f13b74c 100644 (file)
@@ -21,3 +21,8 @@ cc=Equipe Polytechnique.org <validation+trombino@polytechnique.org>
 [valid_evts]
 from=Equipe Polytechnique.org <validation+evts@polytechnique.org>
 cc=Equipe Polytechnique.org <validation+evts@polytechnique.org>
+
+[valid_sondages]
+from=Equipe Polytechnique.org <validation+sondages@polytechnique.org>
+cc=Equipe Polytechnique.org <validation+sondages@polytechnique.org>
+
diff --git a/include/sondage.footer.inc.php b/include/sondage.footer.inc.php
new file mode 100644 (file)
index 0000000..555b1dc
--- /dev/null
@@ -0,0 +1,10 @@
+<?php
+
+/*
+ * Footer spécial sondage (sans les menus x.org)
+ */
+
+?>
+
+</body>
+</html>
diff --git a/include/sondage.header.inc.php b/include/sondage.header.inc.php
new file mode 100644 (file)
index 0000000..59ff2a9
--- /dev/null
@@ -0,0 +1,52 @@
+<?php
+
+/*
+ * Header spécial sondage (sans les menus x.org)
+ */
+
+// Pour des url relatives !!!
+require_once("appel.inc.php");
+?>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+    <meta name="description" content="Sondage">
+    <meta name="keywords" content="sondage">
+<?php
+       require_once('linkbar.inc.php');
+       if (empty($_SESSION['skin_compatible'])) { ?>
+    <link rel="stylesheet" type="text/css" href="<?php echo url("Sk/Base/Base.css");?>" media="screen">
+<?php } ?>
+    <link rel="stylesheet" type="text/css" href="<?php echo url("Sk/{$_SESSION['name']}/{$_SESSION['name']}.css");?>" media="screen">
+    <link rel="icon" type="image/png" href="/images/favicon.png">
+    <title>
+      Sondage
+    </title>
+    <script language="JavaScript" type="text/javascript">
+      <!--
+      function Msg(msg) {
+        status=msg;
+        document.returnValue = true;
+      }
+      function getNow() {
+        dt=new Date();
+        dy=dt.getDay();
+        mh=dt.getMonth();
+        wd=dt.getDate();
+        yr=dt.getYear();
+        if (yr<1000) yr += 1900;
+        hr=dt.getHours();
+        mi=dt.getMinutes();
+        if (mi<10)
+          time=hr+":0"+mi;
+        else
+          time=hr+":"+mi;
+        days=new Array ("Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi");
+        months=new Array ("janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre");
+        return days[dy]+" "+wd+" "+months[mh]+" "+yr+"<br>"+time;
+      }
+      //-->
+    </script>
+  </head>
+  <body>
diff --git a/include/sondage.requetes.inc.php b/include/sondage.requetes.inc.php
new file mode 100644 (file)
index 0000000..498a3fb
--- /dev/null
@@ -0,0 +1,992 @@
+<?php
+require_once("sondage.utils.inc.php");
+
+/**
+ * @package Requetes
+ * Requêtes MySQL pour les sondages
+ */
+
+
+/** dit si un tableau est vide ou non
+ * @param $donnees tableau à tester
+ * @return booléen
+ */
+function est_vide($donnees) {
+       if (!isset($donnees) || count($donnees)==0)
+               return true;
+       else
+               return false;
+}
+
+/** exécute une requête MySQL et si celle-ci est invalide termine le script
+ * permet de rattraper les erreurs MySQL proprement
+ * @param $requete la requête MySQL à exécuter
+ * @return $resultat le résultat de la requête
+ */
+function mysql_query_p($requete) {
+    $resultat = mysql_query($requete);
+    if ($resultat == false) {
+               erreur("Erreur dans une requête.");
+               require("footer.inc.php");
+               exit();
+       }
+       return $resultat;
+}
+
+/** exécute une requête MySQL select et termine le script si aucun enregistrement n'est renvoyé
+ * @param $requete la requête MySQL
+ * @return $resultat le résultat de la requête
+ */
+function mysql_query_p_non_vide($requete) {
+       $resultat = mysql_query_p($requete);
+       if (mysql_num_rows($resultat) <= 0) {
+               erreur("Erreur : pas d'enregistrement correspondant à la requête.");
+               require("footer.inc.php");
+               exit();
+       }
+       else
+               return $resultat;
+}
+
+/** renvoie la liste des noms d'utilisateurs d'une liste d'enregistrements
+ * @param $liste tableau d'enregistrements (...,username)
+ * @return $res tableau des username correspondants
+ */
+function usernames($liste) {
+    for ($i=0;$i<count($liste);$i++)
+        $res[$i]=$liste[$i]->username;
+    return $res;
+}
+
+/** renvoie la liste des modérateurs d'un sondage
+ * @param $SID l'id du sondage
+ * @return $res un tableau d'enregistrements (promo,nom,prenom)
+ */
+function moderateurs($SID) {
+       $resultat = mysql_query_p("select user_id,prenom,nom,promo,username ".
+       "from x4dat.auth_user_md5 as u,sondage.moderateurs as m ".
+       "where u.user_id=m.idu and m.ids=$SID order by promo,nom,prenom");
+       $res = null;
+       for ($i=0;$i<mysql_num_rows($resultat);$i++) {
+               $donnee=mysql_fetch_array($resultat);
+               $nouveau->prenom=$donnee["prenom"];
+               $nouveau->nom=$donnee["nom"];
+               $nouveau->promo=$donnee["promo"];
+        $nouveau->username=$donnee["username"];
+        $nouveau->uid=$donnee["user_id"];
+               $res[]=$nouveau;
+       }
+       return $res;
+}
+
+/** renvoie le mail des modérateurs (tous) d'un sondage
+ * @param $SID l'id du sondage
+ * @return $res une adresse mail (chaîne)
+ */
+function mail_moderateurs($SID) {
+       $resultat=mysql_query_p("select username ".
+       "from x4dat.auth_user_md5 as u, sondage.moderateurs as m ".
+       "where m.ids=$SID and m.idu=u.user_id");
+       $res = "";
+       for ($i=0;$i<mysql_num_rows($resultat);$i++) {
+               $donnee=mysql_fetch_array($resultat);
+               if ($i!=0)
+                       $res.=",";
+               $res.=$donnee["username"]."@m4x.org";
+       }
+       return $res;
+}
+
+/** renvoie la liste des inscrits d'un sondage
+ * @param $SID l'id du sondage
+ * @return $res un tableau d'enregistrements (promo,nom,prenom)
+ */
+function inscrits($SID) {
+       $resultat = mysql_query_p("select user_id,prenom,nom,promo,username ".
+       "from x4dat.auth_user_md5 as u,sondage.inscrits as i ".
+       "where u.user_id=i.idu and i.ids=$SID order by promo,nom,prenom");
+       $res = null;
+       for ($i=0;$i<mysql_num_rows($resultat);$i++) {
+               $donnee=mysql_fetch_array($resultat);
+               $nouveau->prenom=$donnee["prenom"];
+               $nouveau->nom=$donnee["nom"];
+               $nouveau->promo=$donnee["promo"];
+        $nouveau->username=$donnee["username"];
+        $nouveau->uid=$donnee["user_id"];
+               $res[]=$nouveau;
+       }
+       return $res;
+}
+
+/** renvoie l'id d'un utilisateur dont on a l'username
+ * @param $adresse le nom d'utilisateur
+ * @return l'uid ou NULL s'il n'y a pas d'utilisateur avec cet username
+ */
+function recupere_uid($adresse) {
+       $resultat = mysql_query_p("select user_id from x4dat.auth_user_md5 ".
+       "where username='$adresse'");
+       if (mysql_num_rows($resultat)<=0) {
+               erreur("Il n'y a pas d'X inscrit d'identifiant : $adresse.");
+               return NULL;
+       }
+       else {
+               $donnee=mysql_fetch_array($resultat);
+               return $donnee["user_id"];
+       }
+}
+
+/** ajoute un modérateur à un sondage
+ * @param $SID l'id du sondage
+ * @param $adresse l'username à ajouter
+ * @return rien
+ */
+function ajouter_moderateur($SID,$adresse) {
+       $UID = recupere_uid($adresse);
+       if (isset($UID))
+               mysql_query_p("insert into sondage.moderateurs (ids,idu) values($SID,$UID)");
+}
+
+/** ajoute un inscrit à un sondage
+ * @param $SID l'id du sondage
+ * @param $adresse l'username à ajouter
+ * @return rien
+ */
+function ajouter_inscrit($SID,$adresse) {
+    $UID = recupere_uid($adresse);
+       if (isset($UID))
+               mysql_query_p("insert into sondage.inscrits (ids,idu) values($SID,$UID)");
+}
+
+/** supprime un modérateur à un sondage
+ * @param $SID l'id du sondage
+ * @param $adresse l'username à supprimer
+ * @return rien
+ */
+function supprimer_moderateur($SID,$adresse) {
+       $resultat = mysql_query_p("select idu from sondage.moderateurs where ids=$SID");
+       if (mysql_num_rows($resultat) <= 1)
+               erreur("Il doit y avoir au moins un modérateur pour un sondage.");
+       else {
+        $UID = recupere_uid($adresse);
+               if (isset($UID))
+                       mysql_query_p("delete from sondage.moderateurs where ids=$SID and idu=$UID");
+       }
+}
+
+/** supprime un inscrit à un sondage
+ * @param $SID l'id du sondage
+ * @param $adresse l'username à supprimer
+ * @return rien
+ */
+function supprimer_inscrit($SID,$adresse) {
+    $UID = recupere_uid($adresse);
+       if (isset($UID))                   
+               mysql_query_p("delete from sondage.inscrits where ids=$SID and idu=$UID");
+} 
+
+/** renvoie les titres des sondages qui sont/ne sont pas en production pour un certain utilisateur
+ * @param $uid l'id de l'utilisateur
+ * @param $prod en production ou non
+ * @return $res un tableau d'enregistrements (ids,titre)
+ */
+function sondages($prod,$uid) {
+    if ($prod == 1)
+        $not = "";
+    else
+        $not = "!";
+       $resultat=mysql_query_p("select d.ids,titre ".
+       "from sondage.description_generale as d,sondage.moderateurs as m ".
+       "where $not FIND_IN_SET('prod',d.flags) and d.ids=m.ids and m.idu=$uid");
+       $res = null;
+       for ($i=0;$i<mysql_num_rows($resultat);$i++) {
+               $donnee=mysql_fetch_array($resultat);
+               $nouveau->id=$donnee["ids"];
+               $nouveau->titre=$donnee["titre"];
+               $res[]=$nouveau;
+       }
+       return $res;
+}
+
+/** sondages qui sont en production pour un certain utilisateur
+ * @param $uid l'id de l'utilisateur
+ * @return un tableau d'enregistrements (ids,titre)
+ */
+function sondages_en_prod($uid) {
+       return sondages(1,$uid);
+}
+
+/** sondages qui ne sont pas en production pour un certain utilisateur
+ * @param $uid l'id de l'utilisateur
+ * @return un tableau d'enregistrements (ids,titre)
+ */
+function sondages_non_en_prod($uid) {
+       return sondages(0,$uid);
+}
+/** nombre de sondages en production et en modification
+ * @param $uid l'id de l'utilisateur
+ * @return $res un enregistrement (en_prod,en_modif)
+ */
+function nb_sondages_prod($uid) {
+    $resultat = mysql_query_p("select sum(FIND_IN_SET('prod',d.flags)),count(d.flags)".
+    "from sondage.description_generale as d,sondage.moderateurs as m ".
+    "where d.ids=m.ids and m.idu=$uid");
+    list($res->en_prod,$res->en_modif) = mysql_fetch_row($resultat);
+    $res->en_modif=$res->en_modif-$res->en_prod;
+    return $res;
+}
+
+/** passer un sondage en production
+ * @param $SID l'id du sondage
+ * @return rien
+ */
+function passer_en_prod($SID,$alias) {
+       mysql_query_p("update sondage.description_generale "
+    . "set flags=CONCAT_WS(',',flags,'prod'), alias='$alias' where ids=$SID");
+}
+
+/** dit si un utilisateur a déjà voté à un sondage
+ * @param $SID l'id du sondage
+ * @param $user_id l'id de l'utilisateur
+ * @param $sondage informations sur le sondage (renvoyées par la fonction infos_sondage)
+ * @return un booléen
+ */
+function deja_vote($SID,$user_id,$sondage) {
+       $resultat = mysql_query_p("select idu from sondage.sondes where ids=$SID and idu=$user_id");
+       if (mysql_num_rows($resultat) > 0 && $sondage->en_prod==1)
+               return 1;
+       else
+               return 0;
+}
+
+/** renvoyer les informations générales sur un sondage
+ * @param $SID l'id du sondage
+ * @return $res un enregistrement (titre,en_tete,pied,parties,prod,tous,mail)
+ */
+function infos_sondage($SID) {
+       $resultat=mysql_query_p("select titre,en_tete,pied,mail".
+        ", FIND_IN_SET('prod',flags), !FIND_IN_SET('parties',flags), !FIND_IN_SET('tous',flags)".
+           " from sondage.description_generale where ids=$SID");
+       $res = null;
+       if (mysql_num_rows($resultat)>0) {
+               list($res->titre, $res->en_tete, $res->pied, $res->mail, $res->en_prod, $res->parties, $res->tous) = mysql_fetch_row($resultat);
+       }
+       else {
+        require_once("header1.inc.php");
+        require_once("header2.inc.php");
+               erreur("Ce sondage n'existe pas.");
+               require("footer.inc.php");
+               exit;
+       }
+       return $res;
+}
+
+/** renvoyer l'id d'un sondage et récupérer les informations générales
+ * @param $alias l'alias du sondage
+ * @return $SID l'id du sondage
+ */
+function obtenir_sid($alias) {
+    global $sondage;
+    $resultat=mysql_query_p("select ids,titre,en_tete,pied,mail".
+    ", FIND_IN_SET('prod',flags), !FIND_IN_SET('parties',flags), !FIND_IN_SET('tous',flags)".
+    " from sondage.description_generale where alias='$alias'");
+    if (mysql_num_rows($resultat)>0) {
+        list($SID,$res->titre, $res->en_tete, $res->pied, $res->mail, $res->en_prod, $res->parties, $res->tous) = mysql_fetch_row($resultat);
+        $sondage = $res;
+    }
+    else {
+        require_once("header1.inc.php");
+        require_once("header2.inc.php");
+        erreur("Ce sondage n'existe pas.");
+        require("footer.inc.php");
+        exit;
+    }
+    return $SID;
+}
+
+/** renvoyer les informations générales sur une partie
+ * @param $SID l'id du sondage
+ * @param $PID l'id de la partie
+ * @return $res un enregistrement (idp,titre,en_tete,pied,ordre)
+ */
+function infos_partie($SID,$PID) {
+       $resultat=mysql_query_p("select idp,sous_titre,en_tete,pied,ordre ".
+       "from sondage.parties where ids=$SID and idp=$PID");
+       $res = null;
+       if (mysql_num_rows($resultat)>0) {
+               $donnees=mysql_fetch_array($resultat);
+               $res->idp = $donnees["idp"];
+               $res->titre=$donnees["sous_titre"];
+               $res->en_tete=$donnees["en_tete"];
+               $res->pied=$donnees["pied"];
+               $res->ordre=$donnees["ordre"];
+       }
+       return $res;
+}
+
+/** renvoyer les informations générales sur une question
+ * @param $SID l'id du sondage
+ * @param $PID l'id de la partie
+ * @param $QID l'id de la question
+ * @return $res un enregistrement (idq,texte,type_reponse,ordre)
+ */
+function infos_question($SID,$PID,$QID) {
+       $resultat=mysql_query_p("select idq,texte,type_reponse,ordre ".
+       "from sondage.questions where ids=$SID and idp=$PID and idq=$QID");
+       $res = null;
+       if (mysql_num_rows($resultat)>0) {
+               $donnees=mysql_fetch_array($resultat);
+               $res->idq=$donnees["idq"];
+               $res->texte = $donnees["texte"];
+               /** champ texte, choix multiple... */
+               $res->type_question = $donnees["type_reponse"];
+               $res->ordre=$donnees["ordre"];
+       }
+       return $res;
+}
+
+/** renvoyer les informations générales sur un choix de réponse
+ * @param $SID l'id du sondage
+ * @param $PID l'id de la partie
+ * @param $QID l'id de la question
+ * @param $RID l'id du choix
+ * @return $res un enregistrement (idr,texte,coche,ordre)
+ */
+function infos_reponse($SID,$PID,$QID,$RID) {
+       $resultat=mysql_query_p("select idr,reponse,coche,ordre ".
+       "from sondage.choix where ids=$SID and idp=$PID and idq=$QID and idr=$RID");
+       $res = null;
+       if (mysql_num_rows($resultat)>0) {
+               $donnees=mysql_fetch_array($resultat);
+               $res->idr=$donnees["idr"];
+               $res->texte = $donnees["reponse"];
+               /** coché par défaut */
+               $res->coche = $donnees["coche"];
+               $res->ordre=$donnees["ordre"];
+       }
+       return $res;
+}
+
+/** renvoyer les informations sur les parties d'un sondage
+ * @param $SID l'id du sondage
+ * @return $res un tableau d'enregistrements (idp,titre,en_tete,pied,ordre)
+ */
+function infos_parties($SID) {
+       $resultat=mysql_query_p("select idp from sondage.parties where ids=$SID order by ordre");
+       $res = null;
+       for ($i=0;$i<mysql_num_rows($resultat);$i++) {
+               $ligne = mysql_fetch_array($resultat);
+               $res[] = infos_partie($SID,$ligne["idp"]);
+       }
+       return $res;
+}
+
+/** renvoyer les informations sur les parties d'un sondage avec questions et réponses en une seule
+ * requête
+ * @param $SID l'id du sondage
+ * @param $en_prod permet de dire s'il faut aussi récolter les votes (en production)
+ * @return $res un tableau d'enregistrements (idp,titre,en_tete,pied,ordre,questions)
+ */
+function infos_parties_une_seule_requete($SID,$en_prod) {
+    global $UNIQUE,$MULTIPLE,$QUESTION_TEXTE,$QUESTION_MULT;
+    $parties=mysql_query_p("select idp,sous_titre,en_tete,pied,ordre ".
+    "from sondage.parties where ids=$SID order by idp");
+    $questions=mysql_query_p("select idp,idq,texte,type_reponse,ordre ".
+    "from sondage.questions where ids=$SID order by idp,idq");
+    $reponses=mysql_query_p("select idp,idq,idr,reponse,coche,ordre ".
+    "from sondage.choix where ids=$SID order by idp,idq,ordre");
+    if ($en_prod == 1) {
+        $reponses_texte=mysql_query_p("select idp,idq,reponse from sondage.reponses_texte ".
+        "where ids=$SID order by idp,idq");
+        $reponses_choix=mysql_query_p("select idp,idq,code from sondage.reponses_choix_multiple ".
+        "where ids=$SID order by idp,idq");
+        if (mysql_num_rows($reponses_texte)>0)
+            $reponse_texte = mysql_fetch_array($reponses_texte);
+        if (mysql_num_rows($reponses_choix)>0)
+            $reponse_choix = mysql_fetch_array($reponses_choix);
+        $t = 0;
+        $c = 0;
+    }   
+    $res = null;
+    if (mysql_num_rows($questions)>0)
+        $question= mysql_fetch_array($questions);
+    if (mysql_num_rows($reponses)>0)
+        $reponse= mysql_fetch_array($reponses);
+    $j=0;
+    $k=0;
+    for ($i=0;$i<mysql_num_rows($parties);$i++) {
+        $partie = mysql_fetch_array($parties);
+        $res[$i]->idp = $partie["idp"];
+        $res[$i]->titre=$partie["sous_titre"];
+        $res[$i]->en_tete=$partie["en_tete"];
+        $res[$i]->pied=$partie["pied"];
+        $res[$i]->ordre=$partie["ordre"];
+        $resq = null;
+        $l = 0;
+        if (mysql_num_rows($questions)>0)
+        while($question["idp"] == $partie["idp"] && $j<=mysql_num_rows($questions)) {
+            $resq[$l]->idq=$question["idq"];
+            $resq[$l]->texte = $question["texte"];
+            /** champ texte, choix multiple... */
+            $resq[$l]->type_question = $question["type_reponse"];
+            $resq[$l]->ordre=$question["ordre"];
+            $resr = null;
+            $m = 0;
+            if (mysql_num_rows($reponses)>0)
+            while($reponse["idp"] == $partie["idp"] && $reponse["idq"] == $question["idq"] 
+                && $k<=mysql_num_rows($reponses)) {
+                $resr[$m]->idr=$reponse["idr"];
+                $resr[$m]->texte = $reponse["reponse"];
+                /** coché par défaut */
+                $resr[$m]->coche = $reponse["coche"];
+                $resr[$m]->ordre=$reponse["ordre"];
+                if (mysql_num_rows($reponses)>0)
+                    $reponse= mysql_fetch_array($reponses);
+                $k++;
+                $m++;
+            }
+            $resq[$l]->reponses=$resr;
+            if ($en_prod == 1) {
+                if ($question["type_reponse"]==$QUESTION_TEXTE) {
+                    if (mysql_num_rows($reponses_texte)>0)
+                    while($reponse_texte["idp"] == $partie["idp"] 
+                    && $reponse_texte["idq"] == $question["idq"]
+                    && $t<=mysql_num_rows($reponses_texte)) {
+                        $resv[]=$reponse_texte["reponse"];
+                        if (mysql_num_rows($reponses_texte)>0)
+                            $reponse_texte= mysql_fetch_array($reponses_texte);
+                        $t++;
+                    }
+                    $resq[$l]->propositions = $resv;
+                }
+                else {
+                    $nb_reponses = count($resr);
+                    if ($resq[$l]->type_question==$QUESTION_MULT)
+                        $codage = $MULTIPLE;
+                    else
+                        $codage = $UNIQUE;
+                    $counter = 0;
+                    for ($cj=0;$cj<$nb_reponses;$cj++)
+                        $votes[$cj] = 0;
+                    if (mysql_num_rows($reponses_choix)>0)
+                    while($c<=mysql_num_rows($reponses_choix)
+                    && $reponse_choix["idp"] == $partie["idp"]
+                    && $reponse_choix["idq"] == $question["idq"]) {
+                        if ($codage == $UNIQUE) { //la valeur stockée correspond au numéro du choix
+                            if ($reponse_choix["code"]!=0)
+                                $votes[$reponse_choix["code"]-1]++;
+                        }
+                        else { //la représentation binaire de la valeur stockée correspond aux choix cochés
+                            $code = $reponse_choix["code"];
+                            for ($cj=0;$cj<$nb_reponses;$cj++) {
+                                $votes[$cj]+=$code%2;
+                                $code=$code/2;
+                            }
+                        }
+                        if (mysql_num_rows($reponses_choix)>0)
+                            $reponse_choix=mysql_fetch_array($reponses_choix);
+                        $c++;
+                        $counter++;
+                    }
+                    $resc = null;
+                    for ($cj=0;$cj<$nb_reponses;$cj++) {
+                        $resc[$cj]->votes=$votes[$cj];
+                        if ($counter>0)
+                            $resc[$cj]->pourcentage=$votes[$cj]/$counter*100;
+                        else
+                            $resc[$cj]->pourcentage=0;
+                    }
+                    $resq[$l]->resultats = $resc;
+                }
+            }
+            if ($j<mysql_num_rows($questions))
+                $question= mysql_fetch_array($questions);
+            $j++;
+            $l++;
+        }
+        $res[$i]->questions=$resq;
+    }
+    return $res;
+}
+
+/** renvoyer les informations sur les questions d'une partie
+ * @param $SID l'id du sondage
+ * @param $PID l'id de la partie
+ * @return $res un tableau d'enregistrements (idq,texte,type_reponse,ordre)
+ */
+function infos_questions($SID,$PID) {
+        $resultat=mysql_query_p("select idq from sondage.questions where ids=$SID and idp=$PID order by ordre");
+       $res = null;                            
+       for ($i=0;$i<mysql_num_rows($resultat);$i++) {
+               $ligne = mysql_fetch_array($resultat);
+               $res[] = infos_question($SID,$PID,$ligne["idq"]);
+       }
+       return $res;
+}
+
+/** renvoyer les informations sur les choix de réponse d'une question
+ * @param $SID l'id du sondage
+ * @param $PID l'id de la partie
+ * @param $QID l'id de la question
+ * @return $res un tableau d'enregistrements (idr,texte,coche,ordre)
+ */
+function infos_reponses($SID,$PID,$QID) {
+       $resultat=mysql_query_p("select idr from sondage.choix where ids=$SID and idp=$PID and idq=$QID order by ordre");
+       $res = null;
+       for ($i=0;$i<mysql_num_rows($resultat);$i++) {
+               $ligne = mysql_fetch_array($resultat);
+               $res[] = infos_reponse($SID,$PID,$QID,$ligne["idr"]);
+       }
+       return $res;
+}
+
+/** renvoyer les réponses des sondés à une question de type texte
+ * @param $SID l'id du sondage
+ * @param $PID l'id de la partie
+ * @param $QID l'id de la question
+ * @return $res un tableau de chaînes
+ */
+function reponses_texte($SID,$PID,$QID) {
+       $resultat = mysql_query_p("select reponse from sondage.reponses_texte where ids=$SID and idp=$PID and idq=$QID");
+       $res = null;
+       for ($i=0;$i<mysql_num_rows($resultat);$i++) {
+               $ligne = mysql_fetch_array($resultat);
+               $res[] = $ligne["reponse"];
+       }
+       return $res;
+}
+
+/** renvoyer les réponses des sondés à une question de type choix multiple
+ * @param $SID l'id du sondage
+ * @param $PID l'id de la partie
+ * @param $QID l'id de la question
+ * @param $nb_reponses le nombre de choix
+ * @param $codage plusieurs réponses possibles ou choix unique
+ * @return $res un tableau d'enregistrements (votes,pourcentage)
+ */
+function reponses_choix($SID,$PID,$QID,$nb_reponses,$codage) {
+       global $UNIQUE;
+
+       $resultat = mysql_query_p("select code from sondage.reponses_choix_multiple where ids=$SID and idp=$PID and idq=$QID");
+       for ($j=0;$j<$nb_reponses;$j++)
+               $votes[]=0;
+       for ($i=0;$i<mysql_num_rows($resultat);$i++) {
+               $ligne = mysql_fetch_array($resultat);
+               if ($codage == $UNIQUE) { //la valeur stockée correspond au numéro du choix
+                       if ($ligne["code"]!=0)
+                $votes[$ligne["code"]-1]++;
+        }
+               else { //la représentation binaire de la valeur stockée correspond aux choix cochés
+                       $code = $ligne["code"];
+                       for ($j=0;$j<$nb_reponses;$j++) {
+                               $votes[$j]+=$code%2;
+                               $code=$code/2;
+                       }
+               }
+       }
+       for ($j=0;$j<$nb_reponses;$j++) {
+               $res[$j]->votes = $votes[$j];
+               if (mysql_num_rows($resultat)>0)
+                       $res[$j]->pourcentage = $votes[$j]/mysql_num_rows($resultat)*100;
+               else
+                       $res[$j]->pourcentage = 0;
+       }
+       return $res;
+}
+
+/** renvoyer le texte d'un topo explicatif de l'interface
+ * @param $TOPO l'id du topo
+ * @return une chaîne
+ */
+function topo_req($TOPO) {
+       $resultat = mysql_query_p("select texte from sondage.topo where ref = $TOPO");
+       $ligne = mysql_fetch_array($resultat);
+       return $ligne["texte"];
+}
+
+/** ajouter un sondage dont le premier modérateur sera un certain utilisateur
+ * @param $user_id l'id de l'utilisateur
+ * @return $SID l'id du sondage créé
+ */
+function ajouter_sondage($user_id) {
+    //on vérifie que l'utilisateur n'a pas trop de sondages
+    $resultat = mysql_query_p("select count(ids) from sondage.moderateurs where idu=$user_id");
+    list($nb_sondages) = mysql_fetch_row($resultat);
+    if ($nb_sondages > 5) {
+        erreur("Tu as atteint le quota maximal de sondages autorisés. Tu ne peux plus en créer.");
+        require("footer.inc.php");
+        exit;
+    }
+       mysql_query_p("insert into sondage.description_generale (titre) values('')");
+    mysql_query("lock sondage.description_generale");//lock nécessaire pour le retour de SID
+       $resultat = mysql_query_p("select max(ids) from sondage.description_generale");
+    $ligne = mysql_fetch_row($resultat);
+       $SID = $ligne[0];
+       mysql_query_p("insert into sondage.moderateurs (ids,idu) values($SID,$user_id)");
+    mysql_query("unlock sondage.description_generale");
+       return $SID;
+}
+
+/** renvoyer un numéro d'ordre disponible pour une partie d'un sondage
+ * @param $SID l'id du sondage
+ * @return l'ordre de la partie
+ */
+function pid_transitoire($SID) {
+       $resultat = mysql_query_p("select max(ordre) from sondage.parties where ids=$SID");
+       $ligne = mysql_fetch_array($resultat);
+       if ($ligne[0]==null)
+               return 1;
+       else
+               return $ligne[0]+1;
+}
+
+/** renvoyer un numéro d'ordre disponible pour une question d'une partie
+ * @param $SID l'id du sondage
+ * @param $PID l'id de la partie
+ * @return l'ordre de la question
+ */
+function qid_transitoire($SID,$PID) {
+    $resultat = mysql_query_p("select max(ordre) from sondage.questions where ids=$SID and idp=$PID");
+       $ligne = mysql_fetch_array($resultat);
+       if ($ligne[0]==null)
+               return 1;
+       else
+               return $ligne[0]+1;
+}
+
+/** renvoyer un numéro d'ordre disponible pour un choix d'une question
+ * @param $SID l'id du sondage
+ * @param $PID l'id de la partie
+ * @param $QID l'id de la question
+ * @return l'ordre du choix
+ */
+function rid_transitoire($SID,$PID,$QID) {
+    $resultat = mysql_query_p("select max(ordre) from sondage.choix where ids=$SID and idp=$PID and idq=$QID");
+       $ligne = mysql_fetch_array($resultat);
+       if ($ligne[0]==null)
+               return 1;
+       else
+               return $ligne[0]+1;
+}
+
+/** ajouter une partie à un sondage
+ * @param $SID l'id du sondage
+ * @return $PID l'id de la partie créée
+ */
+function ajouter_partie($SID) {
+       mysql_query("lock sondage.parties");//lock nécessaire pour le retour de PID
+       $resultat = mysql_query_p("select max(idp),max(ordre) from sondage.parties where ids = $SID");
+       $ligne = mysql_fetch_array($resultat);
+       if ($ligne[0]==null)
+               $PID = 1;
+       else
+               $PID = $ligne[0]+1;
+       if ($ligne[1]==null)
+        $ordre = 1;
+    else
+        $ordre = $ligne[1]+1;                    
+       mysql_query_p("insert into sondage.parties (ids,idp,ordre,sous_titre,en_tete,pied) values($SID,$PID,$ordre,'','','')");
+       mysql_query("unlock sondage.parties");
+       return $PID;
+}
+
+/** ajouter une question à une partie
+ * @param $SID l'id du sondage
+ * @param $PID l'id de la partie
+ * @return $QID l'id de la question créée
+ */
+function ajouter_question($SID,$PID) {
+       mysql_query("lock sondage.questions");//lock nécessaire pour le retour de QID
+        $resultat = mysql_query_p("select max(idq),max(ordre) from sondage.questions where ids = $SID and idp=$PID");
+       $ligne = mysql_fetch_array($resultat);
+       if ($ligne[0]==null)
+               $QID = 1;
+       else
+               $QID = $ligne[0]+1;
+    if ($ligne[1]==null)
+        $ordre = 1;
+    else
+        $ordre = $ligne[1]+1;
+       mysql_query_p("insert into sondage.questions (ids,idp,idq,ordre,texte,type_reponse) values($SID,$PID,$QID,$ordre,'',0)");
+       mysql_query("unlock sondage.questions");
+       return $QID;
+}
+
+/** ajouter un choix de réponse à une question
+ * @param $SID l'id du sondage
+ * @param $PID l'id de la partie
+ * @param $QID l'id de la question
+ * @return $RID l'id du choix créé
+ */
+function ajouter_reponse($SID,$PID,$QID) {
+       mysql_query("lock sondage.choix");//lock nécessaire pour le retour de RID
+    $resultat = mysql_query_p("select max(idr),max(ordre) from sondage.choix where ids = $SID and idp=$PID and idq=$QID");
+       $ligne = mysql_fetch_array($resultat);
+       if ($ligne[0]==null)
+               $RID = 1;
+       else
+               $RID = $ligne[0]+1;
+    if ($ligne[1]==null)
+        $ordre = 1;
+    else
+        $ordre = $ligne[1]+1;
+       mysql_query_p("insert into sondage.choix (ids,idp,idq,idr,ordre) values($SID,$PID,$QID,$RID,$ordre)");
+       mysql_query("unlock sondage.choix");
+       return $RID;
+}
+
+/** mettre à jour les informations d'un sondage
+ * @param $SID l'id du sondage
+ * @param $titre titre du sondage
+ * @param $en_tete en-tête du sondage
+ * @param $pied pied de page
+ * @param $prod le sondage est-il en production ?
+ * @param $parties y a-t-il plusieurs parties?
+ * @param $tous tous les inscrits peuvent-ils voter ?
+ * @param $mail mail de contact des sondés
+ * @return rien
+ */
+function mettre_a_jour_sondage($SID,$titre,$en_tete,$pied,$prod,$parties,$tous,$mail) {
+    // on connait l'ensemble des flags, on peut donc reconstruire le champ flag en entier
+    $flags = ($prod == 1 ? 'prod,' : '');
+    $flags .= ($parties != 1 ? 'parties,' : '');
+    $flags .= ($tous != 1 ? 'tous,' : '');
+       mysql_query_p("update sondage.description_generale "
+    ."set titre='$titre',en_tete='$en_tete',pied='$pied', flags = '$flags', mail='$mail' where ids=$SID");
+}
+
+/** mettre à jour les informations d'une partie
+ * @param $SID l'id du sondage
+ * @param $PID l'id de la partie
+ * @param $titre titre du sondage
+ * @param $en_tete en-tête du sondage
+ * @param $pied pied de page
+ * @return rien
+ */
+function mettre_a_jour_partie($SID,$PID,$titre,$en_tete,$pied) {
+    mysql_query_p("update sondage.parties set sous_titre='$titre',en_tete='$en_tete',pied='$pied' ".
+    "where ids=$SID and idp=$PID");
+}
+
+/** mettre à jour les informations d'une question
+ * @param $SID l'id du sondage
+ * @param $PID l'id de la partie
+ * @param $QID l'id de la question
+ * @param $texte intitulé de la question
+ * @param $type_question type de la question (texte, choix multiple...)
+ * @return rien
+ */
+function mettre_a_jour_question($SID,$PID,$QID,$texte,$type_question) {
+    mysql_query_p("update sondage.questions set texte='$texte',type_reponse='$type_question' ".
+    "where ids=$SID and idp=$PID and idq=$QID");
+}
+
+/** mettre à jour les informations d'un choix de réponse
+ * @param $SID l'id du sondage
+ * @param $PID l'id de la partie
+ * @param $QID l'id de la question
+ * @param $RID l'id du choix
+ * @param $texte intitulé du choix
+ * @param $coche coché par défaut ?
+ * @return rien
+ */
+function mettre_a_jour_reponse($SID,$PID,$QID,$RID,$texte,$coche) {
+       if ($texte!="") {
+               mysql_query_p("update sondage.choix set reponse='$texte',coche='$coche' ".
+        "where ids=$SID and idp=$PID and idq=$QID and idr=$RID");
+       }
+}
+
+/** supprimer une partie
+ * @param $SID l'id du sondage
+ * @param $PID l'id de la partie
+ * @return rien
+ */
+function supprimer_partie($SID,$PID) {
+       mysql_query_p("delete from sondage.parties where ids=$SID and idp=$PID");
+       mysql_query_p("delete from sondage.questions where ids=$SID and idp=$PID");
+       mysql_query_p("delete from sondage.choix where ids=$SID and idp=$PID");
+}
+
+/** supprimer une question
+ * @param $SID l'id du sondage
+ * @param $PID l'id de la partie
+ * @param $QID l'id de la question
+ * @return rien
+ */
+function supprimer_question($SID,$PID,$QID) {
+       mysql_query_p("delete from sondage.questions where ids=$SID and idp=$PID and idq=$QID");
+       mysql_query_p("delete from sondage.choix where ids=$SID and idp=$PID and idq=$QID");
+}
+
+/** supprimer un choix de réponse
+ * @param $SID l'id du sondage
+ * @param $PID l'id de la partie
+ * @param $QID l'id de la question
+ * @param $RID l'id du choix
+ * @return rien
+ */
+function supprimer_reponse($SID,$PID,$QID,$RID) {
+       mysql_query_p("delete from sondage.choix where ids=$SID and idp=$PID and idq=$QID and idr=$RID");
+}
+
+/** échanger la position de deux parties
+ * @param $SID l'id du sondage
+ * @param $PID1 l'ordre de la partie 1
+ * @param $PID2 l'ordre de la partie 2
+ * @return rien
+ */
+function echanger_partie($SID,$PID1,$PID2,$temp) {
+       //$temp = pid_transitoire($SID);
+       mysql_query_p("update sondage.parties set ordre=$temp where ids=$SID and ordre=$PID1");
+       mysql_query_p("update sondage.parties set ordre=$PID1 where ids=$SID and ordre=$PID2");
+       mysql_query_p("update sondage.parties set ordre=$PID2 where ids=$SID and ordre=$temp");
+}
+
+/** échanger la position de deux questions
+ * @param $SID l'id du sondage
+ * @param $PID l'id de la partie
+ * @param $QID1 l'ordre de la question 1
+ * @param $QID2 l'ordre de la question 2
+ * @return rien
+ */
+function echanger_question($SID,$PID,$QID1,$QID2,$temp) {
+       //$temp = qid_transitoire($SID,$PID);
+       mysql_query_p("update sondage.questions set ordre=$temp where ids=$SID and idp=$PID and ordre=$QID1");
+       mysql_query_p("update sondage.questions set ordre=$QID1 where ids=$SID and idp=$PID and ordre=$QID2");
+       mysql_query_p("update sondage.questions set ordre=$QID2 where ids=$SID and idp=$PID and ordre=$temp");
+}
+
+/** échanger la position de deux choix de réponse
+ * @param $SID l'id du sondage
+ * @param $PID l'id de la partie
+ * @param $QID l'id de la question
+ * @param $RID1 l'ordre du choix 1
+ * @param $RID2 l'ordre du choix 2
+ * @return rien
+ */
+function echanger_reponse($SID,$PID,$QID,$RID1,$RID2,$temp) {
+       //$temp = rid_transitoire($SID,$PID,$QID);
+       mysql_query_p("update sondage.choix set ordre=$temp where ids=$SID and idp=$PID and idq=$QID and ordre=$RID1");
+       mysql_query_p("update sondage.choix set ordre=$RID1 where ids=$SID and idp=$PID and idq=$QID and ordre=$RID2");
+       mysql_query_p("update sondage.choix set ordre=$RID2 where ids=$SID and idp=$PID and idq=$QID and ordre=$temp");
+}
+
+/** descendre une partie d'un niveau
+ * @param $SID l'id du sondage
+ * @param $PID l'id de la partie
+ * @return rien
+ */
+function descendre_partie($SID,$PID) {
+       mysql_query("lock sondage.parties");//lock nécessaire pour récupérer max(ordre)
+       $resultat = mysql_query_p("select min(s1.ordre),s2.ordre ".
+    "from sondage.parties as s1,sondage.parties as s2 ".
+    "where s2.ids=$SID and s2.idp=$PID and s1.ids=$SID and s1.ordre>s2.ordre group by s2.ordre");
+    if (mysql_num_rows($resultat)>0) {
+        $ligne = mysql_fetch_array($resultat);
+           if ($ligne[0]!=null)
+                   echanger_partie($SID,$ligne[1],$ligne[0],0);
+    }
+       mysql_query("unlock sondage.parties");
+}
+
+/** descendre une question d'un niveau
+ * @param $SID l'id du sondage
+ * @param $PID l'id de la partie
+ * @param $QID l'id de la question
+ * @return rien
+ */
+function descendre_question($SID,$PID,$QID) {
+       mysql_query("lock sondage.questions");//lock nécessaire pour récupérer max(ordre)
+       $resultat = mysql_query_p("select min(s1.ordre),s2.ordre ".
+    "from sondage.questions as s1,sondage.questions as s2 ".
+    "where s2.ids=$SID and s2.idp=$PID and s2.idq=$QID and ".
+    "s1.ids=$SID and s1.idp=$PID and s1.ordre>s2.ordre group by s2.ordre");
+       if (mysql_num_rows($resultat)>0) {
+        $ligne = mysql_fetch_array($resultat);
+           if ($ligne[0]!=null)
+                   echanger_question($SID,$PID,$ligne[1],$ligne[0],0);
+       }
+    mysql_query("unlock sondage.questions");
+}
+
+/** descendre un choix de réponse d'un niveau
+ * @param $SID l'id du sondage
+ * @param $PID l'id de la partie
+ * @param $QID l'id de la question
+ * @param $RID l'id du choix
+ * @return rien
+ */
+function descendre_reponse($SID,$PID,$QID,$RID) {
+       mysql_query("lock sondage.choix");//lock nécessaire pour récupérer max(ordre)
+    $resultat = mysql_query_p("select min(s1.ordre),s2.ordre ".
+    "from sondage.choix as s1,sondage.choix as s2 ".
+    "where s2.ids=$SID and s2.idp=$PID and s2.idq=$QID and s2.idr=$RID and ".
+    "s1.ids=$SID and s1.idp=$PID and s1.idq=$QID and s1.ordre>s2.ordre group by s2.ordre");
+    if (mysql_num_rows($resultat)>0) {
+        $ligne = mysql_fetch_array($resultat);
+           if ($ligne[0]!=null)
+                   echanger_reponse($SID,$PID,$QID,$ligne[1],$ligne[0],0);
+       }
+    mysql_query("unlock sondage.choix");
+}
+
+/** monter une partie d'un niveau
+ * @param $SID l'id du sondage
+ * @param $PID l'id de la partie
+ * @return rien
+ */
+function monter_partie($SID,$PID) {
+       mysql_query("lock sondage.parties");//lock nécessaire pour récupérer max(ordre)
+    $resultat = mysql_query_p("select max(s1.ordre),s2.ordre ".
+    "from sondage.parties as s1,sondage.parties as s2 ".
+    "where s2.ids=$SID and s2.idp=$PID and s1.ids=$SID and s1.ordre<s2.ordre group by s2.ordre");
+    if (mysql_num_rows($resultat)>0) {
+        $ligne = mysql_fetch_array($resultat);
+           if ($ligne[0]!=null)
+                   echanger_partie($SID,$ligne[1],$ligne[0],0);
+       }
+    mysql_query("unlock sondage.parties");
+}
+
+/** monter une question d'un niveau
+ * @param $SID l'id du sondage
+ * @param $PID l'id de la partie
+ * @param $QID l'id de la question
+ * @return rien
+ */
+function monter_question($SID,$PID,$QID) {
+       mysql_query("lock sondage.questions");//lock nécessaire pour récupérer max(ordre)
+    $resultat = mysql_query_p("select max(s1.ordre),s2.ordre ".
+    "from sondage.questions as s1,sondage.questions as s2 ".
+    "where s2.ids=$SID and s2.idp=$PID and s2.idq=$QID and ".
+    "s1.ids=$SID and s1.idp=$PID and s1.ordre<s2.ordre group by s2.ordre");
+       if (mysql_num_rows($resultat)>0) {
+        $ligne = mysql_fetch_array($resultat);
+           if ($ligne[0]!=null)
+                   echanger_question($SID,$PID,$ligne[1],$ligne[0],0);
+       }
+    mysql_query("unlock sondage.questions");
+}
+
+/** monter un choix de réponse d'un niveau
+ * @param $SID l'id du sondage
+ * @param $PID l'id de la partie
+ * @param $QID l'id de la question
+ * @param $RID l'id du choix
+ * @return rien
+ */
+function monter_reponse($SID,$PID,$QID,$RID) {
+       mysql_query("lock sondage.choix");//lock nécessaire pour récupérer max(ordre)
+    $resultat = mysql_query_p("select max(s1.ordre),s2.ordre ".
+    "from sondage.choix as s1,sondage.choix as s2 ".
+    "where s2.ids=$SID and s2.idp=$PID and s2.idq=$QID and s2.idr=$RID and ".
+    "s1.ids=$SID and s1.idp=$PID and s1.idq=$QID and s1.ordre<s2.ordre group by s2.ordre");
+       if (mysql_num_rows($resultat)>0) {
+        $ligne = mysql_fetch_array($resultat);                                  
+           if ($ligne[0]!=null)                                                    
+                   echanger_reponse($SID,$PID,$QID,$ligne[1],$ligne[0],0);
+       }
+    mysql_query("unlock sondage.choix");
+} 
+                                                               
+?>
diff --git a/include/sondage.utils.inc.php b/include/sondage.utils.inc.php
new file mode 100644 (file)
index 0000000..3edeb44
--- /dev/null
@@ -0,0 +1,520 @@
+<?php
+require_once("sondage.requetes.inc.php");
+require_once("misc.inc.php");
+
+/**
+ * @package Utils
+ * Fonctions communes à l'interface sondage
+ */
+
+/** récupérer une variable en REQUEST
+ * et la purifier de ses balises ou autres
+ * @param $nom_variable nom de la variable à récupérer
+ * @return variable purifiée ou NULL si non définie en REQUEST
+ */
+function recupere($nom_variable) {
+       if (isset($_REQUEST[$nom_variable]))
+               return str_replace("'","&#039;",stripslashes(strip_tags($_REQUEST[$nom_variable],"<a><b><i><u>")));
+       else
+               return NULL;
+}
+
+/** récupérer une variable en REQUEST obligatoirement
+ * et la purifier de ses balises ou autres
+ * si elle n'est pas définie, le script s'arrête là en ajoutant header et footer
+ * @param $nom_variable nom de la variable à récupérer
+ * @return variable purifiée ou arrêt du script si non définie en REQUEST
+ */
+function recupere_non_vide_avec_header($nom_variable) {
+    $res = recupere($nom_variable);
+    if (!isset($res)) {
+        require_once("header1.inc.php");
+        require_once("header2.inc.php");
+        erreur("Il y a eu un problème lors de la transmission des données du formulaire.");
+        require("footer.inc.php");
+        exit;
+    }
+    else
+        return $res;
+}
+
+/** récupérer une variable en REQUEST obligatoirement
+ * et la purifier de ses balises ou autres
+ * si elle n'est pas définie, le script s'arrête là en ajoutant footer (les header doivent être
+ * inclus avant)
+ * @param $nom_variable nom de la variable à récupérer
+ * @return variable purifiée ou arrêt du script si non définie en REQUEST
+ */
+function recupere_non_vide_sans_header($nom_variable) {
+    $res = recupere($nom_variable);
+    if (!isset($res)) {
+        erreur("Il y a eu un problème lors de la transmission des données du formulaire.");
+        require("footer.inc.php");
+        exit;
+    }
+    else
+        return $res;
+}                                                            
+
+/** teste si l'utilisateur a le droit de modifier un sondage
+ * sinon termine le script
+ * @param $SID l'id du sondage
+ * @return les infos du sondage
+ */
+function permission_modifications($SID) {
+    global $sondage;
+    global $moderos;
+    
+       if (isset($SID)) {
+        if (!isset($sondage))
+                   $sondage = infos_sondage($SID);
+               if ($sondage->en_prod == 1)//le sondage est en prod, seuls les admins peuvent le modifier
+                       check_perms();
+               else {
+            if (!isset($moderos))
+                $moderos = moderateurs($SID);
+                       check_perms(usernames($moderos));
+        }
+        return $sondage;
+       }
+    else
+        return NULL;
+}
+
+/** teste si l'utilisateur est dans une liste d'"ayants-droits"
+ * sinon termine le script avec le footer spécial sondage
+ * (vote sans les menus de x.org)
+ * @param $auth_array tableau de chaînes (username)
+ * @return rien
+ */
+function check_perms_sondage($auth_array) {
+       if (!has_perms($auth_array)) {
+               $_SESSION['log']->log("noperms",$_SERVER['PHP_SELF']);
+               echo "<div class=\"erreur\">";
+               echo "Tu n'as pas les permissions n&eacute;cessaires pour acc&eacute;der &agrave; cette page.";
+               echo "</div>";
+               include("sondage.footer.inc.php");
+               exit;
+       }
+}
+                                                                                               
+/** afficher un titre
+ * @param $intitule le texte du titre
+ * @return rien
+ */
+function titre($intitule) {
+       echo "<div class=\"rubrique\">\n";
+       echo $intitule."\n";
+       echo "</div>\n";
+}
+
+/** commencer un paragraphe
+ * @return rien
+ */
+function debut_paragraphe() {
+       echo "<p class=\"normal\">\n";
+}
+
+/** terminer un paragraphe
+ * @return rien
+ */
+function fin_paragraphe() {
+       echo "</p>\n";
+}
+
+/** donner l'attribut correspondant à une ligne de tableau paire ou impaire
+ * @param $pair paire ou impaire ?
+ * @return rien
+ */
+function nom($pair) {
+       if ($pair == 0)
+               return " class =\"pair\"";
+       else
+               return " class=\"impair\"";
+}
+
+/** changer la valeur courante de la ligne (paire ou impaire)
+ * @param $pair pair ou impair ?
+ * @return la nouvelle valeur de pair
+ */
+function change($pair) {
+        if ($pair == 0)
+               return 1;
+       else
+               return 0;
+}
+
+/** commencer un formulaire POST vers un fichier php
+ * @param $formulaire nom du fichier php à appeler
+ * @return rien
+ */
+function debut_formulaire($formulaire) {
+       echo "<form method='POST' action='$formulaire'>\n";
+}
+
+/** commencer un formulaire POST vers le fichier php appelant
+ * @return rien
+ */
+function debut_formulaire_self() {
+       debut_formulaire($_SERVER['PHP_SELF']);
+}
+
+/** terminer un formulaire
+ * @return rien
+ */
+function fin_formulaire() {
+       echo "</form>\n";
+}
+
+/** afficher un texte en gras sur une ligne
+ * @param $intitule texte à afficher
+ * @return rien
+ */
+function affiche_intitule($intitule) {
+       if ($intitule!="")
+               echo "<b>".$intitule."</b><br>\n";
+}
+
+/** afficher une erreur
+ * @param $intitule texte de l'erreur
+ * @return rien
+ */
+function erreur($intitule) {
+       if ($intitule!="")
+               echo "<div class=\"erreur\">".$intitule."</div>\n";
+}
+
+/** afficher un mail avec lien hypertexte
+ * @param $mail adresse à afficher
+ * @return rien
+ */
+function affiche_mail($mail) {
+       if ($mail!="")
+        echo mailto($mail);
+}
+
+/** afficher un topo
+ * @param $TOPO code du topo à afficher
+ * @return rien
+ */
+function topo($TOPO) {
+       debut_paragraphe();
+       echo topo_req($TOPO);
+       fin_paragraphe();
+}
+
+/** afficher une liste d'utilisateurs
+ * @param $liste tableau d'enregistrements (promo,nom,prenom)
+ * @param $type_utilisateur moderateur ou inscrit
+ * @param $SID id du sondage
+ * @return rien
+ */
+function affiche_liste_utilisateurs($liste,$type_utilisateur,$SID) {
+       debut_paragraphe();
+       $promo_courante = 0;
+       echo "<b>";
+       if (count($liste) == 0)
+               echo "Aucun X n'est abonné.";
+       else {
+               echo count($liste)." X ";
+               if (count($liste) ==1)
+                       echo "est abonné :";
+               else
+                       echo "sont abonnés :";
+       }
+       echo "</b><br>";
+       for ($i=0;$i<count($liste);$i++) {
+               $virgule = true;
+               if ($liste[$i]->promo != $promo_courante) {
+                       if ($promo_courante!=0)
+                               echo "<br>";
+                       $promo_courante = $liste[$i]->promo;
+                       echo "<b>[$promo_courante]</b> ";
+                       $virgule = false;
+               }
+               if ($virgule)
+                       echo ", ";
+               echo $liste[$i]->prenom.' ';
+        echo "<a href=\"javascript:x()\" onclick=\"popWin('../x.php?x=".$liste[$i]->username."')\">";
+        echo $liste[$i]->nom.'</a> ';
+        echo '<a href="droits.php?SID='.$SID.'&amp;retirer=1&amp;';
+        echo $type_utilisateur.'='.urlencode($liste[$i]->username);
+        echo '">[Supprimer]</a>';
+       }
+       fin_paragraphe();
+}
+
+/** afficher un choix de sondages
+ * @param $sond tableau d'enregistrements (id,titre) représentants des sondages
+ * @param $formulaire fichier php vers lequel renvoyer le choix d'un de ces sondages
+ * @return rien
+ */
+function affiche_choix($sond,$formulaire) {
+       for($i=0;$i<count($sond);$i++) {
+               debut_formulaire($formulaire);
+               caches(array("SID"=>$sond[$i]->id));
+               soumettre(array($sond[$i]->titre=>"modifier"));
+               fin_formulaire();
+       }
+}
+
+/** afficher un champ texte
+ * @param $intitule invite texte affichée avant le champ texte
+ * @param $nom_variable nom de la variable associée au champ
+ * @param $defaut valeur par défaut du champ
+ * @param $type ligne ou paragraphe (4 lignes)
+ * @return rien
+ */
+function champ_texte($intitule,$nom_variable,$defaut,$type) {
+       global $LIGNE,$PARAGRAPHE;
+
+       debut_paragraphe();
+       affiche_intitule($intitule);
+       if ($type==$LIGNE)
+               echo "<input type='text' name='$nom_variable' value='$defaut' size=75>\n";
+       else if ($type==$PARAGRAPHE)
+               echo "<textarea name='$nom_variable' cols=65 rows=4>$defaut</textarea>\n";
+       fin_paragraphe();
+}
+
+/** afficher une liste de choix multiples
+ * @param $intitule invite texte affichée avant la liste
+ * @param $nom_variable nom de la variable associée au choix (base des noms de variables pour les cases à cocher)
+ * @param $defaut valeur par défaut du choix (binaire pour les cases à cocher)
+ * @param $choix liste des choix (tableau de chaînes)
+ * @param $type unique (boutons radio) ou multiple (cases à cocher)
+ * @return rien
+ */
+function choix_multiple($intitule,$nom_variable,$defaut,$choix,$type) {
+       global $UNIQUE,$MULTIPLE;
+
+       debut_paragraphe();
+       affiche_intitule($intitule);
+       if ($type==$UNIQUE) //boutons radio
+               $type_choix="radio";
+       else if ($type==$MULTIPLE) //cases à cocher
+               $type_choix="checkbox";
+       for ($i=0;$i<count($choix);$i++) {
+               if ($type==$UNIQUE) { //boutons radio -> defaut = numéro de la case cochée
+                       $nom_var=$nom_variable;
+                       $val=$i;
+                       if ($defaut==$i)
+                               ${$nom_var}=1;
+                       else
+                               ${$nom_var}=0;
+               }
+               else if ($type==$MULTIPLE) { //cases à cocher -> defaut = représentation binaire des cases cochées
+                       $nom_var=$nom_variable."_".$i;
+                       $val=1;
+                       if ($defaut%2)
+                               ${$nom_var}=1;
+                       else
+                               ${$nom_var}=0;
+                       $defaut/=2;
+               }
+               echo "<input type='$type_choix' name='$nom_var' value='$val'";
+               if (${$nom_var} == 1)
+                       echo " CHECKED";
+               echo ">";
+               echo $choix[$i];
+               echo "<br>\n";
+       }
+       fin_paragraphe();               
+}
+
+/** placer des champs cachés dans un formulaire
+ * @param $variables tableau associatif (nom_de_la_variable => valeur)
+ * @return rien
+ */
+function caches($variables) {
+       foreach ($variables as $nom_variable=>$valeur) {
+               echo "<input type='hidden' name='";
+               echo $nom_variable;
+               echo "' value='";
+               echo $valeur;
+               echo "'>\n";
+       }
+}
+
+/** placer des boutons de validation dans un formulaire
+ * @param $boutons tableau associatif (texte_du_bouton => nom_de_la_variable_associée)
+ * @return rien
+ */
+function soumettre($boutons) {
+       debut_paragraphe();
+       foreach ($boutons as $intitule=>$nom_variable) {
+               echo "<input type='submit' name='";
+               echo $nom_variable;
+               echo "' value='";
+               echo $intitule;
+               echo "'>&nbsp;&nbsp;\n";
+       }
+       fin_paragraphe();
+}
+
+/** placer un bouton éditer dans un formulaire avec variables cachées
+ * @param $variables tableau associatif (nom_de_la_variable => valeur) de variables cachées
+ * @param $formulaire nom du fichier php cible du formulaire
+ * @return rien
+ */
+function editer($variables,$formulaire) {
+       echo "<td>"; 
+        debut_formulaire($formulaire);
+       caches($variables);                 
+       soumettre(array("Editer"=>"editer"));                     
+       fin_formulaire();
+       echo "</td>";
+}
+
+/** placer des boutons supprimer,descendre,monter avec variables cachées 
+ * dans un formulaire de cible modifie.php
+ * @param $variables tableau associatif (nom_de_la_variable => valeur) de variables cachées
+ * @return rien
+ */
+function suppr_des_mont($variables) {
+       echo "<td>";
+       debut_formulaire("modifie.php");
+       caches($variables);         
+       soumettre(array("Suppr."=>"supprimer","->"=>"descendre","<-"=>"monter"));         
+       fin_formulaire();
+       echo "</td>";
+}
+
+/** afficher un choix de réponse dans le tableau de modification principal
+ * @param $SID l'id du sondage
+ * @param $PID l'id de la partie
+ * @param $QID l'id de la question
+ * @param $RID l'id du choix
+ * @param $texte chaîne correspondant au choix de réponse
+ * @param $pair ligne paire ou impaire ?
+ * @return nouvelle valeur de ligne paire ou impaire
+ */
+function afficher_reponse($SID,$PID,$QID,$RID,$texte,$pair) {
+       echo "<tr".nom($pair)."><td colspan=\"2\"></td>";
+       echo "<td>".$texte."</td>";
+       echo "<td></td>";
+       suppr_des_mont(array("SID"=>$SID,"PID"=>$PID,"QID"=>$QID,"RID"=>$RID));
+       echo "</tr>";
+       return change($pair);
+}
+
+/** afficher une question dans le tableau de modification principal
+ * @param $SID l'id du sondage
+ * @param $PID l'id de la partie
+ * @param $QID l'id de la question
+ * @param $texte intitulé de la question
+ * @param $pair ligne paire ou impaire ?
+ * @return $pair nouvelle valeur de ligne paire ou impaire
+ */
+function afficher_question($SID,$PID,$QID,$texte,$pair,$infos) {
+    global $QUESTION_TEXTE;
+
+       echo "<tr".nom($pair)."><td></td>";
+       echo "<td colspan=\"2\"><b>".$texte."</b></td>";
+       editer(array("SID"=>$SID,"PID"=>$PID,"QID"=>$QID),"question.php");
+       suppr_des_mont(array("SID"=>$SID,"PID"=>$PID,"QID"=>$QID));
+       echo "</tr>";
+       $pair=change($pair);
+    if ($infos->type_question!=$QUESTION_TEXTE) {
+           $reponses = $infos->reponses;
+        $ordre_courant = 0;
+        if (count($reponses)>0)
+            $min_courant = $reponses[0]->ordre;
+        $min = 0;
+        for ($i=0;$i<count($reponses);$i++) {
+            for ($j=0;$j<count($reponses);$j++)
+                if ($reponses[$j]->ordre>$ordre_courant && $reponses[$j]->ordre<$min_courant) {
+                    $min = $j;
+                    $min_courant = $reponses[$j]->ordre;
+                }
+            $ordre_courant = $min_courant;
+            $min_courant = 255;//nb max de réponses
+                   $pair = afficher_reponse($SID,$PID,$QID,$reponses[$min]->idr,$reponses[$min]->texte,$pair);
+        }
+    }
+       return $pair;
+}
+
+/** afficher une partie dans le tableau de modification principal
+ * @param $SID l'id du sondage
+ * @param $PID l'id de la partie
+ * @param $titre titre de la partie
+ * @param $pair ligne paire ou impaire ?
+ * @param $parties le sondage comporte plusieurs parties ?
+ * @return $pair nouvelle valeur de ligne paire ou impaire
+ */
+function afficher_partie($SID,$PID,$titre,$pair,$parties,$infos) {
+       if ($parties == 0) {
+               echo "<tr".nom($pair).">";
+               echo "<td colspan=\"3\"><b><u>".$titre."</u></b></td>";
+               editer(array("SID"=>$SID,"PID"=>$PID,"partie"=>0),"titre.php");
+               suppr_des_mont(array("SID"=>$SID,"PID"=>$PID));
+               echo "</tr>";
+               $pair = change($pair);
+       }
+       $questions = $infos->questions;
+    $ordre_courant = 0;
+    if (count($questions)>0)
+        $min_courant = $questions[0]->ordre;
+    $min = 0;
+    for ($i=0;$i<count($questions);$i++) {
+        for ($j=0;$j<count($questions);$j++)
+            if ($questions[$j]->ordre>$ordre_courant && $questions[$j]->ordre<$min_courant) {
+                $min = $j;
+                $min_courant = $questions[$j]->ordre;
+            }
+            $ordre_courant = $min_courant;
+            $min_courant = 255;//nb max de questions
+               $pair =
+        afficher_question($SID,$PID,$questions[$min]->idq,($i+1).'. '.$questions[$min]->texte,$pair,$questions[$min]);
+    }
+       echo "<tr".nom($pair)."><td></td><td colspan = \"4\">";
+       debut_formulaire("modifie.php");
+       caches(array("SID"=>$SID,"PID"=>$PID));
+       soumettre(array("Ajouter une question"=>"ajouter_question"));
+       fin_formulaire();
+       echo "</td></tr>";
+       $pair = change($pair);
+       return $pair;
+}
+
+/** afficher les réponses d'une question texte données par les sondés
+ * @param $reponses les propositions faites par les sondés
+ */
+function afficher_reponses_texte($reponses) {
+       echo '<table class="bicol" width="95%">';
+       echo '<tr><th>Réponses</th></tr>';
+       $pair = 0;
+       for ($i=0;$i<count($reponses);$i++) {
+        if ($reponses[$i]!="") {
+                   echo "<tr".nom($pair)."><td>";
+                   echo $reponses[$i];
+                   echo "</td></tr>";
+                   $pair = change($pair);
+        }
+       }
+       echo '</table>';
+}
+
+/** afficher les réponses d'une question à choix multiples données par les sondés
+ * @param $infos les infos du choix dont son intitulé
+ * @param $reponses les résultats en nombre de votes et pourcentage
+ */
+function afficher_reponses_choix($infos,$reponses) {
+       echo '<table class="bicol" width="95%">';
+       echo '<tr><th>Réponse</th><th>Votes</th><th>%</th></tr>';
+       $pair = 0;
+       for ($i=0;$i<count($infos);$i++) {
+               echo '<tr'.nom($pair).'><td>';
+               echo $infos[$i]->texte;
+               echo '</td><td>';
+               echo $reponses[$i]->votes;
+               echo '</td><td>';
+               echo number_format($reponses[$i]->pourcentage,2);
+               echo '</td></tr>';
+               $pair = change($pair);
+       }
+       echo '</table>';
+}
+
+?>
index 1e1b46c..eb36078 100644 (file)
@@ -28,52 +28,7 @@ class SondageReq extends Validate {
         return parent::get_request($uid,'sondage',$stamp);
     }
 
-    function formu() {
-        global $baseurl; 
-        $url = "$baseurl/sondage/questionnaire.php?SID=".$this->sid;
-        return <<<________EOF
-        <form action="{$_SERVER['PHP_SELF']}" method="POST">
-        <input type="hidden" name="uid" value="{$this->uid}" />
-        <input type="hidden" name="type" value="{$this->type}" />
-        <input type="hidden" name="stamp" value="{$this->stamp}" />
-        <table class="bicol" cellpadding="4" summary="Sondage">
-        <tr>
-            <td>Demandeur&nbsp;:
-            </td>
-            <td><a href="javascript:x()" onclick="popWin('/x.php?x={$this->username}')">
-                {$this->prenom} {$this->nom}</a>
-                <?php if(isset($this->old)) echo "({$this->old})";?>
-            </td>
-        </tr>
-           <tr>
-            <td>Titre du sondage&nbsp;:</td>
-            <td>{$this->titre}</td>
-        </tr>
-        <tr>
-            <td>Prévisualisation du sondage&nbsp;:</td>
-            <td><a href="$url" target="_blank">{$this->titre}</a>
-            </td>
-        </tr>
-        <tr>
-            <td>Alias du sondage&nbsp;:</td>
-            <td><input type="text" name="alias" value="{$this->alias}" />&nbsp;(ne doit
-            pas contenir le caractère ')</td>
-        </tr>
-        <tr>
-            <td style="vertical-align: middle;">
-                <input type="submit" name="submit" value="Accepter" />
-                <br /><br />
-                <input type="submit" name="submit" value="Refuser" />
-            </td>
-            <td>
-                <p>Raison du refus:</p>
-                <textarea rows="5" cols="74" name=motif></textarea>
-            </td>
-        </tr>
-        </table>
-        </form>
-________EOF;
-    }
+    function formu() { return 'include/form.valid.sondages.tpl'; }
 
     function handle_formu () {
         global $no_update_bd,$baseurl;
@@ -86,64 +41,42 @@ ________EOF;
         if ($_REQUEST['submit']!="Refuser") {
             $alias = stripslashes($_REQUEST['alias']);
             if ($alias=="") {
-                echo "<br />Il faut entrer un alias pour valider ce sondage.";
-                return false;
+                return '<p class="erreur">Il faut entrer un alias pour valider ce sondage.</p>';
             }
             else {
                 if (strlen($alias)>15) {
-                    echo "<br />L'alias est trop long.";
-                    return false;
+                    return "<p class='erreur'>L'alias est trop long.</p>";
                 }
                 else if (strpos($alias,"'")) {
-                    echo "<br />L'alias ne doit pas contenir le caractère '";
-                    return false;
+                    return "<p class='erreur'>L'alias ne doit pas contenir le caractère '</p>";
                 }
                 else {//on vérifie que l'alias n'existe pas déjà
                     $resultat = mysql_query("select alias from sondage.description_generale ".
                     "where alias='$alias'");
                     if (mysql_num_rows($resultat)>0) {
-                        echo "<br />Cet alias est déjà utilisé.";
-                        return false;
+                        return "<p class='erreur'>Cet alias est déjà utilisé.</p>";
                     }
                 }
             }
             $this->alias=$alias;
         }
 
-        require_once("diogenes.mailer.inc.php");
+        require_once("tpl.mailer.inc.php");
     
         $lien = "$baseurl/sondage/questionnaire.php?alias=".urlencode($this->alias);
-           $titre = '"'.str_replace('&#039;',"'",$this->titre).'"';
-
-        $mymail = new DiogenesMailer('Equipe Polytechnique.org <validation+sondage@polytechnique.org>', 
-                $this->username."@polytechnique.org",
-                "[Polytechnique.org/SONDAGE] Demande de validation du sondage $titre par ".$this->username,
-                false, "validation+sondage@m4x.org");
-
-        $message =
-            "Cher(e) camarade,\n".
-            "\n";
+        
+        $mymail = new TplMailer('valid.sondages.tpl');
+        $mymail->assign('username', $this->username);
+        $mymail->assign('alias', $this->alias);
+        $mymail->assign('titre', '"'.str_replace('&#039;',"'",$this->titre).'"');
 
         if($_REQUEST['submit']=="Accepter") {
             $this->commit();
-            $message .=
-                "  Le sondage $titre que tu as composé vient d'être validé.\n".
-               "Il ne te reste plus qu'à transmettre aux sondés l'adresse".
-                " où ils pourront voter. Cette adresse est : $lien.\n";
+            $mymail->assign('answer','yes');
         } else {
-            $message .=
-                "Le sondage $titre que tu avais proposé a été refusé.\n";
-            if (!empty($_REQUEST["motif"]))
-                $message .= "\nLa raison de ce refus est : \n".
-                    stripslashes($_REQUEST["motif"])."\n";
+            $mymail->assign('answer','no');
         }
 
-        $message .=
-            "\n".
-            "Cordialement,\n".
-            "L'équipe X.org";
-        $message = wordwrap($message,78);  
-        $mymail->setBody($message);
         $mymail->send();
         //Suppression de la demande
         $this->clean();
diff --git a/templates/include/form.valid.sondages.tpl b/templates/include/form.valid.sondages.tpl
new file mode 100644 (file)
index 0000000..dec7261
--- /dev/null
@@ -0,0 +1,44 @@
+{* $Id: form.valid.sondages.tpl,v 1.1 2004-02-08 12:38:26 x2000habouzit Exp $ *}
+
+<form action="{$smarty.server.PHP_SELF}" method="POST">
+<input type="hidden" name="uid" value="{$valid->uid}" />
+<input type="hidden" name="type" value="{$valid->type}" />
+<input type="hidden" name="stamp" value="{$valid->stamp}" />
+<table class="bicol" cellpadding="4" summary="Sondage">
+<tr>
+  <td>Demandeur&nbsp;:
+  </td>
+  <td><a href="javascript:x()" onclick="popWin('{"x.php?x=$valid->username"|url}')">
+      {$valid->prenom} {$valid->nom}</a>
+    {if $valid->old}({$valid->old}){/if}
+  </td>
+</tr>
+<tr>
+  <td>Titre du sondage&nbsp;:</td>
+  <td>{$valid->titre}</td>
+</tr>
+<tr>
+  <td>Prévisualisation du sondage&nbsp;:</td>
+  <td><a href="{"sondages/questionnaire.php?SID=$valid->sid"|url}" target="_blank">{$valid->titre}</a>
+  </td>
+</tr>
+<tr>
+  <td>Alias du sondage&nbsp;:</td>
+  <td><input type="text" name="alias" value="{$valid->alias}" />&nbsp;(ne doit pas contenir le caractère ')
+  </td>
+</tr>
+<tr>
+  <td style="vertical-align: middle;">
+      <input type="submit" name="submit" value="Accepter" />
+      <br /><br />
+      <input type="submit" name="submit" value="Refuser" />
+  </td>
+  <td>
+      <p>Raison du refus:</p>
+      <textarea rows="5" cols="74" name=motif></textarea>
+  </td>
+</tr>
+</table>
+</form>
+
+{* vim:set et sw=2 sts=2 sws=2: *}
diff --git a/templates/mails/valid.sondages.tpl b/templates/mails/valid.sondages.tpl
new file mode 100644 (file)
index 0000000..58bc8fb
--- /dev/null
@@ -0,0 +1,26 @@
+{* $Id: valid.sondages.tpl,v 1.1 2004-02-08 12:38:27 x2000habouzit Exp $ *}
+{config_load file="mails.conf" section="valid_sondages"}
+{subject text="[Polytechnique.org/SONDAGE] Demande de validation du sondage $titre par $username"}
+{from full=#from#}
+{to addr="$username@polytechnique.org"}
+{cc full=#cc#}
+{if $answer eq "yes"}
+Cher(e) camarade,
+
+  Le sondage {$titre} que tu as composé vient d'être validé.
+  Il ne te reste plus qu'à transmettre aux sondés l'adresse où ils pourront voter. Cette adresse est : https://www.polytechnique.org/sondages/questionnaire.php?alias={$alias|escape:'url'}
+
+Cordialement,
+L'équipe X.org
+{elseif $answer eq 'no'}
+
+Cher(e) camarade,
+
+  Le sondage $titre que tu avais proposé a été refusé.
+La raison de ce refus est :
+{$smarty.request.motif}
+
+Cordialement,
+L'équipe X.org
+{/if}
+{* vim:set nocindent noautoindent textwidth=0: *}