// Génére la grille de jeu, de resultat et gère les differentes fonctionnalités de séléction
function Grid (
	
	nInputNbCells, 
	nInputNbCellsByRow, 
	aInputRowDesign, 
	nInputNbSelectableItems,
	sGridTarget,
	sGridListTarget,
	sGridInstanceName) {
	
	this.nGridNbCells = nInputNbCells;
	this.nGridNbCellsByRow = nInputNbCellsByRow;
	this.nGridNbSelectableItems = nInputNbSelectableItems;
	this.sGridTarget = sGridTarget;
	this.sGridListTarget = sGridListTarget;
	this.aGridSelectedItems = new Array();
	this.sGridInstanceName = sGridInstanceName;
	this.sAnimatedCellId;
	this.otBody;
	this.oGrid;
	this.bRandomSelectionLocked = false;
	this.aRowDesign = aInputRowDesign;
	this.nCurrRow;

	// Crée l'element TABLE et Tbody qui sera la racine de tous les sous elements de tableau
	this.setTable = function(sTarget) {
		oGrid = document.createElement("table");
		oGrid.setAttribute('cellspacing', 0);
		oGrid.cellSpacing = 0;		
		this.otBody = document.createElement('tbody');
		oGrid.appendChild(this.otBody);
		if (!sTarget) sTarget = this.sGridTarget;
		document.getElementById(sTarget).appendChild(oGrid);
		oGrid.className = 'gridtable';
		return oGrid;
	}

	//Crée une ligne de tableau dans l'element tBody
	this.setRow = function(otBody) {
		oRow = document.createElement("tr");
		otBody.appendChild(oRow);
		return this.oRow = oRow;
	}

	//Créee les cellules barrées 
	this.setMarkedCell = function(sCellContent, oRow) {
		oCell = document.createElement("td");
		oCell.className = 'markedCell';
		oCell.innerHTML = sCellContent + 1;
		oRow.appendChild(oCell);
	}

	//Créee une cellule vide ( design de la grille )
	this.setEmptyCell = function(oRow) {
		oECell = document.createElement("td");
		oRow.appendChild(oECell);
	}
	
	this.changeFocus = function (v) {
		
		var grilleClass = 'focus';
		var validationClass = 'blur2';
		
		if ( (document.getElementById ('validation') .className == 'focus2') || (document.getElementById ('validation') .className == 'blur2') ) {
									 
			if (this.aGridSelectedItems.length == this.nGridNbSelectableItems && v == 1) {			
				var grilleClass = 'blur';
				var validationClass = 'focus2';
			}	
		
			document.getElementById ('grille') .className = grilleClass;
			document.getElementById ('validation') .className = validationClass;
		}
		
	}

	// Crée et habille une cellule
	this.setCell = function(
							sCellContent, 
							oRow, 
							nGridNbSelectableItems, 
							bResultCell) {
		
		oCell = document.createElement("td");
		
		// Definis les propriété de la cellule, si il s'agit d'une 
		//cellule du tableau de resultat ou de la grille de selection
		if (bResultCell != true) {
			oCell.innerHTML = sCellContent + 1;
			oCell.id = 'Item' + parseInt (sCellContent + 1) ;
			oCell.className = 'gridItem';
			oCell.bGridSelectedItem = false;
		}	else	{
			oCell.innerHTML = sCellContent;
			oCell.id = 'Result'+parseInt(sCellContent+1);
			oCell.bGridSelectedItem = true;
			if (!isNaN(sCellContent)) oCell.className = 'gridItemRes';
			else 	oCell.className = 'gridItemRes';
		}
		
		oGridInstance = this;
			
			// On ecoute le clic sur la cellule, declenchant la methode setClicked
			oCell.onclick = function() {
			
			// Si la cellule est une cellule de resultat on laisse 
			// quand meme la possibilité de retirer la cellule de la liste de resultat
				if (bResultCell == true) {
					if (!isNaN(sCellContent) ) {
						oGridInstance.setClicked(document.getElementById('Item'+sCellContent));
					}
				} else {
					oGridInstance.setClicked (this) ;
				}
				
				oGridInstance.changeFocus (0) ;
			}
		
		// On desactive les écouteurs d'evenements rollover et rollout si la cellule est une cellule de resultat .
		if (bResultCell != true) {
			// On ecoute le passage de souris, simple rollover
			oCell.onmouseover = function() {
				if (this.bGridSelectedItem != true) {
					this.className = 'gridItemSelected';
				}
			}
			// On ecoute le passage de souris, simple rollout
			oCell.onmouseout = function() {
				if (this.bGridSelectedItem!=true) {
					this.className = 'gridItem';
				}
			}
		}
		oRow.appendChild(oCell);
	}

	// Cette fonction est apelée lorsqu'une cellule est cliquée ou que l'on desire simuler le clic sur une cellule
	this.setClicked = function(oGridClickedCell) {
	    // Modifie le contenu du tableau de selection (ajout/suppression) et retourne un booléen (true => objet non present dans le tableau, donc ajouté; false=>objet present donc supprimé)
		oGridClickedCell.bGridSelectableItem = oGridInstance.setSelection(parseInt(oGridClickedCell.innerHTML));
		
								document.forms['result_input'].resultat_ligne.value = this.aGridSelectedItems;   //  ##### AJOUT LIGNE #######	
								document.forms['result_input2'].resultat_ligne2.value = this.aGridSelectedItems;   //  ##### AJOUT LIGNE #######	
								
		// On modifie l'apparence des cellules (séléctionnée ou non)
		if (oGridClickedCell.bGridSelectedItem!=true && oGridClickedCell.bGridSelectableItem!=false) {
			oGridClickedCell.className = 'gridItemSelected';
			oGridClickedCell.bGridSelectedItem=true;
 	} else {
 		oGridClickedCell.className = 'gridItem';
 		oGridClickedCell.bGridSelectedItem=false;
		}
	}

	// Modifie le contenu du tableau de selection (ajout/suppression)
	this.setSelection = function(sSelectedItem)	{
		var bGridRemovedItem;
		// Verifie si la valeur testée existe deja, si oui, on la retire du tableau et renvoie true
		for (i=0;i<this.aGridSelectedItems.length; i++)	{
			if (this.aGridSelectedItems[i] == sSelectedItem)	{
				this.aGridSelectedItems.splice(i,1);
				this.setResultField();
				bGridRemovedItem=true;
				return true;
			}
		}
		// Si la valeur testée nest pas dans le tableau ...
		if (bGridRemovedItem!=true)	{
			// On verifie si la taille maximum du tableau n'a pas été atteinte, si cest le cas on insulte un peu l'user et renvoie false
			if (this.aGridSelectedItems.length==this.nGridNbSelectableItems) {
				alert('Vous ne devez selectionner que '+this.nGridNbSelectableItems+' numeros');
				return false;
			// Sinon on insere la valeur dans la tableau et re génére l'affichage dudit tableau
			} else {
				this.aGridSelectedItems[this.aGridSelectedItems.length] = sSelectedItem;
				// Génére l'affichage des resultats
				this.setResultField();
				return true;
			}
		}
	}

	// On efface tout et on recommence :)
	this.setNewGrid = function () {
		// On wipe l'objet present et on en reinstancie un
		document.getElementById(this.sGridTarget).innerHTML='';
		
		this.sGridInstanceName = new Grid(
										  this.nGridNbCells,
										  this.nGridNbCellsByRow,
										  this.aRowDesign,
										  this.nGridNbSelectableItems,
										  this.sGridTarget,
										  this.sGridListTarget,
										  this.sInstanceName) ;
		
					document.forms['result_input'].resultat_ligne.value = '';   //  ##### AJOUT LIGNE #######
					document.forms['result_input2'].resultat_ligne2.value = '';   //  ##### AJOUT LIGNE #######					
		
		this.aGridSelectedItems = this.sGridInstanceName.aGridSelectedItems;
		this.changeFocus (0) ;
	}

	// Choisis des numéros au hasard
	this.setRandomSelection = function () {
		// Si le nombre maximum de numéros a déjà été sélectionné, on remet a zero
		if (this.aGridSelectedItems.length==this.nGridNbSelectableItems) {
				// On wipe l'objet present et on en reinstancie un
				document.getElementById(this.sGridTarget).innerHTML='';
				this.sGridInstanceName = new Grid(this.nGridNbCells,this.nGridNbCellsByRow,this.aRowDesign, this.nGridNbSelectableItems,this.sGridTarget,this.sGridListTarget,this.sInstanceName) ;
				this.aGridSelectedItems = this.sGridInstanceName.aGridSelectedItems;
				this.sGridInstanceName.setRandomSelection();
		}
		// Ici, on randomize tant qu'on a pas atteint le nombre maximal de numéros séléctionnables
		while (this.aGridSelectedItems.length<this.nGridNbSelectableItems) {
			// Un chiffre au hasard entre 0 et le nombre de cellules . Si ca donne zero on met 1 a la place
			var nGridRandomNumber = Math.round(Math.random()*parseInt(this.nGridNbCells));
			if (nGridRandomNumber == 0) nGridRandomNumber = 1;
			//On verifie si le numéro choisi n'a pas deja été sélectionné
			if (this.isAlreadySelectedNumber(nGridRandomNumber) == false) {
				// Si il n'a pas été séléctionné, on le fait
				this.setClicked(document.getElementById('Item'+nGridRandomNumber));
			}
		}
		
		this.changeFocus (1) ;
	}

	// Anime la cellule contenant le "bouton" randomize
	this.setRandomCellAnimation = function(sAnimatedCellId)	{
		this.sAnimatedCellId = sAnimatedCellId;
		this.sGridInstanceName = sGridInstanceName;
		// Un nombre au hasard entre 1 et le nombre de cellules max ....
		nGridRandomNumber = Math.round(Math.random()*parseInt(this.nGridNbCells));
		if (nGridRandomNumber == 0) nGridRandomNumber = 1;
		// ... Qu'on met en value dans le "bouton" randomize ...
		document.getElementById(sAnimatedCellId).innerHTML =  nGridRandomNumber;
		// ... Qui change 4 fois par seconde
		setTimeout(this.sGridInstanceName+".setRandomCellAnimation("+this.sGridInstanceName+".sAnimatedCellId)",1000);
	}

	// verifie si une valeur existe dans le tableau des valeurs séléctionnées
	this.isAlreadySelectedNumber = function(nNumberToTest)	{
		for (i=0; i<this.aGridSelectedItems.length;i++)	{
			if (this.aGridSelectedItems[i] == nNumberToTest)	return true;
		}
		return false;
	}

	//Affiche le tableau des valeurs choisies
	this.setResultField	= function() {
		// On divise les valeurs par 100 pour trier numériquement puis on remultiplie par 100 et le tour est joué :)
		for (i=0; i<this.aGridSelectedItems.length; i++)	this.aGridSelectedItems[i]= this.aGridSelectedItems[i]/100;
		this.aGridSelectedItems = this.aGridSelectedItems.sort();
		for (i=0; i<this.aGridSelectedItems.length; i++)	this.aGridSelectedItems[i]= Math.round(this.aGridSelectedItems[i]*100);
		// On remet a zéro le div puis génére un tableau avec les valeurs de aGridSelectedItems,
		// On donne ? comme valeur pour les numéros qui n'ont pas encore été choisis
		document.getElementById(this.sGridListTarget).innerHTML='';
		this.oGrid = this.setTable(this.sGridListTarget);
		oRow = this.setRow(this.otBody) ;
				
		for (i=0; i<this.nGridNbSelectableItems; i++)	{
			if (!this.aGridSelectedItems[i])	sResultCellContent='?';
			else sResultCellContent = this.aGridSelectedItems[i];
			this.setCell(sResultCellContent,oRow,0, true);
						
		}
				
	}

	//Retourne une chaine sous la forme XX_XX_XX_XX_XX_XX contenant les numéros du joueur
	this.getResult = function () {
		if(this.aGridSelectedItems.length != this.nGridNbSelectableItems)	{
			return false;
		}
		else	{
			return this.aGridSelectedItems.join('_');
		}
	}

	//Passe le jeu a l'état 'Validation' lorsque le sixieme numéro est séléctionné
	this.setBanners = function () {
		this.bRandomSelectionLocked = true;
	}

	// Génére la grille
	this.oGrid = this.setTable();
	this.nCurrRow = 0;
	var j=0;
	var i=0;
	while(j<parseInt(this.nGridNbCells)) {
		if (i%this.nGridNbCellsByRow==0 || i==0) {
			oRow = this.setRow(this.otBody);
			this.nCurrRow++;
		}
		if (this.aRowDesign[parseInt(this.nCurrRow-1)] == 9) {
			this.setCell(j,oRow,this.nGridNbSelectableItems);
			j++;
		} else {
			if (i%this.nGridNbCellsByRow >= (parseInt(this.nGridNbCellsByRow-this.aRowDesign[parseInt(this.nCurrRow-1)])/2) && i%(this.nGridNbCellsByRow)< (parseInt(this.nGridNbCellsByRow-(parseInt(this.nGridNbCellsByRow-this.aRowDesign[parseInt(this.nCurrRow-1)])/2))))	{
				this.setCell(j,oRow,this.nGridNbSelectableItems);
				j++;
			} else {
				this.setEmptyCell(oRow);
			}
		}
		i++;
	}
	this.setResultField();
	
	this.setFullSelection = function(aArray) {
		this.setNewGrid();
		for (z=0;z<aArray.length;z++) {
			this.setClicked(document.getElementById('Item'+aArray[z]));
		}
	}
}

