/*Questo script si occupa della gestione degli eventi relativi
al mouse e alla tastiera preoccupandosi di invocare le dovute
funzioni contenute nei dovuti script di tale applicazione web*/

function freccia_up()
{
   switch(StatoComandi)
   {
      case "RuotaCubo": cubo_rubik.ruotaX(15);
                        cubo_rubik.draw();
                        break;
      case "OpBlocchi": cubo_rubik.freccia_up();
   }
}

function freccia_down()
{
   switch(StatoComandi)
   {
      case "RuotaCubo": cubo_rubik.ruotaX(-15);
                        cubo_rubik.draw();
                        break;
      case "OpBlocchi": cubo_rubik.freccia_down();
   }
}

function freccia_left()
{
   switch(StatoComandi)
   {
      case "RuotaCubo": cubo_rubik.ruotaY(15);
                        cubo_rubik.draw();
                        break;
      case "OpBlocchi": cubo_rubik.freccia_left();
   }
}

function freccia_right()
{
   switch(StatoComandi)
   {
      case "RuotaCubo": cubo_rubik.ruotaY(-15);
                        cubo_rubik.draw();
                        break;
      case "OpBlocchi": cubo_rubik.freccia_right();
   }
}

function cambia_dimensione(tipo)
{
   var dim = cubo_rubik.dimensione;
   var qualita = cubo_rubik.Qualita_Animazione;

   delete cubo_rubik;

   if(tipo == "+") dim++;
   else dim--;

   if(dim == 1) dim = 2;
   if(dim == 101) dim = 100;

   cubo_rubik = new Cubo(dim,[canvas_cubo,canvas_cubo.width,"#A9A9A9"]);
   cubo_rubik.init();
   cubo_rubik.Setta_Qualita_Animazione(qualita);
   cubo_rubik.assegna_risolutore(risolutore);
   cubo_rubik.assegna_barra(barra_rubik);
   barra_rubik.Setta_Valore_Max(0);
   barra_rubik.Setta_Valore(0);
   barra_rubik.draw();
   cubo_rubik.draw();

   document.title = "Cubo Rubik (" + dim + "x" + dim + "x" + dim + ")";

   StatoComandi = "RuotaCubo";
}

/*Gestore Generico di eventi del mouse e tastiera*/
function gestore_mouse_tastiera(e)
{
   e = (!e) ? window.event : e;

   var bottone;
   var tasto;
   var posX,posY;
   var cubo_veraX,cubo_veraY;
   var barra_veraX,barra_veraY;

   if(e.type.substr(0,5) == "mouse")
   {
      bottone = (e.which != null) ? e.which : e.button;
      posX = e.clientX;
      posY = e.clientY;
   }
   else
   {
      tasto = (e.which != null) ? e.which : e.keyCode;
      switch(tasto)
      {
         case 37: freccia_left(); break;
         case 38: freccia_up(); break;
         case 39: freccia_right(); break;
         case 40: freccia_down(); break;
         case 107: if(cubo_rubik.StatoCubo == "Libero") cambia_dimensione("+"); break;
         case 109: if(cubo_rubik.StatoCubo == "Libero") cambia_dimensione("-"); break;
         case 17: if(cubo_rubik.StatoAnimazioneCoda == "Stop") StatoComandi = (StatoComandi == "RuotaCubo")?"OpBlocchi":"RuotaCubo";
                  else StatoComandi = "RuotaCubo";
                  break;
         case 65: if(cubo_rubik.StatoAnimazioneCoda == "Stop" && cubo_rubik.StatoCubo == "Libero")
                  {
                     if(cubo_rubik.normale_blocchi[0] != 0) cubo_rubik.SetNormale_SetBlocchi([0,1,0]);
                     else if(cubo_rubik.normale_blocchi[1] != 0) cubo_rubik.SetNormale_SetBlocchi([0,0,1]);
                          else cubo_rubik.SetNormale_SetBlocchi([1,0,0]);
                     cubo_rubik.draw();
                     StatoComandi = "OpBlocchi";
                  }
                  break;
         case 85: cubo_rubik.Setta_Qualita_Animazione(0); break;
         case 73: cubo_rubik.Setta_Qualita_Animazione(1); break;
         case 79: cubo_rubik.Setta_Qualita_Animazione(2); break;
         case 80: cubo_rubik.Setta_Qualita_Animazione(3); break;
         case 77: if(cubo_rubik.StatoAnimazioneCoda == "Stop")
                  {
                     StatoComandi = "RuotaCubo";
                     cubo_rubik.mescola((3*cubo_rubik.dimensione)*3,1); 
                  }
                  break;
         case 75: if(cubo_rubik.StatoAnimazioneCoda == "Stop")
                  {
                     StatoComandi = "RuotaCubo";
                     cubo_rubik.mescola((3*cubo_rubik.dimensione)*10,0);
                  }
                  break;
         case 82: if(cubo_rubik.StatoAnimazioneCoda == "Stop")
                  {
                     StatoComandi = "RuotaCubo";
                     cubo_rubik.risolvi();
                  }
                  break;
         case 71: if(cubo_rubik.StatoAnimazioneCoda == "Fermo")
                  {
                     cubo_rubik.StatoAnimazioneCoda = "Stop";
                     cubo_rubik.coda_tipo = null;
                     StatoComandi = "RuotaCubo";
                     barra_rubik.Setta_Valore_Max(0);
                     barra_rubik.Setta_Valore(0);
                     barra_rubik.draw();
                     cubo_rubik.coda_testa = 0;
                     cubo_rubik.coda_mossa_attuale = -1;
                  }
      }
   }

   cubo_veraX = posX-1-parseInt(canvas_cubo.style.left)-parseInt(Box_Rubik.style.left);
   cubo_veraY = posY-1-parseInt(canvas_cubo.style.top)-parseInt(Box_Rubik.style.top);

   barra_veraX = posX-1-parseInt(canvas_barra.style.left)-parseInt(Box_Rubik.style.left);
   barra_veraY = posY-1-parseInt(canvas_barra.style.top)-parseInt(Box_Rubik.style.top);

   switch(e.type)
   {
      case "mousemove": if(cubo_rubik.StatoAnimazioneCoda == "Stop") cubo_rubik.mouse_move(cubo_veraX,cubo_veraY);
                        break;
      case "mousedown": if(bottone == 1) //bottone sx
                        {
                           if(cubo_rubik.StatoAnimazioneCoda == "Stop") cubo_rubik.mouse_down(cubo_veraX,cubo_veraY);
                           barra_rubik.mouse_down(barra_veraX,barra_veraY);
                        }
                        break;
      case "mouseup": if(bottone == 1) //bottone sx
                      {
                         if(cubo_rubik.StatoAnimazioneCoda == "Stop") cubo_rubik.mouse_up(cubo_veraX,cubo_veraY);
                      }
                      else //bottone dx
                      {

                      }
   }
}

function gestore_mouse_dx(e)
{
   //Serve ad evitare il context menu'
   return false;
}


function init_tastiera()
{
   StatoComandi = "RuotaCubo";
   document.onkeyup = gestore_mouse_tastiera;
}

function init_mouse()
{
   document.onmousedown = gestore_mouse_tastiera; 
   document.onmouseup = gestore_mouse_tastiera;
   document.oncontextmenu = gestore_mouse_dx;
   document.onmousemove = gestore_mouse_tastiera;
}