// Déclaration des constantes
  var CREDIT_DEFAUT = 200;
  var MISE_DEFAUT = 5;
  var MISE_MAX = 40;
  var LANGUE_DEFAUT = "fr";  // langue qui sera utilisé par defaut si la langue du navigateur n'es pas disponible dans les choix de langues
// Déclaration des variables globales du jeu
  var gain = 0;
  var credit = CREDIT_DEFAUT;
  var mise = MISE_DEFAUT;
  var langueCourante = "";
  var languesDisponible = {};
  var langueNavigateur = window.navigator.language?window.navigator.language:window.navigator.systemLanguage?window.navigator.systemLanguage:langueDefaut;
  var messageCourant = "msgAppuyezDonner";
  var cartes = new Array();
  var cartesEnJeu = new Array();
  var peuxMiser = true;
  var verifierResultat = false;
  var donnerDisponible = true;
  var musiqueOn = true;
  var muteOn = true;
  var timeOutAfficherMessage = null;
  var factMult = {multJeu1: 1, multJeu2: 3, multJeu3: 4, multJeu4: 5, multJeu5: 6, multJeu6: 10, multJeu7: 25, multJeu8: 50, multJeu9: 250}

// méthode pour la distribution des cartes
function donnerCartes()
{
    window.clearTimeout(timeOutAfficherMessage);
    donnerDisponible = false;
    if (peuxMiser)
    {
      for (var numero = 0; numero<52; numero++)
      {
        cartes[numero].aGarder = false;
        cartes[numero].estUtilisee = false;
      }
      peuxMiser = false;
      retirerCredit(mise);
      gain = 0;
      afficherMontant();
      afficherMessage("msgSelectionnerCarte");
    }
    else
    {
      verifierResultat = true;
    }
    
    for (var numero = 0, nbCarte = 0; numero < 5; numero++)
    {
      if (!cartesEnJeu[numero] || !cartesEnJeu[numero].aGarder)
      {
         nbCarte++;
         var carte = tirerUneCarte();
         cartesEnJeu[numero] = carte;
         objetPoker.cartesJeu[numero].src = "images/cartes/endos.jpg";
         objetPoker.cartesLock[numero].style.display = "none";
         setTimeout("afficherCarte("+numero+")",300*nbCarte);
      }
      
    }
    setTimeout("termineDistribue()",300*(nbCarte+1));
}

// méthode qui affiche la carte et joue le son associé
function afficherCarte(no)
{
  objetPoker.cartesJeu[no].src = cartesEnJeu[no].image.src; 
  if (muteOn)
  {
    try {
        if (objetPoker.son4 && objetPoker.son4.controls) objetPoker.son4.controls.play();
        objetPoker.son3.play();
    }
    catch(e){}
  }
}

// méthode qui fait disparaître les locks sur les cartes et appel la fonction verifierLeJeu si il y a lieu
function termineDistribue()
{
    donnerDisponible = true;
    if (verifierResultat) 
    {
       for (var numero = 0; numero < 5; numero++)
         objetPoker.cartesLock[numero].style.display = "none";
       donnerDisponible = false;
       verifierLeJeu();
    }
}

// méthode appelée pour conserver ou non une carte
function garderCarte(numero)
{
   if (!peuxMiser)
   {
      cartesEnJeu[numero].aGarder = !cartesEnJeu[numero].aGarder;
      objetPoker.cartesLock[numero].style.display = cartesEnJeu[numero].aGarder==true?"block":"none";
   }
}

// méthode qui tire une carte disponible dans le jeu de 52 cartes
function tirerUneCarte()
{
  do 
  {
    var numero = Math.floor(Math.random() * 52); 
  }
  while (cartes[numero].estUtilisee)
  cartes[numero].estUtilisee = true;
  return cartes[numero];
}

// objet carte et ses différentes propriétées propre a chacune des 52 cartes
//   numero      => int (0 - 51) numéro de la carte dans le jeu de 52 cartes
//   valeur      => int (0 - 12) valeur de la carte (0=AS,..., 12=ROI)
//   couleur     => int (0 - 3 ) couleur de la carte (Trefle, Carreau, Coeur et Pique)
//   image       => objet image  image associée a la carte
//   estUtilisee => booléen      indique si la carte est utilisée ou pas
//   aGarder     => booléen      indique si la carte est a garder ou pas lors de la selection de carte
function carte(numero)
{
  this.numero = numero;
  this.valeur = numero%13;
  this.couleur = Math.floor(numero/13);
  this.image = document.createElement("img");
  this.image.src = "images/cartes/" + numero + ".jpg";
  this.estUtilisee = false;
  this.aGarder = false;
}

// méthode appelée pour le changement de la langue du jeux
function setLangueCourante(langue)
{
  var ancienneLangue = langueCourante;
  langueCourante = langue;
  getObjet(langue).className = 'langueSel';
  if (ancienneLangue && ancienneLangue != langueCourante) getObjet(ancienneLangue).className = 'langue';
  setTexteLangue();
}

// méthode appelée lors de l'ajout d'une langue dans le jeu
function ajouterLangue(prefixLangue, oLangue)
{
  languesDisponible[prefixLangue] = oLangue;
}

