/*#############################################*/
/* Clase PIEZA                                 */
/*#############################################*/
  function Pieza() {
   this.x    = 0
   this.y    = 0
   this.pos  = 1
   this.type = Math.floor(Math.random() * NUMERO_TIPOS_PIEZAS)+1;
   this.npos = miTablero.npositions[this.type-1]
 
/*Métodos*/ 
 	this.initPieza 		     = initPieza;         //Inicializa la estructura de una pieza
	this.crearPieza 			 = crearPieza;        //Crea una pieza
 	this.cae			   		   = caerPieza;         //Método principal, que controla la caída de las piezas
 	this.mover             = mover;		 				  //Mueve una pieza 
 	this.chequeaMovimiento = chequeaMovimiento; //Comprueba si se puede mover una pieza
 	this.rotar		         = rotar;             //Gira una pieza
 	this.puedeRotar	       = puedeRotar;        //Comprueba si una pieza puede rotar
	this.clonarPieza       = clonarPieza;				//Clona una pieza
	this.initPieza();	
 }
 
  

/*#############################################*/
/*Crea una pieza, a partir de su tipo*/   
 function crearPieza(){
 
 		switch (this.type) {
	 
     			case PIEZA_T:
							  			 	this.imgsrc 			= 'pieza_t.png' 
												if(this.pos==1) {
                           this.estructura[0][0] = this.type;
                           this.estructura[1][0] = this.type;
                           this.estructura[2][0] = this.type;
                           this.estructura[1][1] = this.type;
													 this.xSize = 3;
													 this.ySize = 2;
                        }else if(this.pos==2) {
                           this.estructura[0][1] = this.type;
                           this.estructura[1][0] = this.type;
                           this.estructura[1][1] = this.type;
                           this.estructura[1][2] = this.type;
                   	  		 this.xSize = 2;
                   	  		 this.ySize = 3;
                        }else if(this.pos==3) {
                           this.estructura[0][1] = this.type;
                           this.estructura[1][0] = this.type;
                           this.estructura[1][1] = this.type;
                           this.estructura[2][1] = this.type;
                   	  		 this.xSize = 3;
                   	  		 this.ySize = 2;
                   	    }else if(this.pos==4) {
                           this.estructura[0][0] = this.type;
                           this.estructura[0][1] = this.type;
                           this.estructura[0][2] = this.type;
                           this.estructura[1][1] = this.type;
                   	  		 this.xSize = 2;
                   	  		 this.ySize = 3;
                        }
												break;
 
 
       case PIEZA_Z:
 												this.imgsrc 			= 'pieza_z.png';
       									if(this.pos==1) {
                       	  this.estructura[0][0] = this.type;
                          this.estructura[1][0] = this.type;
                          this.estructura[1][1] = this.type;
                          this.estructura[2][1] = this.type;
                       	  this.xSize = 3;
                       	  this.ySize = 2;
                       	}else if(this.pos==2) {
                           this.estructura[0][1] = this.type;
                           this.estructura[0][2] = this.type;
                           this.estructura[1][0] = this.type;
                           this.estructura[1][1] = this.type;
                       	   this.xSize = 2;
                       	   this.ySize = 3;
                       	}
       									break;
												
												
       case PIEZA_N:
                  			this.imgsrc 	 		= 'pieza_n.png';
             						if(this.pos==1) {
                           this.estructura[0][1] = this.type;
                           this.estructura[1][0] = this.type;
                           this.estructura[1][1] = this.type;
                           this.estructura[2][0] = this.type;
                   	  		 this.xSize = 3
                   	  		 this.ySize = 2             
												}else if(this.pos==2) {
                           this.estructura[0][0] = this.type;
                           this.estructura[0][1] = this.type;
                           this.estructura[1][1] = this.type;
                           this.estructura[1][2] = this.type;
                   	  		 this.xSize = 2;
                   	  		 this.ySize = 3;
             					  }
                   			break;
												
       case PIEZA_I:
             		      	this.imgsrc 			= 'pieza_i.png';
                        if(this.pos==1) {
                           this.estructura[0][0] = this.type;
                           this.estructura[0][1] = this.type;
                           this.estructura[0][2] = this.type;
                           this.estructura[0][3] = this.type;
                   	  		 this.xSize = 1;
                   	  		 this.ySize = 4;
                       	}else if(this.pos==2) {
                           this.estructura[0][0] = this.type;
                           this.estructura[1][0] = this.type;
                           this.estructura[2][0] = this.type;
                           this.estructura[3][0] = this.type;
                       	   this.xSize = 4;
                       	   this.ySize = 1;
                       	 }
                   			 break;
												
												 
       case PIEZA_O:
               			    this.imgsrc 			= 'pieza_o.png';
               			    this.estructura[0][0] 	= this.type;
               			    this.estructura[0][1] 	= this.type;
               			    this.estructura[1][0] 	= this.type;
               			    this.estructura[1][1] 	= this.type;
               			    this.xSize 				= 2;
               			    this.ySize 				= 2;
               			    break;
												
												
       case PIEZA_LD:
       						 		 this.imgsrc = 'pieza_ld.png';
                       if(this.pos==1) {
                               this.estructura[0][0] = this.type;
                               this.estructura[0][1] = this.type;
                               this.estructura[0][2] = this.type;
                               this.estructura[1][2] = this.type;
                       	  		 this.xSize = 2;
                       	  		 this.ySize = 3;
                       	}else if(this.pos==2) {
                               this.estructura[0][0] = this.type;
                               this.estructura[0][1] = this.type;
                               this.estructura[1][0] = this.type;
                               this.estructura[2][0] = this.type;
                       	  		 this.xSize = 3;
                       	  		 this.ySize = 2;
                       	}else if(this.pos==3) {
                               this.estructura[0][0] = this.type;
                               this.estructura[1][0] = this.type;
                               this.estructura[1][1] = this.type;
                               this.estructura[1][2] = this.type;
                       	  		 this.xSize = 2;
                       	  		 this.ySize = 3;
                       	}else if(this.pos==4) {
                               this.estructura[0][1] = this.type;
                               this.estructura[1][1] = this.type;
                               this.estructura[2][0] = this.type;
                               this.estructura[2][1] = this.type;
                       	  		 this.xSize = 3;
                       	  		 this.ySize = 2;
                       	}
                        break;
												
       case PIEZA_LI:
		 
 										 		this.imgsrc 			= 'pieza_li.png';
                        if(this.pos==1) {
                               this.estructura[0][2] = this.type;
                               this.estructura[1][0] = this.type;
                               this.estructura[1][1] = this.type;
                               this.estructura[1][2] = this.type;
                       	  		 this.xSize = 2;
                       	  		 this.ySize = 3;
                       	}else if(this.pos==2) {
                               this.estructura[0][0] = this.type;
                               this.estructura[0][1] = this.type;
                               this.estructura[1][1] = this.type;
                               this.estructura[2][1] = this.type;
                       	  		 this.xSize = 3;
                       	  		 this.ySize = 2;
                       	}else if(this.pos==3) {
                               this.estructura[0][0] = this.type;
                               this.estructura[0][1] = this.type;
                               this.estructura[0][2] = this.type;
                               this.estructura[1][0] = this.type;
                       	  		 this.xSize = 2;
                       	  		 this.ySize = 3;
                       	}else if(this.pos==4) {
                               this.estructura[0][0] = this.type;
                               this.estructura[1][0] = this.type;
                               this.estructura[2][0] = this.type;
                               this.estructura[2][1] = this.type;
                       	  		 this.xSize = 3;
                       	  		 this.ySize = 2;
                       	}
                        break;
 
   } //end case
 }
