ADD premier commit
authorgburri <gburri@4c3d3983-c6fa-4c6c-9935-18c3bbef1bf0>
Sun, 28 Sep 2008 17:44:47 +0000 (17:44 +0000)
committergburri <gburri@4c3d3983-c6fa-4c6c-9935-18c3bbef1bf0>
Sun, 28 Sep 2008 17:44:47 +0000 (17:44 +0000)
git-svn-id: svn://localhost/cl7/trunk@1 4c3d3983-c6fa-4c6c-9935-18c3bbef1bf0

66 files changed:
TODO [new file with mode: 0644]
class_galerie_photos.php [new file with mode: 0644]
class_participant.php [new file with mode: 0644]
config.php [new file with mode: 0644]
connexion.php [new file with mode: 0644]
controller.php [new file with mode: 0644]
css/style.css [new file with mode: 0644]
doc/graphismes/bieres.xcf [new file with mode: 0644]
doc/graphismes/bieres_fond1.xcf [new file with mode: 0644]
doc/graphismes/bieres_fond2.xcf [new file with mode: 0644]
favicon.ico [new file with mode: 0644]
fonc_images.php [new file with mode: 0644]
images/banniere_eupho.gif [new file with mode: 0644]
images/bieres_fond1.jpg [new file with mode: 0644]
images/bieres_fond2.jpg [new file with mode: 0644]
images/carte.jpg [new file with mode: 0644]
images/carte_mini.jpg [new file with mode: 0644]
images/carte_zoom.gif [new file with mode: 0644]
images/carte_zoom_mini.gif [new file with mode: 0644]
images/exclamation.gif [new file with mode: 0755]
images/fermer.gif [new file with mode: 0755]
images/fond1.png [new file with mode: 0644]
images/fond2.png [new file with mode: 0644]
images/fond3.png [new file with mode: 0644]
images/information.gif [new file with mode: 0755]
images/interrogation.gif [new file with mode: 0755]
images/lien_externe.png [new file with mode: 0644]
images/smiles/Thumbs.db [new file with mode: 0644]
images/smiles/argn.gif [new file with mode: 0644]
images/smiles/bigsmile.gif [new file with mode: 0644]
images/smiles/chat.gif [new file with mode: 0644]
images/smiles/chat.psd [new file with mode: 0644]
images/smiles/clin.gif [new file with mode: 0644]
images/smiles/cool.gif [new file with mode: 0644]
images/smiles/eheheh.gif [new file with mode: 0644]
images/smiles/langue.gif [new file with mode: 0644]
images/smiles/lol.gif [new file with mode: 0644]
images/smiles/oh.gif [new file with mode: 0644]
images/smiles/pas_utilise_cool.gif [new file with mode: 0644]
images/smiles/pascontent.gif [new file with mode: 0644]
images/smiles/smile.gif [new file with mode: 0644]
images/smiles/sniff.gif [new file with mode: 0644]
images/smiles/spliff.gif [new file with mode: 0644]
images/smiles/triste.gif [new file with mode: 0644]
index.php [new file with mode: 0644]
js/betterjs.js [new file with mode: 0644]
js/cl7.js [new file with mode: 0644]
js/jquery-1.2.6.min.js [new file with mode: 0644]
js/util.js [new file with mode: 0644]
menu_droit.php [new file with mode: 0644]
participants.php [new file with mode: 0644]
pizzas.php [new file with mode: 0644]
smiles.php [new file with mode: 0644]
tools/start_yaws.sh [new file with mode: 0755]
tools/yaws.conf [new file with mode: 0644]
traitement_pre_affichage.php [new file with mode: 0644]
tx_bienvenue.php [new file with mode: 0644]
tx_contacts.php [new file with mode: 0644]
tx_informations.php [new file with mode: 0644]
tx_inscription.php [new file with mode: 0644]
tx_inscrits.php [new file with mode: 0644]
tx_intranet.php [new file with mode: 0644]
tx_jeux_joues.php [new file with mode: 0644]
tx_photos.php [new file with mode: 0644]
update_db.php [new file with mode: 0644]
urlrewrite/cl7_urlrewrite.erl [new file with mode: 0644]