//Instanciation de la grille
var oGrid1;
function init(
			  nInputNbCells, 
			  nInputNbCellsByRow, 
			  aInputRowDesign, 
			  nInputNbSelectableItems,
			  sGridTarget,
			  sGridListTarget,
			  sGridInstanceName)	{
	
	oGrid1 = new Grid (
					   nInputNbCells, 
					   nInputNbCellsByRow, 
					   aInputRowDesign, 
					   nInputNbSelectableItems,
					   sGridTarget,
					   sGridListTarget,
					   sGridInstanceName) ;
}

aBanners = new Array();
function addBanner (nID, sUrl, sImg) {
	if (!document.getElementById('DivBanner')) {
		oDiv = document.createElement("div");
		document.getElementById('errorDiv').appendChild(oDiv);
		oDiv.id = 'DivBanner';
	}
	aBanners[nID] = new Array(sUrl, sImg);
}

function showError(sError) {
	if (!document.getElementById('errorDiv'))	{
		oDiv = document.createElement("div");
		document.body.appendChild(oDiv);
		oDiv.className = 'errorDiv';
		oDiv.id = 'errorDiv';
	} else {
		oDiv = document.getElementById("errorDiv")
		oDiv.className = "errorDiv";
		document.getElementById('errorDiv').style.display = 'block';
		document.getElementById('errorDiv').style.visibility = 'visible';
	}
	switch (sError)	{
		case 'loginFailed':
			oDiv.innerHTML = 'Nom d\'utilisateur et/ou mot de passe incorrect(s)<br />Mot de passe perdu? <a href="#" onClick="document.location.href=\'./password.php\'">cliquez ici</a> !<br /><br /><center><a href="#" onClick="javascript:document.getElementById(\'errorDiv\').style.visibility=\'hidden\';return false;"><img src="./img/fermer_red.gif" alt="fermer"></a></center>';
			break;
		case 'unLogged':
			oDiv.innerHTML = 'Vous devez être inscrit et authentifié pour pouvoir jouer ! <br><br><center><a href="#" onClick="javascript:document.getElementById(\'errorDiv\').style.visibility=\'hidden\';return false;"><img src="./img/fermer_red.gif" alt="fermer"></a></center>';
			break;
		case 'notEnoughNumbers':
			oDiv.innerHTML = 'Vous devez saisir vos 7 numéros pour valider votre jeu ! <br><br><center><a href="#" onClick="javascript:document.getElementById(\'errorDiv\').style.visibility=\'hidden\';return false;"><img src="./img/fermer_red.gif" alt="fermer"></a></center>';
			break;
		case 'valideJeu':
			oDiv.innerHTML += '<div id="infovalid">Cliquez l\'une des vignettes de droite pour valider votre jeu<br /><br /><center><span style="cursor:pointer;text-decoration:underline;" onclick="javascript:oGrid1.setNewGrid();return false;">Je veux changer mes numéros !</span></center></div>';
			break;
		default:
			oDiv.innerHTML = sError+'<center><a href="#" onClick="javascript:document.getElementById(\'errorDiv\').style.visibility=\'hidden\';return false;"><img src="./img/fermer_red.gif" alt="fermer"></a></center>'
			break;
	}
}