/*Variables Globales*/
var PIEZA_T  = 1;
var PIEZA_Z  = 2;
var PIEZA_N  = 3;
var PIEZA_I  = 4;
var PIEZA_O  = 5;
var PIEZA_LD = 6;
var PIEZA_LI = 7;
var TABLERO_ALTURA  		  = 30
var TABLERO_ANCHURA		  = 10;
var SIZE_CELDA 	  		  = 6;
var NUMERO_TIPOS_PIEZAS = 7;
/*teclas*/
var LEFT_ARROW 	= 37;
var RIGHT_ARROW = 39;
var UP_ARROW 	  = 38;
var DOWN_ARROW 	= 40;
/*velocidad, niveles, otros*/
var velocidad   = 1000;



/*Funciones Globales*/
function procesaTecla(e) {
  var code;
  if(window.event) // Internet Explorer
     code = e.keyCode;
  else if(e.which) 	// Un navegador decente
     code = e.which;
  return code;
}

function controlarTeclaPulsada(e) {
  var tecla_pulsada;
  tecla_pulsada = procesaTecla(e);
  if(tecla_pulsada==RIGHT_ARROW){
   		    miTablero.piezaActual.mover(RIGHT_ARROW);
  }else if(tecla_pulsada==LEFT_ARROW){
    		miTablero.piezaActual.mover(LEFT_ARROW);
  }else if(tecla_pulsada==DOWN_ARROW){
    		miTablero.piezaActual.mover(DOWN_ARROW);
  }else if(tecla_pulsada==UP_ARROW){
    		miTablero.piezaActual.rotar();
  }
}//fin controlarTeclaPulsada



/*#############################################*/
/* Clase TABLERO                               */
/*#############################################*/



function Tablero() {

  this.piezaActual 		= null;
  this.siguientePieza	= null;
  this.npositions 		= new Array(4,2,2,2,1,4,4) //diferentes posiciones de las piezas, para determinar cuantas veces pueden rotar


  this.lineasCompletadas = 0;
  this.puntuacion 	 		 = 0;
	this.nivel 						 = 1;
  this.estructura        = null;


/*Métodos*/
  this.init   		           = initTablero;
  this.pintarTablero	       = pintarTablero;

  this.mostrarSiguientePieza = mostrarSiguientePieza;
  this.actualizarDatos       = actualizarDatos;
	
	

  this.borrarPieza	   = borrarPieza;   //Borra una pieza del tablero
	this.limpiarCelda    = limpiarCelda;  //Borra una celda del tablero
  this.dibujarPieza	   = dibujarPieza;  //Pinta una pieza en el tablero
	this.esFinDeJuego    = esFinDeJuego;  //Comprueba si es el final del juego
	this.colocaPieza		 = colocaPieza;   //Coloca una pieza en la estructura del tablero
	this.terminaJuego    = terminaJuego;  //Termina el juego
	
  this.checkCompletedLine    = checkCompletedLine;
  this.borrarLineas	         = borrarLineas;
	this.postBorradoLineas     = postBorradoLineas; //Evento disparado al limpiar las líneas

}



/*#############################################*/
function terminaJuego(){
  alert("Game Over");
  
  
  //Guardar Datos
  guardarPuntuacion(this.puntuacion);
  
}
/*#############################################*/



 

/*#############################################*/
function mostrarSiguientePieza(){
  var html = "<img src='modulos/juegos/tetris/imagenes/"+this.siguientePieza.imgsrc+"' />"
  document.getElementById("siguientePieza").innerHTML = html;
}
/*#############################################*/


/*#############################################*/
function actualizarDatos(){
  document.getElementById("puntuacion").innerHTML = this.puntuacion;
  document.getElementById("nivel").innerHTML      ="Nivel " + this.nivel;
}
/*#############################################*/



/*#############################################*/
/*Inicia el tablero y el juego*/ 
function initTablero() {
  /*Creamos la estructura donde representaremos el estado del tablero*/
  this.estructura = new Array(TABLERO_ANCHURA);
  for(var i=0;i<TABLERO_ANCHURA;i++){
    this.estructura[i] = new Array(TABLERO_ALTURA+1)
  }
  /*Iniciamos la estructura. Limpiando todos los huecos del tablero.*/
  for(var i=0;i<TABLERO_ANCHURA;i++){
    for(var j=0;j<TABLERO_ALTURA;j++){
      this.estructura[i][j] = 0;
    }
  }

  /*Definimos el límite inferior del tablero, para que las piezas no caigan del tablero.*/
  for(var i=0;i<TABLERO_ANCHURA;i++){
    this.estructura[i][TABLERO_ALTURA] = 1
  }


  /*Creamos el tablero visual*/
  cadena = "<table  align='center' style='border-collapse:collapse; border: none;'>"
  for(var j=0; j<TABLERO_ALTURA; j++) {
    cadena += "<tr>"
    for(var i=0; i<TABLERO_ANCHURA; i++){
       cadena += "<td style='padding: 0;' id='celda_"+i+"_"+j+"'><img src='modulos/juegos/tetris/imagenes/pieza_0.png' /></td>"
    }
    cadena += "</tr>"
  }
  
  cadena += "</table>"
 
  document.getElementById("tablero").innerHTML = cadena;

  this.lineasCompletadas = 0
  this.puntuacion 		   = 0

  this.siguientePieza  = new Pieza();
  this.piezaActual 	   = new Pieza()
  this.piezaActual.cae();  //empieza el juego, cayendo la primera pieza

}
/*#############################################*/