diff --git a/TODO b/TODO
new file mode 100644 (file)
index 0000000..d718d9e
--- /dev/null
+++ b/TODO
@@ -0,0 +1,17 @@
+V proposer à fabrice de remplacer chaton par euphorik.ch\r
+V Pomper le code de la dll, pour rajouter par exemple des traitement_pre_affichage() dans menu_droit.php\r
+V discuter des tournois et corriger les choix dans l'inscription\r
+V virer ICQ dans les inscriptions\r
+V indiquer que l'email n'est pas public\r
+V Finir la page inscription + controller.php\r
+V Finir la page "Inscrits"\r
+V faire un favicon à base de capsule de biere\r
+V Ajouter un peu de javascript sur la page "jeux joués" pour éviter de cocher trop de jeux (pas forcéement util)\r
+V controller que la limite du nombre de participant fontionne bien, ev. afficher le nombre de place restante
+\r
+* demander à fabrice :\r
+   * quels personnes à mettre dans 'contacts' avec quel email\r
+   * s'il y aura le net sur place\r
+   * le prix exact\r
+* mettre un lien vers euphorik sur la conversation lié au nouveau troll concernant l'ouverture du site\r
+* implémenter le paramètre de config '$INSCRIPTIONS_TERMINEES' 
diff --git a/class_galerie_photos.php b/class_galerie_photos.php
new file mode 100644 (file)
index 0000000..64c3df4
--- /dev/null
@@ -0,0 +1,205 @@
+<?php
+include('fonc_images.php');
+
+define('NOM_FICHIER_INFO', 'infos.txt');
+define('SUFFIXE_VIGNETTE','micro_');
+define('SUFFIXE_PHOTO_REDUITE','mini_');
+
+#retourne les arguments à repasser à la page
+function arguments_page()
+{
+       global $vars_repasse;
+       $args = '';     
+       foreach($vars_repasse as $var)  
+               if(isset($_GET[$var])) $args .= $var.'='.$_GET[$var].'&amp;';
+       return $args;
+}
+
+class Galerie
+{
+       var $repertoire_galerie;
+       
+       var $section_courante = null;
+       var $taille_vignette = TAILLE_VIGNETTE; 
+       var $nombre_vignette_par_page = NOMBRE_VIGNETTE_PAR_PAGE;
+       var $nombre_colonne = NOMBRE_COLONNE;
+
+       #contient un tableau ayant pour indice le nom des section
+       #et pour valeur un tableau contenants en 'infos' un tableau contenant le nom est la date de la section
+       #et en 'images' un tableau des images de la section
+       var $sections = array();
+       
+       function repertoire_courant()   { return $this->repertoire_galerie.'/'.$this->section_courante.'/';     }
+       
+       #constructeur
+       function Galerie($rep='.')
+       {
+               $this->repertoire_galerie = $rep;
+               
+               #ouvre le repertoire de la galerie
+               $rep_galerie = dir($this->repertoire_galerie);
+               #pour chaque repertoire (section)
+               while ($section = $rep_galerie->read())
+               {
+               if ($section != '..' and $section != '.')
+                       {
+                               if (is_null($this->section_courante)) $this->section_courante = $section;
+                       
+                          #ouvre le repertoire des images de la section en cours
+                               $rep_section = dir($this->repertoire_galerie.'/'.$section);
+
+                               #essais d'inclure le fichier d'info
+                               if (!@include($this->repertoire_galerie.'/'.$section.'/'.NOM_FICHIER_INFO))
+                               {$auteur = 'auteur inconnu'; $date = 'date inconnue';}                          
+                                                               
+                               #enregistre les infos
+                               $this->sections[$section]['infos']['auteur'] = $auteur;
+                               $this->sections[$section]['infos']['date'] = $date;
+
+                               #pour chaque images
+                               while ($photo = $rep_section->read())
+                               {
+                                       if (ereg('('.SUFFIXE_VIGNETTE.'|'.SUFFIXE_PHOTO_REDUITE.').*', $photo)) continue;
+                                       if (ereg('.*\.[jJ][pP][gG]', $photo)) #si l'extension est .jpg alors mémorise l'image
+                                               $this->sections[$section]['images'][] = $photo;
+                               }
+                               $rep_section->close();
+                       }
+               }
+               $rep_galerie->close();          
+                       
+               foreach($this->sections as $nom_section => $null)
+                       sort($this->sections[$nom_section]['images']);          
+       }
+       
+       #affiche la liste des pages
+       function liste_pages()
+       {
+               for($i=1; $i<=ceil(count($this->sections[$this->section_courante]['images'])/NOMBRE_VIGNETTE_PAR_PAGE); $i++)
+                       echo ($i==1?'':' | ') ,($i==$_GET['__page_section']?'<b>':''),'<a href="',NOM_FICHIER,'?',arguments_page(),'__section=',$this->section_courante,'&amp;__page_section=',$i,'&amp;__page_galerie=section">',$i,'</a>',($i==$_GET['__page_section']?'</b>':'');
+       }
+       
+       #affiche les vignettes de la section courante
+       function afficher_vignettes($page)
+       {
+               $num_image = 0;
+
+               echo '<table width="100%" cellpading="0" cellspacing="0" border="0">';
+               echo '<tr><td><div style="font-size : ',TAILLE_SECTION,'pt; font-weight : bold; ">',$this->section_courante,'</div></td>';
+               echo '<td align="right">Pages : ',$this->liste_pages(),'</td></tr>';
+               echo '<tr><td colspan="2">Auteur : ', $this->get_auteur(), ' - Date : ', $this->get_date(), '</td></tr></table>';
+                                       
+               #pour chaque image de la section courante
+               echo '<br/><table width="100%" cellpading="0" cellspacing="0" border="0"><tr>';
+               foreach ($this->sections[$this->section_courante]['images'] as $image)
+               {
+                       $num_image++;
+                                               
+                       if ($num_image <= $page*NOMBRE_VIGNETTE_PAR_PAGE-NOMBRE_VIGNETTE_PAR_PAGE or $num_image > $page*NOMBRE_VIGNETTE_PAR_PAGE)
+                               continue;
+                                                       
+                       $vignette = $this->repertoire_courant().SUFFIXE_VIGNETTE.$image;
+                       image_redim ($this->repertoire_courant().$image, TAILLE_VIGNETTE, $vignette, 60, 1);
+
+                       if (($num_image - $page*NOMBRE_VIGNETTE_PAR_PAGE-1) % NOMBRE_COLONNE == 0) echo '</tr><tr>';
+                       echo '<td align="center" valign="middle">
+                       <a href="',NOM_FICHIER,'?',arguments_page(),'__section=',$this->section_courante,'&amp;__photo=',$image,'&amp;__page_galerie=photo">
+                       <img alt="', $vignette ,'" src="', $vignette ,'"/>
+                       </a></td>';
+               }
+               echo '</tr></table>';
+       }
+       
+       #pour afficher une seule photo
+       function afficher_photo($photo)
+       {
+               $photo_reduite = $this->repertoire_courant().SUFFIXE_PHOTO_REDUITE.$photo;
+               $pas_redim = false;
+               if (!image_redim ($this->repertoire_courant().$photo, TAILLE_PHOTO_REDUITE, $photo_reduite, 70, 1))
+                       $pas_redim = true;
+               
+               $lien_retour = NOM_FICHIER.'?'.arguments_page().'__section='.$this->section_courante.'&amp;__page_section='.$this->num_page_photo($photo).'&amp;__page_galerie=section';
+               
+               if ($photo_suivant = $this->photo_suivante($photo))
+                       $lien_suivant = NOM_FICHIER.'?'.arguments_page().'__section='.$this->section_courante.'&amp;__photo='.$photo_suivant.'&amp;__page_galerie=photo';
+               
+               if ($photo_precedante = $this->photo_precedante($photo))
+                       $lien_precedant = NOM_FICHIER.'?'.arguments_page().'__section='.$this->section_courante.'&amp;__photo='.$photo_precedante.'&amp;__page_galerie=photo';
+
+               
+               echo '<table width="100%" cellpading="0" cellspacing="0" border="0">';
+               
+               #la barre de navigation : suivant / précédant
+               $nav = '<tr><td>'.(isset($lien_precedant)?'<a href="'.$lien_precedant.'">Photo précédente</a>':'').'</td>'.
+                                '<td align="center"><a href="'.$lien_retour.'">Retour</a></td>'.
+                      '<td align="right">'.(isset($lien_suivant)?'<a href="'.$lien_suivant.'">Photo suivante</a>':'').'</td></tr>';
+               
+               echo $nav;
+               echo '<tr><td colspan="3" align="center">'.($pas_redim ? '' : '<a target="_blank" href="'.$this->repertoire_courant().'">0').'<img alt="'. ($pas_redim ? $photo : $photo_reduite) .'" src="'. ($pas_redim ? $this->repertoire_courant().$photo : $photo_reduite) .'"/>'.($pas_redim ?'':'</a>').'</td></tr>';
+               echo '<tr><td colspan="3" align="center"><div style="font-size : ',TAILLE_TAILLE_NOM_IMAGE,'pt; font-weight : bold; ">',$photo,'</div></td></tr>';
+               echo $nav;
+               echo '</table>';
+       }
+       
+       #renvois le numéros de la page ou se trouve une photo
+       function num_page_photo($photo)
+       {
+               $num_image = 0;
+               foreach($this->sections[$this->section_courante]['images'] as $nom_image)
+               {
+                       $num_image++;
+                       if ($photo == $nom_image) return ceil($num_image/NOMBRE_VIGNETTE_PAR_PAGE);
+               }
+               return 1;
+       }
+       
+       #renvois la photo suivant, si elle n'existe pas alors renvois 0
+       function photo_suivante($photo)
+       {
+               $num_photo = array_search($photo, $this->sections[$this->section_courante]['images']);
+               if (isset($this->sections[$this->section_courante]['images'][$num_photo+1]))
+                       return $this->sections[$this->section_courante]['images'][$num_photo+1];
+               else
+                       return 0;
+       }
+       
+       #renvois la photo precedante, si elle n'existe pas alors renvois 0
+       function photo_precedante($photo)
+       {
+               $num_photo = array_search($photo, $this->sections[$this->section_courante]['images']);
+               if (isset($this->sections[$this->section_courante]['images'][$num_photo-1]))
+                       return $this->sections[$this->section_courante]['images'][$num_photo-1];
+               else
+                       return 0;
+       }
+               
+       #renvois un tableau des sections
+       function sections()
+       {
+               $sections = array();
+               foreach ($this->sections as $nom_section => $section)
+                       array_push($sections, $nom_section);
+               
+               return $sections;
+       }
+       
+       function set_section_courante($section)
+       {
+               $this->section_courante = $section;
+       }
+       
+       #renvois l'auteur d'une section
+       function get_auteur($section=null)
+       {
+               if (is_null($section)) $section = $this->section_courante;
+               return $this->sections[$section]['infos']['auteur'];
+       }
+       
+       #renvois la date de la section
+       function get_date($section=null)
+       {
+               if (is_null($section)) $section = $this->section_courante;
+               return $this->sections[$section]['infos']['date'];
+       }
+}
+?>
\ No newline at end of file
diff --git a/class_participant.php b/class_participant.php
new file mode 100644 (file)
index 0000000..d5f9c71
--- /dev/null
@@ -0,0 +1,80 @@
+<?php\r
+\r
+/**\r
+  * Représente un participant.\r
+  */
+class Participant
+{
+   public $info; # Toute les infos du membre sous la forme d'un objet
+       public $valide; # Savoir si le participant existe\r
+   \r
+   static private $NB_VOTES_PAR_PARTICIPANT = 3;
+       
+   /**
+     * Constructeur, peut être appelé sous trois formes différentes.\r
+     */
+       function Participant($v1=NULL, $v2=NULL)
+       {          \r
+      # aucunes valeurs transmise => ce n'est pas un participant valide
+          if ($v1 == NULL && $v2 == NULL) 
+      {\r
+         $this->valide = 0;\r
+         return;\r
+      }\r
+      
+               if (is_string($v1) && is_string($v2)) # Aucun des arguments n'est vide alors c'est le pseudo et le password qui ont été transmis
+                       $res = mysql_query("SELECT * FROM participants WHERE pseudo = '" . addslashes($v1) . "' AND password = '" . addslashes($v2) . "'");
+               else # Sinon c'est l'id
+                       $res = mysql_query("SELECT * FROM participants WHERE id = " . addslashes($v1));\r
+      
+               if (mysql_num_rows($res) == 0)\r
+      {\r
+         $this->valide = FALSE;\r
+      }\r
+      else\r
+      {
+         $this->info = mysql_fetch_object($res);
+         $this->valide = TRUE; \r
+      }
+       }\r
+   \r
+   /**\r
+     * Renvoie le nombre de votes restant pour le participant.\r
+     */\r
+   function nb_vote_restant()\r
+   {\r
+      $nombre_de_vote = mysql_fetch_array(mysql_query("\r
+         SELECT COUNT(*) FROM participants RIGHT JOIN jeux_choisis ON participants.id = jeux_choisis.participant_id\r
+         WHERE participants.id = " . $this->info->id . "\r
+         GROUP BY participants.id\r
+      "));\r
+      \r
+      return Participant::$NB_VOTES_PAR_PARTICIPANT - $nombre_de_vote[0];\r
+   }\r
+\r
+   /**\r
+     * Renvois TRUE si le nombre de participant max est atteint.\r
+     */\r
+   static function nombre_participant_max_atteint()\r
+   {\r
+      global $NB_MAX_PARTICIPANT;\r
+      $res_SQL = mysql_query("SELECT COUNT(*) FROM participants");\r
+      $nb_participant = mysql_fetch_row($res_SQL);\r
+\r
+      return $nb_participant[0] >= $NB_MAX_PARTICIPANT;\r
+   }\r
+   \r
+   /**\r
+     * Renvois le nombre de places restantes.\r
+     */\r
+   static function nombre_place_restante()\r
+   {\r
+      global $NB_MAX_PARTICIPANT;\r
+      $res_SQL = mysql_query("SELECT COUNT(*) FROM participants");\r
+      $nb_participant = mysql_fetch_row($res_SQL);\r
+      \r
+      return $NB_MAX_PARTICIPANT - $nb_participant[0];\r
+   }
+}
+
+?>
\ No newline at end of file
diff --git a/config.php b/config.php
new file mode 100644 (file)
index 0000000..ffc342a
--- /dev/null
@@ -0,0 +1,26 @@
+<?php # encoding:utf-8\r
+/**\r
+  * Paramètres du site CL7.\r
+  */\r
+\r
+# Parametres MySQL\r
+$SQL_HOTE = "localhost";\r
+$SQL_LOGIN = "cl7";\r
+$SQL_PASS = "123soleil";\r
+$NOM_BASE = "corcelles_lan7";\r
+\r
+# nombre maximum de participant\r
+$NB_MAX_PARTICIPANT = 25;\r
+\r
+# nombre de votes possibles par participants \r
+$NB_VOTES_JEUX = 3;\r
+\r
+# mettre à TRUE pour cloturer les inscriptions\r
+$INSCRIPTIONS_TERMINEES = FALSE;\r
+\r
+# si la partie pizza est visible\r
+$PIZZA_VISIBLE = 0;\r
+\r
+# si on peut commander des pizza (mettre a 0 lorsque on telephone pour commander ! ;)\r
+$PIZZA_PEUT_COMMANDER = 1;\r
+?>\r
diff --git a/connexion.php b/connexion.php
new file mode 100644 (file)
index 0000000..6b5e26c
--- /dev/null
@@ -0,0 +1,39 @@
+<?php\r
+/*\r
+ * Connexion à la base de donnée + résolutiondu participant.\r
+ * Produit une variable globale nommée '$le_participant'.\r
+ */
+\r
+include_once("config.php");
+include_once("class_participant.php");\r
+
+$lien_mysql = mysql_connect($SQL_HOTE, $SQL_LOGIN, $SQL_PASS);
+mysql_select_db($NOM_BASE);\r
+mysql_set_charset("UTF8");\r
+mysql_query('SET AUTOCOMMIT=0');
+
+if (isset($_POST['effacer_cookie'])) # le membre se délogue
+{
+   setcookie("COOKIE_INFO_PATICIPANT", "", time() - 100); #'efface' le cookie membre
+   unset($HTTP_COOKIE_VARS["COOKIE_INFO_PATICIPANT"]);
+       unset($log);
+}
+
+if (isset($_POST['log'])) # le membre se logue
+{              
+   $le_participant = new Participant($pseudo, $password);
+   if ($le_participant->valide)
+   {
+      setcookie ("COOKIE_INFO_PATICIPANT", $le_participant->info->id, time() + 31104000);              
+   }
+}
+else if (isset($HTTP_COOKIE_VARS["COOKIE_INFO_PATICIPANT"])) # le cookie existe deja chez le participant\r
+{
+   $le_participant = new Participant($HTTP_COOKIE_VARS["COOKIE_INFO_PATICIPANT"]);\r
+}
+else\r
+{
+       $le_participant = new Participant();\r
+}
+
+?>
\ No newline at end of file
diff --git a/controller.php b/controller.php
new file mode 100644 (file)
index 0000000..ff47132
--- /dev/null
@@ -0,0 +1,101 @@
+<?php # coding:utf-8\r
+/**\r
+  * Traite les données envoyées par le client.\r
+  */\r
+include_once("class_participant.php");
+\r
+/**\r
+  * Renvoie TRUE si les données d'une inscription sont valides (POST).\r
+  */\r
+function donnees_inscription_valides()\r
+{\r
+   return\r
+      $_POST['pseudo'] != "" &&\r
+      $_POST['pass1'] != "" &&\r
+      $_POST['pass1'] == $_POST['pass2'] &&\r
+      strlen($_POST['pass1']) >= 3 &&\r
+      $_POST['nom'] != "" &&\r
+      $_POST['prenom'] != "" &&\r
+      $_POST['e_mail'] != "";\r
+}\r
+\r
+# insciption d'un nouveau participant
+if (isset($_POST['inscription']) && !Participant::nombre_participant_max_atteint())
+{              \r
+   # vérification des données\r
+   if (\r
+      donnees_inscription_valides() &&\r
+      $_POST['accord'] == "on"\r
+   )\r
+   {\r
+      mysql_query("BEGIN TRANSACTION");\r
+      mysql_query("\r
+         INSERT INTO participants \r
+         (pseudo, password, clan_nom, clan_tag, nom, prenom, age, e_mail, remarques)
+         VALUES (\r
+            '".addslashes($_POST['pseudo'])."',\r
+            '".addslashes($_POST['pass1'])."',\r
+            '".addslashes($_POST['clan_nom'])."',\r
+            '".addslashes($_POST['clan_tag'])."',\r
+            '".addslashes($_POST['nom'])."',\r
+            '".addslashes($_POST['prenom'])."',\r
+            '".addslashes($_POST['age'])."',\r
+            '".addslashes($_POST['e_mail'])."',\r
+            '".addslashes($_POST['remarques'])."'\r
+         )"\r
+      );\r
+      mysql_query("COMMIT");\r
+   }\r
+   
+       $le_participant = new participant($_POST['pseudo'], $_POST['pass1']);
+   setcookie("COOKIE_INFO_PATICIPANT", $le_participant->info->id, time() + 31104000);  
+}
+# un participant modifie ses infos
+else if(isset($_POST['modification_participant']) && $le_participant->valide)
+{\r
+   if (donnees_inscription_valides())\r
+   {\r
+      mysql_query("BEGIN TRANSACTION");
+      mysql_query("UPDATE participants SET pseudo = '".addslashes($_POST['pseudo'])."' WHERE id = " . $le_participant->info->id);
+      mysql_query("UPDATE participants SET password = '".addslashes($_POST['pass1'])."' WHERE id = " . $le_participant->info->id);
+      mysql_query("UPDATE participants SET clan_nom = '".addslashes($_POST['clan_nom'])."' WHERE id = " . $le_participant->info->id);
+      mysql_query("UPDATE participants SET clan_tag = '".addslashes($_POST['clan_tag'])."' WHERE id = " . $le_participant->info->id);
+      mysql_query("UPDATE participants SET nom = '".addslashes($_POST['nom'])."' WHERE id = " . $le_participant->info->id);
+      mysql_query("UPDATE participants SET prenom = '".addslashes($_POST['prenom'])."' WHERE id = " . $le_participant->info->id);
+      mysql_query("UPDATE participants SET age = '".addslashes($_POST['age'])."' WHERE id = " . $le_participant->info->id);
+      mysql_query("UPDATE participants SET e_mail = '".addslashes($_POST['e_mail'])."' WHERE id = " . $le_participant->info->id);
+      mysql_query("UPDATE participants SET remarques = '".addslashes($_POST['remarques'])."' WHERE id = " . $le_participant->info->id);\r
+      mysql_query("COMMIT");\r
+   }
+}\r
+# vote pour des jeux\r
+else if (isset($_POST['set_jeux_joues']) && $le_participant->valide)\r
+{\r
+   $votes = $_POST['votes'];\r
+   if (!$votes)\r
+      $votes = array();\r
+   \r
+   mysql_query("BEGIN TRANSACTION");\r
+   \r
+   # l'utilisateur peut proposer le nom d'un jeu qui ne se trouve pas dans la liste\r
+   $jeu = trim($_POST['jeu']);\r
+   if ($jeu !== '')\r
+   {\r
+      mysql_query("INSERT INTO jeux (nom) VALUES ('".addslashes($jeu)."')");\r
+      $id = mysql_insert_id();\r
+      if ($id != 0) # si le jeu se trouve déjà dans la liste alors $id == 0\r
+         array_unshift($votes, $id);\r
+   }\r
+   \r
+   # suppression des anciens votes (remplacement par les nouveaux)\r
+   mysql_query("DELETE FROM jeux_choisis WHERE participant_id = " . $le_participant->info->id);\r
+\r
+   # traite les trois premiers votes\r
+   for ($i = 0; $i < count($votes) && $i < $NB_VOTES_JEUX ; $i++)\r
+   {\r
+      mysql_query("INSERT INTO jeux_choisis (participant_id, jeu_id) VALUES (".$le_participant->info->id.", ".(int)$votes[$i].")");\r
+   }\r
+   \r
+   mysql_query("COMMIT");\r
+}
+?>
diff --git a/css/style.css b/css/style.css
new file mode 100644 (file)
index 0000000..5db7678
--- /dev/null
@@ -0,0 +1,243 @@
+/* coding:utf-8 */\r
+\r
+html {\r
+   min-height: 100%;\r
+   margin-bottom: 1px;\r
+}\r
+body {
+       margin: 0px;
+       font-family: monospace;
+       font-size: 11px;
+       color: #ffffff;
+       background-color: #000000;
+}
+img {
+       border-width: 0px;
+}\r
+a {\r
+   color: #8888ff;\r
+   text-decoration: none;\r
+}\r
+a:hover {\r
+   color: #aaaaff;   \r
+}\r
+a.externe {\r
+       padding-right: 12px;\r
+       background:transparent url(../images/lien_externe.png) no-repeat scroll right center;\r
+}\r
+th {\r
+   background-image:url(../images/fond1.png);\r
+   background-repeat:repeat;\r
+}\r
+em {\r
+   color: #ffff00;\r
+}
+
+#container {
+   padding-top: 50px;
+   padding-bottom: 50px;
+   margin-left: auto;
+   margin-right: auto;
+   width: 800px;
+   margin-top: 0px;
+   background-image: url(../images/bieres_fond1.jpg);
+   background-repeat: repeat-y;
+   background-position: 0px -25px;
+}
+
+#cadre {
+   margin-left: 100px;
+   width: 600px;
+   border: 1px solid #ffffff;
+   background-image: url(../images/bieres_fond2.jpg);
+   background-repeat: repeat-y;
+   background-position: 0px -75px;
+
+}
+
+#titre {
+   width: 590px;
+   padding: 5px;
+   font-size: 20px;
+   background-image: url(../images/fond1.png);
+   background-repeat: repeat;
+}\r
+\r
+#titre #nbPlacesRestantes {\r
+       font-size: 11px;\r
+   float: right;\r
+}
+
+ul#menu {\r
+   text-align: justify;
+   margin: 0px;\r
+   padding: 3px;
+   background-image: url(../images/fond3.png);
+   background-repeat: repeat;
+}
+#menu li {
+   display:inline;
+   margin-right: 10px;
+}
+#menu a {
+   color: #6bff6b;
+   text-decoration: none;
+}
+#menu a:hover,\r
+#menu li.courante a {
+   color: #ffffff;
+   background-color: #00d000;
+}
+
+#contenu {
+   padding: 10px;
+   overflow: auto;
+       /*width: 100%*/
+}
+#contenu h1 {
+   margin-top: 5px;
+   margin-bottom: 5px;
+   font-size: 15px;
+}
+#contenu h2 {
+   margin-top: 7px;
+   margin-bottom: 3px;
+   font-size: 12px;
+}
+#contenu p {
+   margin-top: 2px;
+}
+#contenu ul {
+   margin-top: 2px;\r
+   padding-left: 23px;
+}
+#contenu .miniInfo {
+       font-size: 9px;
+}
+#contenu table {
+       /*table-layout: fixed*/
+}
+#contenu td {
+   vertical-align: top;
+}
+#contenu col#inscriptionColonneNom {
+   width: 30%;
+}
+#contenu col#inscriptionColonneValeur {
+   width: 70%;
+}\r
+\r
+#contenu #formulaireJeuxJoues .aVote {\r
+   color: #ffff00;\r
+}\r
+
+#informations {
+   margin: 5px;
+   padding: 5px;
+   float: right;
+   background-image: url(../images/fond2.png);
+   background-repeat: repeat;
+}\r
+#informations ul {\r
+   padding-left: 5px;\r
+}\r
+#informations li {\r
+   list-style-type: none;\r
+}\r
+#informations li:before {\r
+   content: "» ";\r
+}
+#informations form p {
+   margin-bottom: 1px;
+   margin-top: 1px;
+}
+
+#pieddepage {\r
+   text-align: center;
+   background-image: url(../images/fond1.png);
+   background-repeat: repeat;
+   padding: 2px;
+}
+
+form input,
+form button,
+form select,
+form textarea{   \r
+   font-family: monospace;\r
+   font-size: 11px;
+   color: #ffffff;
+   background-color: transparent; 
+   border: #ffffff 1px solid;
+}
+form input:hover, form input:focus,
+form button:hover, form button:focus,
+form select:hover, form select:focus,
+form textarea:hover, form textarea:focus {
+   background-color: transparent; \r
+   border: #ffff00 1px solid;
+}
+
+/***** La boite d'information (s'apparente à une MessageBox) *****/
+div#info {
+       text-align: center;
+       width:100%;
+       position: fixed;
+       left: 0px;
+       top: 0px;
+       background-color: #841919;
+       border-bottom: 1px solid #FFFFFF;
+       z-index: 100;
+       color: #f0df95
+}
+div#info div.fermer {
+       float:right;
+       cursor: pointer;
+       height:16px;
+       width: 16px;
+       background-image: url(../images/fermer.gif)
+}
+div#info #icone {
+       float:left;     
+       height:16px;
+       width: 16px;
+}
+div#info #icone.interrogation {
+       background-image: url(../images/interrogation.gif)
+}
+div#info #icone.information {
+       background-image: url(../images/information.gif)
+}
+div#info #icone.exclamation {
+       background-image: url(../images/exclamation.gif)
+}      
+div#info .boutons {
+       padding: 1px;
+}
+div#info .boutons div {
+       cursor: pointer;
+       background-color: #c62929;      
+       display: inline;
+       padding: 0px 5px 0px 5px;
+       margin: 0px 5px 0px 5px;
+}
+div#info .boutons div:hover {
+       background-color: #e84747;      
+}
+
+/* Pour la page des pizzas */
+.pizzaHeader {
+   background-image:url(../images/fond1.png);
+   background-repeat:repeat;
+}
+
+tr:hover
+{
+   background-image:url(../images/fond2.png);
+   background-repeat:repeat;
+}
+
+.pizzaChoisie 
+{
+   background-image:url(../images/fond2.png);
+   background-repeat:repeat;
+}
diff --git a/doc/graphismes/bieres.xcf b/doc/graphismes/bieres.xcf
new file mode 100644 (file)
index 0000000..41b6809
Binary files /dev/null and b/doc/graphismes/bieres.xcf differ
diff --git a/doc/graphismes/bieres_fond1.xcf b/doc/graphismes/bieres_fond1.xcf
new file mode 100644 (file)
index 0000000..a8e073b
Binary files /dev/null and b/doc/graphismes/bieres_fond1.xcf differ
diff --git a/doc/graphismes/bieres_fond2.xcf b/doc/graphismes/bieres_fond2.xcf
new file mode 100644 (file)
index 0000000..094993d
Binary files /dev/null and b/doc/graphismes/bieres_fond2.xcf differ
diff --git a/favicon.ico b/favicon.ico
new file mode 100644 (file)
index 0000000..643b140
Binary files /dev/null and b/favicon.ico differ
diff --git a/fonc_images.php b/fonc_images.php
new file mode 100644 (file)
index 0000000..f001223
--- /dev/null
@@ -0,0 +1,169 @@
+<?php
+#Copyright (C) 2002 Grégory Burri, this software is under GNU GPL see the index.php file for more informations
+
+/*--------------------------------------------------
+auteur : Pifou
+date   : 24.03.2002
+
+gestion d'image, en particulier de redimensionnage
+---------------------------------------------------*/
+
+/*--------------------------------------------------
+auteur : pifou
+date   : 24.03.2002
+
+redimensionne une image pour qu'elle tienne dans un carré
+de $dim de coté et l'enregistre dans le repertoire $nouveau_chemin
+$nouveau_chemin contient le nom de l'image : '/tmp/apercu_image.jpg'
+renvois 0 si il n'y a pas besoin de la redimensionner.
+$force_rewrite_redim peut prendre 3 valeur =>
+* 0 : si l'image de sortie existe deja alors ne fait rien (renvois 1)
+* 1 : si l'image de sortie existe deha et qu'elle a la meme taille alors ne fait rien
+* 2 : crée de toutes manières l'image de sortie
+---------------------------------------------------*/
+function image_redim ($image_chemin, $dim, $nouveau_chemin, $qualite = 60, $force_rewrite_redim=0)
+{
+       $image = ImageCreateFromJpeg($image_chemin);
+       
+       $hauteur = imageSY($image);
+       $largeur = imageSX($image);
+       
+       if ($hauteur >= $largeur && $hauteur > $dim)
+          $rapport = $dim/$hauteur;       
+       else if($largeur > $hauteur && $largeur > $dim)
+          $rapport = $dim/$largeur;    
+       else return 0;  
+       
+       $new_hauteur = round($hauteur * $rapport);
+       $new_largeur = round($largeur * $rapport);
+       
+    #si le fichier ne doit pas etre recree si il existe deja
+    if ($force_rewrite_redim==0)
+       {
+       #si le fichier existe deja alors ne fait rien
+          if (file_exists($nouveau_chemin)) return 1;
+       }
+       else if ($force_rewrite_redim==1)
+       {
+          if (file_exists($nouveau_chemin))    
+          {
+               $image_existe = ImageCreateFromJpeg($nouveau_chemin);   
+                       if (imageSY($image_existe) == $new_hauteur && imageSX($image_existe) == $new_largeur) return 1;    
+          }
+       }
+       
+
+
+               ##gd 2.0 :
+               $image_redim = imagecreatetruecolor($new_largeur, $new_hauteur); #l'apercu de l'image (plus petite)
+               imagecopyresampled($image_redim, $image, 0, 0, 0, 0, $new_largeur, $new_hauteur, $largeur, $hauteur);   
+               ##
+
+       
+   imagejpeg($image_redim, $nouveau_chemin, $qualite); #ecrit l'apercu sur le disque
+       
+       return 1;
+
+}
+
+/*--------------------------------------------------
+auteur : pifou
+date   : 25.01.2003
+
+Renvois le lien html vers l'image redimensionnée ou l'image
+'no_image.jpg'
+---------------------------------------------------*/
+function image_lien_html($card)
+{
+       global $glob;
+       $settings = $glob->get('settings');
+       $link = $glob->get('link');
+
+       #si le fichier image n'existe pas
+       if (!file_exists($link->path().'DivXDB/images/image_tmp/'.$card->id.'.jpg'))
+       {       
+       $fichier_image = fopen($link->path().'DivXDB/images/image_tmp/'.$card->id.'.jpg', 'wb');        
+       if ($card->image!='') fwrite($fichier_image, $card->image);                     
+       fclose($fichier_image);
+       }
+       else #sinon essais de le lire
+       {
+               #test la validité de l'image (il faudrait trouver une autre manière plus élégante)
+               if(!@getimagesize($link->path().'DivXDB/images/image_tmp/'.$card->id.'.jpg'))
+               {
+                       #si l'image n'est pas valide (en tant que jpeg) alors l'efface de la BD
+                       mysql_query("update movie set image = '' where id = ".$card->id, $glob->get('_the_db_'));
+                       unlink($link->path().'DivXDB/images/image_tmp/'.$card->id.'.jpg');
+               }
+       }
+       
+       $skin_no_image = false;
+       $current_skin_path = $link->path().DIR_SKINS.'/'.$settings->get('current_skin');
+       #si le film n'a pas d'image'
+   if ($card->image=='')
+   {
+               #si le skin à une image 'no_image.jpg'
+       if (file_exists($current_skin_path .'/no_image.jpg'))
+       {
+               $image_path = $current_skin_path .'/no_image.jpg';
+                       $skin_no_image = true;
+       }
+               else
+                       $image_path = $link->path().'DivXDB/images/no_image.jpg';               
+   }
+   else #le film a une image
+       $image_path = $link->path().'DivXDB/images/image_tmp/'.$card->id.'.jpg';
+       
+       #si la library GD n'est pas installée
+       if ($settings->get('gd_library')=='0')
+       {
+       
+               $size = getimagesize($image_path);
+               $largeur = $size[0];
+               $hauteur = $size[1];
+               
+       if ($hauteur >= $largeur && $hauteur > $settings->get('size_image'))
+          $rapport = $settings->get('size_image')/$hauteur;       
+       else if($largeur > $hauteur && $largeur > $settings->get('size_image'))
+          $rapport = $settings->get('size_image')/$largeur;    
+       else $rapport = 1;
+
+       $new_hauteur = round($hauteur * $rapport);
+       $new_largeur = round($largeur * $rapport);
+               
+               #si le film n'a pas d'image
+               if ($card->image=='')
+               {
+                       #$no_image = $settings
+                       $image = '<img alt="'.$card->title.'" border="0" width="'.$new_largeur.'" height="'.$new_hauteur.'" src="'.$image_path.'"/>';
+               }
+               else $image = '<a target="_blank" href="'.$image_path.'"><img alt="'.$card->title.'" border="0" width="'.$new_largeur.'" height="'.$new_hauteur.'" src="'.$image_path.'"/></a>';
+       }
+       else
+       {
+               if ($skin_no_image) #si le film n'a pas d'image et que le skin a une 'no_image.jpg'
+               {
+                       if (image_redim__($image_path, $settings->get('size_image'), $current_skin_path .'/'.SMALL_IMAGE_SUFIX.'no_image.jpg', 60, 1)==0)
+                               $image = '<img alt="'.$card->title.'" src="'.$image_path.'"/>';
+                       else
+                               $image = '<img alt="'.$card->title.'" src="'.$current_skin_path .'/'.SMALL_IMAGE_SUFIX.'no_image.jpg'.'"/>';
+               }
+               elseif($card->image=='')
+               {
+                       if (image_redim__($image_path, $settings->get('size_image'), $link->path().'DivXDB/images/image_tmp/'.SMALL_IMAGE_SUFIX.'no_image.jpg', 60, 1)==0)
+                               $image = '<img alt="'.$card->title.'" src="'.$image_path.'"/>';
+                       else
+                               $image = '<img alt="'.$card->title.'" src="'.$link->path().'DivXDB/images/image_tmp/'.SMALL_IMAGE_SUFIX.'no_image.jpg"/>';
+               }
+               else
+               {
+                       if(image_redim__($link->path().'DivXDB/images/image_tmp/'.$card->id.'.jpg', $settings->get('size_image'), $link->path().'DivXDB/images/image_tmp/'.SMALL_IMAGE_SUFIX.$card->id.'.jpg', 60, 1)==0)
+                               $image = '<img alt="'.$card->title.'" src="'.$link->path().'DivXDB/images/image_tmp/'.$card->id.'.jpg"/>';
+                       else
+                               $image = '<a target="_blank" href="'.$link->path().'DivXDB/images/image_tmp/'.$card->id.'.jpg"><img alt="'.$card->title.'" border="0" src="'.$link->path().'DivXDB/images/image_tmp/'.SMALL_IMAGE_SUFIX.$card->id.'.jpg"/></a>';
+               
+               }
+       }
+       return $image;
+}
+?>
diff --git a/images/banniere_eupho.gif b/images/banniere_eupho.gif
new file mode 100644 (file)
index 0000000..0c97777
Binary files /dev/null and b/images/banniere_eupho.gif differ
diff --git a/images/bieres_fond1.jpg b/images/bieres_fond1.jpg
new file mode 100644 (file)
index 0000000..48f70f1
Binary files /dev/null and b/images/bieres_fond1.jpg differ
diff --git a/images/bieres_fond2.jpg b/images/bieres_fond2.jpg
new file mode 100644 (file)
index 0000000..63845bb
Binary files /dev/null and b/images/bieres_fond2.jpg differ
diff --git a/images/carte.jpg b/images/carte.jpg
new file mode 100644 (file)
index 0000000..070a7c3
Binary files /dev/null and b/images/carte.jpg differ
diff --git a/images/carte_mini.jpg b/images/carte_mini.jpg
new file mode 100644 (file)
index 0000000..6c548fb
Binary files /dev/null and b/images/carte_mini.jpg differ
diff --git a/images/carte_zoom.gif b/images/carte_zoom.gif
new file mode 100644 (file)
index 0000000..b3f8e47
Binary files /dev/null and b/images/carte_zoom.gif differ
diff --git a/images/carte_zoom_mini.gif b/images/carte_zoom_mini.gif
new file mode 100644 (file)
index 0000000..dcabf2d
Binary files /dev/null and b/images/carte_zoom_mini.gif differ
diff --git a/images/exclamation.gif b/images/exclamation.gif
new file mode 100755 (executable)
index 0000000..46bb733
Binary files /dev/null and b/images/exclamation.gif differ
diff --git a/images/fermer.gif b/images/fermer.gif
new file mode 100755 (executable)
index 0000000..3d78493
Binary files /dev/null and b/images/fermer.gif differ
diff --git a/images/fond1.png b/images/fond1.png
new file mode 100644 (file)
index 0000000..81ebb29
Binary files /dev/null and b/images/fond1.png differ
diff --git a/images/fond2.png b/images/fond2.png
new file mode 100644 (file)
index 0000000..1c25743
Binary files /dev/null and b/images/fond2.png differ
diff --git a/images/fond3.png b/images/fond3.png
new file mode 100644 (file)
index 0000000..4e7055f
Binary files /dev/null and b/images/fond3.png differ
diff --git a/images/information.gif b/images/information.gif
new file mode 100755 (executable)
index 0000000..c75a5d6
Binary files /dev/null and b/images/information.gif differ
diff --git a/images/interrogation.gif b/images/interrogation.gif
new file mode 100755 (executable)
index 0000000..47fd4b0
Binary files /dev/null and b/images/interrogation.gif differ
diff --git a/images/lien_externe.png b/images/lien_externe.png
new file mode 100644 (file)
index 0000000..91f55f2
Binary files /dev/null and b/images/lien_externe.png differ
diff --git a/images/smiles/Thumbs.db b/images/smiles/Thumbs.db
new file mode 100644 (file)
index 0000000..07a5c16
Binary files /dev/null and b/images/smiles/Thumbs.db differ
diff --git a/images/smiles/argn.gif b/images/smiles/argn.gif
new file mode 100644 (file)
index 0000000..63d39a8
Binary files /dev/null and b/images/smiles/argn.gif differ
diff --git a/images/smiles/bigsmile.gif b/images/smiles/bigsmile.gif
new file mode 100644 (file)
index 0000000..b54cd0f
Binary files /dev/null and b/images/smiles/bigsmile.gif differ
diff --git a/images/smiles/chat.gif b/images/smiles/chat.gif
new file mode 100644 (file)
index 0000000..33cb58f
Binary files /dev/null and b/images/smiles/chat.gif differ
diff --git a/images/smiles/chat.psd b/images/smiles/chat.psd
new file mode 100644 (file)
index 0000000..ac92a90
Binary files /dev/null and b/images/smiles/chat.psd differ
diff --git a/images/smiles/clin.gif b/images/smiles/clin.gif
new file mode 100644 (file)
index 0000000..35e3625
Binary files /dev/null and b/images/smiles/clin.gif differ
diff --git a/images/smiles/cool.gif b/images/smiles/cool.gif
new file mode 100644 (file)
index 0000000..c3aff9d
Binary files /dev/null and b/images/smiles/cool.gif differ
diff --git a/images/smiles/eheheh.gif b/images/smiles/eheheh.gif
new file mode 100644 (file)
index 0000000..4fc3e19
Binary files /dev/null and b/images/smiles/eheheh.gif differ
diff --git a/images/smiles/langue.gif b/images/smiles/langue.gif
new file mode 100644 (file)
index 0000000..d81ba96
Binary files /dev/null and b/images/smiles/langue.gif differ
diff --git a/images/smiles/lol.gif b/images/smiles/lol.gif
new file mode 100644 (file)
index 0000000..b5e7153
Binary files /dev/null and b/images/smiles/lol.gif differ
diff --git a/images/smiles/oh.gif b/images/smiles/oh.gif
new file mode 100644 (file)
index 0000000..18d3abb
Binary files /dev/null and b/images/smiles/oh.gif differ
diff --git a/images/smiles/pas_utilise_cool.gif b/images/smiles/pas_utilise_cool.gif
new file mode 100644 (file)
index 0000000..2520bcf
Binary files /dev/null and b/images/smiles/pas_utilise_cool.gif differ
diff --git a/images/smiles/pascontent.gif b/images/smiles/pascontent.gif
new file mode 100644 (file)
index 0000000..7297a64
Binary files /dev/null and b/images/smiles/pascontent.gif differ
diff --git a/images/smiles/smile.gif b/images/smiles/smile.gif
new file mode 100644 (file)
index 0000000..3fb63ae
Binary files /dev/null and b/images/smiles/smile.gif differ
diff --git a/images/smiles/sniff.gif b/images/smiles/sniff.gif
new file mode 100644 (file)
index 0000000..da1895d
Binary files /dev/null and b/images/smiles/sniff.gif differ
diff --git a/images/smiles/spliff.gif b/images/smiles/spliff.gif
new file mode 100644 (file)
index 0000000..a7338cb
Binary files /dev/null and b/images/smiles/spliff.gif differ
diff --git a/images/smiles/triste.gif b/images/smiles/triste.gif
new file mode 100644 (file)
index 0000000..0d8abc8
Binary files /dev/null and b/images/smiles/triste.gif differ
diff --git a/index.php b/index.php
new file mode 100644 (file)
index 0000000..8d6c578
--- /dev/null
+++ b/index.php
@@ -0,0 +1,124 @@
+<?php # coding: utf-8\r
+
+if (!isset($page)) $page="acceuil"; #la page par défaut
+
+/* Pour déterminer si en LAN !?
+$IP_SERVEUR = '192.168.1.1';
+$MASK_RESEAU = '255.255.255.0';
+if($titre[1] && (ip2long($REMOTE_ADDR) & ip2long($MASK_RESEAU)) != (ip2long($IP_SERVEUR) & ip2long($MASK_RESEAU)))
+*/
+
+include_once("config.php");
+include_once("class_participant.php");\r
+include_once("connexion.php");
+include_once("controller.php");
+
+$MENU = array(
+   'acceuil' => 'Accueil',
+   'jeux_joues' => 'Jeux joués',
+   'inscription' => 'Inscription',
+   'inscrits' => 'Inscrits',\r
+   'http://www.euphorik.ch/#page=&quot;minichat&quot;;conv=[1642]' => 'Chat',
+   'contacts' => 'Contacts',
+   #'mods' => 'Mods',
+   #'cracks' => 'Cracks',
+   #'pizzas' => 'Pizza',
+);
+
+echo '<?xml version="1.0" encoding="UTF-8"?>';
+?>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+   <title>Corcelles-Lan 7</title>\r
+   <link rel="stylesheet" href="css/style.css" type="text/css" media="screen" ></link>\r
+   <script type="text/javascript" src="js/jquery-1.2.6.min.js"></script>
+   <script type="text/javascript" src="js/betterjs.js"></script>\r
+   <script type="text/javascript" src="js/cl7.js"></script>
+   <script type="text/javascript" src="js/util.js"></script>
+</head>
+   <body>
+      <div id="info" style="display:none" ><div id="icone"></div><div class="fermer" ></div><div class="message" ></div><div class="boutons"></div></div>
+      <div id="container">
+         <div id="cadre">
+            <div id="titre">\r
+               <div id="nbPlacesRestantes">\r
+                  <?php\r
+                     $nb_places_libres = Participant::nombre_place_restante();\r
+                     if ($nb_places_libres <= 0)\r
+                     {\r
+                        echo "Il n'y a plus de places libres";\r
+                     }\r
+                     else\r
+                     {\r
+                        $s = $nb_places_libres > 1 ? 's' : '';\r
+                        echo "Il reste <em>", $nb_places_libres, "</em> place", $s, " libre", $s; \r
+                     }\r
+                  ?>\r
+               </div>\r
+               Corcelles-Lan 7\r
+            </div>
+            <ul id="menu">
+               <?php
+                     # affichage du menu
+                     foreach($MENU as $p => $titre )
+                     {\r
+                        $lien_externe = substr($p, 0, 4) == 'http';
+                        echo '<li' . ($p == $page ? ' class="courante"' : '') . '><a href="'.($lien_externe ? $p : $p.'.html').'" '.($lien_externe ? 'class="externe"' : '').'>' . $titre . '</a></li>';
+                     }
+                  ?>
+            </ul>
+            <div id="contenu">
+               <div id="informations"><?php include("menu_droit.php") ?></div>
+                <?php
+                  switch ($page)
+                  {
+                  case 'acceuil':
+                     include("tx_informations.php");
+                     break;
+                  case 'jeux_joues' :
+                     include("tx_jeux_joues.php");
+                     break;
+                  case 'inscription' :
+                     if (Participant::nombre_participant_max_atteint() && !$le_participant->valide)
+                        echo 'Nous sommes désolés, il n\'y a plus de places libres';
+                     else
+                        include("tx_inscription.php");
+                     break;
+                  case 'inscrits' :
+                     include("tx_inscrits.php");
+                     break;
+                  case 'tournoi' :
+                     include("tx_tournoi.php");
+                     break;
+                  case 'intranet' :
+                     include("tx_intranet.php");
+                     break;
+                  case 'bienvenue' :
+                     include("tx_bienvenue.php");
+                     break;
+                  case 'contacts' :
+                     include("tx_contacts.php");
+                     break;
+                  case 'photos' :
+                     include("tx_photos.php");
+                     break;
+                  case 'pizzas':
+                     include("pizzas.php");
+                     break;
+                  default :
+                     echo 'erreur, page introuvable';
+                     break;     
+                  }
+               ?>
+            </div>
+            <div id="pieddepage">
+               ~ site codé en PHP avec les pieds ~ 
+            </div>
+         </div>
+      </div>
+   </body>
+</html>
diff --git a/js/betterjs.js b/js/betterjs.js
new file mode 100644 (file)
index 0000000..69788d8
--- /dev/null
@@ -0,0 +1,76 @@
+// tout un tas d'améliorations de JavaScript ;)
+
+
+/**
+  * Pour chaque propriété de l'objet execute f(p, v) ou p est le nom de la propriété et v sa valeur.
+  * Ne parcours pas les propriétés des prototypes.
+  * FIXME : Normalement : Object.prototype.each = function(f) mais non supporté par jquery
+  */
+//Object.prototype.each = function(f) {
+var objectEach = function(o, f) {
+   for (var k in o) {
+      if (o.hasOwnProperty(k)) {
+         f(k, o[k]);
+      }
+   }
+};
+
+var objectMemberCount = function(o) {
+   var nb = 0;
+   for (var k in o) {
+      if (o.hasOwnProperty(k)) {
+         nb += 1;
+      }
+   }
+   return nb;
+};
+
+Array.prototype.each = function(f) {
+   for (var i = 0; i < this.length; i++) {
+      f(i, this[i]);
+   }
+};
+
+Array.prototype.map = function(f) {
+   for (var i = 0; i < this.length; i++) {
+      this[i] = f(this[i]);
+   }
+};
+
+String.prototype.trim = function() {
+       return jQuery.trim(this); // anciennement : this.replace(/^\s+|\s+$/g, "");
+};
+
+String.prototype.ltrim = function() {
+       return this.replace(/^\s+/, "");
+};
+
+String.prototype.rtrim = function() {
+       return this.replace(/\s+$/, "");
+};
+
+/**
+  * Voir : http://www.coolpage.com/developer/javascript/Correct%20OOP%20for%20Javascript.html
+  *
+  * Exemple :  
+  *
+  * function Mammal(name) {
+  *    this.name = name;
+  * }
+  *
+  * Cat.Inherits(Mammal);
+  * function Cat(name) {
+  *    this.Super(Mammal, name);
+  * }
+  */
+/*Object.prototype.Super = function(parent) {
+   if(arguments.length > 1) {
+      parent.apply( this, Array.prototype.slice.call( arguments, 1 ) );
+   } else {
+      parent.call( this );
+   }
+}
+Function.prototype.Inherits = function(parent) {
+   this.prototype = new parent();
+   this.prototype.constructor = this;
+}*/
diff --git a/js/cl7.js b/js/cl7.js
new file mode 100644 (file)
index 0000000..10b1c52
--- /dev/null
+++ b/js/cl7.js
@@ -0,0 +1,88 @@
+/**
+  * coding: utf-8
+  * Quelques bouts de JS pour le site de la corcelles-lan 7.
+  * Necessite la lib jQuery.
+  */
+  
+var cl7 = {};
+
+cl7.verification_formulaire_inscription = function(util) {
+   if ($('#formulaireInscription input[name="pseudo"]').val() === "") {
+      util.messageDialogue("Le pseudo ne peut pas être vide");
+      return false;
+   }\r
+   if ($('#formulaireInscription input[name="pass1"]').val() === "" &&\r
+      $('#formulaireInscription input[name="pass2"]').val() === "") {\r
+      util.messageDialogue("Le password ne peut pas être vide");\r
+      return false;   \r
+   }\r
+   if ($('#formulaireInscription input[name="pass1"]').val() !== $('#formulaireInscription input[name="pass2"]').val()) {\r
+      util.messageDialogue("Les passwords ne correspondent pas");\r
+      return false;   \r
+   }\r
+   if ($('#formulaireInscription input[name="pass1"]').val().length < 3) {\r
+      util.messageDialogue("La taille de password doit être d'au moins 3 caractères");\r
+      return false;\r
+   }\r
+   if ($('#formulaireInscription input[name="nom"]').val() === "") {\r
+      util.messageDialogue("Le nom ne peut pas être vide");\r
+      return false;\r
+   }\r
+   if ($('#formulaireInscription input[name="prenom"]').val() === "") {\r
+      util.messageDialogue("Le prénom ne peut pas être vide");\r
+      return false;   \r
+   }\r
+   if ($('#formulaireInscription input[name="e_mail"]').val() === "") {\r
+      util.messageDialogue("L'email ne peut pas être vide");\r
+      return false;   \r
+   }\r
+   if ($('#formulaireInscription input[name="accord"]').length === 1 && !$('#formulaireInscription input[name="accord"]').attr("checked")) {\r
+      util.messageDialogue("Vous devez être d'accord avec le préambule");\r
+      return false;\r
+   }
+   return true;
+}
+  
+$(document).ready(
+   function() { 
+      var util = new cl7.Util();
+      $('form#formulaireInscription').submit(function() {
+         return cl7.verification_formulaire_inscription(util);
+      });\r
+      \r
+      $('form#formulaireInscription select[name="clanChoix"]').change(function() {         \r
+         if ($(this).val() === '0') {\r
+            return;\r
+         }\r
+         $clan = $(this).val().split(';');\r
+         $('form#formulaireInscription input[name="clan_nom"]').val($clan [0]);\r
+         $('form#formulaireInscription input[name="clan_tag"]').val($clan [1]);\r
+      });\r
+      \r
+      // inscrit les emails codés (page contact)\r
+      $('a#contactPifou').attr('href', util.rot13('znvygb:tert.oheev@tznvy.pbz'))
+      $('a#contactLePiaf').attr('href', util.rot13('znvygb:tyrcvns695@zfa.pbz'))\r
+      \r
+      // permet d'éviter de faire plus de choix qu'il n'en faut sur la page des jeux joués\r
+      var nbVotesMax = 3;\r
+      var coches = [];\r
+      $('#formulaireJeuxJoues input:checked').each(function() {\r
+         coches.unshift(parseInt($(this).attr("value")));\r
+      });\r
+      $('#formulaireJeuxJoues input[name="votes[]"]').change(function() {\r
+         if($(this).attr("checked")) {\r
+            if (coches.length >= nbVotesMax) {\r
+               $('#formulaireJeuxJoues input[value="' + coches.pop() + '"]').attr("checked", false);\r
+            }\r
+            coches.unshift(parseInt($(this).attr("value")));\r
+         } else {\r
+            for (var i = 0; i < coches.length; i ++) {\r
+               if (coches[i] == parseInt($(this).attr("value"))) {\r
+                  coches.splice(i, 1);\r
+                  break;\r
+               }\r
+            }\r
+         }\r
+      });
+   }
+);
diff --git a/js/jquery-1.2.6.min.js b/js/jquery-1.2.6.min.js
new file mode 100644 (file)
index 0000000..82b98e1
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * jQuery 1.2.6 - New Wave Javascript
+ *
+ * Copyright (c) 2008 John Resig (jquery.com)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $
+ * $Rev: 5685 $
+ */
+(function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else
+return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else
+return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else
+selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){value=jQuery.browser.msie&&!option.attributes.value.specified?option.text:option.value;if(one)return value;values.push(value);}}return values;}else
+return(this[0].value||"").replace(/\r/g,"");}return undefined;}if(value.constructor==Number)value+='';return this.each(function(){if(this.nodeType!=1)return;if(value.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,value)>=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else
+this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else
+return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else
+jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i<length;i++)if((options=arguments[i])!=null)for(var name in options){var src=target[name],copy=options[name];if(target===copy)continue;if(deep&&copy&&typeof copy=="object"&&!copy.nodeType)target[name]=jQuery.extend(deep,src||(copy.length!=null?[]:{}),copy);else if(copy!==undefined)target[name]=copy;}return target;};var expando="jQuery"+now(),uuid=0,windowData={},exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i,defaultView=document.defaultView||{};jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/^[\s[]?function/.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){var head=document.getElementsByTagName("head")[0]||document.documentElement,script=document.createElement("script");script.type="text/javascript";if(jQuery.browser.msie)script.text=data;else
+script.appendChild(document.createTextNode(data));head.insertBefore(script,head.firstChild);head.removeChild(script);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?windowData:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!==undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?windowData:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])break;if(!name)jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)elem.removeAttribute(expando);}delete jQuery.cache[id];}},each:function(object,callback,args){var name,i=0,length=object.length;if(args){if(length==undefined){for(name in object)if(callback.apply(object[name],args)===false)break;}else
+for(;i<length;)if(callback.apply(object[i++],args)===false)break;}else{if(length==undefined){for(name in object)if(callback.call(object[name],name,object[name])===false)break;}else
+for(var value=object[0];i<length&&callback.call(value,i,value)!==false;value=object[++i]){}}return object;},prop:function(elem,value,type,i,name){if(jQuery.isFunction(value))value=value.call(elem,i);return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(name)?value+"px":value;},className:{add:function(elem,classNames){jQuery.each((classNames||"").split(/\s+/),function(i,className){if(elem.nodeType==1&&!jQuery.className.has(elem.className,className))elem.className+=(elem.className?" ":"")+className;});},remove:function(elem,classNames){if(elem.nodeType==1)elem.className=classNames!=undefined?jQuery.grep(elem.className.split(/\s+/),function(className){return!jQuery.className.has(classNames,className);}).join(" "):"";},has:function(elem,className){return jQuery.inArray(className,(elem.className||elem).toString().split(/\s+/))>-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else
+jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i<stack.length;i++)if(color(stack[i])){swap[i]=stack[i].style.display;stack[i].style.display="block";}ret=name=="display"&&swap[stack.length-1]!=null?"none":(computedStyle&&computedStyle.getPropertyValue(name))||"";for(i=0;i<swap.length;i++)if(swap[i]!=null)stack[i].style.display=swap[i];}if(name=="opacity"&&ret=="")ret="1";}else if(elem.currentStyle){var camelCase=name.replace(/\-(\w)/g,function(all,letter){return letter.toUpperCase();});ret=elem.currentStyle[name]||elem.currentStyle[camelCase];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var left=style.left,rsLeft=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;style.left=ret||0;ret=style.pixelLeft+"px";style.left=left;elem.runtimeStyle.left=rsLeft;}}return ret;},clean:function(elems,context){var ret=[];context=context||document;if(typeof context.createElement=='undefined')context=context.ownerDocument||context[0]&&context[0].ownerDocument||document;jQuery.each(elems,function(i,elem){if(!elem)return;if(elem.constructor==Number)elem+='';if(typeof elem=="string"){elem=elem.replace(/(<(\w+)[^>]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+"></"+tag+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!tags.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!tags.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!tags.indexOf("<td")||!tags.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!tags.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf("<table")&&tags.indexOf("<tbody")<0?div.firstChild&&div.firstChild.childNodes:wrap[1]=="<table>"&&tags.indexOf("<tbody")<0?div.childNodes:[];for(var j=tbody.length-1;j>=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else
+ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&&notxml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&&notxml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&&notxml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else
+while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i<length;i++)if(array[i]===elem)return i;return-1;},merge:function(first,second){var i=0,elem,pos=first.length;if(jQuery.browser.msie){while(elem=second[i++])if(elem.nodeType!=8)first[pos++]=elem;}else
+while(elem=second[i++])first[pos++]=elem;return first;},unique:function(array){var ret=[],done={};try{for(var i=0,length=array.length;i<length;i++){var id=jQuery.data(array[i]);if(!done[id]){done[id]=true;ret.push(array[i]);}}}catch(e){ret=array;}return ret;},grep:function(elems,callback,inv){var ret=[];for(var i=0,length=elems.length;i<length;i++)if(!inv!=!callback(elems[i],i))ret.push(elems[i]);return ret;},map:function(elems,callback){var ret=[];for(var i=0,length=elems.length;i<length;i++){var value=callback(elems[i],i);if(value!=null)ret[ret.length]=value;}return ret.concat.apply([],ret);}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing"}});jQuery.each({parent:function(elem){return elem.parentNode;},parents:function(elem){return jQuery.dir(elem,"parentNode");},next:function(elem){return jQuery.nth(elem,2,"nextSibling");},prev:function(elem){return jQuery.nth(elem,2,"previousSibling");},nextAll:function(elem){return jQuery.dir(elem,"nextSibling");},prevAll:function(elem){return jQuery.dir(elem,"previousSibling");},siblings:function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},children:function(elem){return jQuery.sibling(elem.firstChild);},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}},function(name,fn){jQuery.fn[name]=function(selector){var ret=jQuery.map(this,fn);if(selector&&typeof selector=="string")ret=jQuery.multiFilter(selector,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(){var args=arguments;return this.each(function(){for(var i=0,length=args.length;i<length;i++)jQuery(args[i])[original](this);});};});jQuery.each({removeAttr:function(name){jQuery.attr(this,name,"");if(this.nodeType==1)this.removeAttribute(name);},addClass:function(classNames){jQuery.className.add(this,classNames);},removeClass:function(classNames){jQuery.className.remove(this,classNames);},toggleClass:function(classNames){jQuery.className[jQuery.className.has(this,classNames)?"remove":"add"](this,classNames);},remove:function(selector){if(!selector||jQuery.filter(selector,[this]).r.length){jQuery("*",this).add(this).each(function(){jQuery.event.remove(this);jQuery.removeData(this);});if(this.parentNode)this.parentNode.removeChild(this);}},empty:function(){jQuery(">*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return i<m[3]-0;},gt:function(a,i,m){return i>m[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==0){if(node.nodeIndex==last)add=true;}else if((node.nodeIndex-last)%first==0&&(node.nodeIndex-last)/first>=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else
+for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i<args.length)jQuery.event.proxy(fn,args[i++]);return this.click(jQuery.event.proxy(fn,function(event){this.lastToggle=(this.lastToggle||0)%i;event.preventDefault();return args[this.lastToggle++].apply(this,arguments)||false;}));},hover:function(fnOver,fnOut){return this.bind('mouseenter',fnOver).bind('mouseleave',fnOut);},ready:function(fn){bindReady();if(jQuery.isReady)fn.call(document,jQuery);else
+jQuery.readyList.push(function(){return fn.call(this,jQuery);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.call(document);});jQuery.readyList=null;}jQuery(document).triggerHandler("ready");}}});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(document.addEventListener&&!jQuery.browser.opera)document.addEventListener("DOMContentLoaded",jQuery.ready,false);if(jQuery.browser.msie&&window==top)(function(){if(jQuery.isReady)return;try{document.documentElement.doScroll("left");}catch(error){setTimeout(arguments.callee,0);return;}jQuery.ready();})();if(jQuery.browser.opera)document.addEventListener("DOMContentLoaded",function(){if(jQuery.isReady)return;for(var i=0;i<document.styleSheets.length;i++)if(document.styleSheets[i].disabled){setTimeout(arguments.callee,0);return;}jQuery.ready();},false);if(jQuery.browser.safari){var numStyles;(function(){if(jQuery.isReady)return;if(document.readyState!="loaded"&&document.readyState!="complete"){setTimeout(arguments.callee,0);return;}if(numStyles===undefined)numStyles=jQuery("style, link[rel=stylesheet]").length;if(document.styleSheets.length!=numStyles){setTimeout(arguments.callee,0);return;}jQuery.ready();})();}jQuery.event.add(window,"load",jQuery.ready);}jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,name){jQuery.fn[name]=function(fn){return fn?this.bind(name,fn):this.trigger(name);};});var withinElement=function(event,elem){var parent=event.relatedTarget;while(parent&&parent!=elem)try{parent=parent.parentNode;}catch(error){parent=elem;}return parent==elem;};jQuery(window).bind("unload",function(){jQuery("*").add(document).unbind();});jQuery.fn.extend({_load:jQuery.fn.load,load:function(url,params,callback){if(typeof url!='string')return this._load(url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else
+xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else
+jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else
+for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else
+s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else
+e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)if(!timers[i]())timers.splice(i--,1);if(!timers.length){clearInterval(jQuery.timerId);jQuery.timerId=null;}},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(gotoEnd){var t=now();if(gotoEnd||t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})();
\ No newline at end of file
diff --git a/js/util.js b/js/util.js
new file mode 100644 (file)
index 0000000..208e3a9
--- /dev/null
@@ -0,0 +1,186 @@
+// coding: utf-8\r
+
+
+/**
+  * Cet objet regroupe des fonctions utilitaires (helpers) permettant notamment de :
+  *  - afficher une boite de message
+  *  - afficher une bulle d'aide lié à un élément
+  *  - manipuler le curseur et réaliser des sélections sur des zones de saisie (<input>)
+  */
+cl7.Util = function () {
+   $("#info .fermer").click(function() {
+      $("#info").slideUp(50);
+   });
+   
+   $("body").append('<div id="flecheBulle"></div>').append('<div id="messageBulle"><p></p></div>');
+   
+   this.bulleActive = true;
+};
+\r
+cl7.Util.messageType = {informatif: 0, question: 1, erreur: 2};\r
+\r
+/**\r
+  * Affiche une boite de dialogue avec un message à l'intérieur.\r
+  * @param message le message (string)\r
+  * @param type voir 'messageType'. par défaut messageType.informatif\r
+  * @param les boutons sous la forme d'un objet ou les clefs sont les labels des boutons\r
+  *        et les valeurs les fonctions executées lorsqu'un bouton est activé.\r
+  * @param formate faut-il formaté le message ? true par défaut\r
+  */\r
+cl7.Util.prototype.messageDialogue = function(message, type, boutons, formate) {\r
+   var thisUtil = this;\r
+\r
+   type = type || cl7.Util.messageType.informatif;\r
+   formate = formate || true;\r
+\r
+   if (this.timeoutMessageDialogue) {\r
+      clearTimeout(this.timeoutMessageDialogue);\r
+   }\r
+      \r
+   var fermer = function() { $("#info").slideUp(100); };\r
+   fermer();\r
+   \r
+   $("#info .message").html(message);\r
+   \r
+   switch(type) {\r
+      case cl7.Util.messageType.informatif : $("#info #icone").attr("class", "information"); break;\r
+      case cl7.Util.messageType.question : $("#info #icone").attr("class", "interrogation"); break;\r
+      case cl7.Util.messageType.erreur : $("#info #icone").attr("class", "exclamation"); break;\r
+   }\r
+   \r
+   $("#info .boutons").html("");\r
+   objectEach(boutons, function(nom, bouton) {\r
+      $("#info .boutons").append("<div>" + nom + "</div>").find("div:last").click(bouton).click(fermer);\r
+   });\r
+   \r
+   $("#info").slideDown(200);\r
+   this.timeoutMessageDialogue = setTimeout(fermer, 3000);\r
+};\r
+\r
+cl7.Util.positionTypeX = {gauche: 0, gaucheRecouvrement: 1, centre: 2, droiteRecouvrement: 3, droite: 4};\r
+cl7.Util.positionTypeY = {haut: 0, hautRecouvrement: 1, centre: 2, basRecouvrement: 3, bas: 4};\r
+\r
+/**\r
+  * Afficher une boite flottante (élément) par rapport à une cible.\r
+  * La boite est affichée de manière à ne pas dépasser de la fenêtre.\r
+  * @boite l'élément à afficher\r
+  * @cible l'élément sur lequel est affiché la boite\r
+  * @positionX de type positionTypeX\r
+  * @positionY de type positionTypeY\r
+  */\r
+cl7.Util.prototype.afficherBoite = function(boite, cible, positionX, positionY) {\r
+    var positionCible = cible.offset();\r
+    var positionBoite = {\r
+         left : positionX === cl7.Util.positionTypeX.gauche ? positionCible.left - boite.width() :\r
+            (positionX === cl7.Util.positionTypeX.gaucheRecouvrement ? positionCible.left - boite.width() + cible.width() : \r
+            (positionX === cl7.Util.positionTypeX.droitelsRecouvrement ? positionCible.left :\r
+            (positionX === cl7.Util.positionTypeX.droite ? positionCible.left + cible.width() :\r
+            positionCible.left + cible.width() / 2 - boite.width() / 2 ))), // centre\r
+         top : positionY === cl7.Util.positionTypeY.haut ? positionCible.top - boite.height() :\r
+            (positionY === cl7.Util.positionTypeY.hautRecouvrement ? positionCible.top - boite.height() + cible.height() : \r
+            (positionY === cl7.Util.positionTypeY.basRecouvrement ? positionCible.top :\r
+            (positionY === cl7.Util.positionTypeY.bas ? positionCible.top + cible.height() :\r
+            positionCible.top + cible.height() / 2 - boite.height() / 2 ))) // centre\r
+      };\r
+      \r
+    // calcul les décalages en x et en y pour éviter que la boite ne sorte de la fenêtre, tient compte de la position des barres de défilement\r
+    var marge = 10; \r
+    positionBoite.left = positionBoite.left < marge + window.pageXOffset ? marge + window.pageXOffset :\r
+      (boite.width() - $(window).width() + (positionBoite.left - window.pageXOffset) + marge > 0 ? $(window).width() - boite.width() - marge + window.pageXOffset : positionBoite.left);\r
+    positionBoite.top = positionBoite.top < marge + window.pageYOffset ? marge + window.pageYOffset :\r
+      (boite.height() - $(window).height() + (positionBoite.top - window.pageYOffset) + marge > 0 ? $(window).height() - boite.height() - marge + window.pageYOffset : positionBoite.top);\r
+    \r
+    boite.css("top", positionBoite.top).css("left", positionBoite.left).show();\r
+};\r
+\r
+cl7.Util.positionBulleType = {haut : 0, droite : 1, bas : 2, gauche : 3};\r
+\r
+/**\r
+  * Affiche un info bulle lorsque le curseur survole l'élément donné.\r
+  * @param message le message à afficher\r
+  * @param element l'élément DOM sur lesquel afficher la bulle\r
+  * @param la position de la bulle, voir positionBulleType. Par défaut à 0 (haut)\r
+  */\r
+cl7.Util.prototype.infoBulle = function(message, element, position) {\r
+   var thisUtil = this;\r
+   var cacherBulle = function() {   \r
+      $("#flecheBulle").hide();\r
+      $("#messageBulle").hide();\r
+   };\r
+   \r
+   position = position || cl7.Util.positionBulleType.haut;\r
+\r
+   element.hover(\r
+      function() {\r
+         if (!thisUtil.bulleActive) {\r
+            return;\r
+         }\r
+\r
+         var m = $("#messageBulle");\r
+         var f = $("#flecheBulle");\r
+         f.removeClass().addClass(position === cl7.Util.positionBulleType.haut ? "flecheBulleHaut" :\r
+            (position === cl7.Util.positionBulleType.droite ? "flecheBulleDroite" : \r
+            (position === cl7.Util.positionBulleType.bas ? "flecheBulleBas" : "flecheBulleGauche" )));\r
+         \r
+         // remplie le paragraphe de la bulle avec le message\r
+         $("p", m).html(message);\r
+         \r
+         // réinitialise la position, évite le cas ou la boite est collé à droite et remplie avec un texte la faisant dépassé\r
+         // dans ce cas la hauteur n'est pas calculé correctement\r
+         m.css("top", 0).css("left", 0);\r
+         \r
+         var positionFleche = {\r
+            left : position === cl7.Util.positionBulleType.haut || position === cl7.Util.positionBulleType.bas ?\r
+                element.offset().left + element.outerWidth() / 2 - f.width() / 2 :\r
+                (position === cl7.Util.positionBulleType.gauche ? element.offset().left - f.width() : element.offset().left + element.outerWidth()),\r
+            top : position === cl7.Util.positionBulleType.gauche || position === cl7.Util.positionBulleType.droite ?\r
+                element.offset().top + element.outerHeight() / 2 - f.height() / 2 :\r
+                (position === cl7.Util.positionBulleType.haut ? element.offset().top - f.height() : element.offset().top + element.outerHeight())\r
+         };\r
+         var positionMessage = {\r
+            left : position === cl7.Util.positionBulleType.haut || position === cl7.Util.positionBulleType.bas ?\r
+                element.offset().left + element.width() / 2 - m.width() / 2 :\r
+                (position === cl7.Util.positionBulleType.gauche ? element.offset().left - f.width() - m.width() : element.offset().left + f.width() + element.outerWidth()),\r
+            top : position === cl7.Util.positionBulleType.gauche || position === cl7.Util.positionBulleType.droite ?\r
+                element.offset().top + element.outerHeight() / 2 - m.height() / 2 :\r
+                (position === cl7.Util.positionBulleType.haut ? element.offset().top - f.height() - m.height() : element.offset().top + f.height() + element.outerHeight())\r
+         };\r
+         var depassementDroit = (positionMessage.left + m.width()) - $("body").width();\r
+         if (depassementDroit > 0) {\r
+            positionMessage.left -= depassementDroit;\r
+         } else if (positionMessage.left < 0) {\r
+            positionMessage.left = 0;\r
+         }\r
+         \r
+         m.css("top", positionMessage.top).css("left", positionMessage.left).show();\r
+         f.css("top", positionFleche.top).css("left", positionFleche.left).show();\r
+      },\r
+      cacherBulle\r
+   ).click(cacherBulle);\r
+};\r
+\r
+/**\r
+  * Rot13 d'une chaine, voir : http://fr.wikipedia.org/wiki/ROT13\r
+  */\r
+cl7.Util.prototype.rot13 = function(chaine) {\r
+   var ACode = 'A'.charCodeAt(0);\r
+   var aCode = 'a'.charCodeAt(0);\r
+   var MCode = 'M'.charCodeAt(0);\r
+   var mCode = 'm'.charCodeAt(0);\r
+   var ZCode = 'Z'.charCodeAt(0);\r
+   var zCode = 'z'.charCodeAt(0);\r
+\r
+   var f = function(ch, pos) {\r
+      if (pos === ch.length) {\r
+         return "";\r
+      }\r
+      \r
+      var c = ch.charCodeAt(pos);\r
+      return String.fromCharCode(\r
+         c +\r
+         (c >= ACode && c <= MCode || c >= aCode && c <= mCode ? 13 :\r
+         (c > MCode && c <= ZCode || c > mCode && c <= zCode ? -13 : 0))\r
+      ) + f(ch, pos + 1);\r
+   };\r
+   return f(chaine, 0);\r
+};\r
diff --git a/menu_droit.php b/menu_droit.php
new file mode 100644 (file)
index 0000000..32800c9
--- /dev/null
@@ -0,0 +1,58 @@
+<?php # coding:utf-8
+\r
+include_once("traitement_pre_affichage.php");\r
+\r
+
+# selection de tous les participants
+$res_SQL = mysql_query("SELECT pseudo FROM participants ORDER BY id");
+
+echo '<div id="nbParticipants"><em>', mysql_num_rows($res_SQL), '</em> inscrit', (mysql_num_rows($res_SQL) > 1 ? 's' : ''), '</div>';
+
+# affichage des participants
+if (mysql_num_rows($res_SQL) > 0)
+   echo '<ul id="participants">';
+for ($i=0; $i<mysql_num_rows($res_SQL); $i++)
+{
+       mysql_data_seek($res_SQL, $i);
+       $le_participant_pseudo = mysql_fetch_object($res_SQL);
+       echo '<li>', traitement_pre_affichage($le_participant_pseudo->pseudo, 8), '</li>';
+}
+if (mysql_num_rows($res_SQL) > 0)
+   echo '</ul>';
+?>
+
+
+<?php
+if($le_participant->valide)
+{
+   echo'
+   <form method="post" action="index.php?';
+   
+   foreach($HTTP_GET_VARS as $nom => $valeur)
+   echo $nom,'=',$valeur,'&amp;';
+   
+   echo'">
+    <p><input type="hidden" name="effacer_cookie" value="1" /></p>
+    <p><input type="submit" value="logout" /></p>
+   </form>';
+}
+else
+{
+   if (isset($log)) echo '<em>[erreur de loggation]</em>';
+       
+   echo'
+       <form method="post" action="index.php?';
+   
+   foreach($HTTP_GET_VARS as $nom => $valeur)
+   echo $nom,'=',$valeur,'&amp;';
+   
+   echo'">
+   <p>login / pass</p>
+   <p><input type="hidden" name="log" value="1" /></p>
+   <p><input type="text" name="pseudo" size="10" maxlength="30" /></p>
+   <p><input type="password" name="password" size="10" maxlength="10" /></p>
+   <p><input type="submit" value="oki" class="submitInvisible" /></p>
+   </form>
+   ';
+}
+?>
diff --git a/participants.php b/participants.php
new file mode 100644 (file)
index 0000000..995752b
--- /dev/null
@@ -0,0 +1,56 @@
+<html>
+<head>
+<title>Toutes les infos des participants de la corcelles-lan</title>
+</head>
+<body>
+<h1>Toutes les infos des participants de la corcelles-lan</h1>
+<?php
+
+include('config.php');
+
+function ON($condition)
+{
+       return $condition ? 'Oui' : 'Non';
+}
+
+#connection à la base de données
+$lien_mysql = mysql_connect ($SQL_HOTE, $SQL_LOGIN, $SQL_PASS);
+mysql_select_db ($NOM_BASE);
+
+$requ = mysql_query("select * from participants order by pseudo");
+
+echo
+'<table width="100%" border="2" cellpadding="2" cellspacing="2"><tr>
+<td><b>Pseudo</b></td>
+<td><b>Clan</b></td>
+<td><b>Prénom + nom</b></td>
+<td><b>age</b></td>
+<td><b>E-mail</b></td>
+<td><b>N°ICQ</b></td>
+<td><b>Souhaite participer au tournoi War3 ?</b></td>
+<td><b>Souhaite participer au tournoi Ra3 ?</b></td>
+<td><b>Remarque</b></td>
+<td><b>A payé ?</b></td>
+</tr>
+';
+
+while($participant = mysql_fetch_object($requ))
+{
+       echo '<tr>',
+               '<td>',$participant->pseudo,'</td>',
+               '<td>',($participant->clan_nom==''?'':'('.$participant->clan_tag.')'.$participant->clan_nom),'</td>',
+               '<td>',$participant->prenom, ' ', $participant->nom,'</td>',
+               '<td>',$participant->age,'</td>',
+               '<td>',$participant->e_mail,'</td>',
+               '<td>',$participant->icq,'</td>',
+               '<td>',ON($participant->tournoi_war3_1),'</td>',
+               '<td>',ON($participant->tournoi_ra3_1),'</td>',
+               '<td>',$participant->remarque,'</td>',
+               '<td>',ON($participant->a_paye),'</td>',
+               '<tr>';
+}
+echo '</table>';
+
+?>
+</body>
+</html>
diff --git a/pizzas.php b/pizzas.php
new file mode 100644 (file)
index 0000000..31aad2d
--- /dev/null
@@ -0,0 +1,181 @@
+<?php # coding:utf-8\r
+// Gestion de commande de pizza\r
+// Auteur: KiKi\r
+\r
+function selection_pizzas()\r
+{\r
+   global $PIZZA_PEUT_COMMANDER;\r
+   global $le_participant;\r
+   $requ = mysql_query("select * from pizzas order by nom");\r
+   echo '<h1>commande de pizza</h1>';\r
+   \r
+   if ($PIZZA_PEUT_COMMANDER)\r
+   {\r
+      if ($le_participant->info->pizza != null)\r
+         echo '<br>Vous avez deja commandé une pizza ! mais vous pouvez encore changez votre choix:';\r
+         \r
+      echo '<form name="commande" method="post" action="index.php?page=pizzas">';\r
+      echo '<table width ="100%" border="0" cellpadding="1" cellspacing="3">';\r
+      echo '<tr><td class="pizzaHeader"></td><td class="pizzaHeader">Nom</td><td class="pizzaHeader">Composition</td><td class="pizzaHeader">Prix</td></tr>';\r
+      echo '<tr><td><input type="radio" name="piz_choisie" value="-1" ', ($le_participant->info->pizza==null?'checked':''), '></td><td class="texte">', ($le_participant->info->pizza==null?'<b>':''), 'Aucune', ($le_participant->info->pizza==null?'</b>':''), '</td><td></td><td></td></tr>';\r
+      while($pizza = mysql_fetch_object($requ))\r
+         echo '<tr><td width="1" ',($le_participant->info->pizza==$pizza->id?'class="pizzaChoisie"':''),'><input type="radio" id="pizza_', $pizza->id ,'" name="piz_choisie" value="', $pizza->id, '"',($le_participant->info->pizza==$pizza->id?'checked':''), '></td><td class="',($le_participant->info->pizza==$pizza->id?'pizzaChoisie ':''),'texte"><label for="pizza_', $pizza->id ,'">', $pizza->nom, '</label></td><td class="',($le_participant->info->pizza==$pizza->id?'pizzaChoisie ':''),'texte"><label for="pizza_', $pizza->id ,'">', $pizza->composition, '</label></td><td class="',($le_participant->info->pizza==$pizza->id?'pizzaChoisie ':''),'texte"><label for="pizza_', $pizza->id ,'">', $pizza->prix, '.-</label></td></tr>';\r
+      echo '</table><br><input type="submit" value="Commander"></form>';\r
+   }\r
+   else\r
+      if ($le_participant->info->pizza != null)\r
+         echo '<br><br>votre pizza ', pizza($le_participant->info->pizza), ' va bientot arriver';\r
+      else\r
+         echo "<br><br>la commande de pizza est terminée, veuillez attendre la prochaine vague<br><br>";\r
+}\r
+\r
+// Affiche les statistique sur les pizza\r
+function stats()\r
+{\r
+   $requ_pizza = mysql_query("select * from pizzas order by nom");\r
+   $requ_participant = mysql_query("select * from participants");\r
+   $nb = array();\r
+   $nb_tot = 0;\r
+   $total = 0;\r
+   $nb_pizza = mysql_fetch_row(mysql_query("select count(*) from pizzas"));\r
+   \r
+   // Initialise le tableau de comptage\r
+   for ($i=0; $i < ($nb_pizza[0] + 3); $i++)  // on fait un '+3' parce que on ne sais jamais trop ce qui pourrait se passer ;-))\r
+      $nb[$i] = 0;\r
+     \r
+   // Rempli le tableau de nombre de pizzas\r
+   while ($participant = mysql_fetch_object($requ_participant))\r
+      if ($participant->pizza != null)\r
+          $nb[$participant->pizza]++;\r
+      \r
+   echo '<h1>total des commandes</h1>'; \r
+   echo '<table width="100%" border="0" cellpadding="1" cellspacing="3">';\r
+   echo '<tr><td class="pizzaHeader">Nom</td><td class="pizzaHeader">Nombre</td><td class="pizzaHeader">Prix unitaire</td><td class="pizzaHeader">Prix total</td></tr>';   \r
+      \r
+   while($pizza = mysql_fetch_object($requ_pizza))\r
+   {\r
+      if ($nb[$pizza->id] == 0)\r
+         continue;      \r
+\r
+      echo '<tr><td class="texte">' . $pizza->nom . '</td><td class="texte">' . $nb[$pizza->id] . '</td><td class="texte">' . $pizza->prix . '.-</td><td class="texte">' . $nb[$pizza->id] * $pizza->prix . '.-</td></tr>';\r
+       $total += $nb[$pizza->id] * $pizza->prix;\r
+       $nb_tot += $nb[$pizza->id];\r
+   }\r
+   echo '<tr><td class="pizzaHeader">TOTAL</td><td class="texte pizzaHeader"><b>', $nb_tot, '</b></td><td class="pizzaHeader"></td><td class="texte pizzaHeader"><b>', $total, '.-</b></td></tr></table>';   \r
+}\r
+\r
+// Retourne le nom de la pizza en fonction de son ID\r
+function pizza ($id)\r
+{\r
+   $requ = mysql_query("select * from pizzas where id = " . $id);\r
+   if ($pizza = mysql_fetch_object($requ))\r
+      return $pizza->nom;\r
+   else\r
+      return 'Pizza inexistante !';\r
+}\r
+\r
+\r
+// Affiche qui prends koi\r
+function kiakoi()\r
+{\r
+   global $le_participant;\r
+   $requ = mysql_query("select * from participants order by nom");\r
+   \r
+   \r
+   echo '<h1>qui prend quoi</h1>';\r
+   echo '<table width="100%" border="0" cellpadding="1" cellspacing="3">';\r
+   echo '<tr><td class="pizzaHeader">Pseudo</td><td class="pizzaHeader">Nom</td><td class="pizzaHeader">Prix</td><td class="pizzaHeader">Paiement</td></tr>';\r
+   \r
+   while ($participant = mysql_fetch_object($requ))\r
+   {\r
+      if ($participant->pizza != null)\r
+      {\r
+         $pizza = mysql_fetch_object(mysql_query("select * from pizzas where id = " . $participant->pizza));\r
+         echo '<tr><td class="texte">', $participant->pseudo ,'</td><td class="texte">', $pizza->nom, '</td><td class="texte">', $pizza->prix, '.-</td><td class="texte">', ($le_participant->info->admin?'<a href="?page=pizzas&stats=1&paye=' . $participant->id . '">':''), ($participant->pizza_paye?'payé':'non payé !'), ($le_participant->info->admin?'</a>':'') ,'</td></tr>';\r
+      }\r
+      else\r
+         echo '<tr><td class="texte">', $participant->pseudo ,'</td><td class="texte">-</td><td class="texte">-</td><td class="texte">', '-</td></tr>';\r
+   }\r
+   echo '</table>';  \r
+   \r
+}\r
+\r
+function liens()\r
+{\r
+   global $le_participant;\r
+   \r
+   $res = '';\r
+   if (!isset($_GET['stats']))\r
+      $res .= '<br><a href="/pizzas.html&stats=1">voir les stats globaux</a>';\r
+      \r
+ //  if ($le_participant->info->admin && !isset($kiakoi))\r
+ //     $res .= '<br><a href="?page=pizzas&kiakoi=1">qui prend quoi</a>';\r
+      \r
+   if ($le_participant->info->admin)\r
+      $res .= '<br><br><a href="?page=pizzas' . (isset($_GET['stats'])?'&stats=1':'') . (isset($_GET['kiakoi'])?'&kiakoi=1':'') . '&reset=1">remise a zero de toutes les commandes</a>';\r
+   \r
+   return $res;\r
+}\r
+\r
+\r
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\r
+\r
+\r
+echo '<div id="pizzas">';\r
+if ($le_participant->valide) // le participant est loggé\r
+{\r
+   // Si demande d'effacer les commande et que le gars est admin, le fait\r
+   if(isset($_GET['reset']) && $le_participant->info->admin)\r
+   {\r
+      mysql_query("update participants set pizza = null, pizza_paye = 0");\r
+      $le_participant->info->pizza = -1; //mettre a jour le participants courant pour la beaute de l'affichage\r
+   }\r
+      \r
+   if(isset($_GET['paye']) && $le_participant->info->admin)\r
+   {  \r
+      /////// methode d'inversion\r
+      // $gars = mysql_fetch_object(mysql_query("select * from participants where id = " . $paye));\r
+      // mysql_query("update participants set pizza_paye = " . (1 - $gars->pizza_paye) . " where id = " . $paye);\r
+      ///////\r
+      \r
+      /////// methode d'un unique changement : non-paye -> paye\r
+      mysql_query("update participants set pizza_paye = 1 where id = " . $_GET['paye']);\r
+      ///////\r
+   }\r
+      \r
+      \r
+   if (!isset($_GET['stats']) && !isset($_GET['kiakoi']))\r
+   {\r
+      if (isset($_POST['piz_choisie'])) // la pizza a ete choisie\r
+      {\r
+         if ($piz_choisie != -1) // La pizza est validei\r
+         {\r
+            echo 'une '. pizza($_POST['piz_choisie']) . ' commandée !<br>';\r
+            $pizza_id = $_POST['piz_choisie'];\r
+         }\r
+         else\r
+         {\r
+            echo 'Aucune pizza commandée !'; // la pizza est '-1' donc pas de pizza commandée         \r
+            $pizza_id = "NULL";\r
+         }\r
+         mysql_query("update participants set pizza = " . $pizza_id . " where id = " . $le_participant->info->id);\r
+      }\r
+      else\r
+         selection_pizzas();\r
+   }\r
+   \r
+   if (isset($_GET['stats']))\r
+   {      \r
+      kiakoi();\r
+      echo '<br>';\r
+      stats();\r
+   }\r
+\r
+   echo liens();\r
+}\r
+else // le participant n'est pas loggé\r
+{\r
+   echo '<span class ="texte">Vous devez vous loggé pour commander une pizza</span>';\r
+}\r
+echo '</div>';\r
+?>\r
diff --git a/smiles.php b/smiles.php
new file mode 100644 (file)
index 0000000..bd95a36
--- /dev/null
@@ -0,0 +1,113 @@
+<?php\r
+/*--------------------------------------------------\r
+auteur : pifou\r
+date   : 21.02.2002\r
+\r
+affichage de smiles\r
+---------------------------------------------------*/\r
+\r
+###lES SMILES###\r
+$smiles[":)="] = "spliff.gif"; \r
+$smiles[":-)="] = "spliff.gif";\r
+\r
+$smiles[":))"] = "bigsmile.gif"; \r
+$smiles[":-))"] = "bigsmile.gif";\r
+\r
+$smiles[":)"] = "smile.gif"; \r
+$smiles[":-)"] = "smile.gif";\r
+\r
+$smiles[";)"] = "clin.gif"; \r
+$smiles[";-)"] = "clin.gif";\r
+\r
+$smiles[":-p"] = "eheheh.gif"; \r
+$smiles[":-P"] = "eheheh.gif";\r
+$smiles[":p"] = "eheheh.gif"; \r
+$smiles[":P"] = "eheheh.gif";\r
+\r
+$smiles["¦-)"] = "lol.gif"; \r
+$smiles["¦)"] = "lol.gif";\r
+\r
+$smiles["|-p"] = "langue.gif"; \r
+$smiles["|-P"] = "langue.gif";\r
+$smiles["|p"] = "langue.gif"; \r
+$smiles["|P"] = "langue.gif";\r
+\r
+$smiles[":-o"] = "oh.gif"; \r
+$smiles[":o"] = "oh.gif";\r
+$smiles[":-O"] = "oh.gif"; \r
+$smiles[":O"] = "oh.gif";\r
+$smiles[":-0"] = "oh.gif"; \r
+$smiles[":0"] = "oh.gif";      \r
+\r
+$smiles[">-(("] = "argn.gif"; \r
+$smiles[">(("] = "argn.gif";\r
+\r
+$smiles[">-("] = "pascontent.gif"; \r
+$smiles[">("] = "pascontent.gif";\r
+\r
+$smiles[":-(("] = "triste.gif"; \r
+$smiles[":(("] = "triste.gif";\r
+\r
+$smiles[":-("] = "sniff.gif"; \r
+$smiles[":("] = "sniff.gif";\r
+\r
+$smiles["8-)"] = "cool.gif"; \r
+$smiles["8)"] = "cool.gif";\r
+\r
+$smiles[":chat:"] = "chat.gif";\r
+\r
+/*--------------------------------------------------\r
+auteur : pifou\r
+date   : 21.02.2002\r
+\r
+affichage de tous les smiles dans un tableau\r
+---------------------------------------------------*/\r
+function afficher_smiles ($smiles, $ajout=0)\r
+{\r
+       $nb_colonne = 3; #nombre de colonne que l'on souuhaite au tableau       \r
+               \r
+       $fichier_avant = ""; #pour connaitre quel était le fichier precedement rencontré\r
+       \r
+       $nb_cellule = 0; #le nombre de cellule\r
+       $cellule_tmp =""; #pour la construction d'une cellule\r
+       \r
+       #parcours tous les smiles\r
+       foreach ($smiles as $smile => $fichier)\r
+       {\r
+               #si le fichier n'est pas le même qu'avant (passage à une autre figure) \r
+               if ($fichier != $fichier_avant)\r
+               {\r
+                       $nb_cellule++;\r
+                       if ($nb_cellule != 1) #si ce n'est pas la première iteration\r
+                       {\r
+                               $cellules[] = $cellule_tmp; #ajoute la celulle au tableau de cellules\r
+                               $cellule_tmp=""; #remet à zero la celulle temporaire\r
+                       }\r
+                       if ($ajout) $cellule_tmp .= '<a href ="javascript:ajouter_smile(\''. $smile .'\')";>';\r
+                       \r
+                       $cellule_tmp .= '<img border="0" src="images/smiles/'.$fichier.'"/>';\r
+                       \r
+                       if ($ajout) $cellule_tmp .= '</a>';\r
+               }\r
+               \r
+               $cellule_tmp .=  ' '. $smile;                   \r
+               $fichier_avant = $fichier;\r
+       }\r
+       $cellules[] = $cellule_tmp;\r
+\r
+       #affiche le tableau\r
+       echo '<table width="100%" border="0" cellspacing="0" cellpadding="4">';\r
+       #pour chaque cellule\r
+       foreach($cellules as $num => $cellule)\r
+       {\r
+               if ($num % $nb_colonne == 0) echo "<tr>";\r
+               echo '<td  class="smile">';\r
+               echo $cellule;\r
+               echo '</td>';\r
+               if ($num % $nb_colonne == $nb_colonne-1) echo "</tr>";\r
+       }\r
+       echo '</table>';\r
+\r
+}\r
+\r
+?>
\ No newline at end of file
diff --git a/tools/start_yaws.sh b/tools/start_yaws.sh
new file mode 100755 (executable)
index 0000000..534bf34
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/bash
+yaws --conf ./yaws.conf --sname cl7_dev -I debian_cl7_dev
diff --git a/tools/yaws.conf b/tools/yaws.conf
new file mode 100644 (file)
index 0000000..91abdcd
--- /dev/null
@@ -0,0 +1,84 @@
+# Configuration pour euphorik.ch en mode de développement.
+
+logdir = /tmp
+
+ebin_dir = /usr/lib/yaws/ebin
+include_dir = /usr/lib/yaws/include
+
+ebin_dir = ../urlrewrite
+
+<server localhost>
+   port = 8090
+   listen = 0.0.0.0
+   docroot = /home/gburri/projets/cl7/trunk/
+   allowed_scripts = php
+   # arg_rewrite_mod = cl7_urlrewrite    
+   # dir_listings = true
+</server>
+
+
+# This is a debug variable, possible values are http | traffic | false
+# It is also possible to set the trace (possibly to the tty) while
+# invoking yaws from the shell as in
+# yaws -i -T -x (see man yaws)
+trace = false
+
+cache_refresh_secs = 0
+
+# it is possible to have yaws start additional 
+# application specific code at startup
+# runmod = my_app
+
+
+# By default yaws will copy the erlang error_log and
+# end write it to a wrap log called report.log (in the logdir)
+# this feature can be turned off. This would typically
+# be the case when yaws runs within another larger app
+copy_error_log = true
+
+
+# Logs are wrap logs
+log_wrap_size = 1000000
+
+
+# Possibly resolve all hostnames in logfiles so webalizer
+# can produce the nice geography piechart
+log_resolve_hostname = false
+
+
+# fail completely or not if yaws fails 
+# to bind a listen socket
+fail_on_bind_err = true
+
+
+# If HTTP auth is used, it is possible to have a specific
+# auth log.
+auth_log = true
+
+
+# When we're running multiple yaws systems on the same 
+# host, we need to give each yaws system an individual
+# name. Yaws will write a number of runtime files under
+# /tmp/yaws/${id}
+# The default value is "default"
+#
+# In Debian system init script supplies id from the command
+# line, so it's not necessary to specify it here
+# id = debian_yaws_pre_prod
+
+
+# earlier versions of Yaws picked the first virtual host
+# in a list of hosts with the same IP/PORT when the Host:
+# header doesn't match any name on any Host
+# This is often nice in testing environments but not
+# acceptable in real live hosting scenarios
+pick_first_virthost_on_nomatch = true
+
+# All unices are broken since it's not possible to bind to
+# a privileged port (< 1024) unless uid==0
+# There is a contrib in jungerl which makes it possible by means 
+# of an external setuid root programm called fdsrv to listen to
+# to privileged port.
+# If we use this feature, it requires fdsrv to be properly installed.
+# Doesn't yet work with SSL.
+use_fdsrv = false
diff --git a/traitement_pre_affichage.php b/traitement_pre_affichage.php
new file mode 100644 (file)
index 0000000..85c56d4
--- /dev/null
@@ -0,0 +1,122 @@
+<?php\r
+/*--------------------------------------------------\r
+auteur : pifou\r
+date   : 19.02.2002\r
+\r
+effectue un traitement sur le contenu de la news avant\r
+de l'affficher\r
+---------------------------------------------------*/\r
+include_once("smiles.php"); #fichier de smiles :)\r
+\r
+/*--------------------------------------------------\r
+auteur : pifou\r
+date   : 21.02.2002\r
+\r
+remplace les 1, 2, 3, etc.. par des un, deux, trois, etc..\r
+---------------------------------------------------*/\r
+function nombre_fr($nb)\r
+{\r
+    switch($nb)\r
+    {\r
+               case 1 : return 'une';\r
+               case 2 : return 'deux'; \r
+               case 3 : return 'trois';\r
+               case 4 : return 'quatre';\r
+               case 5 : return 'cinq';\r
+               case 6 : return 'six';\r
+               case 7 : return 'sept';\r
+               case 8 : return 'huit';\r
+               case 9 : return 'neuf';\r
+               case 0 : return 'dix';\r
+       \r
+       }\r
+}\r
+\r
+/*--------------------------------------------------\r
+auteur : pifou\r
+date   : 19.02.2002\r
+\r
+enlève les liens http et ajoute des <br>\r
+---------------------------------------------------*/\r
+function traitement_pre_affichage($texte, $nb_max_long = 20)\r
+{\r
+       $texte = htmlentities($texte, ENT_QUOTES, "UTF-8");\r
+       \r
+   #insère un espace au milieu d'un mot de longueur $nb_max_long\r
+   $texte = ereg_replace("([[:graph:]]{".$nb_max_long."})([[:graph:]]{".$nb_max_long."})", "\\1<br/>\\2", $texte);\r
+       \r
+   #ajoute les smiles et les <br/>, enlève les balises\r
+   $texte = couleur(smile(nl2br($texte)));\r
+   \r
+       \r
+   #souligné\r
+   $texte = str_replace("[u]", "<u>", $texte); \r
+   $texte = str_replace("[/u]", "</u>", $texte); \r
+               \r
+   #gras\r
+   $texte = str_replace("[b]", "<b>", $texte); \r
+   $texte = str_replace("[/b]", "</b>", $texte); \r
+       \r
+   #italique\r
+   $texte = str_replace("[i]", "<i>", $texte); \r
+   $texte = str_replace("[/i]", "</i>", $texte); \r
+       \r
+       #####plus valable#####  \r
+   #gras\r
+   $texte = str_replace("[g]", "<b>", $texte);   \r
+   $texte = str_replace("[/g]", "</b>", $texte);  \r
+       ######################\r
+       \r
+   if ($texte == "")\r
+       return " - ";\r
+   return $texte;\r
+}\r
+\r
+/*--------------------------------------------------\r
+auteur : pifou\r
+date   : 19.02.2002\r
+\r
+remplace les :), :-) etc... par des images de smiles\r
+---------------------------------------------------*/\r
+function smile($texte)\r
+{\r
+       global $smiles;\r
+       \r
+       foreach ($smiles as $smile => $fichier)\r
+                $texte = str_replace($smile, '<img border="0" src="images/smiles/'.$fichier.'">', $texte);\r
+                \r
+    return $texte;\r
+       \r
+}\r
+\r
+/*--------------------------------------------------\r
+auteur : pifou\r
+date   : 2.04.2002\r
+\r
+remplace les balise {1} {/1} par des balise html\r
+font et met l'attribut couleur en fonction du numeros\r
+--------------------------------------------------*/\r
+function couleur($texte)\r
+{\r
+   $les_couleurs[0] = 'black';\r
+   $les_couleurs[1] = 'red';\r
+   $les_couleurs[2] = 'green';\r
+   $les_couleurs[3] = 'yellow';\r
+   $les_couleurs[4] = 'blue';\r
+   $les_couleurs[5] = 'aqua';\r
+   $les_couleurs[6] = 'fuchsia';\r
+   $les_couleurs[7] = 'white';\r
+   #$les_couleurs[8] = 'black';\r
+   #$les_couleurs[9] = 'black';\r
\r
+   foreach ($les_couleurs as $num => $couleur)\r
+   {\r
+      #$texte = ereg_replace("\{" . $num . "\}([[:print:]]+)\{/" . $num . "\}", "<font color=\"" . $couleur . "\">\\1</font>", $texte);\r
+      $texte = str_replace("{" . $num . "}", "<font color=\"" . $couleur . "\">", $texte);\r
+         $texte = str_replace("{/" . $num . "}", "</font>", $texte);\r
+   }\r
+         \r
+   return $texte;\r
+}\r
+\r
+?>\r
diff --git a/tx_bienvenue.php b/tx_bienvenue.php
new file mode 100644 (file)
index 0000000..53f8929
--- /dev/null
@@ -0,0 +1 @@
+Toute l'équipe de la Corcelles-LAN vous souhaite la bienvenue !!
diff --git a/tx_contacts.php b/tx_contacts.php
new file mode 100644 (file)
index 0000000..3727607
--- /dev/null
@@ -0,0 +1,12 @@
+<?php # coding:utf-8 ?>\r
+\r
+<h1>Organisateur</h1>\r
+<ul>\r
+ <li><a href="" id="contactLePiaf">Le Piaf</a></li>\r
+ <!--li><a href="">Pan!cores</a></li>\r
+ <li><a href="">Tourist</a></li-->\r
+</ul>\r
+<h1>Hébergeur et Webmaster</h1>\r
+<ul>\r
+ <li><a href="" id="contactPifou">Pifou</a></li>\r
+</ul>
\ No newline at end of file
diff --git a/tx_informations.php b/tx_informations.php
new file mode 100644 (file)
index 0000000..6f91a4f
--- /dev/null
@@ -0,0 +1,57 @@
+<?php #coding:utf-8 ?>\r
+\r
+<h2>Une puissante LAN aura lieu du <em>vendredi 21 Novembre</em> au <em>Lundi 24 Novembre</em> à Corcelles [NE]</h2>
+
+<h2>Heures</h2>
+<ul><li><p>Débute le vendredi à <em>19h00</em>, finit le lundi à <em>16h00</em> env. avec les rangments.</p></li></ul>
+
+<h2>Points forts</h2>
+<ul>
+ <li>Projecteur + Wii, PES, Worms, etc.</li>
+ <li>Platines pour les Dj's seront de la partie cette année.</li>
+ <li>Un serveur hostera les parties RA3, COD2, COD4, UT3 et Crysis. Counter Strike est strictement interdit durant la LAN, ce point est très important.</li>
+ <li>Accès à internet (pas pour WoW ou autre MMORPG autistique).</li>
+</ul>
+
+<h2>Matos</h2>
+<ul>
+ <li>Il est conseillé de disposer d'un PC en état de marche + carte ethernet et de drivers/soft en cas de réinstallation d'urgence.</li>
+ <li>Les haut-parleurs sont interdits, vous devez vous munir d'écouteurs (pas des écouteurs de 200W :)).</li>
+ <li>Apportez tout les câbles nécessaires à l'alimentation de votre PC + multiprise.</li>
+ <li>Un câble rj45 de si possible au moins 10m doit être amené pour la connexion au réseau.</li>
+</ul>
+
+<h2>Prix</h2>
+<ul>
+ <li>Il est de 40 CHF pour les 4 jours comprenand 3 repas chaud (dépend de l'état du cuistot) + 3 déjeunés à payer sur place au responsable.</li>
+ <li>Il est de 15 CHF par jours pour ceux qui ne peuvent pas venir toute la dureé de la lan.</li>
+</ul>
+
+<h2>Lieu</h2>
+<ul>
+ <li>La LAN ce déroule dans un abri civil à Corcelles, voici le plan :\r
+   <a href="images/carte.jpg"><img alt="carte d'accès" src="images/carte_mini.jpg" /></a>
+   <a href="images/carte_zoom.gif"><img  alt="carte d'accès (aperçu)" src="images/carte_zoom_mini.gif" /></a>.</li>
+ <li>Il y a six place de parc devant l'entrée et grand parking un peu plus loin (voir la deuxième carte ci-dessus).</li>
+ <li>Il est possible de dormir sur place, amenez votre sac de couchage si vous comptez roupiller, il y a aussi des couvertures si jamais des gens ont trop froid.</li>
+</ul>
+
+<h2>Bouffe, boissons &amp; drogues</h2>
+<ul>
+ <li>Une cuisine munit d'un cuistot diplômé sera entièrement à votre disposition pour vous alimenter en nourriture.</li>
+ <li>Amenez quand même un peu de bouffe, on ne sait jamais...</li>
+ <li>La bière est offerte en quantité déraisonnable.</li>
+ <li>Il n'y a, cette année, pas de frigo disponible.</li>
+ <li>Attention : les drogues ne sont absolument pas interdites.</li>
+</ul>
+
+<h2>Intranet</h2>
+<ul>
+ <li>Un système de partage de fichiers (photos de vacances, vidéos de son chat, etc.) sera mis en place. (Actuellement pas encore définit)</li>
+</ul>
+
+<h2>Divers</h2>
+<ul>
+ <li>Les participants sont priés de ranger et nettoyer leur place en quittant la lan.</li>
+ <li>Toute personne ayant installé CS sur sont PC sera immolé dans la joie et la bonne humeur des autres gamers.</li>
+</ul>
diff --git a/tx_inscription.php b/tx_inscription.php
new file mode 100644 (file)
index 0000000..22847f4
--- /dev/null
@@ -0,0 +1,118 @@
+<?php # coding:utf-8
+if($le_participant->valide)
+       echo '<p>Modification de mes infos</p>';
+else
+   echo'<p><em>Les personnes inscrites s\'engagent à être présentes à la LAN et à payer la somme convenue.</em></p>
+<p>Elles peuvent se désinscrirent en cas d\'empèchements majeurs.</p>';
+?>
+
+<form id="formulaireInscription" method="post" action="<?php echo($le_participant->valide?'inscrits':'bienvenue'), '.html'; ?>">
+<?php
+   if($le_participant->valide)
+               echo '<p><input type="hidden" name="modification_participant" value="1" /></p>';
+   else
+      echo '<p><input type="hidden" name="inscription" value="1" /></p>';
+?>
+<table>
+   <colgroup>
+      <col id="inscriptionColonneNom" />  
+      <col id="inscriptionColonneValeur" />
+   </colgroup>
+   <tr>
+      <td>
+         pseudo <span class="miniInfo">(login)</span>
+      </td>
+      <td>
+         <input type="text" maxlength="50" name="pseudo" <?php echo($le_participant->valide?('value="'.$le_participant->info->pseudo.'"'):''); ?> />
+      </td>
+   </tr>
+   <tr>
+      <td>
+         password <span class="miniInfo">(pour pouvoir par la suite modifier mes infos)</span>
+      </td>
+      <td>
+         <input type="password" size="10" maxlength="10" name="pass1" <?php echo($le_participant->valide?('value="'.$le_participant->info->password.'"'):''); ?> />
+         re: <input type="password" maxlength="10" size="10" name="pass2" <?php echo($le_participant->valide?('value="'.$le_participant->info->password.'"'):''); ?> /> 
+      </td>
+   </tr>
+   <tr>
+      <td>
+         clan name
+      </td>
+      <td>
+         <input type="text" maxlength="30" size="15" name="clan_nom" <?php echo($le_participant->valide?('value="'.$le_participant->info->clan_nom.'"'):''); ?> /> 
+         <select id="clanChoix" name="clanChoix" size="1">
+            <option value ="0" selected="selected">clans existants</option>
+            <?php
+               $res = mysql_query("SELECT DISTINCT clan_nom, clan_tag FROM participants WHERE clan_nom != '' OR clan_tag != ''");
+               while($info_clan = mysql_fetch_object($res))
+               {
+                  echo '<option value = "', $info_clan->clan_nom, ';', $info_clan->clan_tag, '">', $info_clan->clan_nom != '' ? $info_clan->clan_nom : $info_clan->clan_tag, '</option>';
+               }
+            ?>
+         </select>
+      </td>
+   </tr> 
+   <tr>
+      <td>
+         clan tag
+      </td>
+      <td>
+         <input type="text" maxlength="10" name="clan_tag" <?php echo($le_participant->valide?('value="'.$le_participant->info->clan_tag.'"'):''); ?> /> 
+      </td>
+   </tr> 
+   <tr>
+      <td>
+         nom
+      </td>
+      <td>
+         <input type="text" maxlength="30" name="nom" <?php echo($le_participant->valide?('value="'.$le_participant->info->nom.'"'):''); ?> />
+      </td>
+   </tr>
+   <tr>
+      <td>
+         prénom
+      </td>
+      <td>
+         <input type="text" maxlength="30" name="prenom" <?php echo($le_participant->valide?('value="'.$le_participant->info->prenom.'"'):''); ?> />
+      </td>
+   </tr>
+   <tr>
+      <td>
+         age
+      </td>
+      <td>
+         <input type="text" maxlength="30" name="age" <?php echo($le_participant->valide?('value="'.$le_participant->info->age.'"'):''); ?> />
+      </td>
+   </tr>
+   <tr>
+      <td>
+         email <span class="miniInfo">(non-public)</span>
+      </td>
+      <td>
+         <input type="text" maxlength="30" name="e_mail" <?php echo($le_participant->valide?('value="'.$le_participant->info->e_mail.'"'):''); ?> />
+      </td>
+   </tr>
+   <tr>
+      <td>
+         remarques
+      </td>
+      <td>
+         <textarea cols="30" rows="5" name="remarques"><?php echo($le_participant->valide?$le_participant->info->remarques:''); ?></textarea>
+      </td>
+   </tr>
+   <?php
+      if (!$le_participant->valide)
+      echo'
+         <tr>
+            <td>
+               j\'ai bien lu et suis d\'accord avec le préambule
+            </td>
+            <td>
+               <input type="checkbox" name="accord" />
+            </td>
+         </tr>';
+   ?>
+   </table>
+   <p><input type="submit" value="OK" /></p>
+</form>
diff --git a/tx_inscrits.php b/tx_inscrits.php
new file mode 100644 (file)
index 0000000..89ff6a0
--- /dev/null
@@ -0,0 +1,36 @@
+<?php # coding:utf-8\r
+\r
+include_once("traitement_pre_affichage.php");\r
+\r
+$res = mysql_query("SELECT pseudo, nom, prenom, age, clan_nom, clan_tag, remarques FROM participants ORDER by clan_nom, clan_tag, pseudo");\r
+\r
+$debut_table = '\r
+<table class="inscrits">\r
+ <tr>\r
+  <th>pseudo</th>\r
+  <th>nom</th>\r
+  <th>prénom</th>\r
+  <th>age</th>\r
+  <th>remarques</th>\r
+ </tr>';\r
\r
+$clan_courant = null;\r
+\r
+while($participant = mysql_fetch_object($res))\r
+{  \r
+   if ($clan_courant !== $participant->clan_nom)\r
+   {\r
+      echo ($participant->clan_nom != '' ? '</table><h1>'.traitement_pre_affichage($participant->clan_nom).'</h1>' : ''), $debut_table;\r
+      $clan_courant = $participant->clan_nom;\r
+   }\r
+   \r
+   echo '<tr>';\r
+       echo '<td>', htmlentities($participant->clan_tag, ENT_QUOTES, "UTF-8"), traitement_pre_affichage($participant->pseudo), '</td>';\r
+       echo '<td>', traitement_pre_affichage($participant->nom), '</td>';\r
+       echo '<td>', traitement_pre_affichage($participant->prenom), '</td>';\r
+       echo '<td>', traitement_pre_affichage($participant->age), '</td>';\r
+       echo '<td>', traitement_pre_affichage($participant->remarques), '</td>';\r
+       echo '</tr>';\r
+}\r
+echo '</table>';\r
+?>\r
diff --git a/tx_intranet.php b/tx_intranet.php
new file mode 100644 (file)
index 0000000..8746475
--- /dev/null
@@ -0,0 +1,21 @@
+
+<h5><a href="ftp://mp3:divx@pifou-computer/" target="_blank">>>Le serveur ftp !!DivX - Mp3 - Progz!! <<</a></h5>
+<h5><a href="ftp://lan:lan@fatypunk/" target="_blank">>>Le serveur de Faty !!Mp3 - Videos!! <<</a></h5>
+<h5><a href="ftp://kiki/" target="_blank">>>Kiki ftp !!Manga - Roms Nes/Snes!! <<</a></h5>
+<h5><a href="ftp://rezo:rezo@leo/" target="_blank">>>Le0 ftp !!Tout!! <<</a></h5>
+<li><a href="files/leechftp130.zip" target="_blank">CLIENT FTP BIEN</a></li>
+
+<h5><a href="http://blue/csstats/" target="_blank">>> Stats CS <<</a></h5>
+
+<h6>PATCHS</h6>
+<ul>
+<li><a href="files/HL1109.exe" target="_blank">HL 1.109</a> & <a href="files/HL1109to1110.exe" target="_blank">HL 1.109 to 1.110</a></li>
+<li><a href="files/quake3v131.exe" target="_blank">Q3 1.31</a></li>
+<li><a href="files/star_109b.exe" target="_blank">Starcraft 1.09b</a> & <a href="files/bw_109b.exe" target="_blank">Broodwar 1.09b</a></li>
+</ul>
+<h6>MODS</h6>
+<ul>
+<li><a href="files/csv15full.exe" target="_blank">CS 1.5</a></li>
+<li><a href="files/rocketarena3v15.exe" target="_blank">RA3 1.5</a></li>
+</ul>
+
diff --git a/tx_jeux_joues.php b/tx_jeux_joues.php
new file mode 100644 (file)
index 0000000..8908949
--- /dev/null
@@ -0,0 +1,57 @@
+<?php # coding: utf-8\r
+\r
+include_once("traitement_pre_affichage.php");\r
+\r
+if (!$le_participant->valide)\r
+{\r
+   echo '<p><em>Remarque : </em>Il faut être inscrit pour pouvoir voter.</p>';\r
+}\r
+\r
+\r
+echo '\r
+<form id="formulaireJeuxJoues" method="post" action="index.php?page=jeux_joues">\r
+   <p><input type="hidden" name="set_jeux_joues" value="1" /></p>\r
+   <table>\r
+      <tr>', ($le_participant->valide ? '<th></th>' : ''), '<th>Votes</th><th>Jeux</th></tr>';\r
+\r
+$jeux_query = mysql_query("\r
+   SELECT jeux.id, jeux.nom, jeux_choisis.participant_id, COUNT(*) + IF(participant_id is not null, 1, 0) - 1 AS nb_vote\r
+   FROM jeux LEFT JOIN jeux_choisis ON jeux.id = jeux_choisis.jeu_id\r
+   GROUP BY jeux.id\r
+   ORDER BY nb_vote DESC, nom \r
+");\r
+   \r
+while ($jeu = mysql_fetch_object($jeux_query))\r
+{\r
+   // est-ce que le participant courant à voté pour ce jeu ?\r
+   if ($le_participant->valide)\r
+   {\r
+      $a_vote = mysql_fetch_row(mysql_query("\r
+         SELECT COUNT(*) FROM jeux_choisis\r
+         WHERE participant_id = ".$le_participant->info->id." AND jeu_id = ".$jeu->id\r
+      )); $a_vote = $a_vote[0];\r
+   }\r
+   else\r
+      $a_vote = FALSE;\r
+   \r
+   echo '<tr>',\r
+      $le_participant->valide ? '<td><input type="checkbox" name="votes[]" '. ($a_vote ? 'checked="checked"' : '') .' value="'.$jeu->id.'" /></td>' : '',\r
+      '<td>' . $jeu->nb_vote . '</td>',\r
+      '<td ' . ($a_vote ? 'class="aVote" ': '').'>' . traitement_pre_affichage($jeu->nom) . '</td></tr>';\r
+}\r
+\r
+echo '\r
+   </table>';\r
+\r
+if ($le_participant->valide)\r
+   echo '\r
+   <p>Autre : <input type="text" maxlength="50" name="jeu" /></p>\r
+   <p><input type="submit" value="Voter" /></p>';\r
+   \r
+echo '</form>';\r
+\r
+// affichage du nombre de vote restant\r
+if ($le_participant->valide)\r
+   echo '<p>Nombre de votes restant : ' . $le_participant->nb_vote_restant() . '</p>';\r
+\r
+?>
\ No newline at end of file
diff --git a/tx_photos.php b/tx_photos.php
new file mode 100644 (file)
index 0000000..939e7ad
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+#Petite galerie d'image à 2 balles , necessite GD2.
+##########CONFIG#########
+#Variables à repasser à la page (liens) :
+$vars_repasse = array('page');
+define('NOM_FICHIER', 'index.php');
+define('TAILLE_SECTION', '12');
+define('TAILLE_NOM_IMAGE', '11');
+define('TAILLE_VIGNETTE', '100');
+define('TAILLE_PHOTO_REDUITE', '400');
+define('NOMBRE_VIGNETTE_PAR_PAGE', '9');
+define('NOMBRE_COLONNE', '3');
+#######FIN CONFIG########
+
+include('class_galerie_photos.php');
+
+$ma_galerie = new galerie("images/galerie");
+
+if (!isset($_GET['__page_galerie'])) $_GET['__page_galerie'] = 'liste_sections';
+if (!isset($_GET['__page_section'])) $_GET['__page_section'] = 1;
+
+switch ($_GET['__page_galerie'])
+{
+       case 'liste_sections' :
+               foreach($ma_galerie->sections() as $section)
+                       echo '<div style="font-size : ',TAILLE_SECTION,'pt; font-weight : bold; "><a href="',NOM_FICHIER,'?',arguments_page(),'__section=',$section,
+                               '&amp;__page_galerie=section">', $section,'</a></div>Auteur : ',$ma_galerie->get_auteur($section),'<br/>Date : ',$ma_galerie->get_date($section),'<br/><br/>';
+               break;
+               
+       case 'section' :
+               $ma_galerie->set_section_courante($_GET['__section']);
+               $ma_galerie->afficher_vignettes($_GET['__page_section']);
+               break;
+               
+       case 'photo' :
+               $ma_galerie->set_section_courante($_GET['__section']);
+               $ma_galerie->afficher_photo($_GET['__photo']);
+               break;
+}
+
+?>
\ No newline at end of file
diff --git a/update_db.php b/update_db.php
new file mode 100644 (file)
index 0000000..3cce184
--- /dev/null
@@ -0,0 +1,89 @@
+<?php # encoding:utf-8
+/**
+  * Met à jour la base de données en fonction de la version courante de celle ci.
+  * Si des tables n'existes pas elles sont automatiquement créées.
+  */
+  
+include("connexion.php");
+  
+function creer_db()
+{
+   mysql_query("   
+      CREATE TABLE IF NOT EXISTS config (
+         nom varchar(50) NOT NULL,
+         valeur varchar(255) NOT NULL,
+         PRIMARY KEY (nom)
+      ) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED;
+   ");
+   mysql_query("
+      CREATE TABLE pizzas (
+        id mediumint(3) unsigned NOT NULL auto_increment,
+        nom varchar(40) NOT NULL,
+        composition varchar(255) NOT NULL,
+        prix tinyint(3) unsigned default '0',
+        PRIMARY KEY  (id)
+      ) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED;
+   ");
+   mysql_query("
+      CREATE TABLE IF NOT EXISTS jeux (
+        id mediumint(3) unsigned NOT NULL auto_increment,
+        nom varchar(200) default '0',
+        PRIMARY KEY (id),
+        UNIQUE KEY nom_unique (nom)
+      ) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED;
+   ");
+   mysql_query("
+      CREATE TABLE IF NOT EXISTS participants (
+        id mediumint(3) unsigned NOT NULL auto_increment,
+        pseudo varchar(50) default NULL,
+        clan_nom varchar(30) default NULL,
+        clan_tag varchar(10) default NULL,
+        password varchar(10) default NULL,
+        nom varchar(30) default NULL,
+        prenom varchar(30) default NULL,
+        age varchar(30) default NULL,
+        e_mail varchar(50) default NULL,
+        remarques varchar(255) default NULL,
+        admin tinyint(1) unsigned NOT NULL default '0',
+        a_paye tinyint(1) unsigned NOT NULL default '0',
+        pizza mediumint(3) unsigned default NULL,
+        pizza_paye tinyint(1) NOT NULL default '0',
+        PRIMARY KEY  (id),
+        KEY FK_pizza (pizza),
+        CONSTRAINT FK_pizza FOREIGN KEY (pizza) REFERENCES pizzas (id) ON DELETE SET NULL ON UPDATE SET NULL
+      ) ENGINE=InnoDB AUTO_INCREMENT=47 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
+   ");
+   mysql_query("
+      CREATE TABLE IF NOT EXISTS jeux_choisis (
+        participant_id mediumint(3) unsigned NOT NULL default '0',
+        jeu_id mediumint(3) unsigned NOT NULL default '0',
+        PRIMARY KEY USING BTREE (participant_id,jeu_id),
+        KEY FK_jeu (jeu_id),
+        CONSTRAINT FK_participant FOREIGN KEY (participant_id) REFERENCES participants (id) ON DELETE CASCADE ON UPDATE CASCADE,
+        CONSTRAINT FK_jeu FOREIGN KEY (jeu_id) REFERENCES jeux (id) ON DELETE CASCADE ON UPDATE CASCADE
+      ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
+   ");
+}
+
+function initialiser_db()
+{
+   mysql_query("INSERT INTO config (nom, valeur) VALUES ('version', 1)");
+}
+
+function update_db()
+{
+   # si la table 'config' n'existe pas alors on suppose qu'aucune table n'existe
+   $version = 0;
+   if(!$version = @mysql_fetch_object(mysql_query("SELECT valeur FROM config WHERE nom = 'version'")))
+   {
+      mysql_query("BEGIN TRANSACTION");
+      creer_db();
+      initialiser_db();
+      mysql_query("COMMIT");
+      $version = 1;
+   }
+}
+
+update_db();
+
+?>
diff --git a/urlrewrite/cl7_urlrewrite.erl b/urlrewrite/cl7_urlrewrite.erl
new file mode 100644 (file)
index 0000000..9115af9
--- /dev/null
@@ -0,0 +1,20 @@
+-module(cl7_urlrewrite).\r
+-export([arg_rewrite/1]).\r
+\r
+-include_lib("yaws/include/yaws_api.hrl").\r
+\r
+arg_rewrite(Arg) ->\r
+   Req = Arg#arg.req,\r
+   {abs_path, Path} = Req#http_request.path,   \r
+   NPath = {abs_path,\r
+      case string:rstr(Path, ".html") of\r
+         0 -> Path;\r
+         N -> "/?page=" ++ string:substr(Path, 2, N - 2) ++ string:substr(Path, N + 5)\r
+      end\r
+   },\r
+   % pour les tests\r
+   %{ok, F} = file:open("/tmp/out.txt", [write]),\r
+   %io:format(F, "~p~n", [Path]),\r
+   %file:close(F),   \r
+   Arg#arg{req = Req#http_request{path = NPath}}.\r
+   \r