/*#############################################*/

 
 



/*#############################################*/
/*Inicializa una pieza, creando su estructura*/  
 function initPieza(){
  /*Creamos la estructura de la pieza*/
  this.estructura = new Array(4);
  for(var i=0;i<4;i++){
   	this.estructura[i] = new Array(4);
   }
	 
 	/*Inicializamos la estructura*/
   for(var i=0;i<4;i++){
     for(var j=0;j<4;j++){
    		   this.estructura[i][j] = 0;
       }
   }
   this.crearPieza();
 }
/*#############################################*/
 
 
 
 
 

 
 
 
/*#############################################*/
/*Hace caer una pieza*/  
 function caerPieza() {
 
    if(this.chequeaMovimiento(DOWN_ARROW)) { //si puede caer
     	miTablero.borrarPieza(this);
     	this.y++;
     	miTablero.dibujarPieza(this);
     	setTimeout('miTablero.piezaActual.cae()', velocidad ); //hacemos que siga cayendo la pieza
   }else{
	 	  //la pieza no puede seguir cayendo 
	  	miTablero.colocaPieza(miTablero.piezaActual);
 			miTablero.checkCompletedLine();
 			delete miTablero.piezaActual;
      miTablero.piezaActual    = miTablero.siguientePieza;
      miTablero.siguientePieza = new Pieza();
		  miTablero.mostrarSiguientePieza();
 
 	 		if(! miTablero.esFinDeJuego()){
				 setTimeout('miTablero.piezaActual.cae()', velocidad ); //hacemos que siga cayendo la pieza				 
      }else {
				 miTablero.terminaJuego();
     	} 
   }
 }
