function Grid ( ) {

	//Initialiser le grid
	this.grid = new Array(gridX);
	for ( i = 0; i < this.grid.length; i++ ){
	
		 this.grid[i] = new Array(gridY);
		 
	}				


	//Vider le grid	
	function newGrid ( ) { 
		
		this.grid = new Array(gridX);
		for ( i = 0; i < this.grid.length; i++ ){
		
			 this.grid[i] = new Array(gridY);
			 
		}				
	
	}

	//Initialiser le grid avec les pieces ( nouvelle partie )
	function initGrid ( ) {	

		var layersObj = document.all("aireDeJeu");	
		var x,y;
		var insertHTML = "";

		//Creation des drWhos
		for ( i = 0; i < nbDrWhos; i++ ) {
			
			playerArray[i] = new DrWho ( "drWho" + ( i + 1 ) ); 
			
			do {
			
				x = Math.floor(Math.random( ) * gridX );
				y = Math.floor(Math.random( ) * gridY );
				
			} while ( checkCollsion ( this.grid,x,y ) );
			
			//position x, y de drwho, et l'inserer sur le grid
			playerArray[i]._x = x 
			playerArray[i]._y = y;			
			this.grid[x][y] = playerArray[i];
			
			//Ajout des layers : DrWho
			insertHTML += "<div class='drWho' id='drWho" + ( i + 1 ) + "'></div>";
								
		}

		//Creation des daleks
		for ( i = nbDrWhos; i < nbDaleks + nbDrWhos; i++ ) {		
			
			var dalekID = ( i - nbDrWhos + 1 );
			
			playerArray[i] = new Dalek ( "d" + dalekID );
			
			do {
			
				x = Math.floor(Math.random( ) * gridX );
				y = Math.floor(Math.random( ) * gridY );
				
			} while ( checkCollsion ( this.grid,x,y ) );			
			
			//position x, y d'un dalek, et l'inserer sur le grid
			playerArray[i]._x = x 
			playerArray[i]._y = y;
			this.grid[x][y] = playerArray[i];
			
			insertHTML += "<div class='daleks' id='d" + dalekID + "'></div>";
			
		}						

		//screwdriver animation
		insertHTML += "<div id='sonic'></div>";
		layersObj.innerHTML = insertHTML;

	}       		
	

	//Affichage les images sur le grid
	function displayGame() { 
		
		for ( i = 0; i < playerArray.length; i++ ) {
		
			obj = playerArray[i];
			doc = document.all[obj._id].style;
			doc.top  = obj._y * blocSize;
			doc.left = obj._x * blocSize;				
			doc.visibility = "visible";

		}
			 
	}

	
	//verification pour une collision
	function checkCollsion ( grid,x,y ) { 

		if ( grid[x][y] != undefined ) {
		
			return true;
			
		} else {
		
			return false;
			
		}

	}
	
	//Methode qui réinsère tous les objets sur le grid, et vérifie pour des collisions	
	function reDraw ( ) { 
	
		for ( i = 0; i < playerArray.length; i++ ) {

			//insérer l'objet : si vivant ou si c'est un tas
			if ( playerArray[i].isAlive || playerArray[i]._type == "rubble" ) {

				//si la case est vide, insère l'objet
				if ( this.grid[ playerArray[i]._x ][ playerArray[i]._y] == undefined ) { 

					//current bloc is empty, place item in the grid
					this.grid[playerArray[i]._x][playerArray[i]._y] = playerArray[i];

				//si la case contient drwho, la partie est terminé
				} else if ( this.grid[ playerArray[i]._x ][ playerArray[i]._y]._type == "drwho") { 			

					//rendre le dalek invisible
					document.getElementById(playerArray[i]._id).style.visibility = "hidden";

					//drWho est maintenant mort				
					document.getElementById(this.grid[playerArray[i]._x] [playerArray[i]._y]._id).style.backgroundImage = "url(images/who_dead.gif)";				

					isGameOver = true;

				//si la case contient un tas
				} else if ( this.grid[ playerArray[i]._x ][ playerArray[i]._y]._type == "rubble" ) { 																			

					//si l'objet qu'on insère n'est pas un tas ( c'est un dalek ) dalek vs tas
					if ( playerArray[i]._type != "rubble" ){

						//setDalek to a rubble in the playerArray
						playerArray[i] = new Rubble ( playerArray[i]._x , playerArray[i]._y, playerArray[i]._id ); 									
						document.getElementById(playerArray[i]._id).className = "rubble";

						playSound ( "explode" );

						score += level;				
						daleksKilledThisLevel++;
				

					}


				//la case contient un dalek vivant
				} else { 

					// l'objet qu'on insère est un tas : rubble vs Dalek vivant
					if ( playerArray[i]._type == "rubble" ) { 
						
						dalek = this.grid [playerArray[i]._x][playerArray[i]._y];													

						//mettre le dalek, dans le playerArray, comme un rubble						
						playerArray [dalek._id.slice ( 1 )] = new Rubble ( dalek._x, dalek._y, dalek._id );															
						document.getElementById( playerArray [dalek._id.slice ( 1 )]._id ).className = "rubble";

						//le grid contient maintenant un tas
						this.grid [playerArray[i]._x][playerArray[i]._y] = playerArray[i];									
					
						playSound ( "explode" );

						score += level;				
						daleksKilledThisLevel++;



					} else { 

					//dalek vs dalek
						
						//dalek sur le grid						
						dalek = this.grid [playerArray[i]._x][playerArray[i]._y];
					
						//changer les deux pieces dans le player array, comme des tas
						playerArray [dalek._id.slice ( 1 )] = new Rubble ( dalek._x, dalek._y, dalek._id );																
						playerArray[i] = new Rubble ( playerArray[i]._x, playerArray[i]._y, playerArray[i]._id );					

						//changer la classe
						document.getElementById( playerArray[i]._id ).className = "rubble";
						document.getElementById( playerArray [dalek._id.slice ( 1 )]._id ).className = "rubble";

						//inserer dans le grid, un tas
						this.grid [playerArray[i]._x][playerArray[i]._y] = playerArray[i];									

						playSound ( "explode" );

						score += 2 * level;
						daleksKilledThisLevel +=2;


					}
					
				}
				
			}			

		}	
	
	}
	
	//Animation des joueurs
	function animateGame ( ) {
 
 		for ( i = 0; i < playerArray.length; i++ ) {
 		
				idAnim_array[i] = setInterval ( "theGrid.animatePlayer("+i+")",10 );		
				
		}
		
		soundCount++;
		
		if ( soundCount > 25 ) {
		
			playSound ( "exterminate" );
			soundCount = 0;
			
		}
		
	}
	
	//Animation d'un joueur, ( POSITION COURANTE - DESTINATION / 5 )
	function animatePlayer ( i ) {

		obj = playerArray[i];
		
		if ( obj != undefined ) {
		
			doc = document.all[obj._id].style

			targetX = obj._x * blocSize;
			targetY = obj._y * blocSize;

			currentX = ( parseInt( doc.left) );
			currentY = ( parseInt( doc.top ) );

			deltaX = currentX - targetX;
			deltaY = currentY - targetY;

			if ( deltaX == 0 && deltaY == 0 ) {

				clearInterval ( idAnim_array[i] );

			} else {

				moveX = deltaX / 5;
				moveY = deltaY / 5;

				//si la valeur est entre -1 et 0, mettre le deplacement a -1
				if ( moveX > -1 && moveX < 0 ) {
					moveX = -1;
				}

				if ( moveY > -1 && moveY < 0) {
					moveY = -1;
				}

				//bouger l'objet
				doc.left = currentX - ( moveX );
				doc.top  = currentY - ( moveY );

			}
			
		} else {
		
			clearInterval ( idAnim_array[i] );	
			
		}
		
	}
	
	
	//fonction qui valide le déplacement de drwho ( limit du grid, tas )
	function isMoveValid( newX, newY ) {
	
		if ( newX < 0 || newY < 0 || newX > gridX  - 1 || newY > gridY - 1 ) { 
		
			return false;	
			
		} else if ( this.grid[newX][newY] != undefined ) {
		
			if ( !this.grid[newX][newY].isAlive ) {	
			
				return false;
				
			} else {
			
				return true;
				
			}
			
		} else {
		
			return true;
			
		}
	
	}
	
	//Screwdriver
	function screwDalek ( x, y ) { 
	
		if ( this.grid[x][y] != undefined ) {
		
			if ( this.grid[x][y]._type != "rubble" ) { 
			
				//kill Dalek! ( efface )
				document.all[this.grid[x][y]._id].style.visibility = "hidden";
				//mettre le dalek isAlive a faux
				playerArray [ this.grid[x][y]._id.slice ( 1 ) ].isAlive = false;		
				daleksKilledThisLevel++;

			}
		
		}
	
	
	}
	
	this.newGrid = newGrid; 
	this.reDraw = reDraw;
	this.screwDalek = screwDalek;
	this.isMoveValid = isMoveValid;
	this.checkCollsion = checkCollsion;
	this.animatePlayer = animatePlayer;
	this.animateGame = animateGame;
	this.initGrid = initGrid;	
	this.displayGame = displayGame;			 

}

