diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..862b3189c89c8f829d18bcd9b35cd21417a4a663
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+.idea/*
+*~
diff --git a/Image.php b/Image.php
new file mode 100644
index 0000000000000000000000000000000000000000..30543b32218f8d58ef7110b80fc37237e92a5fde
--- /dev/null
+++ b/Image.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: table
+ * Date: 05/05/16
+ * Time: 11:34
+ */
+
+/**
+ * Creer un objet image a partir du fichier envoyé par l'utilisateur.
+ * @param array $file
+ *
+ * @return une image ou false si erreur.
+ */
+function getImage($file, $max_hauteur, $max_largeur) {
+    if ($file['error'] == 4) {
+        return array(1, null);
+    }
+    if ($file['error'] > 0) {
+        return array(5, null);
+    }
+    if (!($taille = getimagesize($file['tmp_name']))) {
+        return array(6, null);
+    }
+    if ($taille[0] > $max_largeur OR $taille[1] > $max_hauteur) {
+        return array(7, null); // mais on pourait la réduire
+    }
+    if ($avatar = imagecreatefromjpeg($file['tmp_name'])) {
+        return array(0, $avatar);
+    } elseif ($avatar = imagecreatefrompng($file['tmp_name'])) {
+        return array(0, $avatar);
+    } else {
+        return array(6, null);
+    }
+}
+
+function saveImage($image, $path) {
+    imagejpeg($image, $path);
+}
\ No newline at end of file
diff --git a/app/controller/AdminController.php b/app/controller/AdminController.php
new file mode 100644
index 0000000000000000000000000000000000000000..006d0120e94577cad9f649cf155fc05d2a85342c
--- /dev/null
+++ b/app/controller/AdminController.php
@@ -0,0 +1,645 @@
+<?php
+include(ROOT."/Image.php");
+
+class AdminController extends Controller {
+    
+    public function display() {
+        $this->view->display();
+    }
+
+    public function displayJeu() {
+        $this->view->nonValide = Admin::getListeJeuNonValide();
+        $this->view->Valide = Admin::getListeJeuValide();
+        $this->view->display();
+    }
+    
+    public function acceptJeu() {
+        $slug = $this->route["params"]["slug"];
+        if(Admin::acceptJeu($slug)) {
+            header("Location:valide/ok");
+        } else {
+            session_start();
+            $_SESSION['adminErr'] = 1;
+            header("Location:../../jeu");
+        }
+    }
+    
+    public function displayAcceptJeuOK() {
+        $this->view->display();
+    }
+
+    public function displayModifPartieOK() {
+        $this->view->display();
+    }
+
+    public function supprimeJeu() {
+        $slug = $this->route["params"]["slug"];
+        Admin::supprJeu($slug);
+        unlink(ROOT."/www/images/jeu/".$slug.".jpg");
+        header("Location:supprime/ok");
+    }
+
+    public function displaySupprimeJeuOK() {
+        $this->view->display();
+    }
+    
+    public function unAcceptJeu() {
+        $slug = $this->route["params"]["slug"];
+        if(Admin::unacceptJeu($slug)) {
+            header("Location:unvalide/ok");
+        } else {
+            session_start();
+            $_SESSION['adminErr'] = 1;
+            header("Location:../../jeu");
+        }
+    }
+    
+    public function displayUnAcceptJeuOK() {
+        $this->view->display();
+    }
+    
+    public function displayModifJeu() {
+        $slug = $this->route["params"]["slug"];
+        $this->view->jeu = Jeu::getFromSlug($slug);
+        $this->view->display();
+    }
+
+    public function displayModifJeuOK() {
+        $this->view->display();
+    }
+    public function verifyModifJeu() {
+        $slug = $this->route["params"]["slug"];
+        if(!isset($_POST['min_joueurs']) || !isset($_POST['type']) || !isset($_POST['type_scores'])) {
+            session_start();
+            $_SESSION['modifJeuErrCode'] = 1;
+            header("location:../modif");
+            die();
+        }
+        if(isset($_FILES['image'])) {
+            list($err, $image) = getImage($_FILES['image'], 512, 512);
+            if ($err == 0) {
+                saveImage($image, ROOT . "/www/images/jeu/" . $_POST['slug_jeu'] . ".jpg");
+            } elseif($err == 2) {
+                $_SESSION["addRequestErrCode"] = $err; // on stocke le code d'erreur
+                header('Location:../modif'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne)
+                die();
+            }
+        }
+        $data = $_POST;
+        foreach (array('max_joueurs', 'min_equipes', 'max_equipes') as $truc) {
+            if ($data[$truc] == 0) {
+                $data[$truc] = null;
+            }
+        }
+        Admin::setModifJeu($slug, $data);
+        header("Location:ok");
+    }
+    
+    public function displayJoueur() {
+        $this->view->joueurs = Profil::getList();
+        $this->view->display();
+    }
+    public function supprimeJoueur() {
+        $slug = $this->route["params"]["slug"];
+        Admin::supprJoueur($slug);
+        unlink(ROOT."/www/images/avatar/".$slug.".jpg");
+        header("Location:supprime/ok");
+    }
+
+    public function displaySupprimeJoueurOK() {
+        $this->view->display();
+    }
+    
+    public function displayListPartie() {
+        $this->view->listPartie = Admin::getListPartie();
+        $this->view->display();        
+    }
+    
+    public function initModifPartie()  {
+        session_start();
+        $id = $this->route["params"]["slug"];
+        $partie = Partie::getFromId($id);
+        $jeuactuel = Jeu::getFromSlug($partie->jeu);
+        if($jeuactuel->type == "equipes"){
+            $_SESSION['equipes'] = Admin::getEquipes($id);
+            $_SESSION['jeu_select'] = $jeuactuel;
+            $_SESSION['id_partie'] = $id;
+            header("location:modif/stepe1");
+            die();
+        } else {
+            $_SESSION['joueurs_select'] = Admin::getListeJoueur($id);
+            $_SESSION['jeu_select'] = $jeuactuel;
+            $_SESSION['id_partie'] = $id;
+            header("location:modif/step1");
+            die();
+        }
+    }
+    
+    public function displayModifPartieStepe1()
+    {
+        session_start();
+        if (!isset($_SESSION['jeu_select']) || !isset($_SESSION['equipes'])) {
+            header("Location:../add_partie");
+            die();
+        }
+        if(isset($_SESSION['errMsg'])){
+            $this->view->errMsg = $_SESSION['errMsg'];
+            unset($_SESSION['errMsg']);
+        }
+        if (is_null($_SESSION['jeu_select']->max_joueurs)) {
+            $this->view->maxj = "plus de";
+        }
+        else {
+            $this->view->maxj = $_SESSION['jeu_select']->max_joueurs;
+        }
+        if (is_null($_SESSION['jeu_select']->max_equipes)) {
+            $this->view->maxe = "plus d'";
+        }
+        else{
+            $this->view->maxe = $_SESSION['jeu_select']->max_equipes." ";
+        }
+        $this->view->jeuactuel = $_SESSION['jeu_select'];
+        $this->view->listej = Profil::getList();
+        $this->view->equipes = $_SESSION['equipes'];
+        $this->view->display();
+    }
+
+    public function displayModifPartieStep1()
+    {
+        session_start();
+        if (!isset($_SESSION['jeu_select'])) {
+            header("Location:../add_partie");
+			die();
+		}
+        if(isset($_SESSION['errMsg'])){
+            $this->view->errMsg = $_SESSION['errMsg'];
+            unset($_SESSION['errMsg']);
+        }
+
+        if ($_SESSION['jeu_select']->max_joueurs === "")
+            $this->view->max = "plus";
+        else
+            $this->view->max = $_SESSION['jeu_select']->max_joueurs;
+
+        $this->view->jeuactuel = $_SESSION['jeu_select'];
+        $this->view->listej = Profil::getList();
+        $this->view->display();
+    }
+
+    private static function error($errstr, $step){
+        session_start();
+        $_SESSION['errMsg'] = $errstr;
+        if($step == "step0") {
+            header("Location:../add_partie");
+            die();
+        }
+        else if($step == "step1") {
+            header("Location:step1");
+            die();
+        }
+        else if($step == "step2") {
+            header("Location:step2");
+            die();
+        }
+        else if($step == "stepe1") {
+            header("Location:stepe1");
+            die();
+        }
+        else if($step == "stepe2") {
+            header("Location:stepe2");
+            die();
+        }
+        else {
+            header("Location:../add_partie");
+            die();
+        }
+    }
+
+    public static function ModifPartieaddjoueurs1()
+    {
+        session_start();
+        if (!isset($_SESSION['jeu_select'])) {
+            header("Location:../add_partie");
+            die();
+        }
+
+        $jeu = $_SESSION['jeu_select'];
+
+        if (!isset($_POST["joueur"])) {
+            if ($jeu->type == 'equipes') {
+                self::error("<h1>Erreur : pas de joueur entré.</h1>", "stepe1");
+                die();
+            }
+            else {
+                self::error("<h1>Erreur : pas de joueur entré.</h1>", "step1");
+                die();
+            }
+        }
+
+        $joueur = $_POST["joueur"];
+
+        if (Profil::checkExists($joueur)) {
+            $joueur_objet = Profil::getFromSlug($joueur);
+        }
+        else {
+            if ($jeu->type == 'equipes') {
+                self::error("<h1>Erreur : le joueur est introuvable dans la base de données.</h1>", "stepe1");
+                die();
+            }
+            else {
+                self::error("<h1>Erreur : le joueur est introuvable dans la base de données.</h1>", "step1");
+                die();
+            }
+        }
+
+        if ($jeu->type == 'equipes') {
+            $ke = $_POST['equipejadd'];
+            foreach ($_SESSION['equipes'] as $equipe) {
+                if (in_array($joueur_objet, $equipe)) {
+                    self::error("<h1>Erreur : le joueur a déjà été inscrit pour cette partie.</h1>", "stepe1");
+                    die();
+                }
+            }
+            array_push($_SESSION['equipes'][$ke], $joueur_objet);
+            header("Location:stepe1");
+            die();
+        }
+        else {
+            if (!isset($_SESSION['joueurs_select'])) {
+                $_SESSION['joueurs_select'] = array($joueur_objet);
+                header("Location:step1");
+                die();
+            }
+
+            if (!in_array($joueur_objet, $_SESSION['joueurs_select']))
+                array_push($_SESSION['joueurs_select'], $joueur_objet);
+            else {
+                self::error("<h1>Erreur : le joueur a déjà été inscrit pour cette partie.</h1>", "step1");
+                die();
+            }
+            header("Location:step1");
+            die();
+        }
+    }
+
+    public static function ModifPartieclearstep1()
+    {
+        session_start();
+        if (!isset($_SESSION['jeu_select'])) {
+            header("Location:../add_partie");
+            die();
+        }
+        $jeu_actuel = $_SESSION['jeu_select'];
+        if ($jeu_actuel->type == 'equipes') {
+            if (!isset($_SESSION['equipes'])) {
+                header("Location:stepe1");
+                die();
+            }
+            $_SESSION['equipes'] = array(array());
+            header("Location:stepe1");
+            die();
+        }
+        else {
+            if (!isset($_SESSION['joueurs_select'])) {
+                header("Location:step1");
+                die();
+            }
+            unset($_SESSION['joueurs_select']);
+            header("Location:step1");
+            die();
+        }
+    }
+
+    public static function ModifPartiedeljoueurs1()
+    {
+        session_start();
+        if (!isset($_SESSION['jeu_select'])) {
+            header("Location:../add_partie");
+            die();
+        }
+
+        if ($_SESSION['jeu_select']->type == 'duels') {
+            if (!isset($_SESSION['joueurs_select'])) {
+                header("Location:step1");
+                die();
+            }
+        }
+        if ($_SESSION['jeu_select']->type == 'equipes') {
+            if (!isset($_SESSION['equipes'])) {
+                header("Location:stepe1");
+                die();
+            }
+        }
+
+        if (!isset($_POST['joueurdel'])) {
+            if ($_SESSION['jeu_select']->type == 'equipes') {
+                self::error("<h1>Erreur : variables manquantes.</h1>", "stepe1");
+                die();
+            }
+            else {
+                self::error("<h1>Erreur : variables manquantes.</h1>", "step1");
+                die();
+            }
+        }
+
+        if ($_SESSION['jeu_select']->type == 'equipes') {
+            unset($_SESSION['equipes'][$_POST['equipejdel']][$_POST['joueurdel']]);
+            $equipe_tmp = array();
+            foreach ($_SESSION['equipes'][$_POST['equipejdel']] as $j) {
+                array_push($equipe_tmp, $j);
+            }
+            $_SESSION['equipes'][$_POST['equipejdel']] = $equipe_tmp;
+            header("Location:stepe1");
+            die();
+        }
+        else {
+            unset($_SESSION['joueurs_select'][$_POST['joueurdel']]);
+            $joueurs_tmp = array();
+            foreach ($_SESSION['joueurs_select'] as $j) {
+                array_push($joueurs_tmp, $j);
+            }
+            $_SESSION['joueurs_select'] = $joueurs_tmp;
+            header("Location:step1");
+            die();
+        }
+    }
+
+    public static function ModifPartiedelequipe()
+    {
+        session_start();
+        if (!isset($_SESSION['jeu_select'])) {
+            header("Location:../add_partie");
+            die();
+        }
+        if (!isset($_SESSION['equipes'])) {
+            header("Location:stepe1");
+            die();
+        }
+        if (count($_SESSION['equipes']) <= 1) {
+            self::error("<h1>Erreur : vous ne pouvez pas supprimer la seule équipe restante.</h1>", "stepe1");
+            die();
+        }
+
+        if (!isset($_POST['equipe'])) {
+            self::error("<h1>Erreur : variables manquantes.</h1>", "stepe1");
+            die();
+        }
+
+        unset($_SESSION['equipes'][$_POST['equipe']]);
+        $equipe_tmp = array();
+        foreach ($_SESSION['equipes'] as $e) {
+            array_push($equipe_tmp, $e);
+        }
+        $_SESSION['equipes'] = $equipe_tmp;
+        header("Location:stepe1");
+        die();
+    }
+
+    public static function ModifPartieaddequipe()
+    {
+        session_start();
+        if (!isset($_SESSION['jeu_select'])) {
+            header("Location:../add_partie");
+			die();
+		}
+        if (count($_SESSION['equipes']) == $_SESSION['jeu_select']->max_equipes) {
+            self::error("<h1>Erreur : vous ne pouvez pas créer d'équipe supplémentaire.</h1>", "stepe1");
+			die();
+        }
+
+        array_push($_SESSION['equipes'], array());
+        header("Location:stepe1");
+		die();
+    }
+
+    public static function verifyModifPartieStep1()
+    {
+        session_start();
+        if (!isset($_SESSION['jeu_select'])) {
+            header("Location:../add_partie");
+            die();
+        }
+        $jeu_actuel = $_SESSION['jeu_select'];
+        if ($jeu_actuel->type == 'equipes') {
+            if (!isset($_SESSION['equipes'])) {
+                header("Location:stepe1");
+                die();
+            }
+            $equipes = $_SESSION['equipes'];
+            if (count($equipes) < $jeu_actuel->min_equipes) {
+                self::error("<h1>Erreur : il n'y a pas assez d'équipes.</h1>", "stepe1");
+                die();
+            }
+            if (count($equipes) > $jeu_actuel->max_equipes) {
+                self::error("<h1>Erreur : il y a trop d'équipes.</h1>", "stepe1");
+                die();
+            }
+
+            foreach ($equipes as $ke => $e) {
+                if (count($e) < $jeu_actuel->min_joueurs) {
+                    $ke = $ke + 1;
+                    self::error("<h1>Erreur : il n'y a pas assez de joueurs dans l'équipe $ke.</h1>", "stepe1");
+                    die();
+                }
+                if (!is_null($jeu_actuel->max_joueurs)) {
+                    if (count($e) > $jeu_actuel->max_joueurs) {
+                        $ke = $ke + 1;
+                        self::error("<h1>Erreur : il y a trop de joueurs dans l'équipe $ke.</h1>", "stepe1");
+                        die();
+                    }
+                }
+            }
+
+            header("Location:stepe2");
+            die();
+        }
+        else {
+            if (!isset($_SESSION['joueurs_select'])) {
+                header("Location:step1");
+                die();
+            }
+            $joueurs = $_SESSION['joueurs_select'];
+            if (count($joueurs) < $jeu_actuel->min_joueurs) {
+                self::error("<h1>Erreur : il n'y a pas assez de joueurs.</h1>", "step1");
+                die();
+            }
+            if (count($joueurs) > $jeu_actuel->max_joueurs) {
+                self::error("<h1>Erreur : il y a trop de joueurs.</h1>", "step1");
+                die();
+            }
+            header('Location:step2');
+            die();
+        }
+    }
+
+
+
+    public function displayModifPartieStep2()
+    {
+        session_start();
+        $id = $this->route["params"]["slug"];
+        if (!isset($_SESSION['jeu_select'])) {
+            header("Location:../add_partie");
+            die();
+        }
+        if (!isset($_SESSION['joueurs_select'])) {
+            header("Location:../add_partie/step1");
+            die();
+        }
+        if(isset($_SESSION['errMsg'])){
+            $this->view->errMsg = $_SESSION['errMsg'];
+            unset($_SESSION['errMsg']);
+        }
+
+
+        $this->view->jeuactuel = $_SESSION['jeu_select'];
+        $this->view->listejactuel = $_SESSION['joueurs_select'];
+        if($this->view->jeuactuel->type_scores == "scores") {
+            $this->view->scorePartie = Admin::getListeScorePartie($id);
+        } else {
+            $this->view->classement = Admin::getListeClassement($id);
+        }
+        $this->view->display();
+    }
+
+    public function displayModifPartieStepe2()
+    {
+        session_start();
+        $id = $this->route["params"]["slug"];
+        if (!isset($_SESSION['jeu_select'])) {
+            header("Location:../../../partie");
+			die();
+		}
+        if (!isset($_SESSION['equipes'])) {
+            header("Location:../initModif");
+			die();
+		}
+        if(isset($_SESSION['errMsg'])){
+            $this->view->errMsg = $_SESSION['errMsg'];
+            unset($_SESSION['errMsg']);
+        }
+
+        $this->view->jeuactuel = $_SESSION['jeu_select'];
+        $this->view->equipes = $_SESSION['equipes'];
+        if($this->view->jeuactuel->type_scores == "scores") {
+            $this->view->scorePartie = Admin::getListeScorePartie($id);
+        } else {
+            $this->view->classement = Admin::getListeClassement($id);
+        }
+        $this->view->display();
+    }
+
+    public function verifyModifPartieStep2()
+    {
+        $id = $this->route["params"]["slug"];
+        session_start();
+        if (!isset($_SESSION['jeu_select'])) {
+            self::error("<h1>Erreur : le jeu doit être renseigné.</h1>", "step0");
+            die();
+        }
+
+        $jeu = $_SESSION['jeu_select'];
+        if ($jeu->type == 'equipes') {
+            if (!isset($_SESSION['equipes'])){
+                header("Location:stepe1");
+                die();
+            }
+        }
+        else {
+            if (!isset($_SESSION['joueurs_select'])) {
+                header("Location:step1");
+                die();
+            }
+        }
+
+        if (!isset($_POST['scores'])) {
+            if ($jeu->type == 'equipes') {
+                self::error("<h1>Erreur : variables absentes</h1>", "stepe2");
+                die();
+            }
+            else {
+                self::error("<h1>Erreur : variables absentes</h1>", "step2");
+                die();
+            }
+        }
+
+        $scores = $_POST["scores"];
+        foreach ($scores as $s) {
+            if (!is_numeric($s)) {
+                if ($jeu->type == 'equipes') {
+                    self::error("<h1>Erreur : les scores doivent être des nombres.</h1>", "stepe2");
+                    die();
+                }
+                else {
+                    self::error("<h1>Erreur : les scores doivent être des nombres.</h1>", "step2");
+                    die();
+                }
+            }
+        }
+        if ($jeu->type == 'equipes') {
+            $equipes = $_SESSION['equipes'];
+            $ns = count($scores);
+            $nj = count($equipes);
+            if ($ns != $nj) {
+                self::error("<h1>Erreur : scores et joueurs incohérents</h1>", "stepe2");
+                die();
+            }
+            $pb = Admin::ModifPartie($id,$equipes, $scores, $jeu);
+            if (!$pb) {
+                unset($_SESSION['equipes']);
+                unset($_SESSION['jeu_select']);
+                header('Location:valid'); // Redirection vers la page OK
+                die();
+            }
+            switch ($pb) {
+                case 2:
+                    self::error("<h1>Erreur de connexion à la BD.</h1>", "stepe2");
+                    die();
+                    break;
+                default:
+                    self::error("<h1>Erreur non gérée.</h1>", "stepe2");
+                    die();
+                    break;
+            }
+        }
+        else {
+            $joueurs = $_SESSION['joueurs_select'];
+            $ns = count($scores);
+            $nj = count($joueurs);
+            if ($ns != $nj) {
+                self::error("<h1>Erreur : scores et joueurs incohérents</h1>", "step2");
+                die();
+            }
+            $pb = Admin::ModifPartie($id, $joueurs, $scores, $jeu);
+            if (!$pb) {
+                unset($_SESSION['jeu_select']);
+                unset($_SESSION['joueurs_select']);
+                //self::error("<h1>DEBUGGING</h1>", "step2");
+                //die();
+                header('Location:valid'); // Redirection vers la page OK
+                die();
+            }
+            switch ($pb) {
+                case 2:
+                    self::error("<h1>Erreur de connexion à la BD.</h1>", "step2");
+                    die();
+                    break;
+                default:
+                    self::error("<h1>Erreur non gérée.</h1>", "step2");
+                    die();
+                    break;
+            }
+        }
+    }
+    
+    public function supprPartie() {
+        $id = $this->route["params"]["slug"];
+        Admin::supprPartie($id);
+        header("Location:supprime/ok");
+    }
+    
+    public function displaysupprPartieOK() {
+        $this->view->display();
+    }
+
+}
diff --git a/app/controller/ClassementController.php b/app/controller/ClassementController.php
new file mode 100644
index 0000000000000000000000000000000000000000..91d88fb26752cb01339b1e91da86672db353acc0
--- /dev/null
+++ b/app/controller/ClassementController.php
@@ -0,0 +1,25 @@
+<?php
+
+class ClassementController extends Controller { // classe de contrôleur pour l'affichage des classements
+	public function display() {
+		$slug = $this->route["params"]["slug"]; // on récupère le "slug", en gros tout le reste de l'URL qui n'a pas encore servi
+		
+		//explode du slug pour savoir si on veut le classement par jeu ou global
+		$parts = explode("/", $slug); // on sépare la requête selon les /, et on regarde ce qu'on connait comme ordres dedans
+		if($parts[0] == "jeu") { // && count($parts) == 2) { // on veut consulter le classement d'un jeu
+			
+			header("Location:".BASE_URL."/jeu/".$parts[1]);
+			die();
+			//$this->view->lejeu = $parts[1];
+			//$this->view->classement = Classement::getFromSlug($parts[1]); // on utilise le modèle pour aller chercher en BDD le classement relatif au jeu qui nous intéresse
+		}
+		else { // if($parts[0] == "global") { // on veut consulter le classement d'un jeu (on en fait le cas général pour éviter les pages blanches)
+			$this->view->lejeu = "général";
+			$this->view->classement = Classement::getGlobal(); // on utilise le modèle pour aller chercher en BDD le classement relatif au jeu qui nous intéresse
+		}
+		
+		//  et classement/global pour le classement général
+		
+		$this->view->display(); // on affiche ce classement
+	}
+}
diff --git a/app/controller/ConnexionController.php b/app/controller/ConnexionController.php
new file mode 100644
index 0000000000000000000000000000000000000000..fc3c38ac2135ae9fadad7b520a480573ccd9324e
--- /dev/null
+++ b/app/controller/ConnexionController.php
@@ -0,0 +1,60 @@
+<?php
+
+class ConnexionController extends Controller { // classe de contrôleur pour la connexion au site
+	public function displayValid() { // la fonction d'affichage de réussite
+		$this->view->display(); // on affiche la page avec le message de réussites
+	}
+	
+	public function displayDisconnect() { // la fonction d'affichage de réussite
+		session_start();
+		unset($_SESSION['connected']);
+		unset($_SESSION['user']);
+		$this->view->display(); // on affiche la page avec le message de réussites
+	}
+	
+	public function displayForm() { // la fonction d'affichage de formulaire
+		session_start();
+		
+		if(isset($_SESSION['connexionErrCode'])) { // si message d'erreur
+			$errCode = $_SESSION['connexionErrCode'];
+			$errMsg = ($errCode == 0) ? '<h3>Identifiant inconnu !</h3>' : '<h3>Mauvais mot de passe !</h3>'; // on détermine le message à afficher
+			unset($_SESSION['connexionErrCode']); // on retire la variable de session
+            $this->view->errMsg = $errMsg;
+		}
+		$this->view->display();
+	}
+	
+	public function verify() { // vérifie que les identifiants sont valides par rapport à la BDD et réalise la connexion
+		// méthode avec un stockage de mdp hashé selon la fonction password_hash()
+		if(!isset($_POST['login']) || !isset($_POST['password'])) { // si l'une des données manque, erreur
+			//appeler une fonction d'erreur
+			echo "<h1>Erreur : variables absentes</h1>";
+			die();
+		}
+		
+		$pseudo = $_POST['login'];
+		$userpassword = $_POST['password']; //le mot de passe utilisateur
+		$bddpassword = Connexion::getPassword($pseudo); // le hash du mot de passe stocké en BDD
+		
+		if($bddpassword == null) { // l'utilisateur n'existe pas => code d'erreur 0
+			session_start(); // on démarre une session pour avoir accès aux variables superglobales de session
+			$_SESSION["connexionErrCode"] = 0; // on stocke le code d'erreur 
+			header('Location:../connexion'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne, ne me demandez pas pourquoi !)
+		}
+		else { // l'utilisateur existe
+			if(password_verify($userpassword, $bddpassword)) { // la connexion a réussi
+				session_start(); // on démarre la session pour pouvoir définir les variables adéquates
+				$_SESSION['connected'] = true;
+				$_SESSION['user'] = Connexion::getUser(self::slugify($pseudo));
+				header('Location:valid'); // on redirige vers la  page OK
+			}
+			else { // sinon, c'est que le mot de passe est faux
+				session_start(); // on démarre une session pour avoir accès aux variables superglobales de session
+				$_SESSION["connexionErrCode"] = 2; // on stocke le code d'erreur 
+				header('Location:../connexion'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne, ne me demandez pas pourquoi !)
+			}
+		}
+		
+	}
+	
+}
diff --git a/app/controller/ContactController.php b/app/controller/ContactController.php
new file mode 100644
index 0000000000000000000000000000000000000000..dd5afc72c1e0964444a000356395fa6e61ed286f
--- /dev/null
+++ b/app/controller/ContactController.php
@@ -0,0 +1,87 @@
+<?php
+class ContactController extends Controller { // classe de contrôleur pour l'inscription au site
+
+	public function displayValid() { // la fonction d'affichage du formulaire
+		$this->view->display();
+	}
+
+	public function displayForm() { // la fonction d'affichage du formulaire
+		session_start();
+		
+		if(isset($_SESSION['contactErrCode'])) { // si message d'erreur
+			$errCode = $_SESSION['contactErrCode'];
+			if($errCode == 2) { // on détermine le message
+				$errMsg = '<h3>Veuillez indiquer votre nom !</h3>';
+			} 
+			elseif($errCode == 3) { 
+				$errMsg = '<h3>Veuillez indiquer votre prénom !</h3>';
+			} 
+			elseif($errCode == 4) {
+				$errMsg = '<h3>Veuillez indiquer une adresse mail valide !</h3>';
+			}
+			elseif($errCode == 5) { 
+				$errMsg = '<h3>Veuillez indiquer votre message !</h3>';
+			} 
+            else{
+                $errMsg = "<h3>Exception non gérée.</h3>";
+            }
+			
+			unset($_SESSION['contactErrCode']); // on retire la variable de session
+			
+            $this->view->errMsg = $errMsg;
+		}
+		
+		$this->view->display();
+	}
+
+	public function send() { // vérifie les données de contact
+		if(!isset($_POST['nom']) || !isset($_POST['prenom']) || !isset($_POST['email']) || !isset($_POST['message'])) { // si l'une des données manque, erreur
+			//appeler une fonction d'erreur
+			echo "<h1>Erreur : variables absentes</h1>";
+			die();
+		}
+		$data = $_POST;
+		
+		if($data['nom'] == "") {
+			session_start(); // on démarre une session pour avoir accès aux variables superglobales de session
+			$_SESSION["contactErrCode"] = 2; // on stocke le code d'erreur
+			header('Location:../contact'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne)
+		}
+		if($data['prenom'] == "") {
+			session_start(); // on démarre une session pour avoir accès aux variables superglobales de session
+			$_SESSION["contactErrCode"] = 3; // on stocke le code d'erreur
+			header('Location:../contact'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne)
+		}
+		if(!preg_match("#^[a-z0-9._-]+(@|%40)[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $data['email'])) {
+			session_start(); // on démarre une session pour avoir accès aux variables superglobales de session
+			$_SESSION["contactErrCode"] = 4; // on stocke le code d'erreur
+			header('Location:../contact'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne)
+		}
+		if($data['message'] == null) {
+			session_start(); // on démarre une session pour avoir accès aux variables superglobales de session
+			$_SESSION["contactErrCode"] = 5; // on stocke le code d'erreur
+			header('Location:../contact'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne)
+		}
+		
+		$sender = $data['prenom'];
+		if($data['pseudo'] != "") $sender .= " '".$data['pseudo']."'";
+		$sender .= " ".$data['nom'];
+		
+		$header = "From: \"".$sender."\"<".$data['email'].">\n";
+		$header.= "Reply-to: \"".$sender."\"<".$data['email'].">\n";
+		$header.= "MIME-Version: 1.0\n";
+		
+		$success = mail(
+			"vbochet@gmail.com", // adresse email du destinataire
+			"Message envoyé via Classements Ludiques", // objet du mail
+			htmlspecialchars($data['message']), // message du mail
+			$header);// on réalise l'inscription à l'aide d'une méthode de la classe Register
+		if ($success == 1) {
+			header('Location:valid'); // on redirige vers la  page OK
+		} 
+		else {
+			echo "<h1>Erreur : l'envoi du mail a échoué</h1>";
+		}
+	}
+	
+}
diff --git a/app/controller/ErrorController.php b/app/controller/ErrorController.php
new file mode 100644
index 0000000000000000000000000000000000000000..8e4e9db2e043b2ba7c85656c069a26d70c4cbaca
--- /dev/null
+++ b/app/controller/ErrorController.php
@@ -0,0 +1,8 @@
+<?php
+
+class ErrorController extends Controller { // contrôleur pour la page d'index, qui hérite de la classe mère abstraite Controller
+	
+	public function error404() {
+		$this->view->display(); // et on appelle la méthode display() qui va afficher la page 
+	}
+}
diff --git a/app/controller/IndexController.php b/app/controller/IndexController.php
new file mode 100644
index 0000000000000000000000000000000000000000..b9d59a20defeed5495671f5392ca02558acafc1f
--- /dev/null
+++ b/app/controller/IndexController.php
@@ -0,0 +1,12 @@
+<?php
+
+class IndexController extends Controller { // contrôleur pour la page d'index, qui hérite de la classe mère abstraite Controller
+	
+	public function display() {
+		// là on peut faire un tas de trucs cool, genre déclarer et initialiser les variables d'affichage par exemple !
+		$this->view->last_member = Profil::getLastMember();
+		$this->view->nb_members = Profil::getNbMembers();
+		$this->view->most_played = Jeu::getMostPlayed();
+		$this->view->display(); // et on appelle la méthode display() qui va afficher la page 
+	}
+}
diff --git a/app/controller/JeuController.php b/app/controller/JeuController.php
new file mode 100644
index 0000000000000000000000000000000000000000..1b10c85ab47e37c35ce13c600c83f5c76b1d5031
--- /dev/null
+++ b/app/controller/JeuController.php
@@ -0,0 +1,216 @@
+<?php
+include(ROOT."/Image.php");
+
+class JeuController extends Controller {
+	public function display() {
+		$slug = $this->route["params"]["slug"]; //cf. le commentaire dans ProfilController.php
+		$this->view->classement = Classement::getFromSlug($slug);
+
+		if(in_array($slug, Jeu::getSlugList())) { // si le nom du jeu cherché est dans notre BDD, on peut l'afficher
+			$this->view->jeu = Jeu::getFromSlug($slug);
+			$this->view->display();
+		}
+		else {
+			header('Location:'.BASE_URL.'/404');
+		}
+	}
+
+	public function displayListe() {
+		$this->view->liste = Jeu::getList();
+		$this->view->display();
+	}
+
+	public function listeJson() {
+		$this->view->liste = Jeu::getList();
+		$this->view->display();
+	}
+
+	public function redirect() {
+		$slug = $this->route["params"]["slug"];
+		$slugjeu = self::slugify($slug);
+		header('Location:jeu/'.$slugjeu);
+	}
+
+	public function displayFormAdd() {
+        session_start();
+        
+        if(isset($_SESSION['addRequestErrCode'])) { // si message d'erreur
+            $errCode = $_SESSION['addRequestErrCode'];
+            if ($errCode == 1) { // on détermine le message
+                $errMsg = "<h3>Ce jeu est déjà dans la base !</h3>";
+            } elseif ($errCode == 2) {
+                $errMsg = "<h3>Image manquante</h3>";
+            } elseif ($errCode == 5) {
+                $errMsg = "<h3>Problème sur l'image</h3>";
+            } elseif ($errCode == 6) {
+                $errMsg = "<h3>Le fichier n'est pas une image</h3>";
+            } elseif ($errCode == 7) {
+                $errMsg = "<h3>L'image est trop grande</h3>";
+            } elseif ($errCode == 8) {
+                $errMsg = "<h3>Les valeurs pour les joueurs et/ou les équipes doivent être des nombres.</h3>";
+            } elseif ($errCode == 9) {
+                $errMsg = "<h3>Les valeurs pour les joueurs et/ou les équipes sont incohérentes.</h3>";
+            }
+			elseif ($errCode == 10) {
+				$errMsg = "<h3>Les joueurs/équipes max ne sont pas remplis.</h3><p><em>Si vous ne voulez pas les remplir, cochez la case infini, ou changez de type de jeu.</em></p>";
+			}
+            else{
+                $errMsg = "<h3>Exception non gérée.</h3>";
+            }
+            unset($_SESSION['addRequestErrCode']);
+            $this->view->errMsg = $errMsg;
+        }
+         
+		$this->view->display();
+	}
+
+	public function addRequest() {
+		session_start();
+		if(!isset($_POST['nom']) || !isset($_POST['description']) || !isset($_POST['type']) || !isset($_POST['type_scores'])
+		|| !isset($_POST['max_joueurs']) ||!isset($_POST['min_joueurs'])) { // si l'une des données manque, erreur
+			//appeler une fonction d'erreur
+			echo "<h1>Erreur : variables absentes</h1>";
+			die();
+		}
+
+        $data = $_POST;
+        $data['slug_jeu'] = self::slugify($_POST['nom']);
+
+        $result = Jeu::checkExists($data['slug_jeu']); // vérifie si le jeu n'est pas encore dans la BDD
+        $_POST['type_scores'] = self::slugify($_POST['type_scores']);
+        if($result == 0) { // connexion valide
+			if(isset($_FILES['image'])) {
+				list($err, $image) = getImage($_FILES['image'], 512, 512);
+				if ($err == 0) {
+					saveImage($image, ROOT."/www/images/jeu/".$data['slug_jeu'].".jpg");
+				} elseif($err == 1) {
+					$_SESSION["addRequestErrCode"] = 2; // on stocke le code d'erreur
+					header('Location:../addjeu'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne)
+					die();
+				} else {
+					$_SESSION["addRequestErrCode"] = $err; // on stocke le code d'erreur
+					header('Location:../addjeu'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne)
+					die();
+				}
+
+				if(!is_numeric($data['min_joueurs'])) {
+					$_SESSION["addRequestErrCode"] = 8; // on stocke le code d'erreur
+					header('Location:../addjeu'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne)
+					die();
+				}
+
+				if($data['min_joueurs'] < 0) {
+					$_SESSION["addRequestErrCode"] = 9; // on stocke le code d'erreur
+					header('Location:../addjeu'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne)
+					die();
+				}
+
+				if(!isset($data['max_joueurs_inf']) && ($data['max_joueurs'] < 0 || $data['max_joueurs'] < $data['min_joueurs'])) {
+                    if(!is_numeric($data['max_joueurs']))
+                        $_SESSION["addRequestErrCode"] = 10;
+                    else
+                        $_SESSION["addRequestErrCode"] = 9; // on stocke le code d'erreur
+					header('Location:../addjeu'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne)
+					die();
+				}
+
+				if($data['type'] == "Chacun pour soi"){
+                    $_POST['type'] = "duels";
+					if(isset($data['max_joueurs_inf']) && $data['max_joueurs_inf'])
+						Jeu::addRequest($data['nom'], $data['description'], $data['slug_jeu'], 0, $_POST['type'], $data['type_scores'], $data['min_joueurs']);// on ajoute le jeu à la BDD avec
+					else{
+						Jeu::addRequest($data['nom'], $data['description'], $data['slug_jeu'], 0, $_POST['type'], $data['type_scores'], $data['min_joueurs'], $data['max_joueurs']);// on ajoute le jeu à la BDD avec
+					}
+				header('Location:requestvalid'); // on redirige vers la  page OK
+				}
+				else if ($data['type'] == "Équipes"){
+                    $_POST['type'] = "equipes";
+					if(!isset($data['max_equipes']) || !isset($data['min_equipes'])) {
+						echo "<h1>Erreur : variables absentes</h1>";
+						die();
+					}
+					if(!is_numeric($data['min_equipes'])) {
+						$_SESSION["addRequestErrCode"] = 8; // on stocke le code d'erreur
+						header('Location:../addjeu'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne)
+						die();
+					}
+					if($data['min_equipes'] < 0) {
+						$_SESSION["addRequestErrCode"] = 9; // on stocke le code d'erreur
+						header('Location:../addjeu'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne)
+						die();
+					}
+					if(!isset($data['max_equipes_inf']) && ($data['max_equipes'] < 0 || $data['max_equipes'] < $data['min_equipes'])) {
+						if(!is_numeric($data['max_equipes']))
+							$_SESSION["addRequestErrCode"] = 10;
+						else
+							$_SESSION["addRequestErrCode"] = 9; // on stocke le code d'erreur
+						header('Location:../addjeu'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne)
+						die();
+					}
+                    if(isset($data['max_joueurs_inf']) && $data['max_joueurs_inf']){
+					if(isset($data['max_equipes_inf']) && $data['max_equipes_inf'])
+						Jeu::addRequest($data['nom'], $data['description'], $data['slug_jeu'], 0, $data['type'], $data['type_scores'], $data['min_joueurs'], null, $data['min_equipes']);// on ajoute le jeu à la BDD avec
+					else{
+						Jeu::addRequest($data['nom'], $data['description'], $data['slug_jeu'], 0, $data['type'], $data['type_scores'], $data['min_joueurs'], null, $data['min_equipes'], $data['max_equipes']);// on ajoute le jeu à la BDD avec
+					}
+                    }
+                    else{
+                        if(isset($data['max_equipes_inf']) && $data['max_equipes_inf'])
+                            Jeu::addRequest($data['nom'], $data['description'], $data['slug_jeu'], 0, $data['type'], $data['type_scores'], $data['min_joueurs'], $data['max_joueurs'], $data['min_equipes']);// on ajoute le jeu à la BDD avec
+                        else{
+                            Jeu::addRequest($data['nom'], $data['description'], $data['slug_jeu'], 0, $data['type'], $data['type_scores'], $data['min_joueurs'], $data['max_joueurs'],  $data['min_equipes'], $data['max_equipes']);// on ajoute le jeu à la BDD avec
+                        }
+                    }
+                    header('Location:requestvalid');
+				}
+			} else {
+				session_start(); // on démarre une session pour avoir accès aux variables superglobales de session
+				$_SESSION["addRequestErrCode"] = 2; // on stocke le code d'erreur
+				header('Location:../addjeu'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne)
+			}
+		}
+        else {
+            session_start(); // on démarre une session pour avoir accès aux variables superglobales de session
+            $_SESSION["addRequestErrCode"] = $result; // on stocke le code d'erreur
+            header('Location:../addjeu'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne)
+        }
+
+		//$this->view->display();
+	}
+
+    public function displayRequestValid() { // la fonction d'affichage de réussite
+        $this->view->display(); // on affiche la page avec le message de réussite
+    }
+
+    public function displayFavorisValid() { // la fonction d'affichage de réussite
+		session_start(); // on démarre une session pour avoir accès aux variables superglobales de session
+		$slug_jeu = $this->route["params"]["slug"];
+		if(!isset($_SESSION['connected'])) { // vérification que membre connecté
+			$this->view->msg_error = "Vous n'êtes pas connecté !";
+			$this->view->sous_msg = "Connectez-vous, puis revenez ajouter ce jeu. :)";
+			$this->view->display(); // on affiche la page avec le message d'erreur
+		}
+		else if(!(Jeu::checkExists($slug_jeu))) { // vérification que jeu existe
+			$this->view->msg_error = "Ce jeu n'existe pas !";
+			$this->view->sous_msg = "Vous pouvez peut-être demander son ajout via le formulaire de demande d'ajout de jeu. :)";
+			$this->view->display(); // on affiche la page avec le message d'erreur
+		}
+		else if(Profil::checkJeuFavoris($_SESSION['user']->slug, $slug_jeu)) { // si jeu déjà dans favoris => on le retire
+			Profil::upadteJeuFavoris($_SESSION['user']->slug, $slug_jeu, 0);
+			$this->view->msg_success = "Ce jeu a été retiré de vos favoris !";
+			$this->view->sous_msg = "Il en faut pour tous les goûts ! :)";
+			$this->view->display(); // on affiche la page avec le message de réussite
+		}
+		else { // sinon, on le met en favoris
+			if(Profil::checkADejaJoue($_SESSION['user']->slug, $slug_jeu)) { // si une ligne joueur-jeu existe déjà => UPDATE
+				Profil::upadteJeuFavoris($_SESSION['user']->slug, $slug_jeu, 1);
+			}
+			else { // sinon => INSERT avec des null pour le classement et le score
+				Profil::insertJeuFavoris($_SESSION['user']->slug, $slug_jeu, 1);
+			}
+			$this->view->msg_success = "Ce jeu a été ajouté à vos favoris !";
+			$this->view->sous_msg = ":)";
+			$this->view->display(); // on affiche la page avec le message de réussite
+		}
+    }
+}
diff --git a/app/controller/PartieController.php b/app/controller/PartieController.php
new file mode 100644
index 0000000000000000000000000000000000000000..b278b3f4607e38927489e861c7ed42a35982875b
--- /dev/null
+++ b/app/controller/PartieController.php
@@ -0,0 +1,550 @@
+<?php
+
+/**
+ * Created by PhpStorm.
+ * User: phoenix
+ * Date: 25/04/16
+ * Time: 15:27
+ */
+class PartieController extends Controller
+{
+    public function displayStep0()
+    {
+		session_start();
+        if(isset($_SESSION['errMsg'])){
+            $this->view->errMsg = $_SESSION['errMsg'];
+            unset($_SESSION['errMsg']);
+        }
+
+        $this->view->liste = Jeu::getList();
+        $this->view->display();
+    }
+
+    public function displayStep1()
+    {
+        session_start();
+        if (!isset($_SESSION['jeu_select'])) {
+            header("Location:../add_partie");
+			die();
+		}
+        if(isset($_SESSION['errMsg'])){
+            $this->view->errMsg = $_SESSION['errMsg'];
+            unset($_SESSION['errMsg']);
+        }
+
+        if ($_SESSION['jeu_select']->max_joueurs === "")
+            $this->view->max = "plus";
+        else
+            $this->view->max = $_SESSION['jeu_select']->max_joueurs;
+        
+        $this->view->jeuactuel = $_SESSION['jeu_select'];
+        $this->view->listej = Profil::getList();
+        $this->view->display();
+    }
+
+    public function displayStep2()
+    {
+        session_start();
+        if (!isset($_SESSION['jeu_select'])) {
+            header("Location:../add_partie");
+			die();
+		}
+        if (!isset($_SESSION['joueurs_select'])) {
+            header("Location:../add_partie/step1");
+			die();
+		}
+        if(isset($_SESSION['errMsg'])){
+            $this->view->errMsg = $_SESSION['errMsg'];
+            unset($_SESSION['errMsg']);
+        }
+
+
+        $this->view->jeuactuel = $_SESSION['jeu_select'];
+        $this->view->listejactuel = $_SESSION['joueurs_select'];
+        $this->view->display();
+    }
+
+    public function displayStepe1()
+    {
+        session_start();
+        if (!isset($_SESSION['jeu_select']) || !isset($_SESSION['equipes'])) {
+            header("Location:../add_partie");
+			die();
+		}
+        if(isset($_SESSION['errMsg'])){
+            $this->view->errMsg = $_SESSION['errMsg'];
+            unset($_SESSION['errMsg']);
+        }
+        if (is_null($_SESSION['jeu_select']->max_joueurs)) {
+            $this->view->maxj = "plus de";
+        }
+        else {
+            $this->view->maxj = $_SESSION['jeu_select']->max_joueurs;
+        }
+        if (is_null($_SESSION['jeu_select']->max_equipes)) {
+            $this->view->maxe = "plus d'";
+        }
+        else{
+            $this->view->maxe = $_SESSION['jeu_select']->max_equipes." ";
+        }
+        $this->view->jeuactuel = $_SESSION['jeu_select'];
+        $this->view->listej = Profil::getList();
+        $this->view->equipes = $_SESSION['equipes'];
+        $this->view->display();
+    }
+
+    public function displayStepe2()
+    {
+        session_start();
+        if (!isset($_SESSION['jeu_select'])) {
+            header("Location:../add_partie");
+			die();
+		}
+        if (!isset($_SESSION['equipes'])) {
+            header("Location:../add_partie/stepe1");
+			die();
+		}
+        if(isset($_SESSION['errMsg'])){
+            $this->view->errMsg = $_SESSION['errMsg'];
+            unset($_SESSION['errMsg']);
+        }
+
+        $this->view->jeuactuel = $_SESSION['jeu_select'];
+        $this->view->equipes = $_SESSION['equipes'];
+        $this->view->display();
+    }
+
+    public function displayValid()
+    {
+        $this->view->display();
+    }
+
+    private static function error($errstr, $step){
+        session_start();
+        $_SESSION['errMsg'] = $errstr;
+        if($step == "step0") {
+            header("Location:../add_partie");
+			die();
+        }
+        else if($step == "step1") {
+            header("Location:step1");
+			die();
+        }
+        else if($step == "step2") {
+            header("Location:step2");
+			die();
+        }
+        else if($step == "stepe1") {
+            header("Location:stepe1");
+			die();
+        }
+        else if($step == "stepe2") {
+            header("Location:stepe2");
+			die();
+        }
+        else {
+            header("Location:../add_partie");
+			die();
+        }
+    }
+
+    public static function verifyStep0()
+    {
+
+        if (!isset($_POST['jeu'])) {
+            //appeler une fonction d'erreur
+            self::error("<h1>Erreur : variables absentes</h1>", "step0");
+			die();
+        }
+        $jeu = $_POST['jeu'];
+
+        if (!Jeu::checkExistsNom($jeu)) {
+            self::error("<h1>Erreur : le jeu entré est introuvable dans la BD.</h1>", "step0");
+			die();
+        }
+
+        $jeu = Jeu::getFromNom($jeu);
+        session_start();
+        $_SESSION['jeu_select'] = $jeu;
+        if ($jeu->type == 'equipes') {
+            $_SESSION['equipes'] = array(array());
+            header('Location:stepe1');
+			die();
+        } 
+		else {
+            header('Location:step1');
+			die();
+		}
+    }
+
+    public static function addjoueurs1()
+    {
+        session_start();
+        if (!isset($_SESSION['jeu_select'])) {
+            header("Location:../add_partie");
+			die();
+		}
+
+        $jeu = $_SESSION['jeu_select'];
+
+        if (!isset($_POST["joueur"])) {
+            if ($jeu->type == 'equipes') {
+                self::error("<h1>Erreur : pas de joueur entré.</h1>", "stepe1");
+				die();
+			}
+            else {
+				self::error("<h1>Erreur : pas de joueur entré.</h1>", "step1");
+				die();
+			}
+        }
+
+        $joueur = $_POST["joueur"];
+
+        if (Profil::checkExists($joueur)) {
+            $joueur_objet = Profil::getFromSlug($joueur);
+        } 
+		else {
+            if ($jeu->type == 'equipes') {
+                self::error("<h1>Erreur : le joueur est introuvable dans la base de données.</h1>", "stepe1");
+				die();
+            }
+			else {
+                self::error("<h1>Erreur : le joueur est introuvable dans la base de données.</h1>", "step1");
+				die();
+            }
+        }
+
+        if ($jeu->type == 'equipes') {
+            $ke = $_POST['equipejadd'];
+            foreach ($_SESSION['equipes'] as $equipe) {
+                if (in_array($joueur_objet, $equipe)) {
+                    self::error("<h1>Erreur : le joueur a déjà été inscrit pour cette partie.</h1>", "stepe1");
+					die();
+                }
+            }
+            if (count($_SESSION['equipes'][$ke]) == $_SESSION['jeu_select']->max_joueurs) {
+                self::error("<h1>Erreur : vous ne pouvez pas ajouter de joueurs supplémentaires.</h1>", "stepe1");
+                die();
+            }
+            array_push($_SESSION['equipes'][$ke], $joueur_objet);
+            header("Location:stepe1");
+			die();
+        } 
+		else {
+            if (!isset($_SESSION['joueurs_select'])) {
+                $_SESSION['joueurs_select'] = array($joueur_objet);
+                header("Location:step1");
+				die();
+            }
+
+            if (!in_array($joueur_objet, $_SESSION['joueurs_select'])){
+                if (count($_SESSION['joueurs_select']) == $_SESSION['jeu_select']->max_joueurs) {
+                    self::error("<h1>Erreur : vous ne pouvez pas ajouter de joueurs supplémentaires.</h1>", "step1");
+                    die();
+                }
+                array_push($_SESSION['joueurs_select'], $joueur_objet);
+            }
+            else {
+                self::error("<h1>Erreur : le joueur a déjà été inscrit pour cette partie.</h1>", "step1");
+				die();
+            }
+            header("Location:step1");
+			die();
+        }
+    }
+
+    public static function clearstep1()
+    {
+        session_start();
+        if (!isset($_SESSION['jeu_select'])) {
+            header("Location:../add_partie");
+			die();
+		}
+        $jeu_actuel = $_SESSION['jeu_select'];
+        if ($jeu_actuel->type == 'equipes') {
+            if (!isset($_SESSION['equipes'])) {
+                header("Location:stepe1");
+				die();
+			}
+            $_SESSION['equipes'] = array(array());
+            header("Location:stepe1");
+			die();
+        } 
+		else {
+            if (!isset($_SESSION['joueurs_select'])) {
+                header("Location:step1");
+				die();
+			}
+            unset($_SESSION['joueurs_select']);
+            header("Location:step1");
+			die();
+        }
+    }
+
+    public static function deljoueurs1()
+    {
+        session_start();
+        if (!isset($_SESSION['jeu_select'])) {
+            header("Location:../add_partie");
+			die();
+		}
+
+        if ($_SESSION['jeu_select']->type == 'duels') {
+            if (!isset($_SESSION['joueurs_select'])) {
+                header("Location:step1");
+				die();
+			}
+        }
+        if ($_SESSION['jeu_select']->type == 'equipes') {
+            if (!isset($_SESSION['equipes'])) {
+                header("Location:stepe1");
+				die();
+			}
+        }
+
+        if (!isset($_POST['joueurdel'])) {
+            if ($_SESSION['jeu_select']->type == 'equipes') {
+				self::error("<h1>Erreur : variables manquantes.</h1>", "stepe1");
+				die();
+            }
+			else {
+                self::error("<h1>Erreur : variables manquantes.</h1>", "step1");
+				die();
+			}
+        }
+
+        if ($_SESSION['jeu_select']->type == 'equipes') {
+            unset($_SESSION['equipes'][$_POST['equipejdel']][$_POST['joueurdel']]);
+            $equipe_tmp = array();
+            foreach ($_SESSION['equipes'][$_POST['equipejdel']] as $j) {
+                array_push($equipe_tmp, $j);
+			}
+            $_SESSION['equipes'][$_POST['equipejdel']] = $equipe_tmp;
+            header("Location:stepe1");
+			die();
+        } 
+		else {
+            unset($_SESSION['joueurs_select'][$_POST['joueurdel']]);
+            $joueurs_tmp = array();
+            foreach ($_SESSION['joueurs_select'] as $j) {
+                array_push($joueurs_tmp, $j);
+			}
+            $_SESSION['joueurs_select'] = $joueurs_tmp;
+            header("Location:step1");
+			die();
+        }
+    }
+
+    public static function delequipe()
+    {
+        session_start();
+        if (!isset($_SESSION['jeu_select'])) {
+            header("Location:../add_partie");
+			die();
+		}
+        if (!isset($_SESSION['equipes'])) {
+            header("Location:stepe1");
+			die();
+		}
+        if (count($_SESSION['equipes']) <= 1) {
+            self::error("<h1>Erreur : vous ne pouvez pas supprimer la seule équipe restante.</h1>", "stepe1");
+			die();
+        }
+
+        if (!isset($_POST['equipe'])) {
+            self::error("<h1>Erreur : variables manquantes.</h1>", "stepe1");
+			die();
+        }
+
+        unset($_SESSION['equipes'][$_POST['equipe']]);
+        $equipe_tmp = array();
+        foreach ($_SESSION['equipes'] as $e) {
+            array_push($equipe_tmp, $e);
+		}
+        $_SESSION['equipes'] = $equipe_tmp;
+        header("Location:stepe1");
+		die();
+    }
+
+    public static function addequipe()
+    {
+        session_start();
+        if (!isset($_SESSION['jeu_select'])) {
+            header("Location:../add_partie");
+			die();
+		}
+        if (count($_SESSION['equipes']) == $_SESSION['jeu_select']->max_equipes) {
+            self::error("<h1>Erreur : vous ne pouvez pas créer d'équipe supplémentaire.</h1>", "stepe1");
+			die();
+        }
+
+        array_push($_SESSION['equipes'], array());
+        header("Location:stepe1");
+		die();
+    }
+
+    public static function verifyStep1()
+    {
+        session_start();
+        if (!isset($_SESSION['jeu_select'])) {
+            header("Location:../add_partie");
+			die();
+		}
+        $jeu_actuel = $_SESSION['jeu_select'];
+        if ($jeu_actuel->type == 'equipes') {
+            if (!isset($_SESSION['equipes'])) {
+                header("Location:stepe1");
+				die();
+			}
+            $equipes = $_SESSION['equipes'];
+            if (count($equipes) < $jeu_actuel->min_equipes) {
+                self::error("<h1>Erreur : il n'y a pas assez d'équipes.</h1>", "stepe1");
+				die();
+            }
+            if (count($equipes) > $jeu_actuel->max_equipes) {
+                self::error("<h1>Erreur : il y a trop d'équipes.</h1>", "stepe1");
+				die();
+            }
+
+            foreach ($equipes as $ke => $e) {
+                if (count($e) < $jeu_actuel->min_joueurs) {
+                    $ke = $ke + 1;
+                    self::error("<h1>Erreur : il n'y a pas assez de joueurs dans l'équipe $ke.</h1>", "stepe1");
+					die();
+                }
+                if (!is_null($jeu_actuel->max_joueurs)) {
+                    if (count($e) > $jeu_actuel->max_joueurs) {
+                        $ke = $ke + 1;
+                        self::error("<h1>Erreur : il y a trop de joueurs dans l'équipe $ke.</h1>", "stepe1");
+						die();
+                    }
+                }
+            }
+
+            header("Location:stepe2");
+			die();
+        }
+		else {
+            if (!isset($_SESSION['joueurs_select'])) {
+                header("Location:step1");
+				die();
+			}
+            $joueurs = $_SESSION['joueurs_select'];
+            if (count($joueurs) < $jeu_actuel->min_joueurs) {
+                self::error("<h1>Erreur : il n'y a pas assez de joueurs.</h1>", "step1");
+				die();
+            }
+            if (count($joueurs) > $jeu_actuel->max_joueurs) {
+                self::error("<h1>Erreur : il y a trop de joueurs.</h1>", "step1");
+				die();
+            }
+            header('Location:step2');
+			die();
+        }
+    }
+
+
+    public function verifyStep2()
+    {
+        session_start();
+        if (!isset($_SESSION['jeu_select'])) {
+            self::error("<h1>Erreur : le jeu doit être renseigné.</h1>", "step0");
+			die();
+		}
+
+        $jeu = $_SESSION['jeu_select'];
+        if ($jeu->type == 'equipes') {
+            if (!isset($_SESSION['equipes'])){
+                header("Location:stepe1");
+				die();
+            }
+        }
+		else {
+            if (!isset($_SESSION['joueurs_select'])) {
+                header("Location:step1");
+				die();
+			}
+        }
+
+        if (!isset($_POST['scores'])) {
+            if ($jeu->type == 'equipes') {
+                self::error("<h1>Erreur : variables absentes</h1>", "stepe2");
+				die();
+			}
+            else {
+                self::error("<h1>Erreur : variables absentes</h1>", "step2");
+				die();
+			}
+        }
+
+
+        $scores = $_POST["scores"];
+        foreach ($scores as $s) {
+            if (!is_numeric($s)) {
+                if ($jeu->type == 'equipes') {
+                    self::error("<h1>Erreur : les scores doivent être des nombres.</h1>", "stepe2");
+					die();
+				}
+                else {
+                    self::error("<h1>Erreur : les scores doivent être des nombres.</h1>", "step2");
+					die();
+				}
+            }
+        }
+        if ($jeu->type == 'equipes') {
+            $equipes = $_SESSION['equipes'];
+            $ns = count($scores);
+            $nj = count($equipes);
+            if ($ns != $nj) {
+                self::error("<h1>Erreur : scores et joueurs incohérents</h1>", "stepe2");
+				die();
+            }
+
+            $pb = Partie::addPartie($equipes, $scores, $jeu);
+            if (!$pb) {
+                unset($_SESSION['equipes']);
+                unset($_SESSION['jeu_select']);
+                header('Location:valid'); // Redirection vers la page OK
+				die();
+            }
+            switch ($pb) {
+                case 2:
+                    self::error("<h1>Erreur de connexion à la BD.</h1>", "stepe2");
+					die();
+                    break;
+                default:
+                    self::error("<h1>Erreur non gérée.</h1>", "stepe2");
+					die();
+                    break;
+            }
+        } 
+		else {
+            $joueurs = $_SESSION['joueurs_select'];
+            $ns = count($scores);
+            $nj = count($joueurs);
+            if ($ns != $nj) {
+                self::error("<h1>Erreur : scores et joueurs incohérents</h1>", "step2");
+				die();
+            }
+            $pb = Partie::addPartie($joueurs, $scores, $jeu);
+            if (!$pb) {
+                unset($_SESSION['jeu_select']);
+                unset($_SESSION['joueurs_select']);
+                //self::error("<h1>DEBUGGING</h1>", "step2");
+				//die();
+                header('Location:valid'); // Redirection vers la page OK
+				die();
+            }
+            switch ($pb) {
+                case 2:
+                    self::error("<h1>Erreur de connexion à la BD.</h1>", "step2");
+					die();
+                    break;
+                default:
+                    self::error("<h1>Erreur non gérée.</h1>", "step2");
+					die();
+                    break;
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/controller/ProfilController.php b/app/controller/ProfilController.php
new file mode 100644
index 0000000000000000000000000000000000000000..4208b9d0deb63cec2e507ae29c95acde47d98c30
--- /dev/null
+++ b/app/controller/ProfilController.php
@@ -0,0 +1,110 @@
+<?php
+include(ROOT."/Image.php");
+
+class ProfilController extends Controller { // classe de contrôleur pour l'affichage des profils
+	public function display() {
+		$slug = $this->route["params"]["slug"]; // on récupère le "slug", en gros tout le reste de l'URL qui n'a pas encore servi
+		// je précise que dans ce cas précis, le $slug ne contient que le pseudo du joueur sosu forme normalisée. Donc je pourrais renommer la variable $slug_joueur...
+		$this->view->profil = Profil::getFromSlug($slug); // on utilise le modèle pour aller chercher en BDD le profil qui nous intéresse
+	 	$this->view->profil->avatar = $this->view->profil->avatar ? BASE_URL."/images/avatar/".$this->view->profil->slug.".jpg": BASE_URL."/images/profil_42.jpg";
+		list($i, $o, $p) = Classement::getClassementJoueur($slug);
+		$this->view->classement_top = $i;
+		$this->view->classement_down = $o;
+		$this->view->jeu_favori = $p;
+		$this->view->display(); // on affiche ce profil
+	}
+
+	public function displayEdit() {
+		$slug = $this->route["params"]["slug"]; // on récupère le "slug", en gros tout le reste de l'URL qui n'a pas encore servi
+		// je précise que dans ce cas précis, le $slug ne contient que le pseudo du joueur sosu forme normalisée. Donc je pourrais renommer la variable $slug_joueur...
+		$this->view->profil = Profil::getFromSlug($slug); // on utilise le modèle pour aller chercher en BDD le profil qui nous intéresse
+		
+		session_start();
+		
+		
+		if(isset($_SESSION['registerErrCode'])) { // si message d'erreur
+			$errCode = $_SESSION['registerErrCode'];
+			if($errCode == 2) { // on détermine le message
+				$errMsg = '<h3>Pseudo déjà utilisé !</h3>';
+			} 
+			elseif($errCode == 3) {
+				$errMsg = '<h3>Adresse e-mail déjà utilisée !</h3>';
+			} 
+			elseif($errCode == 4) {
+				$errMsg = '<h3>Mots de passe différents</h3>';
+			} 
+			elseif($errCode == 5) {
+				$errMsg = '<h3>Problème sur l\'avatar</h3>';
+			} 
+			elseif($errCode == 6) {
+				$errMsg = '<h3>Le fichier n\'est pas une image</h3>';
+			} 
+			elseif($errCode == 7) {
+				$errMsg = '<h3>L\'image est trop grande</h3>';
+			}
+            else{
+                $errMsg = "<h3>Exception non gérée.</h3>";
+            }
+			
+			unset($_SESSION['registerErrCode']); // on retire la variable de session
+			
+            $this->view->errMsg = $errMsg;
+		}
+		
+		$this->view->display(); // on affiche ce profil
+	}
+
+	public function displayValid() {
+		$slug = $this->route["params"]["slug"]; // on récupère le "slug", en gros tout le reste de l'URL qui n'a pas encore servi
+		// je précise que dans ce cas précis, le $slug ne contient que le pseudo du joueur sosu forme normalisée. Donc je pourrais renommer la variable $slug_joueur...
+		$this->view->profil = Profil::getFromSlug($slug); // on utilise le modèle pour aller chercher en BDD le profil qui nous intéresse
+		$this->view->display(); // on affiche ce profil
+	}
+	
+	public function verifyEdit() {
+		if (!isset($_POST['nom']) || !isset($_POST['prenom']) || !isset($_POST['email'])) { // si l'une des données manque, erreur
+			echo "<h1>Erreur : variables absentes</h1>";
+			die();
+		}
+		$slug = $this->route["params"]["slug"];
+		$profil = Profil::getFromSlug($slug);
+		if (isset($_POST['password']) && isset($_POST['password_bis']) && $_POST['password'] != "") {
+			if ($_POST['password'] == $_POST['password_bis']) {
+				$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
+				Profil::setPassword($slug, $password);
+			} else {
+				session_start(); // on démarre une session pour avoir accès aux variables superglobales de session
+				$_SESSION["registerErrCode"] = 4; // on stocke le code d'erreur
+				header('Location:../edit'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne)
+				die();
+			}
+		}
+		$data = $_POST;
+		if(!isset($data['avatar_suppr'])) {
+			if(isset($_FILES['avatar'])) {
+				list($err, $avatar) = getImage($_FILES['avatar'], 512, 512);
+				if ($err == 0) {
+					unlink(ROOT . "/www/images/avatar/" . $slug . ".jpg");
+					saveImage($avatar, ROOT . "/www/images/avatar/" . $slug . ".jpg");
+					$data['avatar'] = 1;
+				} elseif ($err == 1) {
+					$data['avatar'] = $profil->avatar;
+				} else {
+					session_start(); // on démarre une session pour avoir accès aux variables superglobales de session
+					$_SESSION["registerErrCode"] = $err; // on stocke le code d'erreur
+					header('Location:../edit'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne)
+					die();
+				}
+			} else {
+				$data['avatar'] = $profil->avatar;
+			}
+		} else {
+			unlink(ROOT."/www/images/avatar/".$slug.".jpg");
+			$data['avatar'] = 0;
+		}
+		Profil::setAutre($slug, $data);
+		session_start();
+		$_SESSION['user'] = Connexion::getUser($slug);
+		header('Location:valid');
+	}
+}
diff --git a/app/controller/RegisterController.php b/app/controller/RegisterController.php
new file mode 100644
index 0000000000000000000000000000000000000000..3674d8156047c8a8fa3a52c937f12fc55bcebb6b
--- /dev/null
+++ b/app/controller/RegisterController.php
@@ -0,0 +1,169 @@
+<?php
+include(ROOT."/Image.php");
+class RegisterController extends Controller { // classe de contrôleur pour l'inscription au site
+
+	public function displayValid() { // la fonction d'affichage de réussite
+		$this->view->display(); // on affiche la page avec le message de réussite
+	}
+	
+	public function displayForm() { // la fonction d'affichage du formulaire
+		session_start();
+		
+		if(isset($_SESSION['registerErrCode'])) { // si message d'erreur
+			$errCode = $_SESSION['registerErrCode'];
+			if($errCode == 2) { // on détermine le message
+				$errMsg = '<h3>Pseudo déjà utilisé !</h3>';
+			} 
+			elseif($errCode == 3) {
+				$errMsg = '<h3>Adresse e-mail déjà utilisée !</h3>';
+			} 
+			elseif($errCode == 4) {
+				$errMsg = '<h3>Mots de passe différents</h3>';
+			} 
+			elseif($errCode == 5) {
+				$errMsg = '<h3>Problème sur l\'avatar</h3>';
+			} 
+			elseif($errCode == 6) {
+				$errMsg = '<h3>Le fichier n\'est pas une image</h3>';
+			} 
+			elseif($errCode == 7) {
+				$errMsg = '<h3>L\'image est trop grande</h3>';
+			}
+            else{
+                $errMsg = "<h3>Exception non gérée.</h3>";
+            }
+			
+			unset($_SESSION['registerErrCode']); // on retire la variable de session
+			
+            $this->view->errMsg = $errMsg;
+		}
+		$this->view->display();
+	}
+
+	public function verify() { // vérifie si les données envoyées sont valides
+		if(!isset($_POST['method']) || !isset($_POST['value'])) { // si l'une des données manque, erreur
+			//appeler une fonction d'erreur
+			echo "<h1>Erreur : données absentes</h1>";
+			die();
+		}
+		
+		$method = $_POST['method'];
+		$value = $_POST['value'];
+		
+		$passed = false;
+		$retval = '';
+		switch($method) {
+			case 'checkPseudo':
+				// vérifie que le pseudo est libre
+				$slug_joueur = self::slugify($value);
+				if(Register::checkPseudo($slug_joueur)) {
+					$passed = true;
+					$retval = "Pseudo valide";
+				}
+				else {
+					$passed = false;
+					$retval = "Déjà utilisé";
+				}
+				break;
+			
+			case 'checkPassword':
+				//if(preg_match("#^[a-z0-9._-]+(@|%40)[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $value)) {
+					$passed = true;
+					$retval = "Mdp valide";
+				//}
+				//else {
+				//	$passed = false;
+				//	$retval = "Mdp invalide";
+				//}
+				break;
+			
+			case 'checkPasswordBis':
+				$mdp = explode("¤", $value);
+				if($mdp[0]==$mdp[1]) {
+					$passed = true;
+					$retval = "Mdp valide";
+				}
+				else {
+					$passed = false;
+					$retval = "Mdp différents";
+				}
+				break;
+				
+			case 'checkEmail':
+				if(preg_match("#^[a-z0-9._-]+(@|%40)[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $value)) {
+					// deuxième test : le mail est il déjà utilisé ?
+					//$value = str_replace("%40", "@", $value); // on corrige le "%40" en "@" pour vérifier l'existence
+					if(Register::checkEmail($value)) {
+						$passed = true;
+						$retval = "E-mail valide";
+					}
+					else {
+						$passed = false;
+						$retval = "Déjà utilisé";
+					}
+				}
+				else {
+					$passed = false;
+					$retval = "Format invalide";
+				}
+				break;
+		
+			default: exit;
+		}
+		
+		if($passed) {
+			// set the message colour to green and the checkbox to checked
+			echo '{"success":true, "text":"'.$retval.'", "color":"green"}';
+		
+		} 
+		else {
+			// set the message colour to red, the checkbox to unchecked and focus back on the field
+			echo '{"success":false, "text":"'.$retval.'", "color":"red"}';
+		}
+	}
+	
+	public function save() { // vérifie les données d'inscription, et enregistre les infos dans la BDD
+		if(!isset($_POST['pseudo']) || !isset($_POST['password']) || !isset($_POST['password_bis']) || !isset($_POST['nom']) || !isset($_POST['prenom']) || !isset($_POST['email'])) { // si l'une des données manque, erreur
+			//appeler une fonction d'erreur
+			echo "<h1>Erreur : variables absentes</h1>";
+			die();
+		}
+		$data = $_POST;
+
+		if($data['password'] == $data['password_bis']) {
+			$data['password'] = password_hash($data['password'], PASSWORD_DEFAULT);
+			$data['slug_joueur'] = self::slugify($_POST['pseudo']);
+			$data['avatar'] = 0;
+			$result = Register::check($data['slug_joueur'], $_POST['email']); // vérifie si le pseudo est libre et que l'adresse email n'est pas déjà utilisée
+			if ($result == 1) { // connexion valide
+				if(isset($_FILES['avatar'])) {
+					list($err, $avatar) = getImage($_FILES['avatar'], 512, 512);
+					if ($err == 0) {
+						saveImage($avatar, ROOT."/www/images/avatar/".$data['slug_joueur'].".jpg");
+						$data['avatar'] = 1;
+					} elseif ($err != 1) {
+						session_start(); // on démarre une session pour avoir accès aux variables superglobales de session
+						$_SESSION["registerErrCode"] = $err; // on stocke le code d'erreur
+						header('Location:../inscription'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne)
+						die();
+					}
+				}
+				$success = Register::writedb($data);// on réalise l'inscription à l'aide d'une méthode de la classe Register
+				if ($success == 1) {
+					header('Location:valid'); // on redirige vers la  page OK
+				} else {
+					echo "<h1>Erreur : l'inscription a échoué</h1>";
+				}
+			} else {
+				session_start(); // on démarre une session pour avoir accès aux variables superglobales de session
+				$_SESSION["registerErrCode"] = $result; // on stocke le code d'erreur
+				header('Location:../inscription'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne)
+			}
+		} else {
+				session_start(); // on démarre une session pour avoir accès aux variables superglobales de session
+				$_SESSION["registerErrCode"] = 4; // on stocke le code d'erreur
+				header('Location:../inscription'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne)
+		}
+	}
+	
+}
diff --git a/app/kernel/Controller.php b/app/kernel/Controller.php
new file mode 100644
index 0000000000000000000000000000000000000000..8652a281216ce502dbcd1d9b2e11b6988cdd73e9
--- /dev/null
+++ b/app/kernel/Controller.php
@@ -0,0 +1,26 @@
+<?php
+
+class Controller { // classe abstraite de contrôleur
+	protected $route; // variable protégée contenant le résultat de l'analyse de la requête (dans un tableau)
+	protected $view; // variable protégée contenant la vue correspondant à la route donnée
+	
+	public function __construct($route) { // constructeur
+		$this->route = $route; // on stocke la route donnée en paramètre dans la variable protégée du même nom
+		$this->view = new View($route); // on instancie une vue avec cette route, et on la stocke dans la variable protégée $view
+	}
+
+	static public function slugify($text) { // fonction permettant de transformer une chaîne de caractères en slug
+		$text = preg_replace('~[^\pL\d]+~u', '-', $text); // on remplace les caractères qui ne sont pas des lettres ou des chiffres par "-"
+		$text = iconv('utf-8', 'us-ascii//TRANSLIT', $text); // on transforme la chaîne pour en retirer les accents
+		$text = preg_replace('~[^-\w]+~', '', $text); // on retire les caract-res non désirés (ie les accents seuls)
+		$text = trim($text, '-'); // on retire les caractères inutiles en début et fin de chaîne (ie les "-")
+		$text = preg_replace('~-+~', '-', $text); // on retire les "-" successifs
+		$text = strtolower($text); // on met la chaîne en caractères minuscules
+
+		if (empty($text)) { // si le texte est vide, on retourne par défaut le texte "n-a"
+			return 'n-a';
+		}
+
+		return $text;
+	}
+}
diff --git a/app/kernel/Database.php b/app/kernel/Database.php
new file mode 100644
index 0000000000000000000000000000000000000000..28da317eac6521e0abaf116506c455281d6fdf54
--- /dev/null
+++ b/app/kernel/Database.php
@@ -0,0 +1,27 @@
+<?php
+
+class Database { // classe de gestion de connexion à la BDD
+	static protected $_instance = null; // variable contenant l'instance de connexion à la BDD, null par défaut
+	protected $_db; // variable contenant la connexion PDO à la BDD
+	
+	static public function getInstance() { // renvoie un instance de connexion à la BDD
+		if(is_null(self::$_instance)) { // si on n'a pas encore réalisé de connexion
+			self::$_instance = new Database(); // on réalise la connexion en instanciant la classe Database
+		}
+		return self::$_instance; // on renvoie l'instance qui contient tout ce qu'il faut
+	}
+	
+	protected function __construct() { // constructeur, qui instancie PDO pour se connecter à la BDD et qui stocke cette connexion dans l'attribut $_db
+		$this->_db = new PDO(
+			"pgsql:host=localhost;dbname=projweb", // penser à modifier le nom de l'hébergeur et de la base
+			"postgres", // ainsi que l'identifiant
+			"postgres" // et le mot de passe
+		);
+	}
+	
+	public function __call($method, array $arg) { // méthode magique qui permet d'exécuter un bloc dans le cas où on appellerait une métohde qui n'est pas définie dans Database
+		// $method = le nom de la méthode appelée, array $arg = arguments passés à la méthode, dans un tableau (sans le array, chaîne de caratère avec les arguments séparés par une virgule
+		
+		return call_user_func_array(array($this->_db, $method), $arg); // appel de la méthode $methdod de l'objet $this->_db avec comme arguments $arg
+	}
+}
diff --git a/app/kernel/Kernel.php b/app/kernel/Kernel.php
new file mode 100644
index 0000000000000000000000000000000000000000..740a2a55c6dd5566509b4ed6283a984c60a172e0
--- /dev/null
+++ b/app/kernel/Kernel.php
@@ -0,0 +1,40 @@
+<?php
+
+class Kernel { // création d'une classe PHP qui servira à la gestion des modèles, vues et contrôleurs, selon la requête fournie
+
+	public static function autoload($class) { // méthode qui charge automatiquement un fichier en fonction du nom de la classe passé en paramètre
+		if(file_exists(ROOT."/app/kernel/$class.php")) { // 1. on vérifie si le fichier voulu existe dans le répertoire contenant les fichiers de classe du noyau
+			require_once(ROOT."/app/kernel/$class.php"); // si c'est le cas, on l'inclut ici et on finit l'exécution de la fonction
+		}
+		else if(file_exists(ROOT."/app/controller/$class.php")) { // 2. sinon, on fait pareil dans le répertoire contenant les fichiers de contrôleurs
+			require_once(ROOT."/app/controller/$class.php"); // si c'est le cas, on l'inclut ici et on finit l'exécution de la fonction
+		}
+		else if(file_exists(ROOT."/app/model/$class.php")) { // 3. sinon, on fait pareil dans le répertoire contenant les fichiers de modèles
+			require_once(ROOT."/app/model/$class.php"); // si c'est le cas, on l'inclut ici et on finit l'exécution de la fonction
+		}
+		// si aucun fichier n'a été trouvé, on ne fait rien
+	}
+
+
+	public static function run() { // méthode, appelée pour toute requête de page, qui gère les différents fichiers à appeler
+		// 1. on commence par enregistrer notre autoload, afin que PHP sache quoi utiliser pour chercher les fichiers et classes dont on aura besoin plus tard
+		spl_autoload_register(array("Kernel", "autoload")); // on donne dans un tableau la classe qui contient la méthode d'autoload, et le nom de cette méthode (parce qu'on aurait pu lui donner un nom exotique, genre choucroute...)
+	
+		// 2. on analyse la requete
+		$query = isset($_GET["query"]) ? $_GET["query"] : ""; // ternaire. Si la variable $_GET['query'] existe, alors on met sa valeur dans la varaible $query. Sinon, on y met la chaîne vide "".
+		$route = Router::analyze($query); // on récupère dans un tableau le nom du contrôleur à utiliser, l'action à déclencher dans ce contrôleur, et les paramètres qui restent dans la requête.
+		// Remarque : ici, on a fait appel à la méthode analyze() de la classe Router, pourtant on n'a pas dit à PHP où la trouver. C'est l'intérêt de l'autoload : à chaque fois que PHP tombe sur une classe qu'il n'a pas en mémoire, il va demander à l'autoload de lui indiquer où la trouver pour l'inclure. Et ça se fait automatiquement ! Elle est pas belle la vie ? :-)
+	
+		// 3. on instancie (enfin) le contrôleur adéquat, et on execute l'action demandée
+		$class = $route["controller"]."Controller"; // variable contenant le nom de la classe qu'on va instancier. Il s'agit du nom du contrôleur donné par la méthode analyze() de Router, concaténé avec "Controller". C'est une contrainte qu'on se donne pour nommer les fichiers de façon uniforme.
+		if(class_exists($class)) { // on regarde si la classe en question a été définie (va normalement appeler autoload pour essayer de la charger le cas échéant), et si c'est le cas :
+			$controller = new $class($route); // on instancie la classe
+			$method = array($controller, $route["action"]); // on définit une variable method qui contient le contrôleur fraichement instancié et l'action à effectuer
+			if(is_callable($method)) { // si la méthode existe et peut être appelée
+				call_user_func($method); // alors on appelle la méthode du contrôleur avec l'action souhaitée
+			}
+			// il faudra gérer les erreurs : faire une méthode dédiée dans le noyau à appeler ?
+			// else { error_callable('method'); } ?
+		}
+	}
+}
diff --git a/app/kernel/Model.php b/app/kernel/Model.php
new file mode 100644
index 0000000000000000000000000000000000000000..7c27e9426ba398f7204efebb9b7e410b10013055
--- /dev/null
+++ b/app/kernel/Model.php
@@ -0,0 +1,5 @@
+<?php
+
+class Model { // classe abstraite pour les modèles. Y'a rien dedans, c'est normal, chaque modèle a ses propres trucs à lui... Mais bon, on voulait quand même une classe abstraite pour tout ce petit monde. Et puis qui sait, peut-être que finalement on trouvera des trucs communs à tous les modèles, et là on sera bien contents d'avoir fait une classe mère, hein ! :-P
+	
+}
diff --git a/app/kernel/Router.php b/app/kernel/Router.php
new file mode 100644
index 0000000000000000000000000000000000000000..c213c26666ea9491b392ccb1692f492513514517
--- /dev/null
+++ b/app/kernel/Router.php
@@ -0,0 +1,396 @@
+<?php
+
+class Router
+{ // classe PHP permettant l'analyse de l'URL des requêtes
+    public static function analyze($query)
+    { // méthode d'analyse de la requête
+        // on définit une variable, par défaut initialisée sur les paramètres de page d'erreur 404 (page non trouvée)
+        $result = array(
+            "controller" => "Error", // le nom du contrôleur à instancier
+            "action" => "error404", // le nom de l'action à effectuer, autrement dit de la méthode à appeler dans ce contrôleur
+            "params" => array() // les paramètres de la requête (dans un tableau), par défaut aucun
+        );
+
+		if($query === "" || $query === "/") { // on regarde si la requête est identique (===) à la chaîne vide ou "/", et si oui, c'est qu'on voulait accéder à la page d'accueil
+			$result["controller"] = "Index"; // le contrôleur est donc Index
+			$result["action"] = "display"; // on va afficher la page, l'action est donc display
+			// il n'y a pas de paramètres, donc pas d'affectation de "params"
+		}
+		else { // sinon, on a des infos sur la page demandée
+			$parts = explode("/", $query); // on sépare la requête selon les /, et on regarde ce qu'on connait comme ordres dedans
+			
+			/*** consultation des jeux ***/
+			if($parts[0] == "jeu" && count($parts) == 2) { // on veut consulter la fiche d'un jeu (jeu/nomDuJeu)
+				$result["controller"] = "Jeu"; // le contrôleur à instancier sera "JeuController", on met donc "Jeu" dans la variable de résultat
+				$result["action"] = "display"; // on veut afficher les informations d'un jeu, donc on donne l'action "display"
+				$result["params"]["slug"] = $parts[1]; //on a des paramètres dans l'URL (normalement le nom/id du jeu), on le stocke aussi
+			}
+			else if($parts[0] == "jeu" && count($parts) == 1 && isset($_POST['rechercheJeu'])) { // on veut consulter la fiche d'un jeu via la barre de recherche du header
+				$result["controller"] = "Jeu"; // le contrôleur à instancier sera "JeuController", on met donc "Jeu" dans la variable de résultat
+				$result["action"] = "redirect"; // on veut rediriger vers la page d'un jeu, donc on donne l'action "redirect"
+				$result["params"]["slug"] = $_POST['rechercheJeu']; //on a un paramètre (le nom du jeu), on le stocke aussi
+			}
+			else if($parts[0] == "listejeux") { // on veut consulter la liste des jeux (listejeux/, avec n'importe quoi derrière)
+				$result["controller"] = "Jeu"; // le contrôleur à instancier sera "JeuController", on met donc "Jeu" dans la variable de résultat
+				$result["action"] = "displayListe"; // on veut afficher la liste des jeux, donc on donne l'action "displayListe"
+				// il n'y a pas de paramètres attendus, on n'affecte pas $result["params"]
+			}
+			else if($parts[0] == "jeux") { // on veut récupérer la liste des jeux au format JSON
+				$result["controller"] = "Jeu"; // le contrôleur à instancier sera "JeuController", on met donc "Jeu" dans la variable de résultat
+				$result["action"] = "listeJson"; // on veut générer une sortie au format json, on donne donc l'action "listeJson"
+				// il n'y a pas de paramètres attendus, on n'affecte pas $result["params"]
+			}
+			else if($parts[0] == "addjeu" && count($parts) == 1) { // on veut afficher le formulaire d'ajout(url/addjeu)
+				$result["controller"] = "Jeu";
+				$result["action"] = "displayFormAdd"; // on veut afficher le formulaire
+				// il n'y a pas de paramètres attendus, on n'affecte pas $result["params"]
+			}
+			else if($parts[0] == "addjeu" && count($parts) == 2 && $parts[1] == "addrequest") { // on veut enregistrer la demande d'ajout (addjeu/addrequest)
+				$result["controller"] = "Jeu"; // le contrôleur à instancier sera "JeuController", on met donc "Jeu" dans la variable de résultat
+				$result["action"] = "addRequest"; // on veut ajouter le jeu à la BDD, donc on donne l'action "addRequest"
+				// il n'y a pas de paramètres attendus, on n'affecte pas $result["params"]
+			}
+			else if($parts[0] == "addjeu" && count($parts) == 2 && $parts[1] == "requestvalid") { // l'enregistrement de la demande a été effectué, on affiche un message de confirmation (addjeu/requestvalid)
+				$result["controller"] = "Jeu";
+				$result["action"] = "displayRequestValid";
+				// il n'y a pas de paramètres attendus, on n'affecte pas $result["params"]
+			}
+			else if($parts[0] == "add_favoris" && count($parts) == 2) { // pour ajouter un jeu à ses favoris (add_favoris/nomdujeu)
+				$result["controller"] = "Jeu";
+				$result["action"] = "displayFavorisValid";
+				$result["params"]["slug"] = $parts[1]; //on a des paramètres dans l'URL (normalement le slug du jeu), on le stocke aussi
+			}
+			
+			/*** consultation des profils ***/
+			else if($parts[0] == "profil" && count($parts) == 2) { // consultation d'un profil : 2 morceaux (profil/pseudoDeLaPersonne)
+				$result["controller"] = "Profil"; 
+				$result["action"] = "display"; 
+				$result["params"]["slug"] = $parts[1]; 
+			}
+			else if($parts[0] == "profil" && count($parts) == 3 && $parts[2] == "edit") {
+				$result["controller"] = "Profil";
+				$result["action"] = "displayEdit";
+				$result["params"]["slug"] = $parts[1];
+			}
+			else if($parts[0] == "profil" && count($parts) == 4 && $parts[2] == "edit" && $parts[3] == "verify") {
+				$result["controller"] = "Profil";
+				$result["action"] = "verifyEdit";
+				$result["params"]["slug"] = $parts[1];
+			}
+			else if($parts[0] == "profil" && count($parts) == 4 && $parts[2] == "edit" && $parts[3] == "valid") {
+				$result["controller"] = "Profil";
+				$result["action"] = "displayValid";
+				$result["params"]["slug"] = $parts[1];
+			}
+
+			/*** consultation des classements ***/
+			else if($parts[0] == "classement" && count($parts) > 1) { // si classement général : 2 morceaux(classement/global), si classement spécifique : 3 morceaux (classement/jeu/nomDuJeu)
+				$result["controller"] = "Classement";
+				$result["action"] = "display";
+				$result["params"]["slug"] = $parts[1]; //on a des paramètres dans l'URL, on le stocke aussi
+				for($k=2; $k<count($parts); $k++) { // on recompose le bout d'URL encore inutilisé
+					$result["params"]["slug"] = $result["params"]["slug"].'/'.$parts[$k];
+				}
+			}
+
+			/*** connexion au site ***/
+			else if($parts[0] == "connexion" && count($parts) == 1) { // formulaire de connexion
+				$result["controller"] = "Connexion"; 
+				$result["action"] = "displayForm"; // "displayForm" pour afficher le formulaire
+			}
+			else if($parts[0] == "deconnexion" && count($parts) == 1) { // page de déconnexion
+				$result["controller"] = "Connexion"; 
+				$result["action"] = "displayDisconnect"; // "displayDisconnect" pour afficher la page de déconnexion réussie
+			}
+			else if($parts[0] == "connexion" && count($parts) == 2 && $parts[1] == "valid") { // connexion réussie
+				$result["controller"] = "Connexion"; 
+				$result["action"] = "displayValid"; // "displayValid" pour afficher la page avec le message de réussite
+			}
+			else if($parts[0] == "connexion" && count($parts) == 2 && $parts[1] == "verify") { // connexion réussie
+				$result["controller"] = "Connexion"; 
+				$result["action"] = "verify"; // "verify" pour appeler la méthode de vérification
+			}
+			
+			/*** inscription au site ***/
+			else if($parts[0] == "inscription" && count($parts) == 1) { // formulaire de connexion
+				$result["controller"] = "Register"; 
+				$result["action"] = "displayForm"; // "displayForm" pour afficher le formulaire
+			}
+			else if($parts[0] == "inscription" && count($parts) == 2 && $parts[1] == "valid") { // connexion réussie
+				$result["controller"] = "Register"; 
+				$result["action"] = "displayValid"; // "displayValid" pour afficher la page avec le message de réussite
+			}
+			else if($parts[0] == "inscription" && count($parts) == 2 && $parts[1] == "verify") { // vérification de la validité des champs
+				$result["controller"] = "Register"; 
+				$result["action"] = "verify"; // "verify" pour appeler la méthode de vérification
+			}
+			else if($parts[0] == "inscription" && count($parts) == 2 && $parts[1] == "save") { // réalisation de l'inscription dans la BDD
+				$result["controller"] = "Register"; 
+				$result["action"] = "save"; // "save" pour appeler la méthode d'enregistrement dans la BDD
+			}
+
+			/*** contact au site ***/
+			else if($parts[0] == "contact" && count($parts) == 1) { // formulaire de connexion
+				$result["controller"] = "Contact"; 
+				$result["action"] = "displayForm"; // "displayForm" pour afficher le formulaire
+			}
+			else if($parts[0] == "contact" && count($parts) == 2 && $parts[1] == "valid") { // connexion réussie
+				$result["controller"] = "Contact"; 
+				$result["action"] = "displayValid"; // "displayValid" pour afficher la page avec le message de réussite
+			}
+			else if($parts[0] == "contact" && count($parts) == 2 && $parts[1] == "send") { // réalisation de l'inscription dans la BDD
+				$result["controller"] = "Contact"; 
+				$result["action"] = "send"; // "save" pour appeler la méthode d'enregistrement dans la BDD
+			}
+
+
+			/*** Ajout de partie ***/
+            else if ($parts[0] == "add_partie" && count($parts) == 1) {
+                $result["controller"] = "Partie";
+                $result["action"] = "displayStep0";
+            } 
+			else if ($parts[0] == "add_partie" && count($parts) == 2 && $parts[1] == "valid") {
+                $result["controller"] = "Partie";
+                $result["action"] = "displayValid";
+            } 
+			else if ($parts[0] == "add_partie" && count($parts) == 2 && $parts[1] == "step1") {
+                $result["controller"] = "Partie";
+                $result["action"] = "displayStep1";
+            } 
+			else if ($parts[0] == "add_partie" && count($parts) == 2 && $parts[1] == "step2") {
+                $result["controller"] = "Partie";
+                $result["action"] = "displayStep2";
+            }
+			else if ($parts[0] == "add_partie" && count($parts) == 2 && $parts[1] == "stepe1") {
+                $result["controller"] = "Partie";
+                $result["action"] = "displayStepe1";
+            } 
+			else if ($parts[0] == "add_partie" && count($parts) == 2 && $parts[1] == "stepe2") {
+                $result["controller"] = "Partie";
+                $result["action"] = "displayStepe2";
+            } 
+			else if ($parts[0] == "add_partie" && count($parts) == 2 && $parts[1] == "verifystep0") {
+                $result["controller"] = "Partie";
+                $result["action"] = "verifyStep0";
+            } 
+			else if ($parts[0] == "add_partie" && count($parts) == 2 && $parts[1] == "verifystep1") {
+                $result["controller"] = "Partie";
+                $result["action"] = "verifyStep1";
+            } 
+			else if ($parts[0] == "add_partie" && count($parts) == 2 && $parts[1] == "verifystep2") {
+                $result["controller"] = "Partie";
+                $result["action"] = "verifyStep2";
+            }
+			
+			/*** Ajout de l'administration ***/
+			else if($parts[0] == "admin" && count($parts) == 1) {
+				$result["controller"] = 'Admin';
+				$result['action'] = "display";
+			}
+
+			else if($parts[0] == "admin" && count($parts) == 2 && $parts[1] == 'jeu') {
+				$result["controller"] = 'Admin';
+				$result['action'] = "displayJeu";
+			}
+
+			else if($parts[0] == "admin" && count($parts) == 4 && $parts[1] == 'jeu' && $parts[3] == 'valide') {
+				$result["controller"] = 'Admin';
+				$result['action'] = "acceptJeu";
+				$result["params"]["slug"] = $parts[2];
+			}
+
+			else if($parts[0] == "admin" && count($parts) == 5 && $parts[1] == 'jeu' && $parts[3] == 'valide' && $parts[4] == 'ok') {
+				$result["controller"] = 'Admin';
+				$result['action'] = "displayAcceptJeuOK";
+				$result["params"]["slug"] = $parts[2];
+			}
+
+			else if($parts[0] == "admin" && count($parts) == 4 && $parts[1] == 'jeu' && $parts[3] == 'supprime') {
+				$result["controller"] = 'Admin';
+				$result['action'] = "supprimeJeu";
+				$result["params"]["slug"] = $parts[2];
+			}
+
+			else if($parts[0] == "admin" && count($parts) == 5 && $parts[1] == 'jeu' && $parts[3] == 'supprime' && $parts[4] == 'ok') {
+				$result["controller"] = 'Admin';
+				$result['action'] = "displaySupprimeJeuOK";
+				$result["params"]["slug"] = $parts[2];
+			}
+
+			else if($parts[0] == "admin" && count($parts) == 4 && $parts[1] == 'jeu' && $parts[3] == 'unvalide') {
+				$result["controller"] = 'Admin';
+				$result['action'] = "unAcceptJeu";
+				$result["params"]["slug"] = $parts[2];
+			}
+
+			else if($parts[0] == "admin" && count($parts) == 5 && $parts[1] == 'jeu' && $parts[3] == 'unvalide' && $parts[4] == 'ok') {
+				$result["controller"] = 'Admin';
+				$result['action'] = "displayUnAcceptJeuOK";
+				$result["params"]["slug"] = $parts[2];
+			}
+
+			else if($parts[0] == "admin" && count($parts) == 4 && $parts[1] == 'jeu' && $parts[3] == 'modif') {
+				$result["controller"] = 'Admin';
+				$result['action'] = "displayModifJeu";
+				$result["params"]["slug"] = $parts[2];
+			}
+
+			else if($parts[0] == "admin" && count($parts) == 5 && $parts[1] == 'jeu' && $parts[3] == 'modif' && $parts[4] == "verify") {
+				$result["controller"] = 'Admin';
+				$result['action'] = "verifyModifJeu";
+				$result["params"]["slug"] = $parts[2];
+			}
+
+			else if($parts[0] == "admin" && count($parts) == 5 && $parts[1] == 'jeu' && $parts[3] == 'modif' && $parts[4] == 'ok') {
+				$result["controller"] = 'Admin';
+				$result['action'] = "displayModifJeuOK";
+				$result["params"]["slug"] = $parts[2];
+			}
+
+			else if($parts[0] == "admin" && count($parts) == 2 && $parts[1] == 'joueur') {
+				$result["controller"] = 'Admin';
+				$result['action'] = "displayJoueur";
+			}
+
+			else if($parts[0] == "admin" && count($parts) == 4 && $parts[1] == 'joueur' && $parts[3] == 'supprime') {
+				$result["controller"] = 'Admin';
+				$result['action'] = "supprimeJoueur";
+				$result["params"]["slug"] = $parts[2];
+			}
+
+			else if($parts[0] == "admin" && count($parts) == 5 && $parts[1] == 'joueur' && $parts[3] == 'supprime' && $parts[4] == 'ok') {
+				$result["controller"] = 'Admin';
+				$result['action'] = "displaySupprimeJoueurOK";
+				$result["params"]["slug"] = $parts[2];
+			}
+
+			else if($parts[0] == "admin" && count($parts) == 2 && $parts[1] == 'partie') {
+				$result["controller"] = 'Admin';
+				$result['action'] = "displayListPartie";
+			}
+
+			else if($parts[0] == "admin" && count($parts) == 4 && $parts[1] == 'partie' && $parts[3] == 'modifinit') {
+				$result["controller"] = 'Admin';
+				$result['action'] = "initModifPartie";
+				$result["params"]["slug"] = $parts[2];
+			}
+
+			else if($parts[0] == "admin" && count($parts) == 4 && $parts[1] == 'partie' && $parts[3] == 'modif') {
+				$result["controller"] = 'Admin';
+				$result['action'] = "initModifPartie";
+				$result["params"]["slug"] = $parts[2];
+			}
+
+			else if($parts[0] == "admin" && count($parts) == 5 && $parts[1] == 'partie' && $parts[3] == 'modif' && $parts[4] == 'stepe1') {
+				$result["controller"] = 'Admin';
+				$result['action'] = "displayModifPartieStepe1";
+				$result["params"]["slug"] = $parts[2];
+			}
+
+			else if($parts[0] == "admin" && count($parts) == 5 && $parts[1] == 'partie' && $parts[3] == 'modif' && $parts[4] == 'step1') {
+				$result["controller"] = 'Admin';
+				$result['action'] = "displayModifPartieStep1";
+				$result["params"]["slug"] = $parts[2];
+			}
+
+			else if($parts[0] == "admin" && count($parts) == 5 && $parts[1] == 'partie' && $parts[3] == 'modif' && $parts[4] == 'addjoueurs1') {
+				$result["controller"] = 'Admin';
+				$result['action'] = "ModifPartieaddjoueurs1";
+				$result["params"]["slug"] = $parts[2];
+			}
+
+			else if ($parts[0] == "admin" && count($parts) == 5 && $parts[1] == 'partie' && $parts[3] == 'modif' && $parts[4] == "clearstep1") {
+				$result["controller"] = "Admin";
+				$result["action"] = "ModifPartieclearstep1";
+				$result["params"]["slug"] = $parts[2];
+			}
+
+			else if($parts[0] == "admin" && count($parts) == 5 && $parts[1] == 'partie' && $parts[3] == 'modif' && $parts[4] == 'deljoueurs1') {
+				$result["controller"] = 'Admin';
+				$result['action'] = "ModifPartiedeljoueurs1";
+				$result["params"]["slug"] = $parts[2];
+			}
+
+			else if($parts[0] == "admin" && count($parts) == 5 && $parts[1] == 'partie' && $parts[3] == 'modif' && $parts[4] == 'delequipe') {
+				$result["controller"] = 'Admin';
+				$result['action'] = "ModifPartiedelequipe";
+				$result["params"]["slug"] = $parts[2];
+			}
+
+			else if($parts[0] == "admin" && count($parts) == 5 && $parts[1] == 'partie' && $parts[3] == 'modif' && $parts[4] == 'addequipe') {
+				$result["controller"] = 'Admin';
+				$result['action'] = "ModifPartieaddequipe";
+				$result["params"]["slug"] = $parts[2];
+			}
+
+			else if($parts[0] == "admin" && count($parts) == 5 && $parts[1] == 'partie' && $parts[3] == 'modif' && $parts[4] == 'verifystep1') {
+				$result["controller"] = 'Admin';
+				$result['action'] = "verifyModifPartieStep1";
+				$result["params"]["slug"] = $parts[2];
+			}
+
+			else if($parts[0] == "admin" && count($parts) == 5 && $parts[1] == 'partie' && $parts[3] == 'modif' && $parts[4] == 'step2') {
+				$result["controller"] = 'Admin';
+				$result['action'] = "displayModifPartieStep2";
+				$result["params"]["slug"] = $parts[2];
+			}
+
+			else if($parts[0] == "admin" && count($parts) == 5 && $parts[1] == 'partie' && $parts[3] == 'modif' && $parts[4] == 'stepe2') {
+				$result["controller"] = 'Admin';
+				$result['action'] = "displayModifPartieStepe2";
+				$result["params"]["slug"] = $parts[2];
+			}
+
+			else if($parts[0] == "admin" && count($parts) == 5 && $parts[1] == 'partie' && $parts[3] == 'modif' && $parts[4] == 'verifystep2') {
+				$result["controller"] = 'Admin';
+				$result['action'] = "verifyModifPartieStep2";
+				$result["params"]["slug"] = $parts[2];
+			}
+
+			else if($parts[0] == "admin" && count($parts) == 5 && $parts[1] == 'partie' && $parts[3] == 'modif' && $parts[4] == 'valid') {
+				$result["controller"] = 'Admin';
+				$result['action'] = "displayModifPartieOK";
+				$result["params"]["slug"] = $parts[2];
+			}
+
+			else if($parts[0] == "admin" && count($parts) == 4 && $parts[1] == 'partie' && $parts[3] == 'supprime') {
+				$result["controller"] = 'Admin';
+				$result['action'] = "supprPartie";
+				$result["params"]["slug"] = $parts[2];
+			}
+
+			else if($parts[0] == "admin" && count($parts) == 5 && $parts[1] == 'partie' && $parts[3] == 'supprime' && $parts[4] == 'ok') {
+				$result["controller"] = 'Admin';
+				$result['action'] = "displaysupprPartieOK";
+				$result["params"]["slug"] = $parts[2];
+			}
+
+            else if ($parts[0] == "add_partie" && count($parts) == 2 && $parts[1] == "addjoueurs1") {
+                $result["controller"] = "Partie";
+                $result["action"] = "addjoueurs1";
+            }
+            else if ($parts[0] == "add_partie" && count($parts) == 2 && $parts[1] == "deljoueurs1") {
+                $result["controller"] = "Partie";
+                $result["action"] = "deljoueurs1";
+            }
+            else if ($parts[0] == "add_partie" && count($parts) == 2 && $parts[1] == "addequipe") {
+                $result["controller"] = "Partie";
+                $result["action"] = "addequipe";
+            }
+            else if ($parts[0] == "add_partie" && count($parts) == 2 && $parts[1] == "delequipe") {
+                $result["controller"] = "Partie";
+                $result["action"] = "delequipe";
+            }
+			else if ($parts[0] == "add_partie" && count($parts) == 2 && $parts[1] == "clearstep1") {
+				$result["controller"] = "Partie";
+				$result["action"] = "clearstep1";
+			}
+
+
+            // à chaque fois qu'on crée une nouvelle page, il faut rajouter un cas à cet endroit !
+
+            // si on n'a rien trouvé que l'on connaissait, alors la page demandée n'existe pas => erreur 404. Ça tombe bien, c'est comme ça qu'on a initialisé la variable ! :-D
+        }
+        return $result; // on renvoie le tableau avec les informations nécessaires pour savoir quoi faire
+    }
+}
diff --git a/app/kernel/View.php b/app/kernel/View.php
new file mode 100644
index 0000000000000000000000000000000000000000..6b1a1467b901b7aaad3c3da53046f13af5e38748
--- /dev/null
+++ b/app/kernel/View.php
@@ -0,0 +1,32 @@
+<?php
+
+class View { // classe abstraite pour les vues
+	protected $_route; // variable protégée contenant le résultat de l'analyse de la requête (dans un tableau)
+	protected $data = array(); // variable protégée contenant des données, sous forme de tableau
+	
+	public function __construct($route) { // le constructeur
+		$this->_route = $route; // on stocke  la route donnée en paramètre dans la variable protégée $_route
+	}
+	
+	public function display() { // va générer un affichage en fonction des paramètres de la route
+		$viewFile = ROOT . "/app/view/" . $this->_route["controller"] . "/" . $this->_route["action"] . ".html"; // on va chercher la vue dans app/view/le_nom_du_contrôleur/ce_qu_on_veut_faire.html (le *.html est là pour indiquer qu'aucun calcul n'est réalisé dans ces pages, qu'elles n'ont qu'une fonction d'affichage. Mais on pourra utiliser du PHP pour afficher des noms de variables (<?php echo $this->profil->pseudo; ? >)
+	
+		if(file_exists($viewFile)) { // le fichier existe bel et bien, on peut l'inclure
+			include($viewFile);
+		}
+		else { // le fichier n'existe pas, on lève une exception avec un message d'erreur/excuse
+			throw new DomainException("Vue introuvable - " . $viewFile);
+		}
+	}
+	
+	public function __set($key, $value) { // méthode magique permettant de mettre une valeur à un attribut donné, de façon identique pour tous les attributs. Cela évite de devoir définir 15000 setters pour toutes les variables. PHP le fait automatiquement, si c'est pas gentil ça ! ^^
+		$this->data[$key] = $value;
+	}
+	
+	public function __get($key) { // idem, mais pour les getters. :-)
+		if(isset($this->data[$key]))
+			return $this->data[$key];
+		else
+			return null;
+	}
+}
diff --git a/app/model/Admin.php b/app/model/Admin.php
new file mode 100644
index 0000000000000000000000000000000000000000..b0f2dd27cd683978b7cd2f5a674d7ad2572f2c5f
--- /dev/null
+++ b/app/model/Admin.php
@@ -0,0 +1,281 @@
+<?php
+
+class Admin extends Model {
+
+    public static function estAdmin($slug) {
+        $db = Database::getInstance(); // on récupère la connexion à la BDD
+        $sql = "SELECT * FROM R_admin WHERE identite = :slug"; // on définit la requête qu'on enverra (on considère que le slug contient jeu/nomDuJeu pour le classement par jeu. Donc il faudrait encore faire un explode() sur le slug.
+        $req = $db->prepare($sql); // on prépare la requête (c'est là que la mémthode __call() est utile dans la classe Database d'ailleurs)
+        $req->execute(array(":slug" => $slug));
+        return ($req->rowcount() != 0);
+    }
+
+    public static function getListeJeuNonValide() {
+        $db = Database::getInstance(); // on récupère la connexion à la BDD
+        $sql = "SELECT * FROM R_jeu WHERE NOT est_valide ORDER BY nom"; // on définit la requête qu'on enverra (on considère que le slug contient jeu/nomDuJeu pour le classement par jeu. Donc il faudrait encore faire un explode() sur le slug.
+        $req = $db->prepare($sql); // on prépare la requête (c'est là que la mémthode __call() est utile dans la classe Database d'ailleurs)
+        $req->execute();
+        $res = array();
+        while($ligne = $req->fetch(PDO::FETCH_ASSOC)) { // parcours toute la liste
+            $res[] = $ligne;
+        }
+        return $res;
+    }
+
+    public static function acceptJeu($slug) {
+        $db = Database::getInstance();
+        $sql = "UPDATE R_jeu SET est_valide = 1 WHERE slug = :slug";
+        $req = $db->prepare($sql);
+        return $req->execute(array(':slug' => $slug));
+    }
+
+    public static function supprJeu($slug) {
+        $db = Database::getInstance();
+        $sql= "SELECT * FROM R_partie WHERE jeu = :slug";
+        $req = $db->prepare($sql);
+        $req->execute(array(':slug' => $slug));
+        $sql= "DELETE FROM R_joueur_partie WHERE partie = :partie";
+        $req = $db->prepare($sql);
+        while($ligne = $req->fetch(PDO::FETCH_ASSOC)) {
+            $req->execute(array(':partie' => $ligne['id']));
+        }
+        $sql= "DELETE FROM R_partie WHERE jeu = :slug";
+        $req = $db->prepare($sql);
+        $req->execute(array(':slug' => $slug));
+        $sql= "DELETE FROM R_joueur_jeu WHERE jeu = :slug";
+        $req = $db->prepare($sql);
+        $req->execute(array(':slug' => $slug));
+        $sql = "DELETE FROM R_jeu WHERE slug = :slug";
+        $req = $db->prepare($sql);
+        $req->execute(array(':slug' => $slug));
+    }
+
+    public static function getListeJeuValide() {
+        $db = Database::getInstance(); // on récupère la connexion à la BDD
+        $sql = "SELECT * FROM R_jeu WHERE est_valide ORDER BY nom"; // on définit la requête qu'on enverra (on considère que le slug contient jeu/nomDuJeu pour le classement par jeu. Donc il faudrait encore faire un explode() sur le slug.
+        $req = $db->prepare($sql); // on prépare la requête (c'est là que la mémthode __call() est utile dans la classe Database d'ailleurs)
+        $req->execute();
+        $res = array();
+        while($ligne = $req->fetch(PDO::FETCH_ASSOC)) { // parcours toute la liste
+            $res[] = $ligne;
+        }
+        return $res;
+    }
+    
+    public static function unacceptJeu($slug) {
+        $db = Database::getInstance();
+        $sql = "UPDATE R_jeu SET est_valide = 0 WHERE slug = :slug";
+        $req = $db->prepare($sql);
+        return $req->execute(array(':slug' => $slug));
+    }
+    
+    public static function setModifJeu($slug, $data) {
+        $db = Database::getInstance();
+        $sql = "UPDATE R_jeu SET description = :description, max_joueurs = :max_joueurs,
+                min_joueurs = :min_joueurs, max_equipes = :max_equipes, min_equipes = :min_equipes,
+                 type = :type, type_scores = :type_scores WHERE slug = :slug";
+        $req = $db->prepare($sql);
+        return $req->execute(array(':slug' => $slug,
+                                    ':description' => $data['description'] ,
+                                    ':type' => $data['type'],
+                                    ':max_joueurs' => $data['max_joueurs'],
+                                    ':min_joueurs' => $data['min_joueurs'],
+                                    ':max_equipes' => $data['max_equipes'],
+                                    ':min_equipes' => $data['min_equipes'],
+                                    ':type_scores' => $data['type_scores']));
+    }
+
+    public static function supprJoueur($slug) {
+        $db = Database::getInstance();
+        $sql= "DELETE FROM R_joueur_partie WHERE joueur = :slug";
+        $req = $db->prepare($sql);
+        $req->execute(array(':slug' => $slug));
+        $sql= "DELETE FROM R_joueur_jeu WHERE joueur = :slug";
+        $req = $db->prepare($sql);
+        $req->execute(array(':slug' => $slug));
+        $sql = "DELETE FROM R_joueur WHERE slug = :slug";
+        $req = $db->prepare($sql);
+        $req->execute(array(':slug' => $slug));
+    }
+
+    public static function getListPartie() {
+        $db = Database::getInstance(); // on récupère la connexion à la BDD
+        $sql = "SELECT * FROM R_partie JOIN R_jeu ON R_partie.jeu = R_jeu.slug ORDER BY date"; // on définit la requête qu'on enverra (on considère que le slug contient jeu/nomDuJeu pour le classement par jeu. Donc il faudrait encore faire un explode() sur le slug.
+        $req = $db->prepare($sql); // on prépare la requête (c'est là que la mémthode __call() est utile dans la classe Database d'ailleurs)
+        $req->execute();
+        $res = array();
+        while($ligne = $req->fetch(PDO::FETCH_ASSOC)) { // parcours toute la liste
+            $res[] = $ligne;
+        }
+        return $res;
+    }
+
+    public static function getEquipes($id) {
+        $db = Database::getInstance(); // on récupère la connexion à la BDD
+        $sql = "SELECT * FROM R_joueur_partie WHERE partie = :id ORDER BY classement"; // on définit la requête qu'on enverra (on considère que le slug contient jeu/nomDuJeu pour le classement par jeu. Donc il faudrait encore faire un explode() sur le slug.
+        $req = $db->prepare($sql); // on prépare la requête (c'est là que la mémthode __call() est utile dans la classe Database d'ailleurs)
+        $req->execute(array(':id' => $id));
+        $res = array();
+        $i = -1;
+        $classement_old = 0;
+        while($ligne = $req->fetch(PDO::FETCH_ASSOC)) {
+            if($classement_old != $ligne['classement']) {
+                $i = $i +1;
+                $classement_old = $ligne['classement'];
+                $res[$i] = array();
+            }
+            $res[$i][] = Profil::getFromSlug($ligne['joueur']);
+        }
+        return $res;
+    }
+
+    public static function getListeJoueur($id) {
+        $db = Database::getInstance(); // on récupère la connexion à la BDD
+        $sql = "SELECT * FROM R_joueur_partie WHERE partie = :id ORDER BY classement"; // on définit la requête qu'on enverra (on considère que le slug contient jeu/nomDuJeu pour le classement par jeu. Donc il faudrait encore faire un explode() sur le slug.
+        $req = $db->prepare($sql); // on prépare la requête (c'est là que la mémthode __call() est utile dans la classe Database d'ailleurs)
+        $req->execute(array(':id' => $id));
+        $res = array();
+        while($ligne = $req->fetch(PDO::FETCH_ASSOC)) { // parcours toute la liste
+            $res[] = Profil::getFromSlug($ligne['joueur']);
+        }
+        return $res;
+    }
+
+    public static function getListeScore($id) {
+        $db = Database::getInstance(); // on récupère la connexion à la BDD
+        $sql = "SELECT * FROM R_joueur_partie WHERE partie = :id ORDER BY classement"; // on définit la requête qu'on enverra (on considère que le slug contient jeu/nomDuJeu pour le classement par jeu. Donc il faudrait encore faire un explode() sur le slug.
+        $req = $db->prepare($sql); // on prépare la requête (c'est là que la mémthode __call() est utile dans la classe Database d'ailleurs)
+        $req->execute(array(':id' => $id));
+        $res = array();
+        while($ligne = $req->fetch(PDO::FETCH_ASSOC)) { // parcours toute la liste
+            $res[$ligne['joueur']] = $ligne['score'];
+        }
+        return $res;
+    }
+
+    public static function getListeScorePartie($id) {
+        $db = Database::getInstance(); // on récupère la connexion à la BDD
+        $sql = "SELECT * FROM R_joueur_partie WHERE partie = :id ORDER BY classement"; // on définit la requête qu'on enverra (on considère que le slug contient jeu/nomDuJeu pour le classement par jeu. Donc il faudrait encore faire un explode() sur le slug.
+        $req = $db->prepare($sql); // on prépare la requête (c'est là que la mémthode __call() est utile dans la classe Database d'ailleurs)
+        $req->execute(array(':id' => $id));
+        $res = array();
+        while($ligne = $req->fetch(PDO::FETCH_ASSOC)) { // parcours toute la liste
+            $res[$ligne['joueur']] = $ligne['score_partie'];
+        }
+        return $res;
+    }
+
+    public static function getListeScorePartie2($id) {
+        $db = Database::getInstance(); // on récupère la connexion à la BDD
+        $sql = "SELECT * FROM R_joueur_partie WHERE partie = :id ORDER BY classement"; // on définit la requête qu'on enverra (on considère que le slug contient jeu/nomDuJeu pour le classement par jeu. Donc il faudrait encore faire un explode() sur le slug.
+        $req = $db->prepare($sql); // on prépare la requête (c'est là que la mémthode __call() est utile dans la classe Database d'ailleurs)
+        $req->execute(array(':id' => $id));
+        $res = array();
+        while($ligne = $req->fetch(PDO::FETCH_ASSOC)) { // parcours toute la liste
+            $res[] = $ligne['score_partie'];
+        }
+        return $res;
+    }
+
+    public static function getListeClassement($id) {
+        $db = Database::getInstance(); // on récupère la connexion à la BDD
+        $sql = "SELECT * FROM R_joueur_partie WHERE partie = :id ORDER BY classement"; // on définit la requête qu'on enverra (on considère que le slug contient jeu/nomDuJeu pour le classement par jeu. Donc il faudrait encore faire un explode() sur le slug.
+        $req = $db->prepare($sql); // on prépare la requête (c'est là que la mémthode __call() est utile dans la classe Database d'ailleurs)
+        $req->execute(array(':id' => $id));
+        $res = array();
+        while($ligne = $req->fetch(PDO::FETCH_ASSOC)) { // parcours toute la liste
+            $res[$ligne['joueur']] = $ligne['classement'];
+        }
+        return $res;
+    }
+
+    public static function getListeClassement2($id) {
+        $db = Database::getInstance(); // on récupère la connexion à la BDD
+        $sql = "SELECT DISTINCT classement FROM R_joueur_partie WHERE partie = :id ORDER BY classement"; // on définit la requête qu'on enverra (on considère que le slug contient jeu/nomDuJeu pour le classement par jeu. Donc il faudrait encore faire un explode() sur le slug.
+        $req = $db->prepare($sql); // on prépare la requête (c'est là que la mémthode __call() est utile dans la classe Database d'ailleurs)
+        $req->execute(array(':id' => $id));
+        $res = array();
+        while($ligne = $req->fetch(PDO::FETCH_ASSOC)) { // parcours toute la liste
+            $res[] = $ligne['classement'];
+        }
+        return $res;
+    }
+
+    public static function ModifPartie($id, $joueurs, $scores, $jeu)
+    {
+        $db = Database::getInstance();
+        $sql5 = "UPDATE R_joueur_jeu SET score = :new_score WHERE joueur = :id_joueur AND jeu = :id_jeu;";
+        $stmt5 = $db->prepare($sql5);
+
+        $partieModif = Partie::getFromId($id);
+        // recherche des joueurs ayant fais une partie apres celle-ci (celle-ci incluse)
+        $sql1 = "SELECT * FROM R_joueur_partie JOIN R_partie ON R_joueur_partie.partie = R_partie.id WHERE date >= date(:date) AND jeu =:jeu ORDER BY date";
+        $stmt1 = $db->prepare($sql1);
+        $stmt1->execute(array(':date' => $partieModif->date, ":jeu" => $partieModif->jeu));
+        // pour tout les joueurs remettre les scrores comme-ci aucune partie après celle-ci a été jouée
+        $joueurDejaTraite = array();
+        while ($joueur = $stmt1->fetch(PDO::FETCH_ASSOC)) {
+            if (!in_array($joueur['joueur'], $joueurDejaTraite)) {
+                $joueurDejaTraite[] = $joueur['joueur'];
+                $stmt5->execute(array(':new_score' => $joueur['score'],
+                ':id_joueur' => $joueur['joueur'],
+                    ':id_jeu' => $joueur['jeu']));
+            }
+        }
+        // applique la partie
+        if (($resp = Partie::modPartie($joueurs, $scores, $jeu, $id)) > 0){
+            print $resp;
+            die();
+        }
+        // pour chaque partie apres celle modifier on la réapplique avec les nouveaux scores
+        $sql2 = "SELECT * FROM R_partie WHERE date > date(:date) AND jeu =:jeu ORDER BY date";
+        $stmt2 = $db->prepare($sql2);
+        $stmt2->execute(array(':date' => $partieModif->date, ":jeu" => $partieModif->jeu));
+        while ($ligne = $stmt2->fetch(PDO::FETCH_ASSOC)) {
+            $joueurs = $jeu->type == 'equipes' ? Admin::getEquipes($ligne['id']) : Admin::getListeJoueur($ligne['id']);
+            $scores = $jeu->type_scores == 'scores' ? Admin::getListeScorePartie2($ligne['id']) : Admin::getListeClassement2($ligne['id']);
+            Partie::modPartie($joueurs, $scores, $jeu, $ligne['id']);
+        }
+        return 0;
+    }
+
+    public static function supprPartie($id) {
+        $db = Database::getInstance();
+        $sql5 = "UPDATE R_joueur_jeu SET score = :new_score WHERE joueur = :id_joueur AND jeu = :id_jeu;";
+        $stmt5 = $db->prepare($sql5);
+        $partieSuppr = Partie::getFromId($id);
+        // recherche des joueurs ayant fais une partie apres celle-ci (celle-ci incluse)
+        $sql1 = "SELECT * FROM R_joueur_partie JOIN R_partie ON R_joueur_partie.partie = R_partie.id WHERE date >= date(:date) AND jeu =:jeu ORDER BY date";
+        $stmt1 = $db->prepare($sql1);
+        $stmt1->execute(array(':date' => $partieSuppr->date, ":jeu" => $partieSuppr->jeu));
+        // pour tout les joueurs remettre les scrores comme-ci aucune partie après celle-ci a été jouée
+        $joueurDejaTraite = array();
+        while ($joueur = $stmt1->fetch(PDO::FETCH_ASSOC)) {
+            if (!in_array($joueur['joueur'], $joueurDejaTraite)) {
+                $joueurDejaTraite[] = $joueur['joueur'];
+                $stmt5->execute(array(':new_score' => $joueur['score'],
+                ':id_joueur' => $joueur['joueur'],
+                    ':id_jeu' => $joueur['jeu']));
+            }
+        }
+
+        $sql = "DELETE FROM R_joueur_partie WHERE partie = :id";
+        $req = $db->prepare($sql);
+        $req->execute(array(':id' => $id));
+
+        $sql = "DELETE FROM R_partie WHERE id = :id";
+        $req = $db->prepare($sql);
+        $req->execute(array(':id' => $id));
+
+        $jeu = Jeu::getFromSlug($partieSuppr->jeu);
+        $sql2 = "SELECT * FROM R_partie WHERE date > date(:date) AND jeu =:jeu ORDER BY date";
+        $stmt2 = $db->prepare($sql2);
+        $stmt2->execute(array(':date' => $partieSuppr->date, ":jeu" => $partieSuppr->jeu));
+        while ($ligne = $stmt2->fetch(PDO::FETCH_ASSOC)) {
+            $joueurs = $jeu->type == 'equipes' ? Admin::getEquipes($ligne['id']) : Admin::getListeJoueur($ligne['id']);
+            $scores = $jeu->type_scores == 'scores' ? Admin::getListeScorePartie2($ligne['id']) : Admin::getListeClassement2($ligne['id']);
+            Partie::modPartie($joueurs, $scores, $jeu, $ligne['id']);
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/app/model/Classement.php b/app/model/Classement.php
new file mode 100644
index 0000000000000000000000000000000000000000..d9ac38d6a2da4102579405b25cdffa6406ec03ed
--- /dev/null
+++ b/app/model/Classement.php
@@ -0,0 +1,92 @@
+<?php
+
+class Classement extends Model { // classe de modèle pour l'affichage de classements
+	public $classement, $lejeu, $slug; // on définit les attributs de la classe
+	
+	public static function getFromSlug($slug) { // méthode permettant de récupérer le classement relatif à un jeu donné de la BDD
+		$db = Database::getInstance(); // on récupère la connexion à la BDD
+		$sql = "SELECT * FROM R_joueur_jeu WHERE jeu = :slug ORDER BY classement"; // on définit la requête qu'on enverra (on considère que le slug contient jeu/nomDuJeu pour le classement par jeu. Donc il faudrait encore faire un explode() sur le slug.
+		$req = $db->prepare($sql); // on prépare la requête (c'est là que la mémthode __call() est utile dans la classe Database d'ailleurs)
+		$req->setFetchMode(PDO::FETCH_CLASS, "Classement"); // règle le type dans lequel on doit mettre les données (PDO va chercher les attributs de la classe de même nom que ses colonnes de BDD et mettre dedans les valeurs correspondantes)
+		$req->execute(array(":slug" => $slug)); // on remplace le "::slug" par sa valeur dans la requête
+		$res = array();
+		while($ligne = $req->fetch(PDO::FETCH_ASSOC)) { // parcours toute la liste
+			$perso = Profil::getFromSlug($ligne['joueur']);
+			$res[] = array(	'slug' => $ligne['joueur'],
+							'pseudo' => $perso->pseudo,
+							'avatar' => $perso->avatar ? BASE_URL."/images/avatar/".$perso->slug.".jpg": BASE_URL."/images/profil_42.jpg",
+							'score' => $ligne['score'],
+							'classement' => $ligne['classement']);
+		}
+		return $res;
+    }
+	
+	public static function getGlobal() {
+        $db = Database::getInstance(); // on récupère la connexion à la BDD
+        $sql = "SELECT * FROM R_joueur_jeu ORDER BY joueur";
+        $req = $db->prepare($sql);
+        $req->setFetchMode(PDO::FETCH_CLASS, "Classement");
+        $req->execute();
+        $res = array();
+        $scores = array();
+        $perso = array();
+        $j = 0;
+        while($ligne = $req->fetch(PDO::FETCH_ASSOC)) {
+            $perso[$j] = Profil::getFromSlug($ligne['joueur']);
+            $scoresj = array();
+            while($ligne['joueur'] == $perso[$j]->slug){
+                array_push($scoresj, $ligne['score']);
+                $ligne = $req->fetch(PDO::FETCH_ASSOC);
+            }
+            $scores[$j] = array_sum($scoresj)/count($scoresj);
+            $j++;
+        }
+        arsort($scores);
+        $i = 1;
+        foreach ($scores as $j => $score){
+            array_push($res, array('slug' => $perso[$j]->slug,
+							'pseudo' => $perso[$j]->pseudo,
+							'avatar' => $perso[$j]->avatar ? BASE_URL."/images/avatar/".$perso[$j]->slug.".jpg": BASE_URL."/images/profil_42.jpg",
+							'score' => $score,
+							'classement' => $i));
+            $i++;
+        }
+        return $res;
+    }
+
+	public static function getClassementJoueur($slug) {
+		$db = Database::getInstance(); // on récupère la connexion à la BDD
+		$sql = "SELECT * FROM R_joueur_jeu WHERE joueur LIKE :slug ORDER BY classement LIMIT 5";
+		$req = $db->prepare($sql);
+		$req->execute(array(":slug" => $slug));
+		$res_top = array();
+		while($ligne = $req->fetch(PDO::FETCH_ASSOC)) { // parcours toute la liste
+			$jeu = Jeu::getFromSlug($ligne['jeu']);
+			$res_top[] = array(	'slug' => $ligne['jeu'],
+							'nom' => $jeu->nom,
+							'score' => $ligne['score'],
+							'classement' => $ligne['classement']);
+		}
+		$sql = "SELECT * FROM R_joueur_jeu WHERE joueur = :slug ORDER BY classement DESC LIMIT 5";
+		$req = $db->prepare($sql);
+		$req->execute(array(":slug" => $slug));
+		$res_down = array();
+		while($ligne = $req->fetch(PDO::FETCH_ASSOC)) { // parcours toute la liste
+			$jeu = Jeu::getFromSlug($ligne['jeu']);
+			$res_down[] = array(	'slug' => $ligne['jeu'],
+							'nom' => $jeu->nom,
+							'score' => $ligne['score'],
+							'classement' => $ligne['classement']);
+		}
+		$sql = "SELECT * FROM R_joueur_jeu WHERE joueur LIKE :slug AND est_jeu_favoris";
+		$req = $db->prepare($sql);
+		$req->execute(array(":slug" => $slug));
+		$res_fav = array();
+		while($ligne = $req->fetch(PDO::FETCH_ASSOC)) { // parcours toute la liste
+			$jeu = Jeu::getFromSlug($ligne['jeu']);
+			$res_fav[] = array(	'slug' => $ligne['jeu'],
+								'nom' => $jeu->nom);
+		}
+		return array($res_top, $res_down, $res_fav);
+	}
+}
diff --git a/app/model/Connexion.php b/app/model/Connexion.php
new file mode 100644
index 0000000000000000000000000000000000000000..6bb7a937a51e2495e851546a73425cbcf5ddcc13
--- /dev/null
+++ b/app/model/Connexion.php
@@ -0,0 +1,36 @@
+<?php
+
+class Connexion extends Model { // classe de modèle pour la connexion au site
+	public $slug, $pseudo, $nom, $prenom, $email;
+	
+	public static function getPassword($pseudo) { // méthode permettant de récupérer le password hashé d'un membre dans la BDD
+		// renvoie le mot de passe si le membre existe
+		// renvoie null si le membre n'existe pas
+		
+		$db = Database::getInstance(); // on récupère la connexion à la BDD
+		$sql = "SELECT password FROM R_joueur WHERE pseudo = :pseudo";
+		$req = $db->prepare($sql); // on prépare la requête
+		$req->execute(array(":pseudo" => $pseudo)); // on remplace les variables dans la requête
+		
+		$return = null; //valeur par défaut du retour
+		if($result = $req->fetch()) { // on récupère l'enregistrement, s'il existe
+			$return = $result['password']; // on récupère le mdp hashé pour le retourner
+		}
+		
+		return $return;
+	}
+	
+	public static function getUser($slug) { // méthode permettant de récupérer les données d'un utilisateur dans la BDD
+		$db = Database::getInstance(); // on récupère la connexion à la BDD
+		$sql = "SELECT slug, pseudo, nom, prenom, email FROM R_joueur WHERE slug = :slug_joueur";
+		$req = $db->prepare($sql); // on prépare la requête
+		$req->setFetchMode(PDO::FETCH_CLASS, "Connexion");
+		$req->execute(array(":slug_joueur" => $slug)); // on remplace les variables dans la requête
+		
+		return $req->fetch();
+	}
+	
+}
+
+
+
diff --git a/app/model/ELO_function.php b/app/model/ELO_function.php
new file mode 100644
index 0000000000000000000000000000000000000000..6aa37837158ec5e18b43668fbec09b4c620a19be
--- /dev/null
+++ b/app/model/ELO_function.php
@@ -0,0 +1,169 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: phoenix
+ * Date: 01/04/16
+ * Time: 18:32
+ *
+ */
+
+/**
+ * Fonction qui calcule les différentiels de scores obtenus après une partie d'un jeu à deux joueurs
+ * où l'on peut perdre (0) ou gagner (1).
+ * @param int $SA : score actuel du premier joueur
+ * @param int $RA : score (valant 0 ou 1) du premier joueur
+ * @param int $SB : score actuel du second joueur
+ * @param int $RB : score (valant 0 ou 1) du second joueur
+ * @param int $K : la quantité max de points gagnable ou perdable sur une partie
+ * @return array : le différentiel de score du premier joueur et du second joueur
+ */
+srand();
+
+function ELO_duel($SA, $RA, $SB, $RB, $K)
+{
+    $EA = 1/(1+10**(($SB-$SA)/400));
+    $EB = 1/(1+10**(($SA-$SB)/400));
+    $newRA = $K * ($RA-$EA);
+    $newRB = $K * ($RB-$EB);
+
+    if ($newRA>0)
+        $newRA = ceil($newRA);
+    else
+        $newRA = floor($newRA);
+
+    if ($newRB>0)
+        $newRB = ceil($newRB);
+    else
+        $newRB = floor($newRB);
+
+    return array($newRA, $newRB);
+}
+
+/**
+ * Fonction qui calcule les différentiels de scores obtenus après une partie à count($S) joueurs
+ * en considérant que $R correspond au classement des joueurs dans ce jeu (du type array(1,3,4,2) pour
+ * le premier joueur est 1er, le second est 2e, etc).
+ * On suppose qu'il y a correpondance entre les indices de $S et les indices de $R.
+ * @param array $S : scores actuels des joueurs
+ * @param array $R : classement des joueurs
+ * @param int $K : la quantité max de points gagnable ou perdable sur une partie
+ * @return array : le différentiel de score de chaque joueur
+ * @throws DomainException
+ */
+function ELO_classement($S, $R, $K)
+{
+    $m = count($S);
+    if (count($R) != $m)
+        throw new DomainException;
+
+    $count = array_fill(0, $m, 0);
+    $res = array_fill(0, $m, 0);
+    for ($i = 0; $i < $m; $i++) {
+        for ($j = $i + 1; $j < $m; $j++) {
+            if ($R[$i] < $R[$j])
+                $newSAB = ELO_duel($S[$i], 1, $S[$j], 0, $K);
+            else
+                $newSAB = ELO_duel($S[$i], 0, $S[$j], 1, $K);
+            $res[$i] = 1 / ($count[$i] + 1) * ($count[$i] * $res[$i] + $newSAB[0]);
+            $count[$i]++;
+            $res[$j] = 1 / ($count[$j] + 1) * ($count[$j] * $res[$j] + $newSAB[1]);
+            $count[$j]++;
+
+        }
+    }
+    for ($i = 0; $i < $m; $i++) {
+        if ($res[$i] > 0)
+            $res[$i] = ceil($res[$i]);
+        else
+            $res[$i] = floor($res[$i]);
+    }
+
+    $e = array_sum($res);
+
+    if($e != 0){
+        $se = 0;
+
+        if ($e < 0) {
+            $se = min($res);
+        }
+        else if($e>0) {
+            $se = max($res);
+        }
+        $i = array_search($se, $res);
+        $res[$i] += -$e;
+    }
+
+    return $res;
+}
+
+
+/** Fonction qui calcule les différentiels de scores obtenus après une à count($S) joueurs
+ * en considérant que $R correspond au score des joueurs à cette partie.
+ * Ne prend pas en compte les écarts de scores entre les joueurs, la fonction ne construisant qu'un classement
+ * entre les joueurs.
+ * On suppose qu'il y a correpondance entre les indices de $S et les indices de $R.
+ * @param $S
+ * @param $R
+ * @param $K
+ * @param array $S : scores actuels des joueurs
+ * @param array $R : scores des joueurs à une partie
+ * @param int $K : la quantité max de points gagnable ou perdable sur une partie
+ * @return array : le différentiel de score de chaque joueur
+ * @throws DomainException
+ */
+function ELO_scores($S, $R, $K){
+    $m = count($S);
+    if (count($R) != $m)
+        throw new DomainException;
+
+    $R_classement = array_fill(0, $m, 0);
+    arsort($R);
+    $i = 1;
+    foreach ($R as $k => $val){
+        $R_classement[$k] = $i;
+        $i++;
+    }
+
+    return ELO_classement($S, $R_classement, $K);
+}
+
+function random_classement($n)
+{
+    $r = array();
+    for ($j=0; $j<$n; $j++)
+    {
+        array_push($r, $j+1);
+    }
+    shuffle($r);
+    return $r;
+}
+
+/* Test */
+function testeur(){
+    print("<html><body><table><th>Itération</th><th>Joueur 1</th><th>Joueur 2</th><th>Joueur 3</th><th>Joueur 4</th><th>Joueur 5</th><th>Somme</th></tr>");
+    $DS = array(1000,1000,1000,1000,1000);
+
+    print("<tr><td>0</td>");
+    foreach ($DS as $value) {
+        print("<td>$value</td>");
+    }
+    $p = array_sum($DS);
+    print("<td>$p</td></tr>");
+
+    for($j=1;$j<1000;$j++){
+        $sa = random_classement(5);
+        $res = ELO_classement($DS, $sa, 32);
+        print("<tr><td>$j</td>");
+
+        for ($i=0;$i<count($DS);$i++) {
+            $DS[$i] = $DS[$i] + $res[$i];
+            $k1 = $DS[$i];
+            $k2 = $res[$i];
+            $k3 = $sa[$i];
+            print("<td>$k1 ($k2) ($k3)</td>");
+        }
+        $p = array_sum($DS);
+        print("<td>$p</td></tr>");
+    }
+    print("</table></body></html>");
+}
diff --git a/app/model/Jeu.php b/app/model/Jeu.php
new file mode 100644
index 0000000000000000000000000000000000000000..9bc6384dc06b784babf6e89b7f4bbaadf02b4fcc
--- /dev/null
+++ b/app/model/Jeu.php
@@ -0,0 +1,120 @@
+<?php
+
+
+class Jeu extends Model {
+   public $id, $nom, $description, $slug;
+
+   public static function getFromSlug($slug_jeu) {
+      $db = Database::getInstance();
+      $sql = "SELECT * FROM R_jeu WHERE slug = :slug";
+      $stmt = $db->prepare($sql);
+      $stmt->setFetchMode(PDO::FETCH_CLASS, "Jeu"); // règle le type dans lequel on doit mettre les données (PDO va chercher les attributs de la classe de même nom que ses colonnes de BDD et mettre dedans les valeurs correspondantes)
+      $stmt->execute(array(":slug" => $slug_jeu));
+      return $stmt->fetch();
+   }
+
+   public static function getList() {
+      $db = Database::getInstance();
+      $sql = "SELECT * FROM R_jeu WHERE est_valide";
+      $stmt = $db->query($sql);
+      $stmt->setFetchMode(PDO::FETCH_CLASS, "Jeu");
+      return $stmt->fetchAll();
+
+   }
+
+
+   public static function getMostPlayed() {
+      $db = Database::getInstance();
+      $sql = 'SELECT nom, slug, COUNT(*) as "parties" FROM R_partie JOIN R_jeu ON slug = jeu GROUP BY nom, r_jeu.slug ORDER BY parties DESC';
+      $stmt = $db->query($sql);
+	  $ret = array();
+	  $k = 0;
+	  while($k<3 && ($elt = $stmt->fetch())) {
+		  echo $elt['nom'].'<br>';
+		  $k++;
+		  array_push($ret, $elt);
+	  }
+      return $ret;
+
+   }
+    
+   public static function getSlugList() {
+      $db = Database::getInstance();
+      $sql = "SELECT slug FROM R_jeu";
+      $stmt = $db->query($sql);
+	  $return = array();
+	  while($elt = $stmt->fetch()) {
+		  array_push($return, $elt['slug']);
+	  }
+      return $return;
+   }
+
+   public static function checkExists($slug_jeu) { // méthode permettant de vérifier si un jeu existe dans la BDD
+      $db = Database::getInstance(); // on récupère la connexion à la BDD
+      $sql = "SELECT * FROM R_jeu WHERE slug = :slug";
+      $req = $db->prepare($sql); // on prépare la requête
+      $req->execute(array(":slug" => $slug_jeu)); // on remplace les variables dans la requête
+
+      if($result = $req->fetch()) { // on récupère l'enregistrement, s'il existe
+         return 1;
+      }
+
+      return 0; // on aurait pu mettre deux return (un dans le if et un ici), mais bon...
+   }
+
+   public static function checkExistsId($id) { // méthode permettant de vérifier si un jeu existe dans la BDD
+      $db = Database::getInstance(); // on récupère la connexion à la BDD
+      $sql = "SELECT * FROM R_jeu WHERE id = :id";
+      $req = $db->prepare($sql); // on prépare la requête
+      $req->execute(array(":id" => $id)); // on remplace les variables dans la requête
+
+      if($result = $req->fetch()) { // on récupère l'enregistrement, s'il existe
+         return 1;
+      }
+
+      return 0; // on aurait pu mettre deux return (un dans le if et un ici), mais bon...
+   }
+
+   public static function addRequest($nom_jeu, $description, $slug_jeu, $est_valide, $type, $type_scores, $min_joueurs, $max_joueurs=null, $min_equipes=null, $max_equipes=null) {
+      $db = Database::getInstance();
+      $sql = "INSERT INTO R_jeu (nom, description, slug, est_valide, min_joueurs, max_joueurs, min_equipes, max_equipes, type, type_scores)
+              VALUES (:nom, :description, :slug, :est_valide, :min_joueurs, :max_joueurs, :min_equipes, :max_equipes, :type, :type_scores);";
+       $stmt = $db->prepare($sql);
+      if($stmt->execute(array(":nom" => $nom_jeu, ":description" => $description, ":slug" => $slug_jeu, ":est_valide" => $est_valide, ":type" => $type, ":type_scores" => $type_scores, ":min_joueurs" => $min_joueurs, ":max_joueurs" => $max_joueurs, ":min_equipes" => $min_equipes, ":max_equipes" => $max_equipes))) {
+          //ok
+      }
+       else {
+           echo "Arise, ça marche pas..."; die();
+       }
+   }
+
+
+    public static function getFromNom($nom_jeu)
+    {
+        $db = Database::getInstance();
+        $sql = "SELECT * FROM R_jeu WHERE nom = :nom";
+        $stmt = $db->prepare($sql);
+        $stmt->setFetchMode(PDO::FETCH_CLASS, "Jeu"); // règle le type dans lequel on doit mettre les données (PDO va chercher les attributs de la classe de même nom que ses colonnes de BDD et mettre dedans les valeurs correspondantes)
+        $stmt->execute(array(":nom" => $nom_jeu));
+        return $stmt->fetch();
+    }
+    
+
+    public static function checkExistsNom($nom)
+    { // méthode permettant de vérifier si un jeu existe dans la BDD
+        $db = Database::getInstance(); // on récupère la connexion à la BDD
+        $sql = "SELECT * FROM R_jeu WHERE nom = :nom";
+        $req = $db->prepare($sql); // on prépare la requête
+        $req->execute(array(":nom" => $nom)); // on remplace les variables dans la requête
+
+        if ($result = $req->fetch()) { // on récupère l'enregistrement, s'il existe
+            return 1;
+        }
+
+        return 0; // on aurait pu mettre deux return (un dans le if et un ici), mais bon...
+    }
+
+}
+
+
+
diff --git a/app/model/Partie.php b/app/model/Partie.php
new file mode 100644
index 0000000000000000000000000000000000000000..658dd042d1926965426052d35830b8b112deff12
--- /dev/null
+++ b/app/model/Partie.php
@@ -0,0 +1,334 @@
+<?php
+include_once("ELO_function.php");
+
+/**
+ * Created by PhpStorm.
+ * User: phoenix
+ * Date: 25/04/16
+ * Time: 15:27
+ */
+class Partie extends Model
+{
+    public $joueurs, $scores, $lejeu, $date, $slug;
+
+    public static function getFromId($id)
+    {
+        $db = Database::getInstance();
+        $sql = "SELECT * FROM R_partie WHERE id = :id";
+        $stmt = $db->prepare($sql);
+        $stmt->setFetchMode(PDO::FETCH_CLASS, "Partie"); // règle le type dans lequel on doit mettre les données (PDO va chercher les attributs de la classe de même nom que ses colonnes de BDD et mettre dedans les valeurs correspondantes)
+        $stmt->execute(array(":id" => $id));
+        return $stmt->fetch();
+    }
+
+    public static function getList()
+    {
+        $db = Database::getInstance();
+        $sql = "SELECT * FROM R_partie";
+        $stmt = $db->query($sql);
+        $stmt->setFetchMode(PDO::FETCH_CLASS, "Partie");
+        return $stmt->fetchAll();
+    }
+
+    public static function checkExists($slug_partie)
+    { // méthode permettant de vérifier si une partie existe dans la BDD
+        $db = Database::getInstance(); // on récupère la connexion à la BDD
+        $sql = "SELECT * FROM R_partie WHERE slug = :slug";
+        $req = $db->prepare($sql); // on prépare la requête
+        $req->execute(array(":slug" => $slug_partie)); // on remplace les variables dans la requête
+
+        if ($result = $req->fetch()) { // on récupère l'enregistrement, s'il existe
+            return true;
+        }
+
+        return false; // on aurait pu mettre deux return (un dans le if et un ici), mais bon...
+    }
+
+    public static function calcul_classement($R)
+    {
+        $m = count($R);
+
+        $R_classement = array_fill(0, $m, 0);
+        arsort($R);
+        $i = 1;
+        foreach ($R as $k => $val) {
+            $R_classement[$k] = $i;
+            $i++;
+        }
+        return $R_classement;
+    }
+
+
+    public static function updateClassement($jeu)
+    {
+        $db = Database::getInstance();
+        $sql1 = "SELECT joueur FROM R_joueur_jeu WHERE jeu = :jeu ORDER BY score DESC";
+        $sql2 = "UPDATE R_joueur_jeu SET classement = :classement WHERE joueur = :joueur AND jeu = :jeu;";
+        $stmt1 = $db->prepare($sql1);
+        $stmt2 = $db->prepare($sql2);
+        if ($stmt1->execute(array(":jeu" => $jeu->slug))) {
+            $t = 1;
+            $rows = $stmt1->fetchAll();
+            foreach ($rows as $row){
+
+                if ($stmt2->execute(array(":classement" => $t, ":joueur" => $row['joueur'], ":jeu" => $jeu->slug))) {
+
+                } else {
+                    return 2;
+                }
+                $t++;
+            }
+        } else {
+            return 2;
+        }
+        return 0;
+    }
+
+    public static function modPartie($joueurs, $scores, $jeu, $id_partie)
+    {
+        $db = Database::getInstance();
+        $sql3 = "SELECT score FROM  R_joueur_partie WHERE joueur = :id_joueur AND partie = :id_partie;";
+        $sql4 = "UPDATE R_joueur_partie SET classement=:classement, score=:score, score_partie=:score_partie
+                 WHERE partie=:partie AND joueur=:joueur;";
+        $sql5 = "UPDATE R_joueur_jeu SET score = :new_score WHERE joueur = :id_joueur AND jeu = :id_jeu;";
+        $sqlN = "INSERT INTO R_joueur_jeu (joueur, jeu, score) VALUES (:id_joueur, :id_jeu, :score);";
+        $stmt3 = $db->prepare($sql3);
+        $stmt4 = $db->prepare($sql4);
+        $stmt5 = $db->prepare($sql5);
+
+        $m = count($scores);
+        $old_score = array_fill(0, $m, 0);
+        $old_score_e = array();
+        foreach ($joueurs as $k => $joueur) {
+            // version avec équipes
+            if ($jeu->type == 'equipes') {
+                $old_score_e[$k] = array();
+                foreach ($joueur as $kj => $j) {
+                    if ($stmt3->execute(array(":id_joueur" => $j->slug, ":id_partie" => $id_partie))) {
+                        if ($row = $stmt3->fetch()) {
+                            // Le joueur a déja joué à ce jeu
+                            $old_score_e[$k][$kj] = $row[0];
+                        }
+                        else {
+                            // ou le joueur n'a jamais joué à ce jeu, on je rajoute à la relation.
+                            $old_score[$k] = 1000;
+                            $stmtN = $db->prepare($sqlN);
+                            if ($stmtN->execute(array(":id_joueur" => $joueur->slug, ":id_jeu" => $jeu->slug, ":score" => 1000))) {
+
+                            } else
+                                return 2;
+                        }
+                    }
+                }
+                $old_score[$k] = array_sum($old_score_e[$k]) / count($old_score_e[$k]);
+            } else {
+                // récupération du score actuel de chaque joueur
+                if ($stmt3->execute(array(":id_joueur" => $joueur->slug, ":id_partie" => $id_partie))) {
+                    if ($row = $stmt3->fetch()) {
+                        // Le joueur a forcément déja joué à ce jeu
+                        $old_score[$k] = $row[0];
+                    }
+                    else {
+                        // ou le joueur n'a jamais joué à ce jeu, on je rajoute à la relation.
+                        $old_score[$k] = 1000;
+                        $stmtN = $db->prepare($sqlN);
+                        if ($stmtN->execute(array(":id_joueur" => $joueur->slug, ":id_jeu" => $jeu->slug, ":score" => 1000))) {
+
+                        } else
+                            return 2;
+                    }
+                }
+            }
+        }
+        // Calcul de la nouvelle différence de scores et du classement de chacun dans la partie
+        $diff_scores = ELO_scores($old_score, $scores, 32);
+        $classement = self::calcul_classement($diff_scores);
+        foreach ($joueurs as $k => $joueur) {
+            if ($jeu->type_scores == 'classement') {
+                $score = null;
+            } else {
+                $score = $scores[$k];
+            }
+            if ($jeu->type == 'equipes') {
+                foreach ($joueur as $kj => $j) {
+                    // Insertion des infos de la partie (avec le score avant la partie et le classement interne à la partie
+                    // et le score de la partie) pour chaque joueur par équipe
+                    if ($stmt4->execute(array(":partie" => $id_partie,
+                        ":joueur" => $j->slug,
+                        ":classement" => $classement[$k], ":score" => $old_score_e[$k][$kj], ":score_partie" => $score))
+                    ) {
+                        $newS = $old_score_e[$k][$kj] + $diff_scores[$k];
+                        // On met à jour le score du joueur actuel dans sa relation avec le jeu
+                        if ($stmt5->execute(array(":new_score" => $newS,
+                            ":id_jeu" => $jeu->slug, ":id_joueur" => $j->slug))
+                        ) {
+                        } else
+                            return 2;
+                    } else
+                        return 2;
+                }
+            } else {
+                // Insertion des infos de la partie (avec le score avant la partie et le classement interne à la partie
+                //  et le score de la partie) pour chaque joueur
+
+                if ($stmt4->execute(array(":partie" => $id_partie,
+                    ":joueur" => $joueur->slug,
+                    ":classement" => $classement[$k], ":score" => $old_score[$k], ":score_partie" => $score))
+                ) {
+                    $newS = $old_score[$k] + $diff_scores[$k];
+                    // On met à jour le score du joueur actuel dans sa relation avec le jeu
+                    if ($stmt5->execute(array(":new_score" => $newS,
+                        ":id_jeu" => $jeu->slug, ":id_joueur" => $joueur->slug))
+                    ) {
+                    } else
+                        return 2;
+                } else
+                    return 2;
+            }
+        }
+
+        return self::updateClassement($jeu);
+    }
+
+    public static function addPartie($joueurs, $scores, $jeu)
+    {
+        $db = Database::getInstance();
+        $datestr = date("Y-m-d H:i:s");
+        $sql1 = "INSERT INTO R_partie (jeu, date) VALUES (:id_jeu, :date);";
+        $sql2 = "SELECT id FROM R_partie WHERE jeu = :id_jeu AND date = :date;";
+        $sql3 = "SELECT score FROM R_joueur_jeu WHERE joueur = :id_joueur AND jeu = :id_jeu;";
+        $sql4 = "INSERT INTO R_joueur_partie (partie, joueur, classement, score, score_partie)
+                VALUES (:partie, :joueur,:classement, :score, :score_partie);";
+        $sql5 = "UPDATE R_joueur_jeu SET score = :new_score WHERE joueur = :id_joueur AND jeu = :id_jeu;";
+        $sqlN = "INSERT INTO R_joueur_jeu (joueur, jeu, score) VALUES (:id_joueur, :id_jeu, :score);";
+        $stmt1 = $db->prepare($sql1);
+        $stmt2 = $db->prepare($sql2);
+        $stmt3 = $db->prepare($sql3);
+        $stmt4 = $db->prepare($sql4);
+        $stmt5 = $db->prepare($sql5);
+
+        if ($stmt1->execute(array(":id_jeu" => $jeu->slug, ":date" => $datestr))) {
+            // insertion d'une nouvelle partie
+            // on suppose que si l'insertion fonctionne, la lecture aussi, donc que les droits d'accés sont bons
+            $stmt2->execute(array(":id_jeu" => $jeu->slug, ":date" => $datestr));
+            $id_partie = $stmt2->fetch()['id'];
+
+            $m = count($scores);
+
+            $old_score = array_fill(0, $m, 0);
+            $old_score_e = array();
+            foreach ($joueurs as $k => $joueur) {
+                // version avec équipes
+                if ($jeu->type == 'equipes') {
+                    $old_score_e[$k] = array();
+                    foreach ($joueur as $kj => $j) {
+                        if ($stmt3->execute(array(":id_joueur" => $j->slug, ":id_jeu" => $jeu->slug))) {
+                            if ($row = $stmt3->fetch()) {
+                                if(!is_null($row[0])){
+                                // Le joueur a déja joué à ce jeu
+                                $old_score_e[$k][$kj] = $row[0];
+                                }
+                                else{
+                                    // ou le joueur n'a jamais joué à ce jeu, on je rajoute à la relation.
+                                    $old_score_e[$k][$kj] = 1000;
+                                    $stmtN = $db->prepare($sqlN);
+                                    if ($stmtN->execute(array(":id_joueur" => $j->slug, ":id_jeu" => $jeu->slug, ":score" => 1000))) {
+
+                                    } else
+                                        return 2;
+                                }
+                            } else {
+                                // ou le joueur n'a jamais joué à ce jeu, on je rajoute à la relation.
+                                $old_score_e[$k][$kj] = 1000;
+                                $stmtN = $db->prepare($sqlN);
+                                if ($stmtN->execute(array(":id_joueur" => $j->slug, ":id_jeu" => $jeu->slug, ":score" => 1000))) {
+
+                                } else
+                                    return 2;
+                            }
+                        }
+                    }
+                    $old_score[$k] = array_sum($old_score_e[$k]) / count($old_score_e[$k]);
+                } else {
+                    // récupération du score actuel de chaque joueur
+                    if ($stmt3->execute(array(":id_joueur" => $joueur->slug, ":id_jeu" => $jeu->slug))) {
+                        if ($row = $stmt3->fetch()) {
+                            if(!is_null($row[0])){
+                            // Le joueur a déja joué à ce jeu
+                            $old_score[$k] = $row[0];
+                            }
+                            else{
+                                // ou le joueur n'a jamais joué à ce jeu, on je rajoute à la relation.
+                                $old_score[$k] = 1000;
+                                $stmtN = $db->prepare($sqlN);
+                                if ($stmtN->execute(array(":id_joueur" => $joueur->slug, ":id_jeu" => $jeu->slug, ":score" => 1000))) {
+
+                                } else
+                                    return 2;
+                            }
+                        } else {
+                            // ou le joueur n'a jamais joué à ce jeu, on je rajoute à la relation.
+                            $old_score[$k] = 1000;
+                            $stmtN = $db->prepare($sqlN);
+                            if ($stmtN->execute(array(":id_joueur" => $joueur->slug, ":id_jeu" => $jeu->slug, ":score" => 1000))) {
+
+                            } else
+                                return 2;
+                        }
+
+                    }
+                }
+            }
+            // Calcul de la nouvelle différence de scores et du classement de chacun dans la partie
+            $diff_scores = ELO_scores($old_score, $scores, 32);
+            $classement = self::calcul_classement($diff_scores);
+            foreach ($joueurs as $k => $joueur) {
+                if ($jeu->type_scores == 'classement'){
+                    $score = null;
+                }
+                else{
+                    $score = $scores[$k];
+                }
+                if ($jeu->type == 'equipes') {
+                    foreach ($joueur as $kj => $j) {
+                        // Insertion des infos de la partie (avec le score avant la partie et le classement interne à la partie
+                        // et le score de la partie) pour chaque joueur par équipe
+                        if ($stmt4->execute(array(":partie" => $id_partie,
+                            ":joueur" => $j->slug,
+                            ":classement" => $classement[$k], ":score" => $old_score_e[$k][$kj], ":score_partie" => $score))
+                        ) {
+                            $newS = $old_score_e[$k][$kj] + $diff_scores[$k];
+                            // On met à jour le score du joueur actuel dans sa relation avec le jeu
+                            if ($stmt5->execute(array(":new_score" => $newS,
+                                ":id_jeu" => $jeu->slug, ":id_joueur" => $j->slug))
+                            ) {
+                            } else
+                                return 2;
+                        } else
+                            return 2;
+                    }
+                } else {
+                    // Insertion des infos de la partie (avec le score avant la partie et le classement interne à la partie
+                    //  et le score de la partie) pour chaque joueur
+
+                    if ($stmt4->execute(array(":partie" => $id_partie,
+                        ":joueur" => $joueur->slug,
+                        ":classement" => $classement[$k], ":score" => $old_score[$k], ":score_partie" => $score))
+                    ) {
+                        $newS = $old_score[$k] + $diff_scores[$k];
+                        // On met à jour le score du joueur actuel dans sa relation avec le jeu
+                        if ($stmt5->execute(array(":new_score" => $newS,
+                            ":id_jeu" => $jeu->slug, ":id_joueur" => $joueur->slug))
+                        ) {
+                        } else
+                            return 2;
+                    } else
+                        return 2;
+                }
+            }
+        } else
+            return 2;
+        // met à jour le classement de tous les joueurs
+        return self::updateClassement($jeu);
+    }
+}
diff --git a/app/model/Profil.php b/app/model/Profil.php
new file mode 100644
index 0000000000000000000000000000000000000000..0fd63f1e87755f958a7b108051bedae35f55b361
--- /dev/null
+++ b/app/model/Profil.php
@@ -0,0 +1,115 @@
+<?php
+
+class Profil extends Model { // classe de modèle pour l'affichage de profils
+	public $slug, $pseudo, $password, $nom, $prenom, $email, $description, $avatar; // on définit les attributs de la classe
+	
+	public static function getFromSlug($slug_profil) { // méthode permettant de récupérer les informations relatives à un profil donné de la BDD
+		$db = Database::getInstance(); // on récupère la connexion à la BDD
+		$sql = "SELECT * FROM R_joueur WHERE slug = :slug"; // on définit la requête qu'on enverra
+		$req = $db->prepare($sql); // on prépare la requête (c'est là que la mémthode __call() est utile dans la classe Database d'ailleurs)
+		$req->setFetchMode(PDO::FETCH_CLASS, "Profil");  // règle le type dans lequel on doit mettre les données (PDO va chercher les attributs de la classe de même nom que ses colonnes de BDD et mettre dedans les valeurs correspondantes)
+		$req->execute(array(":slug" => $slug_profil)); // on remplace le "::slug" par sa valeur dans la requête
+		return $req->fetch(); // on retourne le premier (et normalement unique) résultat en BDD
+	}
+	
+	public static function getList() { // méthode permettant de récupérer la liste des profils de la BDD
+		$db = Database::getInstance(); // idem à au-dessus
+		$sql = "SELECT * FROM R_joueur";
+		$req = $db->query($sql);
+		$req->setFetchMode(PDO::FETCH_CLASS, "Profil");
+		return $req->fetchAll();
+	}
+	
+	public static function setPassword($slug, $password) {
+		$db = Database::getInstance(); // idem à au-dessus
+		$sql = "UPDATE R_joueur SET password = :password WHERE slug = :slug";
+		$req = $db->prepare($sql);
+		$req->execute(array(':password' => $password, ':slug' => $slug));
+	}
+	
+	public static function setAutre($slug, $data)
+	{
+		$db = Database::getInstance(); // idem à au-dessus
+		$sql = "UPDATE R_joueur SET nom = :nom, prenom = :prenom, email = :email, avatar = :avatar WHERE slug = :slug";
+		$req = $db->prepare($sql);
+		$req->execute(array(':nom' => $data['nom'],
+			':prenom' => $data['prenom'],
+			':email' => $data['email'],
+			':avatar' => $data['avatar'],
+			':slug' => $slug));
+	}
+	
+	public static function getLastMember() { // méthode permettant de récupérer les informations relatives au dernier membre inscrit en BDD
+		$db = Database::getInstance(); // on récupère la connexion à la BDD
+		$sql = "SELECT * FROM R_joueur"; // on définit la requête qu'on enverra
+		$req = $db->query($sql); // on exécute la requête
+		$req->setFetchMode(PDO::FETCH_CLASS, "Profil");  // règle le type dans lequel on doit mettre les données (PDO va chercher les attributs de la classe de même nom que ses colonnes de BDD et mettre dedans les valeurs correspondantes)
+		$ret = null;
+		while ($elt = $req->fetch()) { // on parcourt tous les résultats et on les stocke au fur et à mesure dans la même variable, jusqu'au dernier. C'est lui qui restera à la fin
+			$ret = $elt;
+		}
+		return $ret; // on retourne les données du membre
+	}
+	
+	public static function getNbMembers()
+	{ // méthode permettant de récupérer les informations relatives au dernier membre inscrit en BDD
+		$db = Database::getInstance(); // on récupère la connexion à la BDD
+		$sql = "SELECT COUNT(*) FROM R_joueur"; // on définit la requête qu'on enverra
+		$req = $db->query($sql); // on exécute la requête
+		return $req->fetch()[0]; // on retourne le nombre
+	}
+	
+	public static function checkExists($slug_profil) { // méthode permettant de vérifier si un profil existe dans la BDD
+		$db = Database::getInstance(); // on récupère la connexion à la BDD
+		$sql = "SELECT * FROM R_joueur WHERE slug = :slug";
+		$req = $db->prepare($sql); // on prépare la requête
+		$req->execute(array(":slug" => $slug_profil)); // on remplace les variables dans la requête
+
+		if($result = $req->fetch()) { // on récupère l'enregistrement, s'il existe
+			return 1;
+		}
+
+		return 0; // on aurait pu mettre deux return (un dans le if et un ici), mais bon...
+	}
+	
+	public static function checkJeuFavoris($slug_joueur, $slug_jeu) { // méthode permettant de vérifier si un jeu est jeu favoris d'un joueur
+		$db = Database::getInstance(); // on récupère la connexion à la BDD
+		$sql = "SELECT * FROM R_joueur_jeu WHERE joueur = :slug_j AND jeu = :slug_jeu AND est_jeu_favoris";
+		$req = $db->prepare($sql); // on prépare la requête
+		$req->execute(array(":slug_j" => $slug_joueur, ":slug_jeu" => $slug_jeu)); // on remplace les variables dans la requête
+
+		if($result = $req->fetch()) { // on récupère l'enregistrement, s'il existe
+			return 1;
+		}
+		return 0;
+	}
+	
+	public static function checkADejaJoue($slug_joueur, $slug_jeu) { // méthode permettant de vérifier si un joueur a déjà joué à un jeu
+		$db = Database::getInstance(); // on récupère la connexion à la BDD
+		$sql = "SELECT * FROM R_joueur_jeu WHERE joueur = :slug_j AND jeu = :slug_jeu";
+		$req = $db->prepare($sql); // on prépare la requête
+		$req->execute(array(":slug_j" => $slug_joueur, ":slug_jeu" => $slug_jeu)); // on remplace les variables dans la requête
+
+		if($result = $req->fetch()) { // on récupère l'enregistrement, s'il existe
+			return 1;
+		}
+		return 0;
+	}
+	
+	public static function upadteJeuFavoris($slug_joueur, $slug_jeu, $favoris) { // méthode permettant de définir un jeu comme étant jeu favoris d'un joueur, ou l'inverse
+		$db = Database::getInstance(); // on récupère la connexion à la BDD
+		$sql = "UPDATE R_joueur_jeu SET est_jeu_favoris = :favoris WHERE joueur = :slug_j AND jeu = :slug_jeu";
+		$req = $db->prepare($sql); // on prépare la requête
+		$req->execute(array(":favoris" => $favoris, ":slug_j" => $slug_joueur, ":slug_jeu" => $slug_jeu)); // on remplace les variables dans la requête
+	}
+	
+	public static function insertJeuFavoris($slug_joueur, $slug_jeu, $favoris) { // méthode permettant de définir un jeu comme étant jeu favoris d'un joueur, ou l'inverse
+		$db = Database::getInstance(); // on récupère la connexion à la BDD
+		$sql = "INSERT INTO R_joueur_jeu VALUES (:slug_joueur, :slug_jeu, null, null, :favoris) ";
+		$req = $db->prepare($sql); // on prépare la requête
+		$req->execute(array(":slug_joueur" => $slug_joueur, ":slug_jeu" => $slug_jeu, ":favoris" => $favoris)); // on remplace les variables dans la requête
+	}
+}
+
+
+
diff --git a/app/model/Register.php b/app/model/Register.php
new file mode 100644
index 0000000000000000000000000000000000000000..e1adafb7114197ccbfc5010cf9e6c6c859f1f629
--- /dev/null
+++ b/app/model/Register.php
@@ -0,0 +1,75 @@
+<?php
+
+class Register extends Model { // classe de modèle pour l'inscription
+	public static function checkPseudo($slug_joueur) { // méthode permettant de vérifier si un pseudo est libre
+		
+		$db = Database::getInstance(); // on récupère la connexion à la BDD
+		$sql = "SELECT * FROM R_joueur WHERE slug = :slug";
+		$req = $db->prepare($sql); // on prépare la requête
+		$req->execute(array(":slug" => $slug_joueur)); // on remplace les variables dans la requête
+		
+		if($result = $req->fetch()) { // si un enregistrement existe en BDD, on retourne 0
+			return 0;
+		}
+		
+		return 1; // sinon : OK -> on retourne  1
+	}
+	
+	public static function checkEmail($email) { // méthode permettant de vérifier si un pseudo est libre
+		
+		$db = Database::getInstance(); // on récupère la connexion à la BDD
+		$sql = "SELECT * FROM R_joueur WHERE email = :email";
+		$req = $db->prepare($sql); // on prépare la requête
+		$req->execute(array(":email" => $email)); // on remplace les variables dans la requête
+		
+		if($result = $req->fetch()) { // si un enregistrement existe en BDD, on retourne 0
+			return 0;
+		}
+		
+		return 1; // sinon : OK -> on retourne  1
+	}
+	
+	public static function check($slug_joueur, $email) { // méthode permettant de vérifier si un compte-joueur est libre
+		// OK si personne avec même pseudo ou même adresse mail n'existe dans la BDD
+		// renvoie 1 si le compte est libre (= n'existe pas)
+		// renvoie 2 si pseudo déjà pris
+		// renvoie 3 si email déjà utilisé
+		
+		$db = Database::getInstance(); // on récupère la connexion à la BDD
+		$sql = "SELECT * FROM R_joueur WHERE slug = :slug OR email = :email";
+		$req = $db->prepare($sql); // on prépare la requête
+		$req->execute(array(":slug" => $slug_joueur, ":email" => $email)); // on remplace les variables dans la requête
+		
+		$return = 1; //valeur par défaut si on n'a pas d'autre 
+		if($result = $req->fetch()) { // on récupère l'enregistrement, s'il existe
+			if($result["slug"] == $slug_joueur) {
+				$return = 2;
+			} // si on a trouvé quelqu'un avec le pseudo, on ne peut pas faire l'inscription
+			else if($result["email"] == $email) {
+				$return = 3;
+			} // si on a trouvé quelqu'un avec l'e-mail, on ne peut pas faire l'inscription
+		}
+		
+		return $return; // on aurait pu mettre deux return (un dans le if et un ici), mais bon...
+	}
+
+	public static function writedb($data) { // méthode réalisant l'inscription dans la BDD à partir d'un tableau de données
+		$db = Database::getInstance(); // on récupère la connexion à la BDD
+
+		$sql = "INSERT INTO R_joueur (slug, pseudo, password, nom, prenom, email, description, avatar) VALUES (:slug, :pseudo, :password, :nom, :prenom, :email, :description, :avatar)";
+		$req = $db->prepare($sql); // on prépare la requête
+		$result = $req->execute(array(":slug" 		=> $data['slug_joueur'],
+										":pseudo" 	=> $data['pseudo'],
+										":password" => $data['password'],
+										":nom" 		=> $data['nom'],
+									  	":prenom" 	=> $data['prenom'],
+									  	":email" 	=> $data['email'],
+									  	":description" => $data['description'],
+										":avatar" => $data['avatar'])); // on remplace les variables dans la requête
+
+		return $result; // on aurait pu mettre deux return (un dans le if et un ici), mais bon...
+	}
+}
+
+
+
diff --git a/app/view/Admin/display.html b/app/view/Admin/display.html
new file mode 100644
index 0000000000000000000000000000000000000000..8c349c82d29668d360ea7e2799565de53b00d3ce
--- /dev/null
+++ b/app/view/Admin/display.html
@@ -0,0 +1,27 @@
+<?php
+	$page_title = "Page d'administration";
+include(ROOT."/app/view/Includes/header.include.html");
+?>
+
+<?php if(isset($_SESSION['user']) && Admin::estAdmin($_SESSION['user']->slug)) { ?>
+
+    <article>
+        <h3>
+            <a href="admin/jeu">Gestion des jeux</a>
+        </h3>
+        <h3>
+            <a href="admin/joueur">Gestion des Joueurs</a>
+        </h3>
+        <h3>
+            <a href="admin/partie">Gestion des Parties</a>
+        </h3>
+    </article>
+
+
+<?php } else { ?>
+
+<article class="msg-erreur">Vous n'êtes pas connecté comme administrateur</article>'
+
+<?php } ?>
+
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Admin/displayAcceptJeuOK.html b/app/view/Admin/displayAcceptJeuOK.html
new file mode 100644
index 0000000000000000000000000000000000000000..e4f181cf7f618949e93c0ee5a6294ff35ffddf16
--- /dev/null
+++ b/app/view/Admin/displayAcceptJeuOK.html
@@ -0,0 +1,17 @@
+<?php
+	$page_title = "Page d'administration";
+include(ROOT."/app/view/Includes/header.include.html");
+?>
+
+<?php if(isset($_SESSION['user']) && Admin::estAdmin($_SESSION['user']->slug)) { ?>
+
+<article class="msg-valide"><h2>Ajout réussi !</h2></article>
+
+
+<?php } else { ?>
+
+<article class="msg-erreur">Vous n'êtes pas connecté comme administrateur</article>
+
+<?php } ?>
+
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Admin/displayJeu.html b/app/view/Admin/displayJeu.html
new file mode 100644
index 0000000000000000000000000000000000000000..f280b99c440b3549cb8ef8dba39e353325f5e8d1
--- /dev/null
+++ b/app/view/Admin/displayJeu.html
@@ -0,0 +1,97 @@
+<?php
+	$page_title = "Page d'administration";
+include(ROOT."/app/view/Includes/header.include.html");
+?>
+
+<?php if(isset($_SESSION['user']) && Admin::estAdmin($_SESSION['user']->slug)) { ?>
+
+<?php
+			if(isset($_SESSION['addRequestErrCode'])) { // si message d'erreur
+				$errCode = $_SESSION['addRequestErrCode'];
+				if($errCode == 1) { // on détermine le message
+					$errMsg = '<h3>Impossible !</h3>';
+                }
+            echo '<article class="msg-erreur">'.$errMsg.'</article>'; // on affiche le message
+            unset($_SESSION['addRequestErrCode']); // on retire la variable de session
+            }
+?>
+
+
+<article>
+    <h3 class="stat-title">Jeu(x) non Validé(s)</h3>
+    <table class="jeux-preferes">
+        <?php if($this->nonValide != array()){ ?>
+        <tr>
+            <th>Logo</th>
+            <th>Nom</th>
+            <th>Min joueurs</th>
+            <th>Max joueurs</th>
+            <th>Type</th>
+            <th>Min équipe</th>
+            <th>Max équipe</th>
+        </tr>
+        <?php
+            foreach($this->nonValide as $ligne) {
+            print "
+            <tr>
+                <td><a href=\"".BASE_URL."/jeu/".$ligne['slug']."\"> <img src=\"".BASE_URL."/images/jeu/".$ligne['slug'].".jpg\" alt=\"logo de ".$ligne['nom']."\" /></a></td>
+                <td><a href=\"".BASE_URL."/jeu/".$ligne['slug']."\">".$ligne['nom']."</a></td>
+                <td><a href=\"".BASE_URL."/jeu/".$ligne['slug']."\">".$ligne['min_joueurs']."</a></td>
+                <td><a href=\"".BASE_URL."/jeu/".$ligne['slug']."\">".$ligne['max_joueurs']."</a></td>
+                <td><a href=\"".BASE_URL."/jeu/".$ligne['slug']."\">".$ligne['type']."</a></td>
+                <td><a href=\"".BASE_URL."/jeu/".$ligne['slug']."\">".$ligne['min_equipes']."</a></td>
+                <td><a href=\"".BASE_URL."/jeu/".$ligne['slug']."\">".$ligne['max_equipes']."</a></td>
+                <td><a href=\"jeu/".$ligne['slug']."/valide\"><img src=\"".BASE_URL."/images/ok.svg\" alt=\"Valider\"/></a></td>
+                <td><a href=\"jeu/".$ligne['slug']."/modif\"><img src=\"".BASE_URL."/images/modif.svg\" alt=\"Modifier\"//></a></td>
+                <td><a href=\"jeu/".$ligne['slug']."/supprime\"><img src=\"".BASE_URL."/images/cancel.svg\" /></a></td>
+            </tr>
+            ";
+            }
+        } else {
+            print "Il n'y a pas de jeu à valider.";
+        }
+        ?>
+    </table>
+
+    <h3 class="stat-title">Jeu(x) Validé(s)</h3>
+    <table class="jeux-preferes">
+        <?php if($this->Valide != array()){ ?>
+        <tr>
+            <th>Logo</th>
+            <th>Nom</th>
+            <th>Min joueurs</th>
+            <th>Max joueurs</th>
+            <th>Type</th>
+            <th>Min équipe</th>
+            <th>Max équipe</th>
+        </tr>
+        <?php
+            foreach($this->Valide as $ligne) {
+        print "
+        <tr>
+            <td><a href=\"".BASE_URL."/jeu/".$ligne['slug']."\"> <img src=\"".BASE_URL."/images/jeu/".$ligne['slug'].".jpg\" alt=\"logo de ".$ligne['nom']."\" /></a></td>
+            <td><a href=\"".BASE_URL."/jeu/".$ligne['slug']."\">".$ligne['nom']."</a></td>
+            <td><a href=\"".BASE_URL."/jeu/".$ligne['slug']."\">".$ligne['min_joueurs']."</a></td>
+            <td><a href=\"".BASE_URL."/jeu/".$ligne['slug']."\">".$ligne['max_joueurs']."</a></td>
+            <td><a href=\"".BASE_URL."/jeu/".$ligne['slug']."\">".$ligne['type']."</a></td>
+            <td><a href=\"".BASE_URL."/jeu/".$ligne['slug']."\">".$ligne['min_equipes']."</a></td>
+            <td><a href=\"".BASE_URL."/jeu/".$ligne['slug']."\">".$ligne['max_equipes']."</a></td>
+            <td><a href=\"jeu/".$ligne['slug']."/modif\"><img src=\"".BASE_URL."/images/modif.svg\" /></a></td>
+            <td><a href=\"jeu/".$ligne['slug']."/unvalide\"><img src=\"".BASE_URL."/images/cancel.svg\" /></a></td>
+        </tr>
+        ";
+        }
+        } else {
+        print "Il n'y a pas de jeu validé.";
+        }
+        ?>
+    </table>
+</article>
+
+<?php } else { ?>
+
+<article class="msg-erreur">Vous n'êtes pas connecté comme administrateur</article>'
+
+<?php } ?>
+
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Admin/displayJoueur.html b/app/view/Admin/displayJoueur.html
new file mode 100644
index 0000000000000000000000000000000000000000..68fbf4b53f1f6f3df1d14a1fa87efbf35790da75
--- /dev/null
+++ b/app/view/Admin/displayJoueur.html
@@ -0,0 +1,50 @@
+<?php
+	$page_title = "Page d'administration";
+include(ROOT."/app/view/Includes/header.include.html");
+?>
+
+<?php if(isset($_SESSION['user']) && Admin::estAdmin($_SESSION['user']->slug)) { ?>
+
+<article>
+    <h3 class="stat-title">Listes des Joueur</h3>
+    <table class="jeux-preferes">
+        <tr>
+            <th>Avatar</th>
+            <th>Pseudo</th>
+            <th>Nom</th>
+            <th>Prénom</th>
+            <th>email</th>
+        </tr>
+        <?php
+            foreach($this->joueurs as $ligne) {
+        print "
+        <tr>";
+            if($ligne->avatar) { print "
+            <td><a href=\"".BASE_URL."/profil/".$ligne->slug."\"> <img src=\"".BASE_URL."/images/avatar/".$ligne->slug.".jpg\" alt=\"avatar de ".$ligne->pseudo."\" /></a></td>
+            "; } else { print "
+            <td><a href=\"".BASE_URL."/profil/".$ligne->slug."\"> <img src=\"".BASE_URL."/images/profil_42.jpg\" alt=\"avatar de ".$ligne->pseudo."\" /></a></td>
+            "; }
+            print "
+            <td><a href=\"".BASE_URL."/profil/".$ligne->slug."\">".$ligne->pseudo."</a></td>
+            <td><a href=\"".BASE_URL."/profil/".$ligne->slug."\">".$ligne->nom."</a></td>
+            <td><a href=\"".BASE_URL."/profil/".$ligne->slug."\">".$ligne->prenom."</a></td>
+            <td><a href=\"mailto:".$ligne->email."\">".$ligne->email."</a></td>
+            <td><a href=\"joueur/".$ligne->slug."/supprime\"><img src=\"".BASE_URL."/images/cancel.svg\" /></a></td>
+        </tr>
+        ";
+        }
+        ?>
+    </table>
+</article>
+
+
+
+
+
+<?php } else { ?>
+
+<article class="msg-erreur">Vous n'êtes pas connecté comme administrateur</article>'
+
+<?php } ?>
+
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
\ No newline at end of file
diff --git a/app/view/Admin/displayListPartie.html b/app/view/Admin/displayListPartie.html
new file mode 100644
index 0000000000000000000000000000000000000000..b3c0d1c650a5b39c764a51b48447663be986d50a
--- /dev/null
+++ b/app/view/Admin/displayListPartie.html
@@ -0,0 +1,42 @@
+<?php
+	$page_title = "Page d'administration";
+include(ROOT."/app/view/Includes/header.include.html");
+?>
+
+<?php if(isset($_SESSION['user']) && Admin::estAdmin($_SESSION['user']->slug)) { ?>
+
+<article>
+    <h3 class="stat-title">Listes des parties</h3>
+    <table class="jeux-preferes">
+        <tr>
+            <th>Image</th>
+            <th>Jeu</th>
+            <th>Date</th>
+        </tr>
+        <?php
+            foreach($this->listPartie as $ligne) {
+        print "
+        <tr>
+            <td><a href=\"".BASE_URL."/jeu/".$ligne['slug']."\"> <img src=\"".BASE_URL."/images/jeu/".$ligne['slug'].".jpg\" alt=\"image de ".$ligne['jeu']."\" /></a></td>
+            <td><a href=\"".BASE_URL."/jeu/".$ligne['slug']."\">".$ligne['nom']."</a></td>
+            <td><a href=\"".BASE_URL."/admin/partie/".$ligne['slug']."\">".$ligne['date']."</a></td>
+            <td><a href=\"partie/".$ligne['id']."/modifinit\"><img src=\"".BASE_URL."/images/modif.svg\" alt=\"Modifier\"//></a></td>
+            <td><a href=\"partie/".$ligne['id']."/supprime\"><img src=\"".BASE_URL."/images/cancel.svg\" /></a></td>
+        </tr>
+        ";
+        }
+        ?>
+    </table>
+</article>
+
+
+
+
+
+<?php } else { ?>
+
+<article class="msg-erreur">Vous n'êtes pas connecté comme administrateur</article>'
+
+<?php } ?>
+
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
\ No newline at end of file
diff --git a/app/view/Admin/displayModifJeu.html b/app/view/Admin/displayModifJeu.html
new file mode 100644
index 0000000000000000000000000000000000000000..c7b499a78405837f53daf74152f51da7d7ce8c48
--- /dev/null
+++ b/app/view/Admin/displayModifJeu.html
@@ -0,0 +1,82 @@
+<?php
+	$page_title = "Page d'administration";
+include(ROOT."/app/view/Includes/header.include.html");
+?>
+
+<?php if(isset($_SESSION['user']) && Admin::estAdmin($_SESSION['user']->slug)) { ?>
+
+<?php
+			if(isset($_SESSION['modifJeuErrCode'])) { // si message d'erreur
+				$errCode = $_SESSION['modifJeuErrCode'];
+				if($errCode == 1) { // on détermine le message
+					$errMsg = '<h3>Erreur une variable est manquante</h3>';
+                } elseif($errCode == 2) {
+                    $errMsg = '<h3>Image manquante</h3>';
+                } elseif($errCode == 5) {
+                    $errMsg = '<h3>Problème sur l\'image</h3>';
+                } elseif($errCode == 6) {
+                    $errMsg = '<h3>Le fichier n\'est pas une image</h3>';
+                } elseif($errCode == 7) {
+                    $errMsg = '<h3>L\'image est trop grande</h3>';
+                }
+                echo '<article class="msg-erreur">'.$errMsg.'</article>'; // on affiche le message
+                unset($_SESSION['modifJeuErrCode']); // on retire la variable de session
+            }
+?>
+
+<article>
+    <h2>Modifcation de <?php print $this->jeu->nom; ?></h2>
+    <div class="addjeu-form">
+        <form method="post" action="modif/verify" enctype="multipart/form-data">
+            <label for="nom">Nom du jeu :</label> <input type="text" name="nom" required="" id="nom" disabled value="<?php print $this->jeu->nom; ?>"/> <br/>
+            <label for="description">Description :</label> <textarea name="description" id="description" ><?php print $this->jeu->description; ?></textarea> <br/>
+            <label for="min_joueurs">Joueurs minimum*:</label> <input type="number" name="min_joueurs" required="" id="min_joueurs" value="<?php print $this->jeu->min_joueurs; ?>"/> <br/>
+            <label for="max_joueurs">Joueurs maximum :</label> <input type="number" name="max_joueurs" id="max_joueurs" value="<?php print $this->jeu->max_joueurs; ?>"/> <br/>
+            <label for="type">Type de jeu*:</label>
+                <select name="type" required="" id="type" >
+                    <?php if($this->jeu->type == "duels") {
+                        print '
+                            <option value="duels" selected="selected">Duels</option>
+                            <option value="equipes">Equipes</option>
+                        ';
+                        } else {
+                        print '
+                            <option value="duels">Duels</option>
+                            <option value="equipes" selected="selected">Equipes</option>
+                        ';
+                        }
+                    ?>
+                </select><br/>
+            <label for="min_equipes">Nombre d'équipes minimum :</label> <input type="number" name="min_equipes" id="min_equipes" value="<?php print $this->jeu->min_equipes; ?>"/> <br/>
+            <label for="max_equipes">Nombre d'équipes maximum :</label> <input type="number" name="max_equipes" id="max_equipes" value="<?php print $this->jeu->max_equipes; ?>"/> <br/>
+            <label for="type_scores">Type de classement*:</label>
+                <select name="type_scores" required="" id="type_scores" >
+                    <?php if($this->jeu->type == "classement") {
+                        print '
+                            <option value="classement" selected="selected">Classement</option>
+                            <option value="scores">Scores</option>
+                        ';
+                        } else {
+                        print '
+                            <option value="classement">Classement</option>
+                            <option value="scores" selected="selected">Scores</option>
+                        ';
+                        }
+                    ?>
+                </select><br/>
+            <label for="image">Image du jeu: </label>	<input type="file" name="image" id="image" /><br/>
+            <div class="submit">
+                <input type="reset" name="reset" value="Réinitialiser">
+                <input type="submit" name="submit" value="Modifier">
+            </div>
+        </form>
+    </div>
+</article>
+
+<?php } else { ?>
+
+<article class="msg-erreur">Vous n'êtes pas connecté comme administrateur</article>'
+
+<?php } ?>
+
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Admin/displayModifJeuOK.html b/app/view/Admin/displayModifJeuOK.html
new file mode 100644
index 0000000000000000000000000000000000000000..43e5476ba5afdf21178f247dc382974f8fbd34ac
--- /dev/null
+++ b/app/view/Admin/displayModifJeuOK.html
@@ -0,0 +1,17 @@
+<?php
+	$page_title = "Page d'administration";
+include(ROOT."/app/view/Includes/header.include.html");
+?>
+
+<?php if(isset($_SESSION['user']) && Admin::estAdmin($_SESSION['user']->slug)) { ?>
+
+<article class="msg-valide"><h2>Modification réussie !</h2></article>
+
+
+<?php } else { ?>
+
+<article class="msg-erreur">Vous n'êtes pas connecté comme administrateur</article>
+
+<?php } ?>
+
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Admin/displayModifPartieOK.html b/app/view/Admin/displayModifPartieOK.html
new file mode 100644
index 0000000000000000000000000000000000000000..38ba0f326b8c375c056970f7947d688ce42abaee
--- /dev/null
+++ b/app/view/Admin/displayModifPartieOK.html
@@ -0,0 +1,17 @@
+<?php
+	$page_title = "Page d'administration";
+include(ROOT."/app/view/Includes/header.include.html");
+?>
+
+<?php if(isset($_SESSION['user']) && Admin::estAdmin($_SESSION['user']->slug)) { ?>
+
+<article class="msg-valide"><h2>Modifiction réussie !</h2></article>
+
+
+<?php } else { ?>
+
+<article class="msg-erreur">Vous n'êtes pas connecté comme administrateur</article>
+
+<?php } ?>
+
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Admin/displayModifPartieStep1.html b/app/view/Admin/displayModifPartieStep1.html
new file mode 100644
index 0000000000000000000000000000000000000000..5a76afa8f06e1f842d1fced02b4eb3e7716f84c9
--- /dev/null
+++ b/app/view/Admin/displayModifPartieStep1.html
@@ -0,0 +1,51 @@
+<?php 
+	$page_title = "Formulaire d'ajout de partie"; 
+	include(ROOT."/app/view/Includes/header.include.html");
+?>
+<?php $jeuactuel = $this->jeuactuel ?>
+<?php	if (!is_null($this->errMsg)){ ?>
+<article class="msg-erreur"><?php echo $this->errMsg;?></article>
+<?php } ?>
+<article>
+    <h2>Formulaire d'ajout de partie</h2>
+    <h3>Sélection des joueurs</h3>
+    <div class="addjeu-form">
+
+        <h4>Jeu : <?php echo $jeuactuel->nom; ?></h4>
+        <h4>De <?php echo $jeuactuel->min_joueurs; ?> à <?php echo $this->max; ?> joueurs</h4>
+        <form method="post" action="addjoueurs1">
+            <label for="joueur">Ajouter un joueur (pseudo) :</label>
+            <input type="text" id="joueur" name="joueur"/>
+            <input type="submit" name="submit" value="ajouter un joueur"/>
+        </form>
+        <?php if (isset($_SESSION['joueurs_select'])) { ?>
+        <h5>Joueurs actuellement sélectionnés :</h5>
+        <ul>
+            <?php foreach($_SESSION['joueurs_select'] as $k => $j){ ?>
+            <li>
+                <?php echo $j->pseudo; ?>
+
+
+                <form method="post" action="deljoueurs1">
+                    <input type="hidden" value="<?php echo $k;?>" name="joueurdel">
+                    <input type="submit" name="submit" value="supprimer ce joueur"/>
+                </form>
+            </li>
+            <?php } ?>
+            <?php } ?>
+        </ul>
+        <div class="submit">
+            <form method="post" action="clearstep1">
+                <input type="submit" name="submit" value="Remise à zéro"/>
+            </form>
+            <form method="post" action="../modif">
+                <input type="submit" name="submit" value="Réinitialiser"/>
+            </form>
+            <form method="post" action="verifystep1">
+                <input type="submit" name="submit" value="Étape suivante"/>
+            </form>
+        </div>
+    </div>
+</article>
+
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Admin/displayModifPartieStep2.html b/app/view/Admin/displayModifPartieStep2.html
new file mode 100644
index 0000000000000000000000000000000000000000..7ec88e8071688099c6bb39f11578f7a5e13f5e68
--- /dev/null
+++ b/app/view/Admin/displayModifPartieStep2.html
@@ -0,0 +1,47 @@
+<?php 
+	$page_title = "Formulaire d'ajout de partie"; 
+	include(ROOT."/app/view/Includes/header.include.html"); 
+?>
+<?php $jeuactuel = $this->jeuactuel ?>
+<?php	if (!is_null($this->errMsg)){ ?>
+<article class="msg-erreur"><?php echo $this->errMsg;?></article>
+<?php } ?>
+<article>
+    <h2>Formulaire d'ajout de partie</h2>
+    <h3>Entrée des scores</h3>
+    <div class="addjeu-form">
+        <form method="post" action="verifystep2">
+            Jeu : <?php echo $jeuactuel->nom; ?><br/>
+            Joueurs :
+            <ul>
+                <?php foreach($this->listejactuel as $joueur){ ?>
+                <li><?php echo $joueur->pseudo; ?>
+                    <?php if($jeuactuel->type_scores == 'scores'){ ?>
+                    Score obtenu : <input type="text" title="score" required="" name="scores[]" value="<?php echo isset($this->scorePartie[$joueur->slug]) ? $this->scorePartie[$joueur->slug] : "" ; ?>"/>
+                    <?php } else { ?>
+                    Classement obtenu : <select title="score" required="" name="scores[]">
+                        <?php for ($j=1;$j<=count($this->listejactuel);$j++){ ?>
+                        <option value="<?php echo count($this->listejactuel)-$j;?>" <?php echo ((isset($this->classement[$joueur->slug]) && $this->classement[$joueur->slug] == $j)? "selected" : "") ?>><?php echo $j;?></option>
+
+                        <?php } ?>
+                    </select>
+                    <?php } ?>
+                </li>
+                <?php } ?>
+            </ul>
+            <br/>
+            <div class="submit">
+
+                <input type="reset" name="reset" value="Réinitialiser"/>
+                <input type="submit" name="submit" value="Modifier"/>
+            </div>
+        </form>
+        <div class="submit">
+            <form action="step1">
+                <input type="submit" name="submit" value="Étape précédente"/>
+            </form>
+        </div>
+    </div>
+</article>
+
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Admin/displayModifPartieStepe1.html b/app/view/Admin/displayModifPartieStepe1.html
new file mode 100644
index 0000000000000000000000000000000000000000..dbcea70e3f31a163a8e59b7ec18fe7f3fb94913b
--- /dev/null
+++ b/app/view/Admin/displayModifPartieStepe1.html
@@ -0,0 +1,65 @@
+<?php 
+	$page_title = "Formulaire de Modification de partie";
+	include(ROOT."/app/view/Includes/header.include.html");
+?>
+<?php $jeuactuel = $this->jeuactuel ?>
+<?php	if (!is_null($this->errMsg)){ ?>
+<article class="msg-erreur"><?php echo $this->errMsg;?></article>
+<?php } ?>
+<article>
+    <h2>Formulaire de Modifaction de partie</h2>
+    <h3>Sélection des joueurs</h3>
+    <div class="addjeu-form">
+
+        <h4>Jeu : <?php echo $jeuactuel->nom; ?></h4>
+        <h4>De <?php echo $jeuactuel->min_equipes; ?> à <?php echo $this->maxe; ?>équipes (de <?php echo $jeuactuel->min_joueurs; ?> à <?php echo $this->maxj; ?> joueurs)</h4>
+
+        <?php foreach($this->equipes as $ke => $e) { ?>
+        <h5>Équipe <?php echo $ke+1; ?> </h5>
+        <ul>
+            <?php
+            foreach($e as $k => $j){ ?>
+            <li>
+                <?php echo $j->pseudo; ?>
+                <form method="post" action="deljoueurs1">
+                    <input type="hidden" value="<?php echo $k;?>" name="joueurdel"/>
+                    <input type="hidden" value="<?php echo $ke;?>" name="equipejdel"/>
+                    <input type="submit" name="submit" value="supprimer ce joueur"/>
+                </form>
+
+            </li>
+            <?php } ?>
+            <form method="post" action="addjoueurs1">
+                <label for="joueur">Ajouter un joueur à l'équipe <?php echo $ke+1;?> :</label>
+                <input type="text" id="joueur" name="joueur"/>
+                <input type="hidden" value="<?php echo $ke;?>" name="equipejadd" id="equipejadd"/>
+                <input type="submit" name="submit" value="Ajouter un joueur"/>
+            </form>
+            <form method="post" action="delequipe">
+                <input type="hidden" value="<?php echo $ke;?>" name="equipe"/>
+                <input type="submit" name="submit" value="Supprimer l'équipe <?php echo $ke+1;?>"/>
+            </form>
+        </ul>
+        <?php } ?>
+        <div class="submit">
+            <form method="post" action="addequipe">
+                <input type="submit" name="submit" value="Ajouter une équipe"/>
+            </form>
+
+            <form method="post" action="clearstep1">
+                <input type="submit" name="submit" value="Mise à zéro"/>
+            </form>
+            <form method="post" action="../modif">
+                <input type="submit" name="submit" value="Réinitialisation"/>
+            </form>
+            <form method="post" action="verifystep1">
+
+
+                <input type="submit" name="submit" value="Étape suivante"/>
+
+            </form>
+        </div>
+    </div>
+</article>
+
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Admin/displayModifPartieStepe2.html b/app/view/Admin/displayModifPartieStepe2.html
new file mode 100644
index 0000000000000000000000000000000000000000..6ea40056a57e7bea44b475fdf544c2ef71b781cd
--- /dev/null
+++ b/app/view/Admin/displayModifPartieStepe2.html
@@ -0,0 +1,49 @@
+<?php 
+	$page_title = "Formulaire d'ajout de partie"; 
+	include(ROOT."/app/view/Includes/header.include.html"); 
+?>
+<?php $jeuactuel = $this->jeuactuel ?>
+<?php	if (!is_null($this->errMsg)){ ?>
+<article class="msg-erreur"><?php echo $this->errMsg;?></article>
+<?php } ?>
+<article>
+    <h2>Formulaire d'ajout de partie</h2>
+    <h3>Entrée des scores</h3>
+    <div class="addjeu-form">
+        <form method="post" action="verifystep2">
+            Jeu : <?php echo $jeuactuel->nom; ?><br/>
+            Équipes :<br/>
+            <?php foreach($this->equipes as $ke => $e) { ?>
+            <h4>Équipe <?php echo $ke+1; ?> </h4>
+            <ul>
+                <?php
+                    foreach($e as $k => $j){ ?>
+                <li>
+                    <?php echo $j->pseudo;?>
+                </li>
+                <?php } ?>
+            </ul>
+            <?php if($jeuactuel->type_scores == 'scores'){ print_r($this->scorePartie);?>
+                Score obtenu : <input type="text" title="score" required="" name="scores[]" value="<?php echo isset($this->scorePartie[$e[0]->slug]) ? $this->scorePartie[$e[0]->slug] : "" ; ?>"/>
+            <?php } else { ?>
+                Classement obtenu : <select title="score" required="" name="scores[]">
+            <?php for ($j=1;$j<= count($this->equipes);$j++){ ?>
+                <option value="<?php echo count($this->equipes)-$j;?>" <?php echo ((isset($this->classement[$e[0]->slug]) && $this->classement[$e[0]->slug] == $j)? "selected" : "") ?>><?php echo $j;?></option>
+            <?php } ?>
+        </select>
+            <?php } ?>
+            <?php } ?>
+            <div class="submit">
+                <input type="reset" name="reset" value="Réinitialiser"/>
+                <input type="submit" name="submit" value="Modifier"/>
+            </div>
+        </form>
+        <div class="submit">
+            <form action="../add_partie/stepe1">
+                <input type="submit" name="submit" value="Étape précédente"/>
+            </form>
+        </div>
+    </div>
+</article>
+
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Admin/displaySupprimeJeuOK.html b/app/view/Admin/displaySupprimeJeuOK.html
new file mode 100644
index 0000000000000000000000000000000000000000..fb721522c37496cced358d77ad7ee9a0ce26b1a6
--- /dev/null
+++ b/app/view/Admin/displaySupprimeJeuOK.html
@@ -0,0 +1,17 @@
+<?php
+	$page_title = "Page d'administration";
+include(ROOT."/app/view/Includes/header.include.html");
+?>
+
+<?php if(isset($_SESSION['user']) && Admin::estAdmin($_SESSION['user']->slug)) { ?>
+
+<article class="msg-valide"><h2>Suppression réussie !</h2></article>
+
+
+<?php } else { ?>
+
+<article class="msg-erreur">Vous n'êtes pas connecté comme administrateur</article>
+
+<?php } ?>
+
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Admin/displaySupprimeJoueurOK.html b/app/view/Admin/displaySupprimeJoueurOK.html
new file mode 100644
index 0000000000000000000000000000000000000000..fb721522c37496cced358d77ad7ee9a0ce26b1a6
--- /dev/null
+++ b/app/view/Admin/displaySupprimeJoueurOK.html
@@ -0,0 +1,17 @@
+<?php
+	$page_title = "Page d'administration";
+include(ROOT."/app/view/Includes/header.include.html");
+?>
+
+<?php if(isset($_SESSION['user']) && Admin::estAdmin($_SESSION['user']->slug)) { ?>
+
+<article class="msg-valide"><h2>Suppression réussie !</h2></article>
+
+
+<?php } else { ?>
+
+<article class="msg-erreur">Vous n'êtes pas connecté comme administrateur</article>
+
+<?php } ?>
+
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Admin/displayUnAcceptJeuOK.html b/app/view/Admin/displayUnAcceptJeuOK.html
new file mode 100644
index 0000000000000000000000000000000000000000..d4f0a3005a5853bbadf793b9cfcf3dffb339b8b5
--- /dev/null
+++ b/app/view/Admin/displayUnAcceptJeuOK.html
@@ -0,0 +1,17 @@
+<?php
+	$page_title = "Page d'administration";
+include(ROOT."/app/view/Includes/header.include.html");
+?>
+
+<?php if(isset($_SESSION['user']) && Admin::estAdmin($_SESSION['user']->slug)) { ?>
+
+<article class="msg-valide"><h2>Rejet réussi !</h2></article>
+
+
+<?php } else { ?>
+
+<article class="msg-erreur">Vous n'êtes pas connecté comme administrateur</article>
+
+<?php } ?>
+
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Admin/displaysupprPartieOK.html b/app/view/Admin/displaysupprPartieOK.html
new file mode 100644
index 0000000000000000000000000000000000000000..fb721522c37496cced358d77ad7ee9a0ce26b1a6
--- /dev/null
+++ b/app/view/Admin/displaysupprPartieOK.html
@@ -0,0 +1,17 @@
+<?php
+	$page_title = "Page d'administration";
+include(ROOT."/app/view/Includes/header.include.html");
+?>
+
+<?php if(isset($_SESSION['user']) && Admin::estAdmin($_SESSION['user']->slug)) { ?>
+
+<article class="msg-valide"><h2>Suppression réussie !</h2></article>
+
+
+<?php } else { ?>
+
+<article class="msg-erreur">Vous n'êtes pas connecté comme administrateur</article>
+
+<?php } ?>
+
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Classement/display.html b/app/view/Classement/display.html
new file mode 100644
index 0000000000000000000000000000000000000000..fc1f21e4858dd4b530c46fea313739529543ed7f
--- /dev/null
+++ b/app/view/Classement/display.html
@@ -0,0 +1,26 @@
+<?php 
+	$page_title = "Classement ".$this->lejeu; 
+	include(ROOT."/app/view/Includes/header.include.html");
+?>
+
+	<article>
+		<h1>Classement global sur <em>Classements ludiques</em></h1>
+
+			<table class="classement-table">
+				<tr><th>N°</th><th colspan="2">Joueur</th><th>Score</th></tr>
+				<?php foreach($this->classement as $ligne) { ?>
+				<tr>
+					<td>"<?php echo $ligne['classement']; ?>"</td>
+					<td><a href="../profil/<?php echo $ligne['slug'];?>"><img src="<?php echo $ligne['avatar'];?>" alt="Image de profil de <?php echo $ligne['pseudo'];?>" class="classement-profil-img"></a></td>
+					<td><a href="../profil/<?php echo $ligne['slug'];?>"> <?php echo $ligne['pseudo']; ?> </a></td>
+					<td><?php echo $ligne['score'] ; ?></td>
+				</tr>
+				<?php
+                }
+                ?>
+			</table>
+
+		
+	</article>
+	
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Connexion/displayDisconnect.html b/app/view/Connexion/displayDisconnect.html
new file mode 100644
index 0000000000000000000000000000000000000000..6d91f70f8db5f606bf90031c1515b32215d4270e
--- /dev/null
+++ b/app/view/Connexion/displayDisconnect.html
@@ -0,0 +1,11 @@
+<?php 
+	$page_title = "Connexion réussie"; 
+	include(ROOT."/app/view/Includes/header.include.html"); 
+?>
+
+	<article class="msg-valide"><h2>Vous êtes à présent déconnecté !</h2></article>
+	<article>
+		<p>Revenez nous voir bientôt. :)</p>
+	</article>
+	
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Connexion/displayForm.html b/app/view/Connexion/displayForm.html
new file mode 100644
index 0000000000000000000000000000000000000000..637c1ec02b5be0a21956ae53416823ed610317fb
--- /dev/null
+++ b/app/view/Connexion/displayForm.html
@@ -0,0 +1,36 @@
+<?php 
+	// session déjà lancée dans le contrôleur
+	
+	if(isset($_SESSION['connected']) && $_SESSION['connected'] == true) {
+		header('Location:'.BASE_URL);
+	}
+	
+	$page_title = "Formulaire de connexion"; 
+	include(ROOT."/app/view/Includes/header.include.html");
+?>
+
+
+<?php
+if(!is_null($this->errMsg)) { 
+?>
+	<article class="msg-erreur"><?php echo $this->errMsg;?></article>
+<?php 
+} 
+?>
+	
+    <article>
+        <h2>Formulaire de connexion</h2>
+        <div class="connexion-form">
+        <form  method="post" action="connexion/verify">
+            <label for="login">Login : </label><input type="text" name="login" id="login" /><br/>
+			<label for="password">Password : </label><input type="password" name="password" id="password" /><br/>
+            <input type="checkbox" id="stayC" name="stayC" value="checket"><label for="stayC">Rester connecté</label><br />
+			<div class="submit">
+				<input type="reset" name="reset" value="Réinitialiser">
+				<input type="submit" name="submit" value="Se connecter">
+			</div>
+        </form>
+        </div>
+    </article>
+
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Connexion/displayValid.html b/app/view/Connexion/displayValid.html
new file mode 100644
index 0000000000000000000000000000000000000000..84ee2b7e9b03c8f81444288addf24e7538c213c7
--- /dev/null
+++ b/app/view/Connexion/displayValid.html
@@ -0,0 +1,11 @@
+<?php 
+	$page_title = "Connexion réussie"; 
+	include(ROOT."/app/view/Includes/header.include.html"); 
+?>
+
+	<article class="msg-valide"><h2>Vous êtes connecté !</h2></article>
+	<article>
+		<p>Vous pouvez à présent profiter de toutes les fonctionnalités du site. :)</p>
+	</article>
+	
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Contact/displayForm.html b/app/view/Contact/displayForm.html
new file mode 100644
index 0000000000000000000000000000000000000000..7d57957fd42c9eccf9f702229015b98742c0122c
--- /dev/null
+++ b/app/view/Contact/displayForm.html
@@ -0,0 +1,80 @@
+<?php 
+	$page_title = "Formulaire de contact"; 
+	include(ROOT."/app/view/Includes/header.include.html");
+?>
+
+<?php
+if(!is_null($this->errMsg)) { 
+?>
+	<article class="msg-erreur"><?php echo $this->errMsg;?></article>
+<?php 
+}
+?>
+
+	
+    <article>
+        <h2>Formulaire de contact</h2>
+        <div class="inscription-form">
+			<form  method="post" action="contact/send"  enctype="multipart/form-data" onsubmit="return checkForm();">
+				
+				<div class="form-line">
+					<div class="validation-container-left">
+						<label for="pseudo">Pseudo : </label>
+						<input type="text" name="pseudo" id="pseudo" />
+					</div>
+				</div>
+				<div class="form-line">
+					<div class="validation-container-left">
+						<label for="nom">Nom* : </label>
+						<input type="text" required="" name="nom" id="nom" />
+					</div>
+					<div class="validation-container">
+						<span id="rsp_nom" class="validation-container-content"></span>
+						<input type="checkbox" disabled name="valid_nom" class="validation-checkbox" />
+					</div>
+				</div>
+				<div class="form-line">
+					<div class="validation-container-left">
+						<label for="prenom">Prénom* : </label>
+						<input type="text" required="" name="prenom" id="prenom" />
+					</div>
+					<div class="validation-container">
+						<span id="rsp_prenom" class="validation-container-content"></span>
+						<input type="checkbox" disabled name="valid_prenom" class="validation-checkbox" />
+					</div>
+				</div>
+				<div class="form-line">
+					<div class="validation-container-left">
+						<label for="email">Adresse e-mail* : </label>
+						<input type="email" required="" name="email" id="email" onchange="if(this.value != '') checkEmail(this.value, this.id);" />
+					</div>
+					<div class="validation-container">
+						<span id="rsp_email" class="validation-container-content"></span>
+						<input type="checkbox" disabled name="valid_email" class="validation-checkbox" />
+					</div>
+				</div>
+				<div class="form-line">
+					<div class="validation-container-left">
+						<label for="description">Votre message* : </label>
+						<textarea required="" name="message" id="message"></textarea>
+					</div>
+					<div class="validation-container">
+						<span id="rsp_message" class="validation-container-content"></span>
+						<input type="checkbox" disabled name="valid_message" class="validation-checkbox" />
+					</div>
+				</div>
+				<div class="submit">
+					<input type="reset" name="reset" value="Réinitialiser">
+					<input type="submit" name="submit" value="Envoyer">
+				</div>
+			</form>
+        </div>
+    </article>
+	
+	
+	
+	<script type="text/javascript" src="<?php echo BASE_URL; ?>/js/jquery.min.js"></script>
+	<script type="text/javascript" src="<?php echo BASE_URL; ?>/js/verif_form_contact.js"></script>
+	
+	
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Contact/displayValid.html b/app/view/Contact/displayValid.html
new file mode 100644
index 0000000000000000000000000000000000000000..d919b943c6e438cb8b89b27f49a2319f3430d939
--- /dev/null
+++ b/app/view/Contact/displayValid.html
@@ -0,0 +1,11 @@
+<?php 
+	$page_title = "Message envoyé"; 
+	include(ROOT."/app/view/Includes/header.include.html");
+?>
+
+	<article class="msg-valide"><h2>Votre message a été envoyé !</h2></article>
+	<article>
+		<p>Vous pouvez continuer à naviguer sur notre site. :)</p>
+	</article>
+	
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Error/error404.html b/app/view/Error/error404.html
new file mode 100644
index 0000000000000000000000000000000000000000..b5cda4d17d55d5816c792eccfc9208b05ad3b139
--- /dev/null
+++ b/app/view/Error/error404.html
@@ -0,0 +1,13 @@
+<?php 
+	$page_title = "Erreur 404"; 
+	include(ROOT."/app/view/Includes/header.include.html"); 
+?>
+
+	<article class="msg-erreur">
+		<h2>Erreur 404</h2>
+	</article>
+	<article>
+		<h3>La page que vous demandez est inaccessible, ou n'existe pas (ou plus...)</h3>
+	</article>
+
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Includes/footer.include.html b/app/view/Includes/footer.include.html
new file mode 100644
index 0000000000000000000000000000000000000000..b131881727723f6426dc8152533bd3bfe3d2dfd9
--- /dev/null
+++ b/app/view/Includes/footer.include.html
@@ -0,0 +1,12 @@
+	
+	</div>
+
+    <footer>
+        <a href="#top">Haut de page</a>
+        <div id="copyright">
+            &copy; Vincent Bochet, Romain Drouin, Eliah Rebstock & Guillaume Sézille
+        </div>
+    </footer>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/app/view/Includes/header.include.html b/app/view/Includes/header.include.html
new file mode 100644
index 0000000000000000000000000000000000000000..eaeec7f768c66a812a7eb26e533af310a57aa012
--- /dev/null
+++ b/app/view/Includes/header.include.html
@@ -0,0 +1,66 @@
+<?php 
+if(!isset($_SESSION)) { // si 
+	session_start(); 
+}
+?>
+<!DOCTYPE html>
+<html lang="fr">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title><?php echo $page_title; ?></title>
+    <link rel="stylesheet" href="<?php echo BASE_URL; ?>/css/style.css">
+    <link rel="stylesheet" href="<?php echo BASE_URL; ?>/css/jquery.auto-complete.css">
+    <link rel="stylesheet" href="<?php echo BASE_URL; ?>/css/pure.min.css">
+    <link href='https://fonts.googleapis.com/css?family=Work+Sans' rel='stylesheet' type='text/css'>
+	
+	
+	<script>var BASE_URL = 'http://localhost/projet-web-2016/www';</script>
+	<script src="<?php echo BASE_URL; ?>/js/jquery.min.js"></script>
+	<script src="<?php echo BASE_URL; ?>/js/jquery.auto-complete.min.js"></script>
+	<script src="<?php echo BASE_URL; ?>/js/autocompletion_form_jeux.js"></script>
+</head>
+<body onload="loadJsonJeux();">
+<div class="wrapper">
+    <header class="row">
+		<div class="header row">
+			<div class="col-2 col-m-2">
+				<a href="<?php echo BASE_URL; ?>">
+					<img class="logo-image" src="<?php echo BASE_URL; ?>/images/logo.png" alt="logo du site web"/>
+				</a>
+			</div>
+
+			<div class="search-bar-conteneur col-3 col-m-3">
+				<form method="post" action="<?php echo BASE_URL; ?>/jeu" name="nomJeu" class="pure-form">
+					<input type="text" class="search-bar" id="rechercheJeu" name="rechercheJeu" placeholder="Rechercher un jeu..." /><input type="submit" class="search-button" value=""/>
+				</form>
+				
+			</div>
+
+			<?php 
+			if(isset($_SESSION['connected']) && $_SESSION['connected'] == true) {
+			?>
+			<div class="col-3 space col-m-1"></div>
+			<div class="connexion col-4 col-m-6">
+				<div class="signin"><a class="connexion-link" href="<?php echo BASE_URL; ?>/profil/<?php echo $_SESSION['user']->slug; ?>"><?php echo $_SESSION['user']->pseudo; ?></a></div>
+				<div class="login"><a class="connexion-link" href="<?php echo BASE_URL; ?>/deconnexion">Déconnexion</a></div>
+			</div>
+			<?php 
+			}
+			else { 
+			?>
+			<div class="col-4 space col-m-1"></div>
+			<div class="connexion col-3 col-m-6">
+				<div class="signin"><a class="connexion-link" href="<?php echo BASE_URL; ?>/inscription">Inscription</a></div>
+				<div class="login"><a class="connexion-link" href="<?php echo BASE_URL; ?>/connexion">Connexion</a></div>
+			</div>
+			<?php 
+			} 
+			?>
+		</div>
+		
+		<?php include(ROOT."/app/view/Includes/menu.include.html"); ?>
+    </header>
+	
+	
+	<div class="main" id="top">
diff --git a/app/view/Includes/menu.include.html b/app/view/Includes/menu.include.html
new file mode 100644
index 0000000000000000000000000000000000000000..24239666bc44d0fa1c8538acce022018dd0c0c3b
--- /dev/null
+++ b/app/view/Includes/menu.include.html
@@ -0,0 +1,15 @@
+    <nav class="row">
+		<ul class="row">
+			<div class="space col-1 col-m-1"></div>
+			<a href="<?php echo BASE_URL."/listejeux";?>">
+				<li class="<?php if($page_title == "Liste des jeux") echo "actif "; ?>col-3 col-m-3">La liste de nos jeux</li>
+			</a>
+			<a href="<?php echo BASE_URL."/classement/global";?>">
+				<li class="<?php if($page_title == "Classement général") echo "actif "; ?>col-3 col-m-3">Le classement général</li>
+			</a>
+			<a href="<?php echo BASE_URL."/contact";?>">
+				<li class="<?php if($page_title == "Contact") echo "actif "; ?>col-3 col-m-3">Nous contacter</li>
+			</a>
+			<div class="space col-1 col-m-1"></div>
+		</ul>
+    </nav>
diff --git a/app/view/Index/display.html b/app/view/Index/display.html
new file mode 100644
index 0000000000000000000000000000000000000000..87a7ff076c59eb21c78dd4e0d07cbc49872a3400
--- /dev/null
+++ b/app/view/Index/display.html
@@ -0,0 +1,73 @@
+<?php 
+	$page_title = "Classements ludiques"; 
+	include(ROOT."/app/view/Includes/header.include.html"); 
+?>
+
+
+	<article class="surtitre"><h2><em>Classements ludiques</em>, pour vous affronter sur vos jeux préférés !</h2></article>
+	<article>
+        <div class="col-6 stat-block">
+            <h3 class="stat-title">Jeux les plus joués sur <em>Classements ludiques</em></h3>
+            <table class="jeux-preferes">
+				<?php 
+				foreach($this->most_played as $jeu) {
+				?>
+			    <tr>
+					<td><a href="<?php echo BASE_URL; ?>/jeu/<?php echo $jeu['slug']; ?>"><img src="<?php echo BASE_URL; ?>/images/jeu/<?php echo $jeu['slug']; ?>.jpg" alt="logo jeu <?php echo $jeu['nom']; ?>" /></a></td>
+					<td><a href="<?php echo BASE_URL; ?>/jeu/<?php echo $jeu['slug']; ?>"><?php echo $jeu['nom']; ?></a></td>
+					<td><?php echo $jeu['parties']; ?>x</td>
+				</tr>
+				<?php 
+				} 
+				?>
+				<tr><td colspan=3><a href="<?php echo BASE_URL; ?>/listejeux">Voir plus de jeux</a></td></tr>
+            </table>
+        </div>
+
+        <div class="col-6">
+            <h3 class="stat-title">Dernier inscrit :</h3>
+			<aside class="profil-image"><a href="<?php echo BASE_URL; ?>/profil/<?php echo $this->last_member->slug; ?>">
+				<img src="<?php echo BASE_URL; ?>/images/profil_42.jpg" alt="Photo de profil de phoenix" />
+                </a>
+			</aside>
+			<ul class="col-4 pref">
+				<li><a href="<?php echo BASE_URL; ?>/profil/<?php echo $this->last_member->slug; ?>">
+                    <?php echo $this->last_member->prenom.' '.$this->last_member->nom; ?></a>
+                </li>
+
+			</ul>
+			
+        </div>
+
+        <div class="col-6">
+            <h3 class="stat-title">Nombre d'inscrit sur <em>Classements ludiques</em></h3>
+			<blockquote class="stat-title"><?php echo $this->nb_members; ?></blockquote>
+        </div>
+
+
+
+		<div class="row">
+		<?php 
+		if(isset($_SESSION['connected']) && $_SESSION['connected'] == true) {
+		?>
+			<h2 class="stat-title">Vous êtes connecté</h2>
+			<div class="inscription-btn-container">
+				<a class="inscription-btn" href="<?php echo BASE_URL; ?>/add_partie">Ajouter une partie !</a>
+			</div>
+		<?php 
+		}
+		else {
+		?>
+			<h2 class="stat-title">Pas encore inscrit ?</h2>
+			<div class="inscription-btn-container">
+				<a class="inscription-btn" href="<?php echo BASE_URL; ?>/inscription">Inscrivez-vous !</a>
+			</div>
+		<?php 
+		}
+		?>
+		</div>
+
+    </article>
+	
+	
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Jeu/display.html b/app/view/Jeu/display.html
new file mode 100644
index 0000000000000000000000000000000000000000..0e5d6151c38a44aeaad3d3d04c4316176cff1768
--- /dev/null
+++ b/app/view/Jeu/display.html
@@ -0,0 +1,53 @@
+<?php 
+	$page_title = "Fiche du jeu ".$this->jeu->nom; 
+	include(ROOT."/app/view/Includes/header.include.html"); 
+?>
+
+        <article>
+            <h2><?php echo $this->jeu->nom; ?></h2>
+            <aside class="jeu-image"><img src="<?php echo BASE_URL  ."/images/jeu/".$this->jeu->slug.".jpg" ?>" alt="Logo du jeu <?php echo $this->jeu->nom; ?>" />
+            </aside>
+            <div class="row">
+                <p class="col-7">
+                    <?php echo $this->jeu->description; ?>
+                </p>
+            </div>
+			<?php 
+			if(isset($_SESSION['connected']) && $_SESSION['connected'] == true) {
+				if(Profil::checkJeuFavoris($_SESSION['user']->slug, $this->jeu->slug)) {
+				?>
+				<h2 class="stat-title">Vous n'aimez plus ce jeu ?</h2>
+				<div class="inscription-btn-container">
+					<a class="inscription-btn" href="<?php echo BASE_URL; ?>/add_favoris/<?php echo $this->jeu->slug; ?>">Retirez-le de vos favoris !</a>
+				</div>
+				<?php 
+				}
+				else {
+				?>
+				<h2 class="stat-title">Vous aimez ce jeu ?</h2>
+				<div class="inscription-btn-container">
+					<a class="inscription-btn" href="<?php echo BASE_URL; ?>/add_favoris/<?php echo $this->jeu->slug; ?>">Ajoutez-le à vos favoris !</a>
+				</div>
+				<?php 
+				}
+			}
+			?>
+        </article>
+        <div class="classement-card">
+            <table class="classement-table">
+                <tr><th>N°</th><th colspan="2">Joueur</th><th>Score</th></tr>
+                <?php foreach($this->classement as $ligne) { ?>
+                <tr>
+                    <td>"<?php echo $ligne['classement']; ?>"</td>
+                    <td><a href="../profil/<?php echo $ligne['slug'];?>"><img src="<?php echo $ligne['avatar'];?>" alt="Image de profil de <?php echo $ligne['pseudo'];?>" class="classement-profil-img"></a></td>
+                    <td><a href="../profil/<?php echo $ligne['slug'];?>"> <?php echo $ligne['pseudo']; ?> </a></td>
+                    <td><?php echo $ligne['score'] ; ?></td>
+                </tr>
+                <?php
+                }
+                ?>
+            </table>
+        </div>
+
+		
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Jeu/displayFavorisValid.html b/app/view/Jeu/displayFavorisValid.html
new file mode 100644
index 0000000000000000000000000000000000000000..c73d7cb1fc2f16e97ea081d643265fb429b563e4
--- /dev/null
+++ b/app/view/Jeu/displayFavorisValid.html
@@ -0,0 +1,23 @@
+<?php 
+	// session déjà démarrée dans le contrôleur, pas besoin de le faire ici
+	
+	$page_title = "Ajout du jeu à ses favoris"; 
+	include(ROOT."/app/view/Includes/header.include.html");
+	
+	if(!is_null($this->msg_success)) {
+?>
+	<article class="msg-valide"><h2><?php echo $this->msg_success; ?></h2></article>
+<?php 
+	}
+	else if(!is_null($this->msg_error)) {
+?>
+	<article class="msg-erreur"><h2><?php echo $this->msg_error; ?></h2></article>
+<?php 
+	}
+?>
+
+	<article>
+		<p><?php echo $this->sous_msg; ?></p>
+	</article>
+
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Jeu/displayFormAdd.html b/app/view/Jeu/displayFormAdd.html
new file mode 100644
index 0000000000000000000000000000000000000000..9b704e76bdea692dfa9dc5c7747fd9e5137fbf09
--- /dev/null
+++ b/app/view/Jeu/displayFormAdd.html
@@ -0,0 +1,49 @@
+<?php
+	
+	if(!isset($_SESSION['connected']) || $_SESSION['connected'] != true) {
+		header('Location:'.BASE_URL);
+	}
+	
+	$page_title = "Formulaire de demande d'ajout de jeu"; 
+	include(ROOT."/app/view/Includes/header.include.html");
+?>
+
+<?php	if (!is_null($this->errMsg)){ ?>
+<article class="msg-erreur"><?php echo $this->errMsg;?></article>
+<?php } ?>
+
+<article>
+    <h2>Formulaire de demande d'ajout de jeu</h2>
+    <div class="addjeu-form">
+        <form method="post" action="addjeu/addrequest" enctype="multipart/form-data">
+            <label for="nom">Nom du jeu * :</label> <input type="text" name="nom" required="" id="nom"/> <br/>
+            <label for="description">Description :</label> <textarea name="description" id="description"></textarea>
+            <br/>
+            <label for="type">Type de jeu * :</label>
+            <select name="type" required="" id="type">
+                <option>Équipes</option>
+                <option>Chacun pour soi</option>
+            </select><br/>
+
+            <label for="type_scores">Type du résultat * :</label>
+            <select name="type_scores" required="" id="type_scores">
+                <option>Scores</option>
+                <option>Classement</option>
+            </select><br/>
+
+            <label for="max_joueurs">Joueurs max : </label><input type="text" name="max_joueurs" id="max_joueurs"/><br/>
+            <label for="max_joueurs_inf">Joueurs max infini ?</label><input type="checkbox" name="max_joueurs_inf" id="max_joueurs_inf" value="1">
+            <label for="min_joueurs">Joueurs min * : </label><input type="text" name="min_joueurs" required="" id="min_joueurs"/><br/>
+            <label for="min_equipes">Equipes max : </label><input type="text" name="min_equipes" id="min_equipes"/><br/>
+            <label for="max_equipes">Equipes min : </label><input type="text" name="max_equipes" id="max_equipes"/><br/>
+            <label for="max_equipes_inf">Equipes max infini ?</label><input type="checkbox" name="max_equipes_inf" id="max_equipes_inf" value="1">
+            <label for="image">Image du jeu * (max 200x200px) : </label> <input type="file" required="" name="image" id="image"/><br/>
+            <div class="submit">
+                <input type="reset" name="reset" value="Réinitialiser">
+                <input type="submit" name="submit" value="Demander l'ajout">
+            </div>
+        </form>
+    </div>
+</article>
+
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Jeu/displayListe.html b/app/view/Jeu/displayListe.html
new file mode 100644
index 0000000000000000000000000000000000000000..da247c500bfb7d5e92b042dbe0e302866a778d7e
--- /dev/null
+++ b/app/view/Jeu/displayListe.html
@@ -0,0 +1,53 @@
+<?php 
+	$page_title = "Liste des jeux"; 
+	include(ROOT."/app/view/Includes/header.include.html");
+?>
+
+	<?php 
+	$cpt = 1;
+	
+	foreach($this->liste as $jeu) {
+		if($cpt == 1) {
+			echo '<div class="row game-row">';
+		}
+		?>
+		<div class="col-3 col-m-6">
+            <div class="game">
+                <a href="jeu/<?php echo $jeu->slug;?>">
+                    <img class="game-image"  alt="logo du jeu <?php echo $jeu->nom;?>" src="<?php echo BASE_URL; ?>/images/jeu/<?php echo $jeu->slug;?>.jpg">
+                    <div class="game-caption"><?php echo $jeu->nom;?></div>
+                </a>
+            </div>
+        </div>
+	<?php 
+		if($cpt == 4) {
+			echo '</div>';
+			$cpt = 0;
+		}
+		$cpt++;
+	}
+	?>
+   
+	<?php
+	
+	if(isset($_SESSION['connected']) && $_SESSION['connected'] == true) {
+		if($cpt == 1) {
+			echo '<div class="row game-row">';
+		}
+		?>
+   
+        <div class="col-3 col-m-6">
+            <div class="game more">
+                <a href="addjeu">
+                    <img class="game-image" alt="bouton ajouter jeu" src="<?php echo BASE_URL; ?>/images/plus-symbol.png">
+                    <div class="game-caption">Un autre jeu ?</div>
+                </a>
+            </div>
+        </div>
+	<?php
+	}
+	?>
+	</div>
+
+
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Jeu/displayRequestValid.html b/app/view/Jeu/displayRequestValid.html
new file mode 100644
index 0000000000000000000000000000000000000000..460253c8265ccffc05eff72ea126f2e1280a4739
--- /dev/null
+++ b/app/view/Jeu/displayRequestValid.html
@@ -0,0 +1,11 @@
+<?php 
+	$page_title = "Demande enregistrée"; 
+	include(ROOT."/app/view/Includes/header.include.html");
+?>
+
+	<article class="msg-valide"><h2>Votre demande a été enregistrée !</h2></article>
+	<article>
+		<p>Elle sera traitée par les administrateurs dès que possible. :)</p>
+	</article>
+	
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Jeu/listeJson.html b/app/view/Jeu/listeJson.html
new file mode 100644
index 0000000000000000000000000000000000000000..7977fda2af8934d05d5592111a5bd854f0060f7a
--- /dev/null
+++ b/app/view/Jeu/listeJson.html
@@ -0,0 +1,12 @@
+[
+<?php 
+$cpt = 1;
+foreach($this->liste as $jeu) {
+	echo '{"value": "'.htmlspecialchars($jeu->nom).'"}';
+	if($cpt != count($this->liste)) {
+		echo ',';
+	}
+	$cpt++;
+}
+?>
+]
\ No newline at end of file
diff --git a/app/view/Partie/displayStep0.html b/app/view/Partie/displayStep0.html
new file mode 100644
index 0000000000000000000000000000000000000000..0b95e1e2a8b017becb88763fe32ccdbe72c6afed
--- /dev/null
+++ b/app/view/Partie/displayStep0.html
@@ -0,0 +1,33 @@
+<?php 
+	// session déjà lancée dans le contrôleur
+	
+	if(!isset($_SESSION['connected']) || $_SESSION['connected'] != true) {
+		header('Location:'.BASE_URL);
+	}
+	
+	$page_title = "Formulaire d'ajout de partie"; 
+	include(ROOT."/app/view/Includes/header.include.html"); 
+?>
+<?php	if (!is_null($this->errMsg)){ ?>
+<article class="msg-erreur"><?php echo $this->errMsg;?></article>
+<?php } ?>
+    <article>
+        <h2>Formulaire d'ajout de partie</h2>
+        <h3>Sélection d'un jeu</h3>
+        <div class="addjeu-form">
+			<form method="post" action="add_partie/verifystep0">
+				<label for="jeu">Jeu : </label>
+				<select name="jeu" id="jeu">
+				<?php foreach($this->liste as $jeu){ ?>
+					<option><?php echo $jeu->nom; ?></option>
+				<?php } ?>
+				</select><br />
+				<div class="submit">
+                    <input type="reset" name="reset" value="Réinitialiser" />
+					<input type="submit" name="submit" value="Étape suivante" />
+				</div>
+			</form>
+		</div>
+	</article>
+
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Partie/displayStep1.html b/app/view/Partie/displayStep1.html
new file mode 100644
index 0000000000000000000000000000000000000000..c1e125ac650d78104d0b0ea5ed87aaa9b8941eae
--- /dev/null
+++ b/app/view/Partie/displayStep1.html
@@ -0,0 +1,52 @@
+<?php 
+	$page_title = "Formulaire d'ajout de partie"; 
+	include(ROOT."/app/view/Includes/header.include.html");
+?>
+<?php $jeuactuel = $this->jeuactuel ?>
+<?php	if (!is_null($this->errMsg)){ ?>
+<article class="msg-erreur"><?php echo $this->errMsg;?></article>
+<?php } ?>
+<article>
+    <h2>Formulaire d'ajout de partie</h2>
+    <h3>Sélection des joueurs</h3>
+    <div class="addjeu-form">
+
+        <h4>Jeu : <?php echo $jeuactuel->nom; ?></h4>
+        <h4>De <?php echo $jeuactuel->min_joueurs; ?> à <?php echo $this->max; ?> joueurs</h4>
+        <form method="post" action="addjoueurs1">
+            <label for="joueur">Ajouter un joueur (pseudo) :</label>
+            <input type="text" id="joueur" name="joueur"/>
+            <input type="submit" name="submit" value="ajouter un joueur"/>
+        </form>
+        <?php if (isset($_SESSION['joueurs_select'])) { ?>
+        <h5>Joueurs actuellement sélectionnés :</h5>
+        <ul>
+            <?php foreach($_SESSION['joueurs_select'] as $k => $j){ ?>
+            <li>
+                <?php echo $j->pseudo; ?>
+
+
+                <form method="post" action="deljoueurs1">
+                    <input type="hidden" value="<?php echo $k;?>" name="joueurdel">
+                    <input type="submit" name="submit" value="supprimer ce joueur"/>
+                </form>
+            </li>
+            <?php } ?>
+            <?php } ?>
+        </ul>
+        <div class="submit">
+            <form method="post" action="clearstep1">
+                <input type="submit" name="submit" value="Réinitialiser"/>
+            </form>
+            <form method="post" action="verifystep1">
+                <input type="submit" name="submit" value="Étape suivante"/>
+            </form>
+
+            <form action="../add_partie">
+                <input type="submit" name="submit" value="Étape précédente"/>
+            </form>
+        </div>
+    </div>
+</article>
+
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Partie/displayStep2.html b/app/view/Partie/displayStep2.html
new file mode 100644
index 0000000000000000000000000000000000000000..43d5038d016a6f478d28b2b825a3d819c6ef5dee
--- /dev/null
+++ b/app/view/Partie/displayStep2.html
@@ -0,0 +1,47 @@
+<?php 
+	$page_title = "Formulaire d'ajout de partie"; 
+	include(ROOT."/app/view/Includes/header.include.html"); 
+?>
+<?php $jeuactuel = $this->jeuactuel ?>
+<?php	if (!is_null($this->errMsg)){ ?>
+<article class="msg-erreur"><?php echo $this->errMsg;?></article>
+<?php } ?>
+<article>
+    <h2>Formulaire d'ajout de partie</h2>
+    <h3>Entrée des scores</h3>
+    <div class="addjeu-form">
+        <form method="post" action="verifystep2">
+            <h4>Jeu : <?php echo $jeuactuel->nom; ?></h4>
+            <h4>Joueurs</h4>
+            <ul>
+                <?php foreach($this->listejactuel as $joueur){ ?>
+                <li><?php echo $joueur->pseudo; ?>
+                    <?php if($jeuactuel->type_scores == 'scores'){ ?>
+                    Score obtenu : <input type="text" title="score" required="" name="scores[]"/>
+                    <?php } else { ?>
+                    Classement obtenu : <select title="score" required="" name="scores[]">
+                        <?php for ($j=1;$j<=count($this->listejactuel);$j++){ ?>
+                        <option value="<?php echo count($this->listejactuel)-$j;?>"><?php echo $j;?></option>
+
+                        <?php } ?>
+                    </select>
+                    <?php } ?>
+                </li>
+                <?php } ?>
+            </ul>
+            <br/>
+            <div class="submit">
+
+                <input type="reset" name="reset" value="Réinitialiser"/>
+                <input type="submit" name="submit" value="Demander l'ajout"/>
+            </div>
+        </form>
+        <div class="submit">
+            <form action="step1">
+                <input type="submit" name="submit" value="Étape précédente"/>
+            </form>
+        </div>
+    </div>
+</article>
+
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Partie/displayStepe1.html b/app/view/Partie/displayStepe1.html
new file mode 100644
index 0000000000000000000000000000000000000000..8133544788def29ae2b0c990cc09d56c85413cb0
--- /dev/null
+++ b/app/view/Partie/displayStepe1.html
@@ -0,0 +1,65 @@
+<?php 
+	$page_title = "Formulaire d'ajout de partie"; 
+	include(ROOT."/app/view/Includes/header.include.html");
+?>
+<?php $jeuactuel = $this->jeuactuel ?>
+<?php	if (!is_null($this->errMsg)){ ?>
+<article class="msg-erreur"><?php echo $this->errMsg;?></article>
+<?php } ?>
+<article>
+    <h2>Formulaire d'ajout de partie</h2>
+    <h3>Sélection des joueurs</h3>
+    <div class="addjeu-form">
+
+        <h4>Jeu : <?php echo $jeuactuel->nom; ?></h4>
+        <h4>De <?php echo $jeuactuel->min_equipes; ?> à <?php echo $this->maxe; ?>équipes (de <?php echo $jeuactuel->min_joueurs; ?> à <?php echo $this->maxj; ?> joueurs)</h4>
+
+        <?php foreach($this->equipes as $ke => $e) { ?>
+        <h5>Équipe <?php echo $ke+1; ?> </h5>
+        <ul>
+            <?php
+            foreach($e as $k => $j){ ?>
+            <li>
+                <?php echo $j->pseudo; ?>
+                <form method="post" action="deljoueurs1">
+                    <input type="hidden" value="<?php echo $k;?>" name="joueurdel"/>
+                    <input type="hidden" value="<?php echo $ke;?>" name="equipejdel"/>
+                    <input type="submit" name="submit" value="supprimer ce joueur"/>
+                </form>
+
+            </li>
+            <?php } ?>
+            <form method="post" action="addjoueurs1">
+                <label for="joueur">Ajouter un joueur à l'équipe <?php echo $ke+1;?> :</label>
+                <input type="text" id="joueur" name="joueur"/>
+                <input type="hidden" value="<?php echo $ke;?>" name="equipejadd" id="equipejadd"/>
+                <input type="submit" name="submit" value="Ajouter un joueur"/>
+            </form>
+            <form method="post" action="delequipe">
+                <input type="hidden" value="<?php echo $ke;?>" name="equipe"/>
+                <input type="submit" name="submit" value="Supprimer l'équipe <?php echo $ke+1;?>"/>
+            </form>
+        </ul>
+        <?php } ?>
+        <div class="submit">
+            <form method="post" action="addequipe">
+                <input type="submit" name="submit" value="Ajouter une équipe"/>
+            </form>
+
+            <form method="post" action="clearstep1">
+                <input type="submit" name="submit" value="Réinitialiser"/>
+            </form>
+            <form method="post" action="verifystep1">
+
+
+                <input type="submit" name="submit" value="Étape suivante"/>
+
+            </form>
+            <form action="../add_partie">
+                <input type="submit" name="submit" value="Étape précédente"/>
+            </form>
+        </div>
+    </div>
+</article>
+
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Partie/displayStepe2.html b/app/view/Partie/displayStepe2.html
new file mode 100644
index 0000000000000000000000000000000000000000..2fa4968a6a2a57d927a8b15e83f6b61d1f067084
--- /dev/null
+++ b/app/view/Partie/displayStepe2.html
@@ -0,0 +1,48 @@
+<?php 
+	$page_title = "Formulaire d'ajout de partie"; 
+	include(ROOT."/app/view/Includes/header.include.html"); 
+?>
+<?php $jeuactuel = $this->jeuactuel ?>
+<?php	if (!is_null($this->errMsg)){ ?>
+<article class="msg-erreur"><?php echo $this->errMsg;?></article>
+<?php } ?>
+<article>
+    <h2>Formulaire d'ajout de partie</h2>
+    <h3>Entrée des scores</h3>
+    <div class="addjeu-form">
+        <form method="post" action="verifystep2">
+            <h4>Jeu : <?php echo $jeuactuel->nom; ?></h4>
+            <?php foreach($this->equipes as $ke => $e) { ?>
+            <h4>Équipe <?php echo $ke+1; ?> </h4>
+            <ul>
+                <?php
+                    foreach($e as $k => $j){ ?>
+                <li>
+                    <?php echo $j->pseudo; ?>
+                </li>
+                <?php } ?>
+            </ul>
+            <?php if($jeuactuel->type_scores == 'scores'){ ?>
+            Score obtenu : <input type="text" title="score" required="" name="scores[]"/>
+            <?php } else { ?>
+            Classement obtenu : <select title="score" required="" name="scores[]">
+            <?php for ($j=1;$j<= count($this->equipes);$j++){ ?>
+            <option value="<?php echo count($this->equipes)-$j;?>"><?php echo $j;?></option>
+            <?php } ?>
+        </select>
+            <?php } ?>
+            <?php } ?>
+            <div class="submit">
+                <input type="reset" name="reset" value="Réinitialiser"/>
+                <input type="submit" name="submit" value="Demander l'ajout"/>
+            </div>
+        </form>
+        <div class="submit">
+            <form action="../add_partie/stepe1">
+                <input type="submit" name="submit" value="Étape précédente"/>
+            </form>
+        </div>
+    </div>
+</article>
+
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Partie/displayValid.html b/app/view/Partie/displayValid.html
new file mode 100644
index 0000000000000000000000000000000000000000..68eb0148989259be5cad8bc39eec13a7e6c784c3
--- /dev/null
+++ b/app/view/Partie/displayValid.html
@@ -0,0 +1,12 @@
+<?php 
+	$page_title = "Formulaire d'ajout de partie"; 
+	include(ROOT."/app/view/Includes/header.include.html"); 
+?>
+
+	<article class="msg-valide"><h2>La partie a été enregistrée !</h2></article>
+	<article>
+		<p>Votre partie a bien été enregistrée !</p>
+		<p><a href="<?php echo BASE_URL; ?>">Retour a l'accueil</a></p>
+	</article>
+	
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
\ No newline at end of file
diff --git a/app/view/Profil/display.html b/app/view/Profil/display.html
new file mode 100644
index 0000000000000000000000000000000000000000..8bbf2e29ffdb172d588e12260b966bb35aef1070
--- /dev/null
+++ b/app/view/Profil/display.html
@@ -0,0 +1,99 @@
+<?php 
+	$page_title = "Profil de ".$this->profil->pseudo; 
+	include(ROOT."/app/view/Includes/header.include.html"); 
+?>
+	
+	<article>
+        <h2><?php echo $this->profil->pseudo; ?></h2>
+        <aside class="profil-image">
+			<img src="<?php echo $this->profil->avatar; ?>" alt="Photo de profil de <?php echo $this->profil->pseudo; ?>" />
+        </aside>
+        <div class="row">
+			<ul class="col-4 pref">
+				<li><?php echo $this->profil->prenom.' '.$this->profil->nom; ?></li>
+				
+				<?php 
+				if(isset($_SESSION['connected']) && $_SESSION['connected'] == true) {
+				?>
+				<li>24 ans</li>
+				<li>ENSIIE</li>
+				<li>1A+++</li>
+				<li><?php echo $this->profil->email; ?></li>
+			</ul>
+			<ul class="col-4 pref">
+				<li><?php echo $this->profil->description; ?></li>
+			</ul>
+			<?php } ?>
+			<!--<ul class="col-4 pref">
+				<li>Aime le basket</li>
+				<li>N'aime pas le JQuery</li>
+			</ul>-->
+        </div>
+		<?php 
+		if(isset($_SESSION['connected']) && $_SESSION['connected'] == true) {
+		?>
+        <div class="col-6">
+            <h3 class="stat-title">Jeux préférés</h3>
+            <table class="jeux-preferes">
+				<?php foreach($this->jeu_favori as $ligne) {
+					print "
+					<tr>
+						<td><a href=\"".BASE_URL."/jeu/".$ligne['slug']."\"> <img src=\"".BASE_URL."/images/jeu/".$ligne['slug'].".jpg\" alt=\"logo de ".$ligne['nom']."\" /></a></td>
+						<td><a href=\"".BASE_URL."/jeu/".$ligne['slug']."\">".$ligne['nom']."</a></td>
+					</tr>
+					";
+				}
+				?>
+            </table>
+        </div>
+		<?php } ?>
+
+        <div class="col-6">
+            <h3 class="stat-title">Meilleurs classements</h3>
+            <table class="jeux-preferes">
+				<?php foreach($this->classement_top as $ligne) {
+					print "
+					<tr>
+						<td><a href=\"".BASE_URL."/jeu/".$ligne['slug']."\"> <img src=\"".BASE_URL."/images/jeu/".$ligne['slug'].".jpg\" alt=\"logo de ".$ligne['nom']."\" /></a></td>
+						<td><a href=\"".BASE_URL."/jeu/".$ligne['slug']."\">".$ligne['nom']."</a></td>
+						<td>".$ligne['classement']."e </td>
+						<td>".$ligne['score']."</td>
+					</tr>
+					";
+				}
+				?>
+            </table>
+            <div class="more-link"><a href="" >Plus...</a></div>
+
+        </div>
+
+
+
+		<div class="row">
+			<div class="col-6">
+				<h3 class="stat-title">Pire classements</h3>
+				<table class="jeux-preferes">
+					<?php foreach($this->classement_down as $ligne) {
+						print "
+						<tr>
+							<td><a href=\"".BASE_URL."/jeu/".$ligne['slug']."\"> <img src=\"".BASE_URL."/images/jeu/".$ligne['slug'].".jpg\" alt=\"logo de ".$ligne['nom']."\" /></a></td>
+							<td><a href=\"".BASE_URL."/jeu/".$ligne['slug']."\">".$ligne['nom']."</a></td>
+							<td>".$ligne['classement']."e </td>
+							<td>".$ligne['score']."</td>
+						</tr>
+						";
+					}
+					?>
+				</table>
+				<div class="more-link"><a href="" >Plus...</a></div>
+			</div>
+		</div>
+		<?php
+		if(isset($_SESSION['connected']) && $_SESSION['connected'] == true && $_SESSION['user']->slug == $this->profil->slug) {
+		?>
+				<div class="more-link"><a href="<?php print $this->profil->slug;?>/edit" >Modifier le profil</a></div>
+		<?php } ?>
+
+    </article>
+	
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Profil/displayEdit.html b/app/view/Profil/displayEdit.html
new file mode 100644
index 0000000000000000000000000000000000000000..b4b801bab853c6c704079913702646fb52aaf1ed
--- /dev/null
+++ b/app/view/Profil/displayEdit.html
@@ -0,0 +1,104 @@
+<?php
+	// session déjà lancée dans le contrôleur
+
+	$page_title = "Édition du profil de ".$this->profil->pseudo;
+	include(ROOT."/app/view/Includes/header.include.html");
+?>
+
+<?php
+if(!is_null($this->errMsg)) { 
+?>
+	<article class="msg-erreur"><?php echo $this->errMsg;?></article>
+<?php 
+} 
+?>
+
+
+<?php if(isset($_SESSION['connected']) && $_SESSION['connected'] == true &&
+    isset($_SESSION['user']) && $_SESSION['user']->slug == $this->profil->slug) { ?>
+<article>
+    <h2>Édition du profil de <?php print $this->profil->pseudo; ?></h2>
+        <div class="inscription-form">
+			<form  method="post" action="edit/verify" enctype="multipart/form-data" onsubmit="return checkForm();">
+				<div class="form-line">
+					<div class="validation-container-left">
+						<label for="password">Mot de passe* : </label>
+						<input type="password" name="password" id="password" onchange="if(this.value != '') callAjax('checkPassword', this.value, this.id);" />
+					</div>
+					<div class="validation-container">
+						<span id="rsp_password" class="validation-container-content"></span>
+						<input type="checkbox" disabled name="valid_password" class="validation-checkbox" />
+					</div>
+				</div>
+				<div class="form-line">
+					<div class="validation-container-left">
+						<label for="password_bis">Vérification mdp* : </label>
+						<input type="password" name="password_bis" id="password_bis" onchange="if(this.value != '') callAjax('checkPasswordBis', this.value+'¤'+$.(\'#password\').value, this.id);" />
+					</div>
+					<div class="validation-container">
+						<span id="rsp_password_bis" class="validation-container-content"></span>
+						<input type="checkbox" disabled name="valid_password_bis" class="validation-checkbox" />
+					</div>
+				</div>
+				<div class="form-line">
+					<div class="validation-container-left">
+						<label for="nom">Nom* : </label>
+						<input type="text" required="" name="nom" id="nom" <?php print "value=\"".$this->profil->nom."\"";?> />
+					</div>
+					<div class="validation-container">
+						<span id="rsp_nom" class="validation-container-content"></span>
+						<input type="checkbox" disabled name="valid_nom" class="validation-checkbox" />
+					</div>
+				</div>
+				<div class="form-line">
+					<div class="validation-container-left">
+						<label for="prenom">Prénom* : </label>
+						<input type="text" required="" name="prenom" id="prenom" <?php print "value=\"".$this->profil->prenom."\"";?>/>
+					</div>
+					<div class="validation-container">
+						<span id="rsp_prenom" class="validation-container-content"></span>
+						<input type="checkbox" disabled name="valid_prenom" class="validation-checkbox" />
+					</div>
+				</div>
+				<div class="form-line">
+					<div class="validation-container-left">
+						<label for="email">Adresse e-mail* : </label>
+						<input type="email" required="" name="email" id="email" <?php print "value=\"".$this->profil->email."\"";?> onchange="if(this.value != '') callAjax('checkEmail', this.value, this.id);" />
+					</div>
+					<div class="validation-container">
+						<span id="rsp_email" class="validation-container-content"></span>
+						<input type="checkbox" disabled name="valid_email" class="validation-checkbox" />
+					</div>
+				</div>
+				<div class="form-line">
+					<div class="validation-container-left">
+						<label for="description">Une description de vous : </label>
+						<textarea name="description" id="description" ><?php print $this->profil->description;?></textarea>
+					</div>
+				</div>
+				<div class="form-line">
+					<div class="validation-container-left">
+						<label for="avatar">Avatar</label>
+						<input type="file" name="avatar" id="avatar" />
+					</div>
+				</div>
+				<div class="form-line">
+					<div class="validation-container-left">
+						<label for="avatar_suppr">Supprimer l'avatar : </label>
+						<input type="checkbox" name="avatar_suppr" id="avatar_suppr" value="1"/>
+					</div>
+				</div>
+				<div class="submit">
+					<input type="reset" name="reset" value="Réinitialiser">
+					<input type="submit" name="submit" value="Modifier">
+				</div>
+			</form>
+        </div>
+    </article>
+    <?php } else {?>
+        <article class="msg-erreur">Vous n'êtes pas <?php print $this->profil->pseudo; ?></article>
+    <?php } ?>
+
+
+
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
\ No newline at end of file
diff --git a/app/view/Profil/displayValid.html b/app/view/Profil/displayValid.html
new file mode 100644
index 0000000000000000000000000000000000000000..d8a4bc7b30c54925e6e94aba30e0775faf89c423
--- /dev/null
+++ b/app/view/Profil/displayValid.html
@@ -0,0 +1,11 @@
+<?php 
+	$page_title = "Inscription réussie"; 
+	include(ROOT."/app/view/Includes/header.include.html");
+?>
+
+	<article class="msg-valide"><h2>Modification enregistrée !</h2></article>
+	<article>
+		<p>:)</p>
+	</article>
+	
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Register/displayForm.html b/app/view/Register/displayForm.html
new file mode 100644
index 0000000000000000000000000000000000000000..f647f978c538c8fbd889091fefb647d0b31c0098
--- /dev/null
+++ b/app/view/Register/displayForm.html
@@ -0,0 +1,111 @@
+<?php 
+	// session déjà lancée dans le contrôleur
+	
+	if(isset($_SESSION['connected']) && $_SESSION['connected'] == true) {
+		header('Location:'.BASE_URL);
+	}
+	
+	$page_title = "Formulaire d'inscription"; 
+	include(ROOT."/app/view/Includes/header.include.html");
+?>
+
+
+<?php	
+if(!is_null($this->errMsg)) { 
+?>
+	<article class="msg-erreur"><?php echo $this->errMsg;?></article>
+<?php 
+}
+?>
+    <article>
+        <h2>Formulaire d'inscription</h2>
+        <div class="inscription-form">
+			<form  method="post" action="inscription/save"  enctype="multipart/form-data" onsubmit="return checkForm();">
+				
+				<div class="form-line">
+					<div class="validation-container-left">
+						<label for="pseudo">Pseudo* : </label>
+						<input type="text" required="" name="pseudo" id="pseudo" onchange="if(this.value != '') callAjax('checkPseudo', this.value, this.id);" />
+					</div>
+					<div class="validation-container">
+						<span id="rsp_pseudo" class="validation-container-content"></span>
+						<input type="checkbox" disabled name="valid_pseudo" class="validation-checkbox" />
+					</div>
+				</div>
+				<div class="form-line">
+					<div class="validation-container-left">
+						<label for="password">Mot de passe* : </label>
+						<input type="password" required="" name="password" id="password" onchange="if(this.value != '') callAjax('checkPassword', this.value, this.id);" />
+					</div>
+					<div class="validation-container">
+						<span id="rsp_password" class="validation-container-content"></span>
+						<input type="checkbox" disabled name="valid_password" class="validation-checkbox" />
+					</div>
+				</div>
+				<div class="form-line">
+					<div class="validation-container-left">
+						<label for="password_bis">Vérification mdp* : </label>
+						<input type="password" required="" name="password_bis" id="password_bis" onchange="if(this.value != '') callAjax('checkPasswordBis', this.value+'¤'+$('#password').val(), this.id);" />
+					</div>
+					<div class="validation-container">
+						<span id="rsp_password_bis" class="validation-container-content"></span>
+						<input type="checkbox" disabled name="valid_password_bis" class="validation-checkbox" />
+					</div>
+				</div>
+				<div class="form-line">
+					<div class="validation-container-left">
+						<label for="nom">Nom* : </label>
+						<input type="text" required="" name="nom" id="nom" />
+					</div>
+					<div class="validation-container">
+						<span id="rsp_nom" class="validation-container-content"></span>
+						<input type="checkbox" disabled name="valid_nom" class="validation-checkbox" />
+					</div>
+				</div>
+				<div class="form-line">
+					<div class="validation-container-left">
+						<label for="prenom">Prénom* : </label>
+						<input type="text" required="" name="prenom" id="prenom" />
+					</div>
+					<div class="validation-container">
+						<span id="rsp_prenom" class="validation-container-content"></span>
+						<input type="checkbox" disabled name="valid_prenom" class="validation-checkbox" />
+					</div>
+				</div>
+				<div class="form-line">
+					<div class="validation-container-left">
+						<label for="email">Adresse e-mail* : </label>
+						<input type="email" required="" name="email" id="email" onchange="if(this.value != '') callAjax('checkEmail', this.value, this.id);" />
+					</div>
+					<div class="validation-container">
+						<span id="rsp_email" class="validation-container-content"></span>
+						<input type="checkbox" disabled name="valid_email" class="validation-checkbox" />
+					</div>
+				</div>
+				<div class="form-line">
+					<div class="validation-container-left">
+						<label for="description">Une description de vous : </label>
+						<textarea name="description" id="description"></textarea>
+					</div>
+				</div>
+				<div class="form-line">
+					<div class="validation-container-left">
+						<label for="avatar">Avatar</label>
+						<input type="file" name="avatar" id="avatar" />
+					</div>
+				</div>
+				<div class="submit">
+					<input type="reset" name="reset" value="Réinitialiser">
+					<input type="submit" name="submit" value="S'inscrire">
+				</div>
+			</form>
+        </div>
+    </article>
+	
+	
+	
+	<script type="text/javascript" src="<?php echo BASE_URL; ?>/js/jquery.min.js"></script>
+	<script type="text/javascript" src="<?php echo BASE_URL; ?>/js/verif_form_inscription.js"></script>
+	
+	
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Register/displayValid.html b/app/view/Register/displayValid.html
new file mode 100644
index 0000000000000000000000000000000000000000..cd0f28841428f5f2ec6e28fc553828c4964a0aca
--- /dev/null
+++ b/app/view/Register/displayValid.html
@@ -0,0 +1,11 @@
+<?php 
+	$page_title = "Inscription réussie"; 
+	include(ROOT."/app/view/Includes/header.include.html");
+?>
+
+	<article class="msg-valide"><h2>Vous êtes maintenant inscrit !</h2></article>
+	<article>
+		<p>Connectez-vous pour profiter de toutes les possibilités du site. :)</p>
+	</article>
+	
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/generate_base.sql b/generate_base.sql
new file mode 100644
index 0000000000000000000000000000000000000000..e91ec89a8cf5bbd7df035bb86f3bcfc464adab6a
--- /dev/null
+++ b/generate_base.sql
@@ -0,0 +1,64 @@
+-- Pour générer la base de données PostgreSQL pour le projet Classements Ludiques
+CREATE TYPE type_jeu AS ENUM ('duels', 'equipes');
+CREATE TYPE type_scores_jeu AS ENUM ('classement', 'scores');
+
+
+DROP TABLE IF EXISTS R_jeu;
+CREATE TABLE R_jeu (
+  nom VARCHAR(255) NOT NULL,
+  description TEXT NOT NULL,
+  slug VARCHAR(255) PRIMARY KEY,
+  est_valide BOOLEAN NOT NULL,
+  max_joueurs INT,
+  min_joueurs INT,
+  min_equipes INT,
+  max_equipes INT,
+  type type_jeu NOT NULL,
+  type_scores type_scores_jeu NOT NULL
+);
+
+DROP TABLE IF EXISTS R_joueur;
+CREATE TABLE R_joueur (
+  slug VARCHAR(255) PRIMARY KEY,
+  pseudo VARCHAR(100) NOT NULL,
+  password TEXT NOT NULL,
+  nom VARCHAR(150) NOT NULL,
+  prenom VARCHAR(150) NOT NULL,
+  email VARCHAR(255) UNIQUE NOT NULL,
+  description TEXT NOT NULL,
+  avatar BOOLEAN DEFAULT '0'
+);
+
+DROP TABLE IF EXISTS R_admin;
+CREATE TABLE R_admin (
+  identite varchar(255) REFERENCES R_joueur(slug),
+  PRIMARY KEY (identite)
+  );
+
+DROP TABLE IF EXISTS R_partie;
+CREATE TABLE R_partie (
+  id SERIAL PRIMARY KEY,
+  jeu VARCHAR(255) REFERENCES R_jeu(slug),
+  date TIMESTAMP NOT NULL
+);
+
+DROP TABLE IF EXISTS R_joueur_partie;
+CREATE TABLE R_joueur_partie (
+  partie INT REFERENCES R_partie(id),
+  joueur VARCHAR(255) REFERENCES R_joueur(slug),
+  classement INT NOT NULL,
+  score INT NOT NULL,
+  score_partie INT,
+  PRIMARY KEY (joueur, partie)
+);
+
+DROP TABLE IF EXISTS R_joueur_jeu;
+CREATE TABLE R_joueur_jeu (
+  joueur varchar(255) REFERENCES R_joueur(slug),
+  jeu VARCHAR(255) REFERENCES R_jeu(slug),
+  score INT,
+  classement INT,
+  est_jeu_favoris BOOLEAN,
+  PRIMARY KEY (joueur, jeu)
+);
+
diff --git a/rapport.pdf b/rapport.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..9f4a00dc9afeaffae51fb698cb3f5f1a74b7b22d
Binary files /dev/null and b/rapport.pdf differ
diff --git a/rapport.tex b/rapport.tex
new file mode 100644
index 0000000000000000000000000000000000000000..51dea34400c7988e74cd78cda269412b2debba3c
--- /dev/null
+++ b/rapport.tex
@@ -0,0 +1,67 @@
+\documentclass[a4paper,french,12pt]{article}
+\usepackage{babel,amssymb,amsmath}
+\usepackage[utf8]{inputenc}
+\usepackage{array,colortbl}
+\usepackage{graphicx}
+\usepackage{multicol}
+\usepackage{textcomp}
+\usepackage{fancyhdr}
+\usepackage[top=2cm, bottom=2cm, right=2cm, left=2cm]{geometry}
+
+\setlength{\parskip}{1em}
+\begin{document}
+
+\title{Projet web 2016 -- Rapport}
+\author{Vincent BOCHET, Romain DROUIN, Eliah REBSTOCK, Guillaume SÉZILLE\\~\\~\\}
+\date{10/05/2016}
+\maketitle
+
+
+\setlength{\columnseprule}{0.5pt}
+
+\newpage
+
+\section*{Composition du groupe}
+
+Notre groupe est composé des membres suivants :
+\begin{itemize}
+	\item Vincent BOCHET (4.2)
+	\item Romain DROUIN (3.1)
+	\item Eliah REBSTOCK (4.1)
+	\item Guillaume SEZILLE (4.1)
+\end{itemize}
+
+\section*{Problématique et motivation}
+
+Notre projet est un projet libre, néanmoins inspiré du projet d'application de ranking pour babyfoot proposé par votre équipe. Ainsi, nous avons également choisi de travailler sur une application de classement, mais plutôt pour des jeux de société compétitifs. Le site est donc issu d'un besoin de compétition sur ces jeux, mais également d'un besoin d'interaction sociale à travers ces compétitions.
+
+La raison principale de ce choix est presque tous les membres de notre groupe sont eux-mêmes des joueurs de jeux de société au sein de l'ENSIIE et que nous avons trouvé cela motivant de pouvoir travailler sur un projet nous concernant, et pouvant même être réutilisé par la suite une fois le projet terminé.
+
+\section*{Approche mise en place}
+
+Afin de réaliser ce projet, il nous a semblé clair que l'architecture MVC (Modèle – Vue – Contrôleur) était la plus adaptée. En effet, celle-ci permet de réutiliser plusieurs fois les mêmes choses dans divers contextes : ainsi, les méthodes du modèle (permettant les accès à la base de données) peuvent être réutilisées dans différentes vues, au travers du contrôleur. De même, certaines méthodes d'un même contrôleur peuvent être utilisées dans plusieurs vues. Outre l'avantage de ne pas réécrire plusieurs fois le même code, la structure MVC permet aussi une maintenance beaucoup plus aisée, puisqu'on peut ajouter des fonctionnalités de façon modulaire en ajoutant un nouveau modèle, un contrôleur et de nouvelles vues associées (ou simplement en étendant les modules déjà existants).
+
+Nous avons donc, dans un premier temps, réfléchi sur les diverses fonctionnalités à implémenter sur notre application et les cas d'usage possibles. Nous avons de cela tiré un certain nombre de pages web, permettant des actions spécifiques. Dans le même temps, nous nous sommes lancés dans la conception d'une première version de la base de données, en fonction des besoins identifiés. En parallèle, nous avons cherché comment réaliser un site web avec l'architecture MVC, et avons créé quelques pages afin de bien nous familiariser avec le fonctionnement. 
+
+Nous avons utilisé Git durant toute la durée du projet afin de pouvoir travailler séparément, chacun sur un bout du projet, en créant des branches pour chaque nouvelle fonctionnalité. Il suffisait ensuite de merge les branches afin d'obtenir un tout cohérent, ce qui fut facilité par l'architecture MVC. Par ailleurs, afin de pouvoir communiquer à l'intérieur du groupe à n'importe quel moment, nous avons utilisé Slack, un service de messagerie pour les équipes.
+
+\section*{Problématiques rencontrées (techniques et méthodes) et solutions apportées}
+
+Au cours de notre développement, nous nous sommes heurtés à plusieurs problèmes, et ce à différents niveaux. D'un point de vue méthodologique, nous faisions l'erreur de fonder nos fichiers (vue/contrôleur) sur la base de données, ce qui nous a été indiqué lors de la deuxième séance de projet. Cela avait tendance à nous brider un peu sur le développement de certaines fonctionnalités, et une fois ce problème identifié, nous avons pu nous libérer de cette contrainte, modifiant la structure de la base et rajoutant des modules autant que nécessaire. Par ailleurs, les nombreux changements sur la base par chacun des membres de l'équipe ont entraîné souvent des divergences entre les différentes branches, et ont donc demandé de nombreuses régénérations de bases dans chacune des bases personnelles de développement. Cela aurait pu être corrigé en travaillant directement avec une base sur un serveur commun de développement.
+
+Il y a également eu des débats internes au groupe sur l'algorithme de classement à utiliser. En effet, au début du projet, l'algorithme ELO n'était pas une évidence pour tout le monde, et un simple système d'ajout/retrait de points fixes semblait suffire. Mais, en expliquant les principaux intérêts de l'algorithme (prendre en compte le niveau des joueurs pour attribuer la quantité de points) le groupe fut finalement convaincu de la nécessité d'utiliser cet algorithme. Cependant, le fait de devoir adapter l'algorithme à plusieurs types de jeu demandait des efforts supplémentaires, que certains membres n'étaient pas prêts à prendre. Mais Eliah Rebstock, qui avait proposé l'algorithme après quelques recherches sur le sujet, accepta de prendre charge de celui-ci.
+
+Enfin, un manque d'objectifs au début du projet nous a menés à ne pas beaucoup avancer les premiers temps, car aucune liste précise des choses à faire n'était établie. Nous avons tenté de corriger le problème à l'aide des issues sur Git, mais c'est finalement la réalisation d'une liste de TODO qui nous a réellement permis d'avancer de façon productive. De cette façon, chacun pouvait se lancer dans le développement d'un point de la liste, et une fois ce point terminé, pouvait se lancer dans un autre sans nécessité de se concerter avec les autres membres, puisque ceux-ci étaient occupés sur d'autres tâches déjà identifiées.
+
+Au niveau technique maintenant, nous avons rencontré d'autres soucis. Par exemple, un bug qui ne réalisait pas les bonnes redirections sans raison apparente. Il s'est avéré que le souci venait d'un manque d'accolades dans le code, ainsi que de la nécessité de cesser l'exécution du reste du fichier après la redirection à l'aide de la fonction \verb|die();| de PHP. Parmi les soucis techniques, nous pouvons également penser au fait qu'aucun d'entre nous n'avait utilisé MVC en pratique dans un contexte web, qu'aucun d'entre nous ne maitrisait JavaScript, ni le responsive design en CSS, et pour palier à ces soucis, il nous a fallu avoir une démarche d'autodidacte, ce qui a ralenti le développement.
+
+\section*{Répartition des tâches}
+
+Une répartition des tâches s'est mise en place dès les travaux préparatoires sur le projet. Tout d'abord, nous avons énuméré ensemble les différentes fonctionnalités et usages que nous souhaitions avoir sur le site et si cela correspondait bien au principe du site. L'équipe a donc dégagé les fonctionnalités suivantes : l'inscription au site, l'ajout de partie, l'affichage de profil, l'affichage de jeu et du classement associé, l'affichage d'un classement global. 
+
+Pendant une première phase du projet, Guillaume Sézille a mis en place une première version de la base de données, Vincent Bochet a travaillé sur la mise en place d'une structure MVC utilisable par tous les membres du groupe, tandis que Romain Drouin réfléchissait à de nouvelles fonctionnalités. En parallèle Eliah Rebstock a fait des maquettes pour le site et mis en place des pages tests afin d'implémenter le design qui allait devenir celui du site. Certaines parties comme les headers et footers seront reprises dans le design final, tout comme certaines pages converties en vues.
+
+Une fois que la structure MVC a été mis en place, il fut possible de commencer à travailler sur les différents modèles du site. Ainsi, Eliah Rebstock s'est focalisé sur l'ajout de partie, la mise en place d'un algorithme ELO amélioré capable de gérer les différents types de jeu disponibles et la page de classement global. Vincent Bochet a mis en place l'authentification ainsi que les pages d'accueil, de contact, la page de profil, le menu, la migration de la base de données sous PostgreSQL (au lieu de MySQL). Romain Drouin a, lui, pris en charge la gestion des images pour les jeux et les membres, l'édition de profil et l'interface d'administration dans sa totalité.
+
+
+\end{document}
\ No newline at end of file
diff --git a/readme.md b/readme.md
index 21fca5e3309f18ea2f44a4fba79ef441d1ae9b6f..6add448419605e67151cedf8b1c804beae9ec940 100644
--- a/readme.md
+++ b/readme.md
@@ -1,6 +1,14 @@
 Projet Web 2016 - Classement multi-jeux de plateau
 ==================================================
 
+A faire pour chaque nouvelle installation du site
+-------------------------------------------------
+
+* Modifier le .htaccess du répertoire /www et changer le RewriteBase
+* Modifier index.php du répertoire /www et changer BASE_URL
+* Modifier Database.php du répertoire /app/kernel et changer les identifiants de connexion à la BDD + le nom de l'hébergement et de la base
+* Penser aussi à changer la ligne de connexion en fonction du type de BDD (mysql ou pgsql) => y'a des différences
+
 Membres du groupe
 -----------------
 
@@ -9,9 +17,3 @@ Membres du groupe
 * Eliah *Phoenix* REBSTOCK (4.1)
 * Guillaume *Gimli* SEZILLE (4.1)
 
-Random infos
-------------
-
-* Palette de couleur préliminaire : http://paletton.com/#uid=53l0x1knDk8atANhJqsuvcSJX5xknDk8atANhJqsuvcSJX5xkrDorewC+lIt2vBijKN9X
-
-
diff --git a/valeurs.sql b/valeurs.sql
new file mode 100644
index 0000000000000000000000000000000000000000..ea51edc9b99a4af4284191b3a88eca527645dfdc
--- /dev/null
+++ b/valeurs.sql
@@ -0,0 +1,14 @@
+INSERT INTO R_jeu (nom, description, slug, est_valide, min_joueurs, max_joueurs, min_equipes, max_equipes, type, type_scores) VALUES
+('Rencontres Cosmiques', 'Jeu de plateau de 3 à 6 joueurs dont le but consiste à remporter cinq planètes adverses.', 'rencontres-cosmiques', true, 3, 5, NULL, NULL, 'duels', 'classement'),
+('Jeu Équipes', 'cats', 'jeu-equipes', false, 0, NULL, 0, 4, 'equipes', 'scores');
+
+INSERT INTO R_joueur (slug, pseudo, password, nom, prenom, email, description, avatar) VALUES
+('nestor', 'Nestor', '$2y$10$CwRFu66YRrpI2dFmLWWjeeDn2GI5Gup5ililfJsT5HDE.zyiAG/6m', 'Bochet', 'Vincent', 'vbochet@gmail.com', 'L''un des quatre membres du groupe, le moins joueur des quatre. :)', false),
+('nestor1', 'Nestor1', '', 'Bochet1', 'Vincent', 'vbochet1@gmail.com', 'L''un des quatre membres du groupe, le moins joueur des quatre. :)', false),
+('nestor2', 'Nestor2', '', 'Bochet2', 'Vincent', 'vbochet2@gmail.com', 'L''un des quatre membres du groupe, le moins joueur des quatre. :)', false),
+('nestor3', 'Nestor3', '', 'Bochet3', 'Vincent', 'vbochet3@gmail.com', 'L''un des quatre membres du groupe, le moins joueur des quatre. :)', false),
+('nestor4', 'Nestor4', '', 'Bochet4', 'Vincent', 'vbochet4@gmail.com', 'L''un des quatre membres du groupe, le moins joueur des quatre. :)', false);
+
+
+INSERT INTO R_admin (identite) VALUES
+('nestor');
diff --git a/www/.htaccess b/www/.htaccess
new file mode 100644
index 0000000000000000000000000000000000000000..3e5388f895f5f816992b8f288cb50a4f519950d5
--- /dev/null
+++ b/www/.htaccess
@@ -0,0 +1,10 @@
+# Mise en place de la ré-écriture
+RewriteEngine On
+
+# Adresse de base de réécriture, dépendante de l'architecture, et donc à modifier à chaque installation du site...
+RewriteBase /projet-web-2016/www
+
+# Règles de réécriture des URL
+RewriteCond %{SCRIPT_FILENAME} !-f
+RewriteCond %{SCRIPT_FILENAME} !-d
+RewriteRule (.*) index.php?query=$1 [QSA,L]
diff --git a/www/css/jquery.auto-complete.css b/www/css/jquery.auto-complete.css
new file mode 100644
index 0000000000000000000000000000000000000000..4261b1d033e28b55dfc43df39f5410a11823a15c
--- /dev/null
+++ b/www/css/jquery.auto-complete.css
@@ -0,0 +1,9 @@
+.autocomplete-suggestions {
+    text-align: left; cursor: default; border: 1px solid #ccc; border-top: 0; background: #fff; box-shadow: -1px 1px 3px rgba(0,0,0,.1);
+
+    /* core styles should not be changed */
+    position: absolute; display: none; z-index: 9999; max-height: 254px; overflow: hidden; overflow-y: auto; box-sizing: border-box;
+}
+.autocomplete-suggestion { position: relative; padding: 0 .6em; line-height: 23px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: 1.02em; color: #333; }
+.autocomplete-suggestion b { font-weight: normal; color: #1f8dd6; }
+.autocomplete-suggestion.selected { background: #f0f0f0; }
diff --git a/www/css/pure.min.css b/www/css/pure.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..29eae96a708643cd327d7f96700d6802d9cfc53d
--- /dev/null
+++ b/www/css/pure.min.css
@@ -0,0 +1,75 @@
+.pure-form input[type="text"],
+.pure-form textarea {
+	padding:.5em .6em;
+	display:inline-block;
+	border:1px solid #ccc;
+	box-shadow:inset 0 1px 3px #ddd;
+	border-radius:4px 0 0 4px;
+	-webkit-box-sizing:border-box;
+	-moz-box-sizing:border-box;
+	box-sizing:border-box;
+	border-right:0;
+	margin:0;
+}
+
+.pure-form input[type="submit"] {
+	display:inline-block;
+	border:1px solid #ccc;
+	box-shadow:inset 0 1px 3px #ddd;
+	border-radius:0 4px 4px 0;
+	-webkit-box-sizing:border-box;
+	-moz-box-sizing:border-box;
+	box-sizing:border-box;
+	border-left:0;
+	margin:0;
+}
+
+.pure-form input:focus,
+.pure-form textarea:focus {
+	outline:0;
+}
+
+.pure-form input[disabled],
+.pure-form textarea[disabled] {
+	cursor:not-allowed;
+	background-color:#eaeded;
+	color:#cad2d3;
+}
+
+.pure-form input[readonly],
+.pure-form textarea[readonly] {
+	background-color:#eee;
+	color:#777;
+	border-color:#ccc;
+}
+
+.pure-form input:focus:invalid,
+.pure-form select:focus:invalid {
+	color:#b94a48;
+	border-color:#e9322d;
+}
+
+.pure-form select {
+	height:2.25em;
+	border:1px solid #ccc;
+	background-color:#fff;
+}
+
+.pure-form select[multiple] {
+	height:auto;
+}
+
+.pure-form label {
+	margin:.5em 0 .2em;
+}
+
+@media only screen and (max-width :480px) {
+	.pure-form button[type=submit] {
+		margin:.7em 0 0;
+	}
+	
+	.pure-form label {
+		margin-bottom:.3em;
+		display:block;
+	}
+}
\ No newline at end of file
diff --git a/www/css/style.css b/www/css/style.css
new file mode 100644
index 0000000000000000000000000000000000000000..cc57665bae8fed6b2c8b937f51394436556e8171
--- /dev/null
+++ b/www/css/style.css
@@ -0,0 +1,578 @@
+body {
+    background-color:#76A7AE;
+    font-family: 'Work Sans', sans-serif;
+    margin: 0;
+    padding:0;
+}
+
+.wrapper{
+    min-height:100%;
+    position: relative;
+}
+
+header
+{
+	padding:0;
+    position: fixed;
+    top: 0;
+    right: 0;
+    left: 0;
+    height: 120px;
+	z-index:100;
+	margin-bottom: 15px;
+}
+
+.header {
+    padding:5px;
+	min-height:44px;
+    background:#26346D;
+}
+
+nav
+{
+    padding:5px;
+    background:#26346D;
+    min-height: 40px;
+	z-index:100;
+	margin:0;
+}
+
+footer{
+    background: #003F00;
+    padding: 20px;
+    color:white;
+    position:absolute;
+    bottom:0;
+    left:0;
+    right:0;
+    height: 100px;
+    box-sizing: border-box;
+}
+
+.main a{
+    color: #159C15;
+    text-decoration: none;
+}
+.main a:hover{
+    color: cadetblue !important;
+}
+.inscription-btn{
+    color:blanchedalmond !important;
+    font-weight : bold;
+    text-decoration:none;
+    width:100%;
+    padding: 2px;
+    border-radius:10px;
+    background: #02071E linear-gradient(to bottom, #02071E, #02071E, rgba(255, 255, 255, 0));
+    -webkit-transition: background 500ms; /* Safari */
+    transition: background 500ms ;
+    display: inline-block;
+    height:30px;
+}
+
+.inscription-btn:hover {
+    background: red linear-gradient(to bottom, #02071E, #02071E, rgba(255, 255, 255, 0));
+}
+.main{
+    margin-top:235px;
+    padding-bottom:100px;
+}
+
+article{
+    width:100%;
+    background:white;
+    box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
+    box-sizing: border-box;
+	padding: 20px;
+}
+
+
+
+header a, footer a {
+    color:navajowhite;
+    text-decoration: none;
+}
+
+header a:hover, footer a:hover {
+    color:cadetblue;
+    text-decoration: none;
+}
+
+.row:after {
+    content: "";
+    clear: both;
+    display: block;
+}
+
+
+
+
+#logo {
+    margin-left:20px;
+}
+
+.search-bar-conteneur {
+    vertical-align: middle;
+    margin-top:5px;
+    height: 32px;
+    border-radius: 2px;
+    position: static;
+}
+
+.search-bar {
+	margin-right:32px;
+	width: calc(100% - 32px);
+}
+
+.search-button {
+	width:32px;
+    height: 32px;
+	float:right;
+	background-image:url(../images/find.png);
+	background-size: 31px;
+}
+
+.connexion {
+    text-align: center;
+    border-radius: 2px;
+    background: #02071E;
+    margin-top:4px;
+    color:blanchedalmond;
+    line-height: 30px;
+    height:34px;
+}
+
+
+.signin {
+    width:48%;
+    text-align: center;
+    padding: 2px;
+    border-right: mintcream solid 1px;
+    background: #02071E linear-gradient(to bottom, #02071E, #02071E, rgba(255, 255, 255, 0));
+    -webkit-transition: background 500ms; /* Safari */
+    transition: background 500ms ;
+    display: inline-block;
+    height:30px;
+	margin-right:-4px;
+}
+
+.signin:hover {
+    background: red linear-gradient(to bottom, #02071E, #02071E, rgba(255, 255, 255, 0));
+
+}
+
+.login {
+    width:48%;
+    text-align: center;
+    padding: 2px;
+    border-left: mintcream solid 1px;
+    background: #02071E linear-gradient(to bottom, #02071E, #02071E, rgba(255, 255, 255, 0));
+    -webkit-transition: background 500ms; /* Safari */
+    transition: background 500ms ;
+    display: inline-block;
+    height:30px;
+	margin-left:-4px;
+}
+
+.login:hover{
+    background: blue linear-gradient(to bottom, #02071E, #02071E, rgba(255, 255, 255, 0));
+}
+
+
+
+.inscription-btn-container {
+    text-align: center;
+    background: #02071E;
+    line-height: 30px;
+    height:34px;
+	border-radius:10px;
+}
+
+
+
+nav ul {
+	text-align:center;
+	margin:0;
+	padding:0;
+}
+
+nav ul li {
+    display: inline-block;
+    text-align: center;
+    line-height: 28px;
+    height:28px;
+    margin-bottom:2px;
+    border-radius: 2px;
+    color:blanchedalmond;
+    background: #02071E linear-gradient(to bottom, #02071E, #02071E, rgba(255, 255, 255, 0));
+    -webkit-transition: background 500ms; /* Safari */
+    transition: background 500ms ;
+}
+
+nav ul li.actif {
+    color:blanchedalmond;
+    background: #0f0 linear-gradient(to bottom, #02071E, #02071E, rgba(255, 255, 255, 0));
+}
+
+nav ul li:hover{
+    background: magenta linear-gradient(to bottom, #02071E, #02071E, rgba(255, 255, 255, 0));
+}
+
+
+
+
+
+
+.logo-image{
+    height:40px;
+}
+.game{
+    background: white;
+    width:80%;
+    height:250px;
+    padding-top:3px;
+    box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
+    min-width: 220px;
+    margin: auto auto 10px;
+}
+.more{
+    background: darkgray;
+    height:250px;
+}
+
+.game-image{
+    height:220px;
+    display:block;
+    margin:auto;
+}
+
+.game-caption{
+    text-align: center;
+    vertical-align: middle;
+    padding:5px;
+    background: whitesmoke;
+}
+
+.pref{
+    list-style-type: none;
+    padding: 0;
+    text-align: center;
+    margin-top: 40px;
+}
+.stat-title{
+    text-align: center;
+}
+
+.jeux-preferes 
+{
+    margin: auto;
+    width: 90%;
+    border-collapse: collapse;
+}
+
+.jeux-preferes tr td img{
+    width: 50px;
+    display: block;
+    margin:auto;
+
+}
+
+.jeux-preferes tr td{
+    vertical-align: middle;
+    text-align: center;
+    border: black solid 1px;
+    padding:2px;
+
+}
+
+.more-link{
+    text-align: right;
+    margin-right: 15px;
+}
+
+.game-row{
+    margin-bottom:20px;
+}
+
+
+[class*="col-"] {
+    width: 100%;
+
+}
+
+.space{
+    height:0;
+}
+
+
+
+div.submit {
+	text-align:center;
+	margin-top:10px;
+}
+
+div.submit  input[type=submit], div.submit  input[type=reset] {
+	margin-left:5px;
+	margin-right:5px;
+}
+
+.connexion-form, .inscription-form{
+    margin: auto;
+    display: block;
+    width: 300px;
+}
+
+.addjeu-form{
+    margin: auto;
+    display: block;
+    width: 324px;
+}
+
+.connexion-form label , .inscription-form label, .addjeu-form label {
+	display: block;
+	min-width: 150px;
+	float: left;
+}
+
+
+.inscription-form textarea, .addjeu-form textarea {
+	width: 160px;
+}
+
+.form-line {
+	margin-bottom:10px;
+}
+
+.validation-container-left {
+	position: relative;
+	display: flex;
+}
+
+.validation-container {
+	min-height: 25px;
+	min-width:120px;
+	max-width:130px;
+	position: relative;
+	margin-top:-2px;
+	margin-left:150px;
+    padding-left:7px;
+	padding-right:7px;
+	background: red;
+	color:white;
+	box-shadow: 0 0 2px black;
+	/*display: flex;*/
+	display:none;
+}
+
+.validation-container-content {
+	margin: auto;
+}
+
+.validation-container:before,
+.validation-container:after {
+	content: '';
+	width: .7em; height: .7em;
+	position: absolute; top: -.35em; left: 3.5em;
+	margin-left: .35em;
+	background: red;
+	-webkit-transform:rotate(45deg);
+	-moz-transform:rotate(45deg);
+	-ms-transform:rotate(45deg);
+	-o-transform:rotate(45deg);
+	transform:rotate(45deg);
+}
+
+.validation-container:before {
+	-webkit-box-shadow: 0 0 5px black;
+	-moz-box-shadow: 0 0 5px black;
+	box-shadow: 0 0 5px black;
+	z-index: -1;
+}
+
+.validation-checkbox {
+	display:none;
+}
+
+.connexion-form input, .inscription-form input{
+    margin-bottom:12px;
+}
+
+.profil-image, .jeu-image{
+    margin: auto;
+}
+
+.profil-image img{
+    width: 100px;
+    margin: auto;
+    display: block;
+    border-radius: 100%;
+    box-shadow: 0 6px 20px 2px black;
+}
+
+.jeu-image img{
+    width: 230px;
+    margin: auto;
+    display: block;
+    box-shadow: 0 6px 20px 2px black;
+}
+
+article h1{
+    text-align:  center;
+	font-size: 2em;
+	font-weight: bolder;
+}
+article h2{
+    text-align:  center;
+}
+
+.msg-erreur {
+	color: white;
+	background-color: red;
+}
+
+.msg-valide h2 {
+	text-align:left;
+}
+.msg-valide {
+	color: white;
+	background-color: green;
+}
+
+.surtitre {
+	color: white;
+	background-color:  #4A588F;
+}
+
+.classement-card{
+    width:100%;
+    background:white;
+    box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
+    margin-top: 24px;
+    padding:20px;
+    box-sizing: border-box;
+}
+
+.classement-table{
+    border-collapse: collapse;
+    margin: auto;
+    width: 100%;
+    text-align: center;
+    border: black solid 1px;
+}
+
+.classement-table th{
+    border: black solid 1px;
+}
+.classement-table td{
+    border-bottom: solid black 1px;
+    border-top: solid black 1px;
+}
+
+.classement-profil-img{
+    width: 50px;
+    border-radius: 100%;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+@media only screen and (min-width: 600px) {
+    /* For tablets: */
+    .col-m-1 {width: 8.33%;}
+    .col-m-2 {width: 16.66%;}
+    .col-m-3 {width: 25%;}
+    .col-m-4 {width: 33.33%;}
+    .col-m-5 {width: 41.66%;}
+    .col-m-6 {width: 50%;}
+    .col-m-7 {width: 58.33%;}
+    .col-m-8 {width: 66.66%;}
+    .col-m-9 {width: 75%;}
+    .col-m-10 {width: 83.33%;}
+    .col-m-11 {width: 91.66%;}
+    .col-m-12 {width: 100%;}
+
+    [class*="col-"] {
+        float: left;
+    }
+
+    nav ul li{
+    margin:0 5px 2px 5px;
+    padding: 2px 8px 0 8px;
+    }
+
+    header{
+        min-height: 40px;
+    }
+
+    .main{
+        margin-top:120px;
+    }
+
+    .space{
+        height: 40px;
+    }
+
+}
+
+
+
+@media only screen and (min-width: 768px) {
+    .col-1 {width: 8.32%;}
+    .col-2 {width: 16.65%;}
+    .col-3 {width: 25%;}
+    .col-4 {width: 33.32%;}
+    .col-5 {width: 41.65%;}
+    .col-6 {width: 50%;}
+    .col-7 {width: 58.32%;}
+    .col-8 {width: 66.65%;}
+    .col-9 {width: 75%;}
+    .col-10 {width: 83.32%;}
+    .col-11 {width: 91.65%;}
+    .col-12 {width: 100%;}
+
+    .game{
+        margin-bottom:0;
+    }
+
+    .stat-block{
+        min-height: 200px;
+    }
+    article{
+        margin:auto;
+        width:768px;
+        background:white;
+        box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
+
+    }
+
+    .classement-card{
+        margin: 24px auto auto;
+        width:768px;
+        background:white;
+        box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
+    }
+
+    .profil-image, .jeu-image{
+        float:left;
+        padding: 10px;
+    }
+
+    .profil-image img, .jeu-image img{
+        margin-right: 10px;
+        margin-left: 24px;
+
+    }
+
+
+
+
+}
+
diff --git a/www/images/avatar/b b/www/images/avatar/b
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/www/images/cancel.svg b/www/images/cancel.svg
new file mode 100644
index 0000000000000000000000000000000000000000..74217739102e22e1aa6e161d538e2392385826fc
--- /dev/null
+++ b/www/images/cancel.svg
@@ -0,0 +1,558 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="48px"
+   height="48px"
+   id="svg1306"
+   sodipodi:version="0.32"
+   inkscape:version="0.45.1"
+   sodipodi:docbase="C:\Documents and Settings\AleXander\Desktop"
+   sodipodi:docname="Dialog-error.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs1308">
+    <linearGradient
+       id="linearGradient3957">
+      <stop
+         style="stop-color:#fffeff;stop-opacity:0.33333334;"
+         offset="0"
+         id="stop3959" />
+      <stop
+         style="stop-color:#fffeff;stop-opacity:0.21568628;"
+         offset="1"
+         id="stop3961" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2536">
+      <stop
+         style="stop-color:#a40000;stop-opacity:1;"
+         offset="0"
+         id="stop2538" />
+      <stop
+         style="stop-color:#ff1717;stop-opacity:1;"
+         offset="1"
+         id="stop2540" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2479">
+      <stop
+         style="stop-color:#ffe69b;stop-opacity:1;"
+         offset="0"
+         id="stop2481" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop2483" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4126"
+       inkscape:collect="always">
+      <stop
+         id="stop4128"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <stop
+         id="stop4130"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0;" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4126"
+       id="radialGradient2169"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.000000,0.000000,0.000000,0.500000,1.899196e-14,20.00000)"
+       cx="23.857143"
+       cy="40.000000"
+       fx="23.857143"
+       fy="40.000000"
+       r="17.142857" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2479"
+       id="linearGradient2485"
+       x1="43.93581"
+       y1="53.835983"
+       x2="20.064686"
+       y2="-8.5626707"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2536"
+       id="linearGradient2542"
+       x1="36.917976"
+       y1="66.288063"
+       x2="19.071495"
+       y2="5.5410109"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2536"
+       id="linearGradient3046"
+       gradientUnits="userSpaceOnUse"
+       x1="36.917976"
+       y1="66.288063"
+       x2="19.071495"
+       y2="5.5410109" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2479"
+       id="linearGradient3048"
+       gradientUnits="userSpaceOnUse"
+       x1="43.93581"
+       y1="53.835983"
+       x2="20.064686"
+       y2="-8.5626707" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2536"
+       id="linearGradient3064"
+       gradientUnits="userSpaceOnUse"
+       x1="36.917976"
+       y1="66.288063"
+       x2="19.071495"
+       y2="5.5410109" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2479"
+       id="linearGradient3066"
+       gradientUnits="userSpaceOnUse"
+       x1="43.93581"
+       y1="53.835983"
+       x2="20.064686"
+       y2="-8.5626707" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3957"
+       id="linearGradient3963"
+       x1="21.993773"
+       y1="33.955299"
+       x2="20.917078"
+       y2="15.814602"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4126"
+       id="radialGradient3976"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.5,0,20)"
+       cx="23.857143"
+       cy="40.000000"
+       fx="23.857143"
+       fy="40.000000"
+       r="17.142857" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2536"
+       id="linearGradient3978"
+       gradientUnits="userSpaceOnUse"
+       x1="36.917976"
+       y1="66.288063"
+       x2="19.071495"
+       y2="5.5410109" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2479"
+       id="linearGradient3980"
+       gradientUnits="userSpaceOnUse"
+       x1="43.93581"
+       y1="53.835983"
+       x2="20.064686"
+       y2="-8.5626707" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3957"
+       id="linearGradient3982"
+       gradientUnits="userSpaceOnUse"
+       x1="21.993773"
+       y1="33.955299"
+       x2="20.917078"
+       y2="15.814602"
+       gradientTransform="matrix(1.002994,0,0,1.002994,-7.1859e-2,1.968356e-2)" />
+    <linearGradient
+       gradientTransform="translate(0,-2)"
+       gradientUnits="userSpaceOnUse"
+       y2="35.05225"
+       x2="24.30225"
+       y1="15.80225"
+       x1="21.75"
+       id="linearGradient2262"
+       xlink:href="#linearGradient2256"
+       inkscape:collect="always" />
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.154957,0,0,3.198723,-52.84553,-23.50921)"
+       r="21.25"
+       fy="10.666344"
+       fx="16.75"
+       cy="10.666344"
+       cx="16.75"
+       id="radialGradient2254"
+       xlink:href="#linearGradient2248"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientTransform="matrix(0.988373,0.000000,0.000000,0.988373,0.279002,0.278984)"
+       y2="37.959785"
+       x2="41.047836"
+       y1="20.105337"
+       x1="23.995985"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2243"
+       xlink:href="#linearGradient4981"
+       inkscape:collect="always" />
+    <radialGradient
+       gradientTransform="matrix(1.693981,0,0,1.693981,-16.86529,-25.11111)"
+       gradientUnits="userSpaceOnUse"
+       r="12.30225"
+       fy="33.30225"
+       fx="24.30225"
+       cy="33.30225"
+       cx="24.30225"
+       id="radialGradient2239"
+       xlink:href="#linearGradient9647"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="28.394291"
+       x2="32.166405"
+       y1="16.285088"
+       x1="15.578875"
+       id="linearGradient7901"
+       xlink:href="#linearGradient7895"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientTransform="translate(0,-2)"
+       gradientUnits="userSpaceOnUse"
+       y2="37.959785"
+       x2="41.047836"
+       y1="20.105337"
+       x1="23.995985"
+       id="linearGradient4987"
+       xlink:href="#linearGradient4981"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientTransform="translate(0,-2)"
+       gradientUnits="userSpaceOnUse"
+       y2="47.374317"
+       x2="53.570126"
+       y1="12.503600"
+       x1="15.737001"
+       id="linearGradient2057"
+       xlink:href="#linearGradient11780"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15762"
+       id="linearGradient15772"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1.000000,0.000000,0.000000,-1.000000,31.72170,31.29079)"
+       x1="5.7365270"
+       y1="5.3855424"
+       x2="9.8940229"
+       y2="9.6507530" />
+    <linearGradient
+       id="linearGradient11014">
+      <stop
+         id="stop11016"
+         offset="0.0000000"
+         style="stop-color:#a80000;stop-opacity:1.0000000;" />
+      <stop
+         id="stop13245"
+         offset="0.0000000"
+         style="stop-color:#c60000;stop-opacity:1.0000000;" />
+      <stop
+         id="stop11018"
+         offset="1.0000000"
+         style="stop-color:#e50000;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient11780">
+      <stop
+         id="stop11782"
+         offset="0.0000000"
+         style="stop-color:#ff8b8b;stop-opacity:1.0000000;" />
+      <stop
+         id="stop11784"
+         offset="1.0000000"
+         style="stop-color:#ec1b1b;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient14236">
+      <stop
+         style="stop-color:#ed4040;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop14238" />
+      <stop
+         style="stop-color:#a40000;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop14240" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient15762">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop15764" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop15766" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4981">
+      <stop
+         id="stop4983"
+         offset="0"
+         style="stop-color:#cc0000;stop-opacity:1;" />
+      <stop
+         id="stop4985"
+         offset="1.0000000"
+         style="stop-color:#b30000;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient7895"
+       inkscape:collect="always">
+      <stop
+         id="stop7897"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop7899"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+    </linearGradient>
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.595238,0,14.875)"
+       r="15.75"
+       fy="36.75"
+       fx="25.125"
+       cy="36.75"
+       cx="25.125"
+       id="radialGradient21650"
+       xlink:href="#linearGradient21644"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient21644"
+       inkscape:collect="always">
+      <stop
+         id="stop21646"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <stop
+         id="stop21648"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient9647">
+      <stop
+         id="stop9649"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop9651"
+         offset="1"
+         style="stop-color:#dbdbdb;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2248"
+       inkscape:collect="always">
+      <stop
+         id="stop2250"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop2252"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2256">
+      <stop
+         id="stop2258"
+         offset="0"
+         style="stop-color:#ff0202;stop-opacity:1;" />
+      <stop
+         id="stop2260"
+         offset="1"
+         style="stop-color:#ff9b9b;stop-opacity:1;" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient9647"
+       id="radialGradient2335"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.693981,0,0,1.693981,-16.86529,-23.715608)"
+       cx="24.30225"
+       cy="33.30225"
+       fx="24.30225"
+       fy="33.30225"
+       r="12.30225" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2256"
+       id="linearGradient2337"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-7.1723252e-7,-0.6044975)"
+       x1="21.75"
+       y1="15.80225"
+       x2="24.30225"
+       y2="35.05225" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="0.21568627"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.9785191"
+     inkscape:cx="41.314579"
+     inkscape:cy="38.052902"
+     inkscape:current-layer="layer3"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="925"
+     inkscape:window-height="846"
+     inkscape:window-x="247"
+     inkscape:window-y="-12"
+     inkscape:showpageshadow="false"
+     fill="#ef2929"
+     gridempspacing="4" />
+  <metadata
+     id="metadata1311">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Rodney Dawes</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <dc:contributor>
+          <cc:Agent>
+            <dc:title>Jakub Steiner, Garrett LeSage</dc:title>
+          </cc:Agent>
+        </dc:contributor>
+        <cc:license
+           rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
+        <dc:title>Dialog Error</dc:title>
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
+        <cc:permits
+           rdf:resource="http://web.resource.org/cc/Reproduction" />
+        <cc:permits
+           rdf:resource="http://web.resource.org/cc/Distribution" />
+        <cc:requires
+           rdf:resource="http://web.resource.org/cc/Notice" />
+        <cc:requires
+           rdf:resource="http://web.resource.org/cc/Attribution" />
+        <cc:permits
+           rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+        <cc:requires
+           rdf:resource="http://web.resource.org/cc/ShareAlike" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Shadow">
+    <path
+       inkscape:r_cy="true"
+       inkscape:r_cx="true"
+       transform="matrix(1.070555,0,0,0.525,-0.892755,22.5)"
+       d="M 41 40 A 17.142857 8.5714283 0 1 1  6.7142868,40 A 17.142857 8.5714283 0 1 1  41 40 z"
+       sodipodi:ry="8.5714283"
+       sodipodi:rx="17.142857"
+       sodipodi:cy="40"
+       sodipodi:cx="23.857143"
+       id="path6548"
+       style="opacity:0.6;color:#000000;fill:url(#radialGradient3976);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
+       sodipodi:type="arc" />
+  </g>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <g
+       id="g4006">
+      <path
+         transform="matrix(0.920488,0,0,0.920488,2.368532,0.97408)"
+         d="M 46.857143 23.928572 A 23.357143 23.357143 0 1 1  0.1428566,23.928572 A 23.357143 23.357143 0 1 1  46.857143 23.928572 z"
+         sodipodi:ry="23.357143"
+         sodipodi:rx="23.357143"
+         sodipodi:cy="23.928572"
+         sodipodi:cx="23.5"
+         id="path1314"
+         style="fill:url(#linearGradient3978);fill-opacity:1;fill-rule:nonzero;stroke:#b20000;stroke-width:1.08638;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:type="arc"
+         inkscape:r_cx="true"
+         inkscape:r_cy="true" />
+      <path
+         transform="matrix(0.856093,0,0,0.856093,1.818275,0.197769)"
+         d="M 49.901535 26.635273 A 23.991123 23.991123 0 1 1  1.9192886,26.635273 A 23.991123 23.991123 0 1 1  49.901535 26.635273 z"
+         sodipodi:ry="23.991123"
+         sodipodi:rx="23.991123"
+         sodipodi:cy="26.635273"
+         sodipodi:cx="25.910412"
+         id="path3560"
+         style="opacity:0.34659089;fill:#cc0000;fill-opacity:0;stroke:url(#linearGradient3980);stroke-width:1.16809607;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:type="arc"
+         inkscape:r_cx="true"
+         inkscape:r_cy="true" />
+    </g>
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Error Box">
+    <rect
+       inkscape:r_cy="true"
+       inkscape:r_cx="true"
+       style="fill:#efefef;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73876643;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.8627451"
+       id="rect2070"
+       width="28.000002"
+       height="6.0000873"
+       x="-13.292924"
+       y="30.234007"
+       transform="matrix(0.7071068,-0.7071068,0.7071068,0.7071068,0,0)" />
+    <rect
+       inkscape:r_cy="true"
+       inkscape:r_cx="true"
+       style="fill:#efefef;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73876643;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.8627451"
+       id="rect2353"
+       width="28.000002"
+       height="6.0000873"
+       x="19.234049"
+       y="-3.7071202"
+       transform="matrix(0.7071068,0.7071068,-0.7071068,0.7071068,0,0)" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Glossy Shine">
+    <path
+       sodipodi:nodetypes="czssc"
+       id="path3955"
+       d="M 43.428679,21.800186 C 43.428679,32.663229 33.043349,15.515116 24.698029,22.187731 C 16.547377,28.704695 4.039397,34.414777 4.039397,23.551734 C 4.039397,12.434496 12.760828,2.1207586 23.623874,2.1207586 C 34.48692,2.1207586 43.428679,10.937141 43.428679,21.800186 z "
+       style="fill:url(#linearGradient3982);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       inkscape:r_cx="true"
+       inkscape:r_cy="true" />
+  </g>
+</svg>
diff --git a/www/images/dummy_web_page.jpg b/www/images/dummy_web_page.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..60c7db05eed6bfe7776ac7c82819b250fce12560
Binary files /dev/null and b/www/images/dummy_web_page.jpg differ
diff --git a/www/images/find.png b/www/images/find.png
new file mode 100644
index 0000000000000000000000000000000000000000..50f725595c540691511c5cc8498cd6c38c7c361b
Binary files /dev/null and b/www/images/find.png differ
diff --git a/www/images/jeu/rencontres-cosmiques.jpg b/www/images/jeu/rencontres-cosmiques.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..b1ae656991f458ca75d93c5ea3c55aa6fd3b3cfd
Binary files /dev/null and b/www/images/jeu/rencontres-cosmiques.jpg differ
diff --git a/www/images/logo.png b/www/images/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..185fd62b8307af1e992d98f6179f4049dc5c3be0
Binary files /dev/null and b/www/images/logo.png differ
diff --git a/www/images/modif.svg b/www/images/modif.svg
new file mode 100644
index 0000000000000000000000000000000000000000..a0eba2b8484ab12625ce2266087f301bf4a8753b
--- /dev/null
+++ b/www/images/modif.svg
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg4198" xmlns="http://www.w3.org/2000/svg" height="42.525" width="42.525" version="1.0" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs id="defs4200">
+  <linearGradient id="linearGradient15218">
+   <stop id="stop15220" stop-color="#f0f0ef" offset="0"/>
+   <stop id="stop2269" stop-color="#e8e8e8" offset=".59929"/>
+   <stop id="stop2267" stop-color="#fff" offset=".82759"/>
+   <stop id="stop15222" stop-color="#d8d8d3" offset="1"/>
+  </linearGradient>
+  <linearGradient id="linearGradient2259">
+   <stop id="stop2261" stop-color="#fff" offset="0"/>
+   <stop id="stop2263" stop-color="#fff" stop-opacity="0" offset="1"/>
+  </linearGradient>
+  <linearGradient id="linearGradient3497" y2="39.498" xlink:href="#linearGradient15218" gradientUnits="userSpaceOnUse" x2="35.785" gradientTransform="matrix(1.0657 0 0 .98760 -8.5483 -4.8917)" y1="18.992" x1="22.308"/>
+  <linearGradient id="linearGradient3499" y2="42.007" xlink:href="#linearGradient2259" gradientUnits="userSpaceOnUse" x2="30.811" gradientTransform="matrix(.99850 0 0 .99825 -6.9704 -4.8929)" y1="26.697" x1="26.076"/>
+  <linearGradient id="linearGradient3501" y2="39.498" xlink:href="#linearGradient15218" gradientUnits="userSpaceOnUse" x2="35.785" gradientTransform="matrix(.67326 0 0 .62408 13.393 9.6326)" y1="18.992" x1="22.308"/>
+  <linearGradient id="linearGradient3503" y2="42.007" xlink:href="#linearGradient2259" gradientUnits="userSpaceOnUse" x2="30.811" gradientTransform="matrix(.63048 0 0 .63084 14.402 9.6314)" y1="26.697" x1="26.076"/>
+  <linearGradient id="linearGradient3505" y2="37.771" gradientUnits="userSpaceOnUse" x2="33.665" gradientTransform="matrix(.63084 0 0 .63084 14.51 9.6314)" y1="40.458" x1="35.997">
+   <stop id="stop2226" stop-color="#7c7c7c" offset="0"/>
+   <stop id="stop2228" stop-color="#b8b8b8" offset="1"/>
+  </linearGradient>
+  <linearGradient id="linearGradient3507" y2="38.07" gradientUnits="userSpaceOnUse" x2="34.17" gradientTransform="matrix(.63084 0 0 .63084 14.51 9.3949)" y1="36.921" x1="33.396">
+   <stop id="stop2253" stop-color="#fff" offset="0"/>
+   <stop id="stop2255" stop-color="#fff" stop-opacity="0" offset="1"/>
+  </linearGradient>
+ </defs>
+ <g id="layer1" transform="translate(-3.2124 -.63038)">
+  <g id="g3475">
+   <path id="path1650" stroke-linejoin="round" d="m45.265 21.893c0 11.482-9.308 20.79-20.79 20.79s-20.79-9.308-20.79-20.79c-0.0001-11.482 9.308-20.79 20.79-20.79 11.482-0.0001 20.79 9.308 20.79 20.79v0z" stroke="#914900" stroke-linecap="round" stroke-width="0.945" fill="#f57900"/>
+   <path id="path3392" stroke-linejoin="round" d="m44.732 21.802c0 11.11-9.007 20.117-20.118 20.117-11.11 0-20.118-9.007-20.118-20.117 0.0005-11.111 9.008-20.118 20.118-20.118 11.111-0.0002 20.118 9.007 20.118 20.118v0z" stroke="#fcaf3e" stroke-linecap="round" stroke-width=".91445" fill="none"/>
+   <path id="path3068" d="m43.853 20.966c0 10.831-6.052-4.306-18.674 0.386-12.723 4.73-20.567 10.445-20.567-0.386-0.0001-10.831 8.79-19.621 19.621-19.621 10.83 0.0002 19.62 8.79 19.62 19.621z" fill-opacity=".21390" fill="#fffeff"/>
+   <g id="g4268" opacity=".5" transform="matrix(.63180 0 0 .63123 10.591 7.0472)">
+    <rect id="rect2279" opacity=".17045" fill-rule="evenodd" height="2" width="13" y="34.033" x="20.162"/>
+    <rect id="rect4238" opacity="1" fill-rule="evenodd" rx=".56566" ry=".56616" height="35.977" width="30.952" stroke="#888a85" y="1.5629" x="1.5484" stroke-width=".99894" fill="url(#linearGradient3497)"/>
+    <rect id="rect4240" opacity="1" rx="0" ry="0" height="33.981" width="28.971" stroke="url(#linearGradient3499)" y="2.5606" x="2.5325" stroke-width=".99894" fill="none"/>
+    <rect id="rect4248" opacity=".17045" fill-rule="evenodd" height="2" width="21" y="10.033" x="7.0161"/>
+    <rect id="rect4250" opacity=".17045" fill-rule="evenodd" height="2" width="20" y="14.033" x="7.0161"/>
+    <rect id="rect4252" opacity=".17045" fill-rule="evenodd" height="2" width="18" y="18.033" x="7.0161"/>
+    <rect id="rect4254" opacity=".17045" fill-rule="evenodd" height="2" width="21" y="22.033" x="7.0161"/>
+    <rect id="rect4256" opacity=".17045" fill-rule="evenodd" height="2" width="13" y="26.033" x="7.0161"/>
+   </g>
+   <path id="rect12413" opacity=".80277" d="m20.131 13.711h18.835c0.199 0 0.359 0.16 0.359 0.358v17.139c0 1.562-4.34 5.238-5.846 5.238h-13.348c-0.199 0-0.359-0.16-0.359-0.358v-22.019c0-0.198 0.16-0.358 0.359-0.358z" fill-rule="evenodd" stroke="#888a85" stroke-width=".63084" fill="url(#linearGradient3501)"/>
+   <rect id="rect15244" rx="0" ry="0" height="21.474" width="18.293" stroke="url(#linearGradient3503)" y="14.342" x="20.402" stroke-width=".63084" fill="none"/>
+   <path id="path2210" d="m33.472 36.445c1.281 0.208 6.049-2.858 5.857-5.361-0.986 1.528-3.002 0.811-5.594 0.912 0 0 0.25 4.133-0.263 4.449z" fill-rule="evenodd" stroke="#868a84" stroke-width=".63084" fill="url(#linearGradient3505)"/>
+   <path id="path2247" opacity=".36932" d="m34.387 35.062c0.864-0.431 2.794-1.354 3.613-2.541-1.006 0.429-1.859 0.133-3.597 0.12 0 0 0.103 1.932-0.016 2.421z" stroke="url(#linearGradient3507)" stroke-width=".63084" fill="none"/>
+   <rect id="rect2271" opacity=".17045" fill-rule="evenodd" height="1.2617" width="13.248" y="19.094" x="23.239"/>
+   <rect id="rect2273" opacity=".17045" fill-rule="evenodd" height="1.2617" width="12.612" y="21.617" x="23.239"/>
+   <rect id="rect2275" opacity=".17045" fill-rule="evenodd" height="1.2617" width="11.34" y="24.141" x="23.239"/>
+   <rect id="rect2277" opacity=".17045" fill-rule="evenodd" height="1.2617" width="13.248" y="26.664" x="23.239"/>
+  </g>
+ </g>
+</svg>
diff --git a/www/images/ok.svg b/www/images/ok.svg
new file mode 100644
index 0000000000000000000000000000000000000000..287b11e7fa019b860c28aa56e1b40c4df6441992
--- /dev/null
+++ b/www/images/ok.svg
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg1306" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="48px" width="48px" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <defs id="defs1308">
+  <radialGradient id="radialGradient3976" gradientUnits="userSpaceOnUse" cy="40" cx="23.857" gradientTransform="matrix(1 0 0 .5 0 20)" r="17.143">
+   <stop id="stop4128" offset="0"/>
+   <stop id="stop4130" stop-opacity="0" offset="1"/>
+  </radialGradient>
+  <linearGradient id="linearGradient3980" y2="-8.5627" gradientUnits="userSpaceOnUse" x2="20.065" y1="53.836" x1="43.936">
+   <stop id="stop2481" stop-color="#ffe69b" offset="0"/>
+   <stop id="stop2483" stop-color="#fff" offset="1"/>
+  </linearGradient>
+  <linearGradient id="linearGradient3982" y2="15.815" gradientUnits="userSpaceOnUse" x2="20.917" gradientTransform="matrix(1.003 0 0 1.003 -.071859 .019684)" y1="33.955" x1="21.994">
+   <stop id="stop3959" stop-color="#fffeff" stop-opacity=".33333" offset="0"/>
+   <stop id="stop3961" stop-color="#fffeff" stop-opacity=".21569" offset="1"/>
+  </linearGradient>
+ </defs>
+ <metadata id="metadata1311">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:creator>
+     <cc:Agent>
+      <dc:title>Rodney Dawes</dc:title>
+     </cc:Agent>
+    </dc:creator>
+    <dc:contributor>
+     <cc:Agent>
+      <dc:title>Jakub Steiner, Garrett LeSage</dc:title>
+     </cc:Agent>
+    </dc:contributor>
+    <cc:license rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/"/>
+    <dc:title/>
+   </cc:Work>
+   <cc:License rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
+    <cc:permits rdf:resource="http://web.resource.org/cc/Reproduction"/>
+    <cc:permits rdf:resource="http://web.resource.org/cc/Distribution"/>
+    <cc:requires rdf:resource="http://web.resource.org/cc/Notice"/>
+    <cc:requires rdf:resource="http://web.resource.org/cc/Attribution"/>
+    <cc:permits rdf:resource="http://web.resource.org/cc/DerivativeWorks"/>
+    <cc:requires rdf:resource="http://web.resource.org/cc/ShareAlike"/>
+   </cc:License>
+  </rdf:RDF>
+ </metadata>
+ <g id="layer2">
+  <path id="path6548" opacity=".6" style="color:#000000" d="m41 40a17.143 8.5714 0 1 1 -34.286 0 17.143 8.5714 0 1 1 34.286 0z" transform="matrix(1.0706 0 0 .525 -.89276 22.5)" display="block" fill="url(#radialGradient3976)"/>
+ </g>
+ <g id="layer1">
+  <g id="g4006">
+   <path id="path1314" d="m46.857 23.929c0 12.9-10.457 23.357-23.357 23.357s-23.357-10.457-23.357-23.357 10.457-23.357 23.357-23.357 23.357 10.457 23.357 23.357z" transform="matrix(.92049 0 0 .92049 2.3685 .97408)" stroke="#4e9a06" stroke-width="1.0864" fill="#73d216"/>
+   <path id="path3560" opacity=".34659" d="m49.902 26.635c0 13.25-10.741 23.991-23.991 23.991s-23.991-10.741-23.991-23.991 10.741-23.991 23.991-23.991 23.991 10.741 23.991 23.991z" fill-opacity="0" transform="matrix(.85609 0 0 .85609 1.8183 .19777)" stroke="url(#linearGradient3980)" stroke-width="1.1681"/>
+  </g>
+ </g>
+ <g id="layer3">
+  <g id="text4967" fill="#eeeeec" stroke="#eeeeec">
+   <path id="path4984" style="" d="m14.707 25.178c0.62921 0.000015 1.1052 0.5163 1.4278 1.5489 0.64534 1.9361 1.1052 2.9041 1.3794 2.9041 0.20973 0.000012 0.42753-0.16133 0.65342-0.48402 4.5336-7.2602 8.7284-13.133 12.584-17.618 1.0003-1.1616 2.5895-1.7424 4.7676-1.7425 0.51625 0.0000313 0.86313 0.048433 1.0406 0.1452 0.17744 0.096834 0.26618 0.21784 0.26621 0.36301-0.000033 0.2259-0.26624 0.66959-0.79863 1.331-6.2277 7.4861-12.004 15.392-17.328 23.717-0.37109 0.58082-1.1294 0.87124-2.2749 0.87123-1.1617 0.000005-1.8473-0.0484-2.0571-0.1452-0.54856-0.242-1.1939-1.4762-1.9361-3.7027-0.83897-2.4685-1.2585-4.0173-1.2584-4.6466-0.000008-0.67761 0.56468-1.331 1.6941-1.9603 0.69375-0.3872 1.3068-0.5808 1.8393-0.58082"/>
+  </g>
+ </g>
+ <g id="layer4">
+  <path id="path3955" fill="url(#linearGradient3982)" d="m43.429 21.8c0 10.863-10.386-6.285-18.731 0.388-8.151 6.517-20.659 12.227-20.659 1.364 0.0004-11.118 8.722-21.431 19.585-21.431 10.863-0.0002 19.805 8.816 19.805 19.679z"/>
+ </g>
+</svg>
diff --git a/www/images/plus-symbol.png b/www/images/plus-symbol.png
new file mode 100644
index 0000000000000000000000000000000000000000..aee1df91bd97c748767629c041b8ccc5d5563505
Binary files /dev/null and b/www/images/plus-symbol.png differ
diff --git a/www/images/profil_42.jpg b/www/images/profil_42.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..b88921a049a84a5ab4c796c8b65c9a2be8e346eb
Binary files /dev/null and b/www/images/profil_42.jpg differ
diff --git a/www/index.php b/www/index.php
new file mode 100644
index 0000000000000000000000000000000000000000..f9c2c0ac1e5012234c4a34c0c92cc6410f701721
--- /dev/null
+++ b/www/index.php
@@ -0,0 +1,18 @@
+<?php
+// 
+// Info :
+// Penser à éditer la ligne "RewriteBase" du fichier .htaccess si besoin.
+//
+//
+// Ce fichier est le point d'entrée unique du projet. Toute requête de page sera envoyée sur cette page, qui s'occupera d'appeler les fichiers nécessaires.
+// La requête client se trouve dans le paramètre query.
+//
+// => pour le debug : echo $_GET["query"]; die(); (affiche le contenu de $_GET['query'] et termine l'exécution)
+//
+
+define("ROOT", realpath(__dir__."/..")); // on définit une sorte de variable globale, nommée ROOT, qui contient le répertoire racine de notre site. On s'en servira par la suite lorsque l'on voudra accéder à tel ou tel fichier (vue, contrôleur, modèle ou autre...
+define("BASE_URL", "http://localhost/projet-web-2016/www"); // on définit une sorte de variable globale, nommée BASE_URL, qui contient le répertoire du point d'entrée de notre site, qui contient les images, css, etc.
+
+require_once(ROOT . "/app/kernel/Kernel.php"); // première chose à faire : on inclut le fichier noyau, qui va gérer les différentes actions à effectuer (trouver quelle page est demandée, quel contrôleur appeler, quelle vue afficher, etc.)
+
+Kernel::run(); // deuxième chose : on lance la méthode run() de la classe Kernel. (oui, c'est de l'objet.)
diff --git a/www/js/autocompletion_form_jeux.js b/www/js/autocompletion_form_jeux.js
new file mode 100644
index 0000000000000000000000000000000000000000..b51f6a7238f10c56bd53ceff191b409bd74b5599
--- /dev/null
+++ b/www/js/autocompletion_form_jeux.js
@@ -0,0 +1,37 @@
+var choices = [];
+		
+function loadJsonJeux(value) {
+	var params = {};
+	
+	$.ajax({
+		dataType: 'json',
+		type: 'POST',
+		url: BASE_URL+'/jeux',
+		data: params,
+		success: function(resp) {
+			for (var x = 0; x < resp.length; x++) {
+				choices.push(resp[x].value);
+			}
+		},
+		error: function() {
+			choices = [];
+			console.log('there was a problem checking the fields');
+		}
+	});
+}
+
+$(function(){
+	$('#rechercheJeu').autoComplete({
+		minChars: 1,
+		source: function(term, suggest){
+			term = term.toLowerCase();
+			var suggestions = [];
+			for (i=0;i<choices.length;i++) {
+				if(~choices[i].toLowerCase().indexOf(term)) {
+					suggestions.push(choices[i]);
+				}
+			}
+			suggest(suggestions);
+		}
+	});
+});
\ No newline at end of file
diff --git a/www/js/jquery.auto-complete.min.js b/www/js/jquery.auto-complete.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..c6deb2f25b5ecacffef3451315b2016e4f440956
--- /dev/null
+++ b/www/js/jquery.auto-complete.min.js
@@ -0,0 +1,3 @@
+// jQuery autoComplete v1.0.7
+// https://github.com/Pixabay/jQuery-autoComplete
+!function(e){e.fn.autoComplete=function(t){var o=e.extend({},e.fn.autoComplete.defaults,t);return"string"==typeof t?(this.each(function(){var o=e(this);"destroy"==t&&(e(window).off("resize.autocomplete",o.updateSC),o.off("blur.autocomplete focus.autocomplete keydown.autocomplete keyup.autocomplete"),o.data("autocomplete")?o.attr("autocomplete",o.data("autocomplete")):o.removeAttr("autocomplete"),e(o.data("sc")).remove(),o.removeData("sc").removeData("autocomplete"))}),this):this.each(function(){function t(e){var t=s.val();if(s.cache[t]=e,e.length&&t.length>=o.minChars){for(var a="",c=0;c<e.length;c++)a+=o.renderItem(e[c],t);s.sc.html(a),s.updateSC(0)}else s.sc.hide()}var s=e(this);s.sc=e('<div class="autocomplete-suggestions '+o.menuClass+'"></div>'),s.data("sc",s.sc).data("autocomplete",s.attr("autocomplete")),s.attr("autocomplete","off"),s.cache={},s.last_val="",s.updateSC=function(t,o){if(s.sc.css({top:s.offset().top+s.outerHeight(),left:s.offset().left,width:s.outerWidth()}),!t&&(s.sc.show(),s.sc.maxHeight||(s.sc.maxHeight=parseInt(s.sc.css("max-height"))),s.sc.suggestionHeight||(s.sc.suggestionHeight=e(".autocomplete-suggestion",s.sc).first().outerHeight()),s.sc.suggestionHeight))if(o){var a=s.sc.scrollTop(),c=o.offset().top-s.sc.offset().top;c+s.sc.suggestionHeight-s.sc.maxHeight>0?s.sc.scrollTop(c+s.sc.suggestionHeight+a-s.sc.maxHeight):0>c&&s.sc.scrollTop(c+a)}else s.sc.scrollTop(0)},e(window).on("resize.autocomplete",s.updateSC),s.sc.appendTo("body"),s.sc.on("mouseleave",".autocomplete-suggestion",function(){e(".autocomplete-suggestion.selected").removeClass("selected")}),s.sc.on("mouseenter",".autocomplete-suggestion",function(){e(".autocomplete-suggestion.selected").removeClass("selected"),e(this).addClass("selected")}),s.sc.on("mousedown click",".autocomplete-suggestion",function(t){var a=e(this),c=a.data("val");return(c||a.hasClass("autocomplete-suggestion"))&&(s.val(c),o.onSelect(t,c,a),s.sc.hide()),!1}),s.on("blur.autocomplete",function(){try{over_sb=e(".autocomplete-suggestions:hover").length}catch(t){over_sb=0}over_sb?s.is(":focus")||setTimeout(function(){s.focus()},20):(s.last_val=s.val(),s.sc.hide(),setTimeout(function(){s.sc.hide()},350))}),o.minChars||s.on("focus.autocomplete",function(){s.last_val="\n",s.trigger("keyup.autocomplete")}),s.on("keydown.autocomplete",function(t){if((40==t.which||38==t.which)&&s.sc.html()){var a,c=e(".autocomplete-suggestion.selected",s.sc);return c.length?(a=40==t.which?c.next(".autocomplete-suggestion"):c.prev(".autocomplete-suggestion"),a.length?(c.removeClass("selected"),s.val(a.addClass("selected").data("val"))):(c.removeClass("selected"),s.val(s.last_val),a=0)):(a=40==t.which?e(".autocomplete-suggestion",s.sc).first():e(".autocomplete-suggestion",s.sc).last(),s.val(a.addClass("selected").data("val"))),s.updateSC(0,a),!1}if(27==t.which)s.val(s.last_val).sc.hide();else if(13==t.which||9==t.which){var c=e(".autocomplete-suggestion.selected",s.sc);c.length&&s.sc.is(":visible")&&(o.onSelect(t,c.data("val"),c),setTimeout(function(){s.sc.hide()},20))}}),s.on("keyup.autocomplete",function(a){if(!~e.inArray(a.which,[13,27,35,36,37,38,39,40])){var c=s.val();if(c.length>=o.minChars){if(c!=s.last_val){if(s.last_val=c,clearTimeout(s.timer),o.cache){if(c in s.cache)return void t(s.cache[c]);for(var l=1;l<c.length-o.minChars;l++){var i=c.slice(0,c.length-l);if(i in s.cache&&!s.cache[i].length)return void t([])}}s.timer=setTimeout(function(){o.source(c,t)},o.delay)}}else s.last_val=c,s.sc.hide()}})})},e.fn.autoComplete.defaults={source:0,minChars:3,delay:150,cache:1,menuClass:"",renderItem:function(e,t){t=t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&");var o=new RegExp("("+t.split(" ").join("|")+")","gi");return'<div class="autocomplete-suggestion" data-val="'+e+'">'+e.replace(o,"<b>$1</b>")+"</div>"},onSelect:function(e,t,o){}}}(jQuery);
diff --git a/www/js/jquery.min.js b/www/js/jquery.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..0f60b7bd0d9c395e1748cc962810d2dee9bb9fc2
--- /dev/null
+++ b/www/js/jquery.min.js
@@ -0,0 +1,5 @@
+/*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\f]' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function qa(){}qa.prototype=d.filters=d.pseudos,d.setFilters=new qa,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function ra(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;
+
+return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Bottom","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==ca()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===ca()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return m.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?aa:ba):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:ba,isPropagationStopped:ba,isImmediatePropagationStopped:ba,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=aa,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=aa,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=aa,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,"form")?!1:void m.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=m.nodeName(b,"input")||m.nodeName(b,"button")?b.form:void 0;c&&!m._data(c,"submitBubbles")&&(m.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),m._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,"form")?!1:void m.event.remove(this,"._submit")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(m.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate("change",this,a,!0)})),!1):void m.event.add(this,"beforeactivate._change",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,"changeBubbles")&&(m.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate("change",this.parentNode,a,!0)}),m._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,"._change"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=ba;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,m(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=ba),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function da(a){var b=ea.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var ea="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",fa=/ jQuery\d+="(?:null|\d+)"/g,ga=new RegExp("<(?:"+ea+")[\\s/>]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/<tbody/i,la=/<|&#?\w+;/,ma=/<(?:script|style|link)/i,na=/checked\s*(?:[^=]|=\s*.checked.)/i,oa=/^$|\/(?:java|ecma)script/i,pa=/^true\/(.*)/,qa=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ra={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:k.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1></$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?"<table>"!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Ca[0].contentWindow||Ca[0].contentDocument).document,b.write(),b.close(),c=Ea(a,b),Ca.detach()),Da[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Ga=/^margin/,Ha=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ia,Ja,Ka=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ia=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)},Ja=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ia(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Ha.test(g)&&Ga.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ia=function(a){return a.currentStyle},Ja=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ia(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Ha.test(g)&&!Ka.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function La(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight),b.removeChild(i)),b.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Ma=/alpha\([^)]*\)/i,Na=/opacity\s*=\s*([^)]*)/,Oa=/^(none|table(?!-c[ea]).+)/,Pa=new RegExp("^("+S+")(.*)$","i"),Qa=new RegExp("^([+-])=("+S+")","i"),Ra={position:"absolute",visibility:"hidden",display:"block"},Sa={letterSpacing:"0",fontWeight:"400"},Ta=["Webkit","O","Moz","ms"];function Ua(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Ta.length;while(e--)if(b=Ta[e]+c,b in a)return b;return d}function Va(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fa(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wa(a,b,c){var d=Pa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xa(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Ya(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ia(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Ja(a,b,f),(0>e||null==e)&&(e=a.style[b]),Ha.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xa(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Ja(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ua(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qa.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ua(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Ja(a,b,d)),"normal"===f&&b in Sa&&(f=Sa[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Oa.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Ra,function(){return Ya(a,b,d)}):Ya(a,b,d):void 0},set:function(a,c,d){var e=d&&Ia(a);return Wa(a,c,d?Xa(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Na.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Ma,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Ma.test(f)?f.replace(Ma,e):f+" "+e)}}),m.cssHooks.marginRight=La(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Ja,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Ga.test(a)||(m.cssHooks[a+b].set=Wa)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ia(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Va(this,!0)},hide:function(){return Va(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Za(a,b,c,d,e){
+return new Za.prototype.init(a,b,c,d,e)}m.Tween=Za,Za.prototype={constructor:Za,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px")},cur:function(){var a=Za.propHooks[this.prop];return a&&a.get?a.get(this):Za.propHooks._default.get(this)},run:function(a){var b,c=Za.propHooks[this.prop];return this.options.duration?this.pos=b=m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Za.propHooks._default.set(this),this}},Za.prototype.init.prototype=Za.prototype,Za.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Za.propHooks.scrollTop=Za.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Za.prototype.init,m.fx.step={};var $a,_a,ab=/^(?:toggle|show|hide)$/,bb=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cb=/queueHooks$/,db=[ib],eb={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bb.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bb.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fb(){return setTimeout(function(){$a=void 0}),$a=m.now()}function gb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hb(a,b,c){for(var d,e=(eb[b]||[]).concat(eb["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ib(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fa(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fa(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ab.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fa(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hb(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jb(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kb(a,b,c){var d,e,f=0,g=db.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$a||fb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$a||fb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jb(k,j.opts.specialEasing);g>f;f++)if(d=db[f].call(j,a,k,j.opts))return d;return m.map(k,hb,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kb,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],eb[c]=eb[c]||[],eb[c].unshift(b)},prefilter:function(a,b){b?db.unshift(a):db.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kb(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gb(b,!0),a,d,e)}}),m.each({slideDown:gb("show"),slideUp:gb("hide"),slideToggle:gb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($a=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$a=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_a||(_a=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_a),_a=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e;b=y.createElement("div"),b.setAttribute("className","t"),b.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lb=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lb,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mb,nb,ob=m.expr.attrHandle,pb=/^(?:checked|selected)$/i,qb=k.getSetAttribute,rb=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nb:mb)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rb&&qb||!pb.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qb?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nb={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rb&&qb||!pb.test(c)?a.setAttribute(!qb&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ob[b]||m.find.attr;ob[b]=rb&&qb||!pb.test(b)?function(a,b,d){var e,f;return d||(f=ob[b],ob[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,ob[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rb&&qb||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mb&&mb.set(a,b,c)}}),qb||(mb={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},ob.id=ob.name=ob.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mb.set},m.attrHooks.contenteditable={set:function(a,b,c){mb.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sb=/^(?:input|select|textarea|button|object)$/i,tb=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sb.test(a.nodeName)||tb.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var ub=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ub," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ub," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ub," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vb=m.now(),wb=/\?/,xb=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xb,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yb,zb,Ab=/#.*$/,Bb=/([?&])_=[^&]*/,Cb=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Db=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Eb=/^(?:GET|HEAD)$/,Fb=/^\/\//,Gb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hb={},Ib={},Jb="*/".concat("*");try{zb=location.href}catch(Kb){zb=y.createElement("a"),zb.href="",zb=zb.href}yb=Gb.exec(zb.toLowerCase())||[];function Lb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mb(a,b,c,d){var e={},f=a===Ib;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nb(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Ob(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zb,type:"GET",isLocal:Db.test(yb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nb(Nb(a,m.ajaxSettings),b):Nb(m.ajaxSettings,a)},ajaxPrefilter:Lb(Hb),ajaxTransport:Lb(Ib),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cb.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zb)+"").replace(Ab,"").replace(Fb,yb[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gb.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yb[1]&&c[2]===yb[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yb[3]||("http:"===yb[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mb(Hb,k,b,v),2===t)return v;h=m.event&&k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Eb.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wb.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bb.test(e)?e.replace(Bb,"$1_="+vb++):e+(wb.test(e)?"&":"?")+"_="+vb++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jb+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mb(Ib,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Ob(k,v,c)),u=Pb(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qb=/%20/g,Rb=/\[\]$/,Sb=/\r?\n/g,Tb=/^(?:submit|button|image|reset|file)$/i,Ub=/^(?:input|select|textarea|keygen)/i;function Vb(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rb.test(a)?d(a,e):Vb(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vb(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vb(c,a[c],b,e);return d.join("&").replace(Qb,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Ub.test(this.nodeName)&&!Tb.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sb,"\r\n")}}):{name:b.name,value:c.replace(Sb,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zb()||$b()}:Zb;var Wb=0,Xb={},Yb=m.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Xb)Xb[a](void 0,!0)}),k.cors=!!Yb&&"withCredentials"in Yb,Yb=k.ajax=!!Yb,Yb&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wb;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xb[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xb[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zb(){try{return new a.XMLHttpRequest}catch(b){}}function $b(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _b=[],ac=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_b.pop()||m.expando+"_"+vb++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ac.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ac.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ac,"$1"+e):b.jsonp!==!1&&(b.url+=(wb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_b.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bc=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bc)return bc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cc=a.document.documentElement;function dc(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dc(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cc;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cc})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dc(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=La(k.pixelPosition,function(a,c){return c?(c=Ja(a,b),Ha.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ec=a.jQuery,fc=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fc),b&&a.jQuery===m&&(a.jQuery=ec),m},typeof b===K&&(a.jQuery=a.$=m),m});
diff --git a/www/js/verif_form_contact.js b/www/js/verif_form_contact.js
new file mode 100644
index 0000000000000000000000000000000000000000..437dcb78990724c5d5a39f3e2cef9efd2a3a65ad
--- /dev/null
+++ b/www/js/verif_form_contact.js
@@ -0,0 +1,43 @@
+function checkEmail(value, target) {
+	var regex = /^[a-z0-9._-]+(@|%40)[a-z0-9._-]{2,}\.[a-z]{2,4}$/;
+	var success = regex.test(value);
+
+	if (success) {
+		//validation OK
+		$('#rsp_'+target).text("Ok");
+		$('#rsp_'+target).parent().css("display","none");
+		$('input[name="valid_'+target+'"]').prop('checked',true);
+	} 
+	else {
+		//invalidation
+		$('#rsp_'+target).text("Format invalide");
+		$('#rsp_'+target).parent().css("display","flex");
+		$('input[name="valid_'+target+'"]').prop('checked',false);
+		$('#'+target).focus();
+	}
+}
+
+function checkForm() {
+	if($('#nom').val() == "") {
+		alert("Veuillez entrer votre nom dans le formulaire");
+		$('#nom').focus();
+		return false;
+	}
+	if($('#prenom').val() == "") {
+		alert("Veuillez entrer votre prénom dans le formulaire");
+		$('#prenom').focus();
+		return false;
+	}
+	if($('#email').val() == "" || !$('input[name="valid_email"]').is(':checked')) {
+		alert("Veuillez indiquer une adresse e-mail valide");
+		$('#email').focus();
+		return false;
+	}
+	if($('#message').val() == "") {
+		alert("Veuillez entrer votre message");
+		$('#message').focus();
+		return false;
+	}
+	
+	return true;
+}
diff --git a/www/js/verif_form_inscription.js b/www/js/verif_form_inscription.js
new file mode 100644
index 0000000000000000000000000000000000000000..ab644b981ea1ac308d1eda4c179aead004764e18
--- /dev/null
+++ b/www/js/verif_form_inscription.js
@@ -0,0 +1,70 @@
+function callAjax(method, value, target) {
+	if(encodeURIComponent) {
+		var params = {};
+		params["method"] = method;
+		params["value"]  = value; //encodeURIComponent(value);
+		
+		$.ajax({
+			dataType: 'json',
+			type: 'POST',
+			url: 'inscription/verify',
+			data: params,
+			success: function(resp) {
+				if (resp.success == true) {
+					//validation OK
+					$('#rsp_'+target).text(resp.text);
+					$('#rsp_'+target).parent().css("display","none");
+					$('input[name="valid_'+target+'"]').prop('checked',true);
+					return false;
+				} 
+				else {
+					//invalidation
+					$('#rsp_'+target).text(resp.text);
+					$('#rsp_'+target).parent().css("display","flex");
+					$('input[name="valid_'+target+'"]').prop('checked',false);
+					$('#'+target).focus();
+				}
+				return false;
+			},
+			error: function(data) {
+				alert(data.text);
+				console.log('Une erreur est survenue lors de la vérification de ce champ');
+			}
+		});
+	}
+}
+
+function checkForm() {
+	if($('#pseudo').val() == "" || !$('input[name="valid_pseudo"]').is(':checked')) {
+		alert("Veuillez indiquer un pseudo valide");
+		$('#pseudo').focus();
+		return false;
+	}
+	if($('#password').val() == "") {
+		alert("Veuillez indiquer un mot de passe");
+		$('#password').focus();
+		return false;
+	}
+	if($('#password_bis').val() == "" || $('#password').val() != $('#password_bis').val()) {
+		alert("Les mots de passe indiqués sont différents");
+		$('#password_bis').focus();
+		return false;
+	}
+	if($('#nom').val() == "") {
+		alert("Veuillez entrer votre nom dans le formulaire");
+		$('#nom').focus();
+		return false;
+	}
+	if($('#prenom').val() == "") {
+		alert("Veuillez entrer votre prénom dans le formulaire");
+		$('#prenom').focus();
+		return false;
+	}
+	if($('#email').val() == "" || !$('input[name="valid_email"]').is(':checked')) {
+		alert("Veuillez indiquer une adresse e-mail valide");
+		$('#email').focus();
+		return false;
+	}
+	
+	return true;
+}