/*#############################################*/
 
 
 

 
 
/*#############################################*/
/*Indica si una pieza se puede mover en una determinada dirección*/  
 function chequeaMovimiento(DIRECCION){
 
	var puedeMoverse = true;
	
 	if (DIRECCION == RIGHT_ARROW){
  		if(this.x+this.xSize+1> TABLERO_ANCHURA)  return false;
 	    for(var i=0;(i<this.xSize)&&puedeMoverse;i++){
 		    for(var j=0;(j<this.ySize)&&puedeMoverse;j++){
 		      if( (miTablero.estructura[this.x + i + 1][this.y + j]!=0) && (this.estructura[i][j]!=0) ) {
 		      	puedeMoverse = false;
 		      }
 		   }
 		}
 		return puedeMoverse;
 	}
 
 	if (DIRECCION == LEFT_ARROW){
 		  if(this.x == 0) return false;
 		  for(var i=0;(i<this.xSize)&&puedeMoverse;i++){
 				for(var j=0;(j<this.ySize)&&puedeMoverse;j++){
 			  				if( (miTablero.estructura[this.x + i - 1][this.y + j]!=0) && (this.estructura[i][j]!=0) ){
 										puedeMoverse = false;
 			  				}
 				}
 		  }
 		  return puedeMoverse;
 	}
 
 	if (DIRECCION == DOWN_ARROW){
 		  for(var i=0;(i<this.xSize)&&puedeMoverse;i++){
 			  for(var j=0;(j<this.ySize)&&puedeMoverse;j++){
 			     if( (miTablero.estructura[this.x + i][this.y + j + 1]!=0) && (this.estructura[i][j]!=0) ){
 			    	puedeMoverse = false;
 			    }
 			 }
 		 }
 		 return puedeMoverse;
 	}
 
 
 }
/*#############################################*/
 
 

 
 
/*#############################################*/
/*Mueve una pieza en una determinada dirección*/  
 function mover(DIRECCION) {
 
 		if (DIRECCION == DOWN_ARROW){ 
 			  if(this.chequeaMovimiento(DIRECCION)) {
   				miTablero.borrarPieza(this);
   				this.y++;
   				miTablero.dibujarPieza(this);
 			  }
 		}
 
 		if (DIRECCION == RIGHT_ARROW){
 			  if(this.chequeaMovimiento(DIRECCION)) {
   				miTablero.borrarPieza(this);
   				this.x++;
   				miTablero.dibujarPieza(this);
 			  } 
 		}
 
 		if (DIRECCION == LEFT_ARROW){
 			  if(this.chequeaMovimiento(DIRECCION)) {
   				miTablero.borrarPieza(this);
   				this.x--;
   				miTablero.dibujarPieza(this);
 			  }
 		}
 }
/*#############################################*/




/*#############################################*/
/*Clona una pieza*/  
 function clonarPieza(){
   var auxPiece  = new Pieza();
   auxPiece.type = this.type;
   auxPiece.pos  = this.pos;
   auxPiece.npos = this.npos;
   auxPiece.x    = this.x;
   auxPiece.y    = this.y;
	 
	 return auxPiece;
 }
/*#############################################*/
 
 
 
 


/*#############################################*/
/*Rota una pieza*/  
 function rotar() {
   if(this.puedeRotar()){
     miTablero.borrarPieza(this);
     if(this.pos < this.npos)       this.pos++;    else       this.pos = 1;
     this.initPieza();
     miTablero.dibujarPieza(this);
   }
 }
/*#############################################*/
 
 
 
 

 
/*#############################################*/
/*Indica si una pieza puede rotar o no*/   
 function puedeRotar() {
 
   var piezaAuxiliar  =  this.clonarPieza();
   if(piezaAuxiliar.pos < piezaAuxiliar.npos) piezaAuxiliar.pos++;   else piezaAuxiliar.pos = 1;
	 piezaAuxiliar.initPieza();
 
   var puede = true;
   for(var i=0;i<piezaAuxiliar.xSize&&puede;i++){
     for(var j=0;j<piezaAuxiliar.ySize&&puede;j++){
       if( (piezaAuxiliar.x+i>=TABLERO_ANCHURA) || (piezaAuxiliar.y+j>=TABLERO_ALTURA) || (piezaAuxiliar.estructura[i][j]!=0)&&(miTablero.estructura[piezaAuxiliar.x+i][piezaAuxiliar.y+j]!=0) ){
			  	  puede = false;
			 } 
		}
	 }
	 	 
   return puede;
 }
/*#############################################*/