// méthode qui crée le bouton pour chacune des langues disponibles et détermine la langue par defaut, 
//  soit la langue du navigateur si elle est disponible, sinon la langue par defaut
function determinerLangueCourante()
{ 
  for(var prefixLangue in languesDisponible)
  {
    var boiteDeLangue = document.createElement("div");
    boiteDeLangue.className = langueCourante == prefixLangue?"langueSel":"langue";
    boiteDeLangue.langue = prefixLangue;
    boiteDeLangue.id = prefixLangue;
    boiteDeLangue.unselectable = "on";
    boiteDeLangue.onclick = function () {setLangueCourante(this.langue);};
    boiteDeLangue.innerHTML = prefixLangue;
    objetPoker.langueBox.appendChild(boiteDeLangue);  
  }
  setLangueCourante(languesDisponible[langueNavigateur]?langueNavigateur:LANGUE_DEFAUT);
}

// méthode qui créer l'objet objetPoker qui set les différents objets utilisés dans le jeu
function setObjetPoker()
{
  objetPoker = {
		jeu:  getObjet("jeu"),
		creditTexte:  getObjet("creditTexte"),
		miseTexte: getObjet("miseTexte"),
		gainTexte: getObjet("gainTexte"),
		messageTexte: getObjet("messageTexte"),
		donner: getObjet("donner"),
		credit: getObjet("credit"),
		mise: getObjet("mise"),
		gain: getObjet("gain"),
		langueBox: getObjet("langueBox"),
		musique: getObjet("musique"),
		son: getObjet("son"),
		mute: getObjet("mute"),
		son2: getObjet("son2"),
		son3: getObjet("son3"),
		son4: getObjet("son4"),
		son5: getObjet("son5"),
		son6: getObjet("son6"),
		cartesJeu: new Array(getObjet("carte1"), getObjet("carte2"), getObjet("carte3"), getObjet("carte4"), getObjet("carte5")),
		cartesLock: new Array(getObjet("carte1Sel"), getObjet("carte2Sel"), getObjet("carte3Sel"), getObjet("carte4Sel"), getObjet("carte5Sel"))
  }
}

// méthode qui retourne l'objet qui correspond à l'id de celui-ci
function getObjet(o)
{
  return document.getElementById(o);
}

// méthode qui change les différents libellés du jeu dans la langue sélectionnée ou par defaut
function setTexteLangue()
{
  maLangue = languesDisponible[langueCourante];
  objetPoker.creditTexte.innerHTML = (maLangue.credit);
  objetPoker.miseTexte.innerHTML = (maLangue.mise);
  objetPoker.gainTexte.innerHTML = (maLangue.gain);
  objetPoker.messageTexte.innerHTML = (maLangue[messageCourant]);
  objetPoker.donner.innerHTML = (maLangue.donner);
}

// méthode qui affiche une message dans la boîte de message et qui set le message courant
function afficherMessage(message)
{
  messageCourant = message;
  objetPoker.messageTexte.innerHTML = (maLangue[messageCourant]);
}

// méthode permettant d'ajouter _nbCredit crédits
function ajouterCredit(nbCredit)
{
  credit += nbCredit; 
  afficherMontant();
}

// méthode permettant de retirer _nbCredit crédits
function retirerCredit(nbCredit) 
{
  credit -= nbCredit;
  if (credit <= 0)
  {
    credit = 0;
  }
  afficherMontant();
}

// méthode permettant d'ajouter la mise de _nbMise 
function ajouterMise(nbMise)
{ 
  if (!peuxMiser) return;
  mise += nbMise; 
  mise = Math.min(credit, MISE_MAX, mise); 
  afficherMontant();
}

// méthode permettant de diminuer la mise de _nbMise
function retirerMise(nbMise) 
{
  if (!peuxMiser) return;
  mise -= nbMise;
  if (mise < 1) 
  {
    mise = Math.min(credit,1);
  } 
  afficherMontant();
}

// méthode qui affiche le credit, la mise et le gain
function afficherMontant()
{
  objetPoker.credit.innerHTML = credit + "&nbsp;";
  objetPoker.mise.innerHTML = mise + "&nbsp;";
  objetPoker.gain.innerHTML = gain + "&nbsp;";
}

// méthode qui permet de jouer ou pas la musique d'embiance
function setOptionMusique()
{
  if (musiqueOn==true || muteOn==false)
  {
     objetPoker.musique.className = "musiqueOff";
    try {
        musiqueOn = false;
        if (objetPoker.son2 && objetPoker.son2.controls) objetPoker.son2.controls.stop();
        objetPoker.son.stop();
    }
    catch(e){}
  }
  else
  {
    objetPoker.musique.className = "musiqueOn";
    try {
        musiqueOn = true;
        if (objetPoker.son2 && objetPoker.son2.controls) objetPoker.son2.controls.play();
        objetPoker.son.play();
    }
    catch(e){}
  }
}