/*#############################################*/
/*Pinta el Tablero*/ 
function pintarTablero() {
  for(var i=0;i<TABLERO_ANCHURA;i++)
    for(var j=0;j<TABLERO_ALTURA;j++) {
      var cadena = '<img src="modulos/juegos/tetris/imagenes/pieza_'+miTablero.estructura[i][j]+'.png" />';
      document.getElementById("celda_"+i+"_"+j).innerHTML = cadena;
    }
}
/*#############################################*/





/*#############################################*/
/*Comprueba si es el final del juego*/ 
function esFinDeJuego() {

  var esfin = true;

	var piezaActualAux = this.piezaActual;
	
  for(var i=0;i<piezaActualAux.xSize&&esfin;i++)
    for(var j=0;j<piezaActualAux.ySize&&esfin;j++)
      if((this.estructura[i][j]!=0)&&(miTablero.estructura[piezaActualAux.x+i][piezaActualAux.y+j]!=0))  esfin = false;

  return  !esfin;
}
/*#############################################*/





/*#############################################*/
/*Pinta una pieza en el tablero*/ 
function dibujarPieza(pieza) {

  for(var i=0;i<pieza.xSize;i++){
    for(var j=0;j<pieza.ySize;j++){

          if(pieza.estructura[i][j]!=0){
    	  			var xcell = pieza.x + i;
    	  			var ycell = pieza.y + j;
    	  			var cadena = '<img src="modulos/juegos/tetris/imagenes/pieza_'+pieza.type+'.png" />';
    	  			document.getElementById("celda_"+xcell+"_"+ycell).innerHTML = cadena;
         }
		 
	 }
	}
	
}//fin dibujarPieza
/*#############################################*/





/*#############################################*/
/*Borra una pieza del tablero*/ 
function borrarPieza(pieza){

	  for(var i=0;i<pieza.xSize;i++){
	    for(var j=0;j<pieza.ySize;j++){
	      if(pieza.estructura[i][j]!=0) {
    			  var xcell = pieza.x + i;
    			  var ycell = pieza.y + j;
    			  this.limpiarCelda(xcell, ycell);
  		  }
			}
		}
}
/*#############################################*/



/*#############################################*/
/*Borra una celda del tablero*/ 
function limpiarCelda(xcell,ycell){
 		  var cadena = '<img src="modulos/juegos/tetris/imagenes/pieza_0.png" />';
		  document.getElementById("celda_"+xcell+"_"+ycell).innerHTML = cadena;
}
/*#############################################*/



/*#############################################*/
/*Coloca una pieza en el tablero*/ 
function colocaPieza( pieza ) {

  for(var i=0;i<pieza.xSize;i++){
    for(var j=0;j<pieza.ySize;j++){
      if( (pieza.estructura[i][j]!=0) ){
	  			miTablero.estructura[pieza.x + i][pieza.y + j]=pieza.estructura[i][j];
		  }
    }
	 }
}
/*#############################################*/






function checkCompletedLine() {

  var completedLines = new Array()

  for(var j=TABLERO_ALTURA-1;j>0;j--) {
    var completed = true
    for(var i=0;i<TABLERO_ANCHURA;i++)
      if(this.estructura[i][j]==0) {
	  completed = false
	  break
    }
    if(completed)      completedLines[completedLines.length] = j
  }

  if(completedLines.length>0) this.borrarLineas(completedLines);

}



function borrarLineas(completedLines) {

  var numLineasBorradas = completedLines.length;
	
  for(k=numLineasBorradas;k>=0;k--)
    for(var j=completedLines[k];j>0;j--)
      for(var i=0;i<TABLERO_ANCHURA;i++)
        this.estructura[i][j] = this.estructura[i][j-1];

  this.pintarTablero();
	this.postBorradoLineas(numLineasBorradas);
}








/*#############################################*/
/*Trigger que controla las acciones después de borradas una o más líneas*/ 
function postBorradoLineas(numLineasBorradas){
 
 /*Aumentamos el número de líneas completadas*/
 this.lineasCompletadas += numLineasBorradas;
 /*Aumentamos la puntuación*/
 this.puntuacion += this.nivel*numLineasBorradas*numLineasBorradas*5;
 /*Controlamos la velocidad y los niveles*/ 
 if(Math.floor(this.lineasCompletadas%20)== 0)    {
	 this.nivel++;
 }
 velocidad  = 1000- (this.nivel*100);
 /*Actualizamos los datos que se muestran en pantalla*/
  this.actualizarDatos();  
   
 
}
/*#############################################*/


















