var abc = new Array("A","B","C","D","E","F","G","H","I","J","K","L","M","N","Ñ","O","P","Q","R","S","T","U","V","W","X","Y","Z");

var solAlumno = "";
var solCorrecta = "";

function IJ(letra,i,j)
{
	this.letra=letra;
	this.i=i;
	this.j=j;
}

function Palabra(palabra, i_ini, j_ini, i_fin, j_fin, letras)
{
	this.palabra = palabra;
        this.acertada = false;
	this.posiciones = new Array();
	
        var var_i=i_ini, var_j=j_ini, incremento_i=0, incremento_j=0;
        
        //AÑADIR LAS POSICIONES DE TODAS LAS LETRAS...... EN FUNCION DE LA DE INICIO Y FIN....
        if(i_ini == i_fin)  //Palabra en horizontal
        {
            if(j_ini < j_fin) //De izda a dcha
            {
                incremento_i = 0;
                incremento_j = 1;
            }
            else
            {
                incremento_i = 0;
                incremento_j = -1;                
            }
        }
        else //Palabra en vertical
        {
            if(i_ini < i_fin)  //De arriba a abajo
            {
                incremento_i = 1;
                incremento_j = 0;                
            }
            else
            {
                incremento_i = -1;
                incremento_j = 0;                  
            }
        }
        
        for(var i=0;i<palabra.length;i++)
        {
            this.posiciones[this.posiciones.length] = new IJ(letras[var_i][var_j],var_i,var_j);
            
            //Ponemos la letra a usada a la vez q insertamos la palabra
            letras[var_i][var_j].usada = true;
            
            var_i = parseInt(var_i) + parseInt(incremento_i);
            var_j = parseInt(var_j) + parseInt(incremento_j);
        }
        
}

function Letra (letra)
{ 
    this.letra = letra; 
    this.usada = false;		//Usada por una palabra
    this.marcada = false;	//Marcada en rojo por el usuario
    this.acertada = false;      //Perteneciente a una palabra acertada
}

function aleatorio(inferior,superior)
{ 
    numPosibilidades = superior - inferior; 
    aleat = Math.random() * numPosibilidades; 
    aleat = Math.round(aleat);
    return parseInt(inferior) + aleat; 
}


function corrigeEjercicioTipoSopaLetras(idEjercicio, scorm)
{
    
    var sopaLetras =  eval("sopaLetras_"+idEjercicio);


    var vectorPalabras = sopaLetras.getPalabras();

    //Todas las palabras de la sopa
    for(var i=0;i<vectorPalabras.length;i++)
        solCorrecta += vectorPalabras[i] + "; ";
    
    eval("estadoEjercicio_"+idEjercicio+"= sopaLetras.corregirSopa()");
    actualizarSopa(idEjercicio,true);
    

    var vectorPalabrasAcertadas = sopaLetras.getPalabrasAcertadas();

    //Todas las palabras de la sopa
    for(var i=0;i<vectorPalabrasAcertadas.length;i++)
        solAlumno += vectorPalabrasAcertadas[i] + "; ";

    if(parseInt(scorm)==3)
        finishInteraction(idEjercicio,solAlumno, solCorrecta);

}

function limpiaEjercicioTipoSopaLetras(idEjercicio)
{
    var sopaLetras =  eval("sopaLetras_"+idEjercicio);
    
    sopaLetras.limpiarSopa();   
    
    actualizarSopa(idEjercicio,false);
    
}

function actualizarSopa(idEjercicio, corregir)
{
    var sopaLetras = eval("sopaLetras_"+idEjercicio);
    var cadena = "";

    cadena += "<strong>PALABRAS</strong><br />";

    for (var i = 0; i < sopaLetras.palabras.length; i++)
    {
        if(sopaLetras.palabras[i].acertada==false)
            cadena += "&nbsp;&nbsp;&nbsp;-&nbsp;" + sopaLetras.palabras[i].palabra + "<br />";
        else
            cadena += "&nbsp;&nbsp;&nbsp;-&nbsp;<strike>" + sopaLetras.palabras[i].palabra + "</strike><br />";
    }

    // COMPROBAMOS SI HAY QUE MOSTRAR LAS PALABRAS O NO
    if (sopaLetras.getMostrarPalabras() == false)
    {
        document.getElementById("cuerpoDivSopaLetrasIzda_"+idEjercicio).style.visibility = "hidden";
    }

    document.getElementById("cuerpoDivSopaLetrasIzda_"+idEjercicio).innerHTML = cadena;

    document.getElementById("cuerpoDivSopaLetrasDcha_"+idEjercicio).innerHTML = sopaLetras.sopaLetrasToString(idEjercicio,corregir);

    if(sopaLetras.mensaje!="")
    {
        alert(sopaLetras.mensaje);
        sopaLetras.mensaje="";

        //FIN DEL JUEGO
        if(sopaLetras.numPalabrasAcertadas==sopaLetras.palabras.length)
        {
            alert("FIN DEL JUEGO"); 

            if( eval("estadoEjercicio_"+idEjercicio+" == -1") )
            {
                eval("estadoEjercicio_"+idEjercicio+" = 1; ");

                solAlumno = solCorrecta;
            }
        }    
    }


}