// méthode permettant de déterminer si le jeu est gagnant
function verifierLeJeu()
{       
   var valJeu = 0;
   var paire = false;
   var noPaire = "";
   var i = 0;
   
   cartesEnJeu.sort(triCartes);
   
   //* Paire de Dame, Valet, Roi ou AS
   for (i = 0; i < 4; i++)
   {
      if (cartesEnJeu[i].valeur == cartesEnJeu[i + 1].valeur)
      {
        paire  = true;
        if (cartesEnJeu[i].valeur >= 10 || cartesEnJeu[i].valeur == 0)
        {
          valJeu = 1;
          noPaire = "De"+cartesEnJeu[i].valeur;
        }
      }
   }
   
   //* Brelan
   for (i = 0; i < 3; i++)
   {
      if (cartesEnJeu[i].valeur == cartesEnJeu[i + 1].valeur && cartesEnJeu[i + 1].valeur == cartesEnJeu[i + 2].valeur)
        valJeu = 3;
   }
   
   //* Double paire et Main Pleine
   if (((cartesEnJeu[0].valeur == cartesEnJeu[1].valeur) && (cartesEnJeu[2].valeur == cartesEnJeu[3].valeur)) ||
       ((cartesEnJeu[0].valeur == cartesEnJeu[1].valeur) && (cartesEnJeu[3].valeur == cartesEnJeu[4].valeur)) ||
       ((cartesEnJeu[1].valeur == cartesEnJeu[2].valeur) && (cartesEnJeu[3].valeur == cartesEnJeu[4].valeur)))
	if (valJeu != 3)
	   valJeu = 2;
	else
	   valJeu = 6;  
   
   //* Carré
   for (i = 0;i < 2; i++)
      if ((cartesEnJeu[i].valeur == cartesEnJeu[i+1].valeur) && (cartesEnJeu[i].valeur == cartesEnJeu[i+2].valeur) && (cartesEnJeu[i].valeur == cartesEnJeu[i+3].valeur))
         valJeu = 7;    
   
   //* Quinte
   if ((!paire && ((cartesEnJeu[4].valeur - cartesEnJeu[0].valeur) == 4)) ||
       ((cartesEnJeu[0].valeur == 0) && (cartesEnJeu[1].valeur == 9) && (cartesEnJeu[2].valeur == 10) && 
        (cartesEnJeu[3].valeur == 11) && (cartesEnJeu[4].valeur == 12)))
          valJeu = 4;
   
   //* Flush, Quinte Flush et  Quinte Flush Royale
   if ((cartesEnJeu[0].couleur == cartesEnJeu[1].couleur)&&(cartesEnJeu[1].couleur == cartesEnJeu[2].couleur)&&
	   (cartesEnJeu[2].couleur == cartesEnJeu[3].couleur)&&(cartesEnJeu[3].couleur == cartesEnJeu[4].couleur))
   {
      if (valJeu != 4) 
         valJeu = 5;
      else
         if (cartesEnJeu[0].valeur == 0 && cartesEnJeu[1].valeur != 1)
	    valJeu = 9;
	 else
	    valJeu = 8;
   }
   
   if (valJeu > 0)
   {
      afficherMessage("libJeu" + valJeu + (valJeu>1?"":noPaire));
      timeOutAfficherMessage = setTimeout("afficherMessage('msgAppuyezDonner')",3000);
      gain = mise * factMult["multJeu" + valJeu];
      ajouterCredit(gain);
      afficherMontant();
      if (muteOn)
      {
        try {
            if (objetPoker.son6 && objetPoker.son6.controls) objetPoker.son6.controls.play();
            objetPoker.son5.play();
        }
        catch(e){}
      }
   }
   else
   { 
      if (credit==0)
      {
         afficherMessage("msgFinPartie");
         peuxMiser = true;
         setTimeout("inviterNouvellePartie()", 2000);
         return false;
      }
      else
      {
         afficherMessage("msgAppuyezDonner");
      }
   }
   peuxMiser = true;
   donnerDisponible = true;
   verifierResultat = false;
   if (mise > credit)
   {
     mise = credit;
     afficherMontant();
   }
}

// méthode qui surcharge la méthode sort du tableau afin de trier numériquement la propriétée valeur de l'objet carte  
function triCartes(carteUn, carteDeux)
{
   return(carteUn.valeur - carteDeux.valeur);
}

// méthode qui invite pour relancer une nouvelle partie
function inviterNouvellePartie()
{
  var jouerEncore = window.confirm(maLangue.nouvellePartie);
  if (jouerEncore)
  {
    peuxMiser = true;
    donnerDisponible = true;
    verifierResultat = false;    
    mise = MISE_DEFAUT;
    credit = CREDIT_DEFAUT;
    afficherMontant();
    afficherMessage("msgAppuyezDonner");
  }
  else
  {
    alert(maLangue.merci);
  }
}

// méthode qui créer le jeu de 52 cartes ( 52 X l'objet carte )
function chargerCartes()
{
  for (var numero = 0; numero<52; numero++)
    cartes.push(new carte(numero));
}

// méthode qui initialise le jeu de poker
function initialiserJeu()
{
  setObjetPoker();
  determinerLangueCourante();
  setTexteLangue();
  afficherMontant();
  getObjet("jeu").style.display = "block";
}   

chargerCartes();