function SopaLetrasCorreccion( strLetras, strPalabras, numFilas, numColumnas, mostrarPalabras, idEjercicio)
{
    this.idEjercicio = idEjercicio;
    this.tam = numFilas ;
    this.numClicks = 0;
    this.numPalabrasAcertadas = 0;
    this.letras = new Array(numColumnas);
    this.palabras = new Array();
    this.correctas = new Array();
    this.mensaje = "";
    this.mostrarPalabras = mostrarPalabras;
    
    
    //PARSEAMOS LA TABLA (LETRAS)
    for(var i=0;i<this.tam;i++)
    {
            this.letras[i] = new Array(this.tam);
            
            for(var j=0; j<this.tam; j++)
            {
                    this.letras[i][j]=new Letra( strLetras.charAt( i*this.tam + j ) );
            }
    }

    //PARSEAMOS LAS PALABRAS    
    var pal_aux_01 = new Array();
    pal_aux_01 = strPalabras.split("#");
    
    for(var i=0;i<pal_aux_01.length-1;i++)
    {
        var aux_pal = pal_aux_01[i].split("$")[0];
        var aux_i_ini = parseInt(pal_aux_01[i].split("$")[1].split(";")[0]);
        var aux_j_ini = parseInt(pal_aux_01[i].split("$")[1].split(";")[1]);
        var aux_i_fin = parseInt(pal_aux_01[i].split("$")[2].split(";")[0]);
        var aux_j_fin = parseInt(pal_aux_01[i].split("$")[2].split(";")[1]);
        
        this.palabras[i] = new Palabra(aux_pal, aux_i_ini, aux_j_ini, aux_i_fin, aux_j_fin, this.letras );
    }
    

    this.getPalabras = function()
    {
        var v_palabras = new Array();
        
        for(var i=0;i<this.palabras.length;i++)
        {
            v_palabras[i] = this.palabras[i].palabra;
        }
        
        return v_palabras;
    };
    
    this.getPalabrasAcertadas = function()
    {
        var v_palabras = new Array();
        var indice=0;
        
        for(var i=0;i<this.palabras.length;i++)
        {
            if(this.palabras[i].acertada==true)
            {
                v_palabras[indice] = this.palabras[i].palabra;
                indice++;
            }
        }
        
        return v_palabras;
    };
    
    
    this.sopaLetrasToString = function(idEjercicio, solucionar)
    {
            var sal="";

            if(this.palabras.length!=0)
            {
                sal+="<table class='tablaSopa'>";

                for(var i=0;i<this.tam;i++)
                {
                        sal += "<tr class='filaSopa'>";
                        for(var j=0; j<this.tam; j++)
                        {
                            if(this.letras[i][j].marcada==true)
                            {
                                sal += "<td class='celdaSopa celdaSopaClick' id='cel"+i+"_"+j+"' onclick='sopaLetras_"+idEjercicio+".marcarLetra("+i+","+j+");'>" + this.letras[i][j].letra + "</td>";
                            }
                            else if(this.letras[i][j].acertada==true)
                            {
                                sal += "<td class='celdaSopa celdaSopaAcierto' id='cel"+i+"_"+j+"' onclick='sopaLetras_"+idEjercicio+".marcarLetra("+i+","+j+");'>" + this.letras[i][j].letra + "</td>";
                            }   
                            else if(this.letras[i][j].usada==true && this.letras[i][j].acertada==false && solucionar==true)
                            {
                                sal += "<td class='celdaSopa celdaSopaSolucion' id='cel"+i+"_"+j+"' onclick='sopaLetras_"+idEjercicio+".marcarLetra("+i+","+j+");'>" + this.letras[i][j].letra + "</td>";
                            }
                            else
                            {
                                sal += "<td class='celdaSopa celdaSopaInicio' id='cel"+i+"_"+j+"' onclick='sopaLetras_"+idEjercicio+".marcarLetra("+i+","+j+");'>" + this.letras[i][j].letra + "</td>";
                            }

                        }
                        sal+="</tr>";
                }	
                sal+="</table>";
            }
            
            return sal;
    };    
    
    this.marcarLetra = function(i,j)
    {

            if(this.numPalabrasAcertadas!=this.palabras.length) //Si el juego no ha terminado aun
            {
                    this.numClicks++;
                    
                    //Presuponemos ejercicio incorrecto, aunq si termina correctamente ya se pondra el estado a 1
                    if( eval("estadoEjercicio_"+this.idEjercicio+" == -1") )
                        eval("estadoEjercicio_"+this.idEjercicio+" = 0; ");
                    
                    //Desmarcamos las que no sean contiguas
                    this.desmarcadoAutomatico(i,j);

                    //COMPROBAMOS ACIERTOS
                    for(var k=0;k<this.palabras.length;k++)
                    {
                            if(this.palabras[k].acertada==false)
                            {
                                    var longPalabra = this.palabras[k].palabra.length;
                                    var acierto=true;

                                    for(var z=0;z<longPalabra && acierto==true;z++)
                                    {
                                            var pos_i = this.palabras[k].posiciones[z].i;
                                            var pos_j = this.palabras[k].posiciones[z].j;
                                            var letra_aux = this.letras[pos_i][pos_j];

                                            if(letra_aux.marcada==false)
                                            {				
                                                    acierto=false;
                                            }
                                    }

                                    if(acierto==true && this.getNumMarcadas()==longPalabra)
                                    {
                                            this.palabras[k].acertada = true;
                                            this.mensaje="¡ACIERTO! Palabra "+this.palabras[k].palabra+" encontrada.";
                                            
                                            //Desmarcamos el rojo de la palabra y la marcamos a acertada
                                            this.marcarPalabraAcertada(k);

                                            this.numPalabrasAcertadas++;
                                    }
                            }
                    }
            }

    };    
    
    
    this.desmarcadoAutomatico = function(pos_i,pos_j)
    {
    //Si se quiere restringir que se vaya resolviendo en orden, solo habría que comprobar que si el numero de marcadas es 0, en el
    //primer if, que solo se marque en el caso de  que la posicion sea la primera posicion de una palabra

     if(this.getNumMarcadas()==0)	//Caso cuando no hay ninguna marcada
     {
            this.correctas[this.correctas.length] = new IJ(this.letras[pos_i][pos_j].letra,pos_i,pos_j);
            
            //document.getElementById("cel"+pos_i+"_"+pos_j).style.backgroundColor="red";
            
            this.letras[pos_i][pos_j].marcada=true;
     }
     else
     {
            //Si no esta marcada la q vamos a pinchar hay q gestionar el desmarcado de lo que ya hay por si esta muy alejada
            if(this.letras[pos_i][pos_j].marcada==false)
            {
                     if( this.esVecino(pos_i,pos_j)==true )
                     {
                            this.correctas[this.correctas.length] = new IJ(this.letras[pos_i][pos_j].letra,pos_i,pos_j);
                            //document.getElementById("cel"+pos_i+"_"+pos_j).style.backgroundColor="red";
                            this.letras[pos_i][pos_j].marcada=true;	
                     }
                     else
                     {
                            //Desmarcamos todo
                            for(var i=0;i<this.tam;i++)
                            {
                                    for(var j=0;j<this.tam;j++)
                                    {			
                                            this.letras[i][j].marcada = false;
                                            this.letras[i][j].correcta = false;
                                    }
                            }

                            this.correctas = new Array();
                            this.correctas[this.correctas.length] = new IJ(this.letras[pos_i][pos_j].letra,pos_i,pos_j);

                            this.letras[pos_i][pos_j].marcada=true;
                     }
            }
            //Si lo q hay esta marcado, tenemos que 
            else
            {
                    for(var i=0;i<this.correctas.length;i++)
                    {
                            var c_i = this.correctas[i].i;
                            var c_j = this.correctas[i].j;

                            this.letras[c_i][c_j].marcada = false;
                            this.letras[c_i][c_j].correcta = false;
                    }

                    this.correctas = new Array();
            }
     }

    };

    this.esVecino = function(pos_i,pos_j)
    {

            for(var i=0;i<this.correctas.length;i++)
            {
                    var c_i = this.correctas[i].i;
                    var c_j = this.correctas[i].j;

                    //Si es vecino del único añadido se puede poner en cualquiera de los 4 vecinos
                    if( this.correctas.length == 1 &&  ((c_i == pos_i-1 && c_j == pos_j) || (c_i == pos_i+1 && c_j == pos_j) || 
                            (c_i == pos_i && c_j == pos_j-1) || (c_i == pos_i && c_j == pos_j+1) ))
                    {
                            return true;
                    }
                    else if ( this.correctas.length > 1 )
                    {
                            // Se puede marcar arriba y abajo de lo marcado
                            if(this.correctas[0].i == this.correctas[this.correctas.length-1].i && pos_i == this.correctas[0].i && 
                              (pos_j == this.correctas[0].j-1 || pos_j == this.correctas[0].j+1 || 
                               pos_j == this.correctas[this.correctas.length-1].j-1 || pos_j == this.correctas[this.correctas.length-1].j+1) )
                               return true;
                            //Se puede marcar a dcha e izda de lo marcado
                            else if(this.correctas[0].j == this.correctas[this.correctas.length-1].j && pos_j == this.correctas[0].j && 
                              (pos_i == this.correctas[0].i-1 || pos_i == this.correctas[0].i+1 || 
                               pos_i == this.correctas[this.correctas.length-1].i-1 || pos_i == this.correctas[this.correctas.length-1].i+1) )
                               return true;
                    }

            }

            return false;
    };


    this.getNumMarcadas = function()
    {
            var numMarcadas=0;

            for(var i=0;i<this.tam;i++)
            {
                    for(var j=0; j<this.tam; j++)
                    {
                            if(this.letras[i][j].marcada==true)
                                    numMarcadas++;
                    }
            }	

            return numMarcadas;
    };

    this.marcarPalabraAcertada = function(indice)
    {
            for(var i=0;i<this.palabras[indice].palabra.length;i++)
            {
                    var pos_i = this.palabras[indice].posiciones[i].i;
                    var pos_j = this.palabras[indice].posiciones[i].j;
                    this.letras[pos_i][pos_j].acertada=true;
                    this.letras[pos_i][pos_j].marcada=false;		
            }

            this.correctas = new Array();
    };

    this.marcarCorrectas = function()
    {
        for(var i=0;i<this.tam;i++)
                for(var j=0;j<this.tam;j++)
                {
                        if(this.letras[i][j].usada==true)
                        {
                                this.marcarLetra(i,j);
                        }
                }
    };

    
    this.limpiarSopa = function()
    {
            this.numPalabrasAcertadas = 0;
            
            for(var i=0;i<this.tam;i++)
            {
                    for(var j=0;j<this.tam;j++)
                    {
                        this.letras[i][j].marcada = false;
                        this.letras[i][j].acertada = false;                             
                    }
            }
            
            for(var i=0;i<this.palabras.length;i++)
            {
                this.palabras[i].acertada = false;
            }
    };    
    
    
    this.corregirSopa = function()
    {
        var resultado = 1;
        
        for(var i=0;i<this.tam;i++)
                for(var j=0;j<this.tam;j++)
                {
                        if(this.letras[i][j].usada==true && this.letras[i][j].acertada==false)
                        {
                                this.letras[i][j].corregida=true;
                                resultado = 0;
                        }
                }
        
        return resultado;
    }
    
    //**** 
    
    
    this.palabrasToString = function()
    {    
        var sal = "";
        for(var i=0;i<this.palabras.length;i++)
            sal += this.palabras[i].palabra + "$" + this.palabras[i].posiciones[0].i + ";" + this.palabras[i].posiciones[0].j + "$" + this.palabras[i].posiciones[this.palabras[i].posiciones.length-1].i + ";" + this.palabras[i].posiciones[this.palabras[i].posiciones.length-1].j + "#";

         return sal;
    };
    
    this.letrasToString = function()
    {
        var sal = "";
        
        for(var i=0;i<this.tam;i++)
          for(var j=0;j<this.tam;j++)
             sal += this.letras[i][j].letra;
        
        return sal;
    };
    
    this.getMostrarPalabras = function()
    {
        return this.mostrarPalabras;
    };
    
    this.getNumColumnas = function()
    {
        return this.tam;
    };
    
    this.getNumFilas = function()
    {
        return this.tam;
    };
}
