var Direzione,          // direzione inserimento in schema 0:orizz, 1:vert
    Primacasella,       // indice prima casella utile di inserimento
    Precedente,         // indice precedente casella utilizzata
    Attuale,            // indice casella attualmente in uso

Dim=25;

function nuovo_schema()
// calcola parametri schema scelto e lo visualizza
{
  Risolto=0;
  calcolaindici();

  vedi_schema();

  stopTimer();
  startTimer();

  return(false);
}

function vedi_schema()
// visualizza schema scelto
{
  ss="<div class=\"crucitxt\" id=\"crcdef\"></div>";
  // spazio definizione

  ss+="<table align=\"center\" cellspacing=\"1\" cellpadding=\"0\""+
      "bgcolor=\"#000000\">";
  // inizio casella

  for (i=0;i<NumeroRighe;i++)   // per ogni riga schema
  {
    ss+="<tr>";                 // inizio riga
    for (j=0;j<NumeroColonne;j++)  // per ogni colonna schema
      ss+="<td bgcolor=\"#ffffff\"><div class=\"cruciterno\" "+
          "onClick=\"cliccata("+(i*NumeroColonne+j)+"); return false;\" "+
          "id=\""+crctag(i*NumeroColonne+j)+"\"></div></td>";
    ss+="</tr>";                // chiusura riga
  }

  ss+="</table>"
  // chiusura tabella

  document.getElementById("crcsk").innerHTML=ss;
  // inserisce codice html intero schema

  Direzione=0;
  primacasella();
  Precedente=Primacasella;
  Attuale=Primacasella;

  for (i=0;i<NumeroRighe;i++)
    for (j=0;j<NumeroColonne;j++)
    {
      if (Schemi[Schema].charAt(i*NumeroColonne+j)=='')
        document.getElementById(crctag(i*NumeroColonne+
         j)).style.backgroundColor="#000";
      else
      {
        document.getElementById(crctag(i*NumeroColonne+j)).innerHTML="";
        document.getElementById(crctag(i*NumeroColonne+
          j)).style.backgroundColor="#fff";
      }
    }

  zooma_font(0);

  cliccata(Primacasella);
}

function zooma_font(p)
// modifica dimensioni font a scelta utente
{
  if ((Dim<=10 && p<0)||(Dim>=40 && p>0))
    return;

  Dim+=p;

  if (el=document.getElementById("crcdef"))
    el.style.fontSize=Math.floor(Dim/4*3)+"px";

  i=0;
  while (el=document.getElementById(crctag(i)))
  {
    el.style.width=Dim+"px";
    el.style.height=Dim+"px";
    el.style.fontSize=Math.floor(Dim/4*3)+"px";
    i++;
  }
}

function cliccata(c)
// cliccato su casella
{
  if (Schemi[Schema].charAt(c)=='')
    return;
  // se clicca su casella nera, non fa niente

  evidenzia(Attuale,"#fff","#fff");
  // toglie evidenziatura a parola precedente

  // cliccata casella giocabile:
  if ( ( (Direzione==0) && (Indicioriz[c]==-1) )
     || ( (Direzione!=0) && (Indicivert[c]==-1) )
     )
    Direzione = (Direzione+1)%2;
  // cambia direzione, se deve

  Attuale=c;
  Precedente=Attuale;
  evidenzia(Attuale,"#ff0","#ccc");
  // evidenzia nuova parola

  document.getElementById("crcdef").innerHTML=
Direzione==0?Deforiz[Schema][Indicioriz[c]-1]:Defvert[Schema][Indicivert[c]-1];
}

function inkeys(e)
// gestore pressione tasti
{
  if (!e)
    e=window.event;

  if (e.keyCode==13)
  // invio = cambia direzione
  {
    if ( ( (Direzione==0) && (Indicivert[Attuale]!=-1) )
       || ( (Direzione!=0) && (Indicioriz[Attuale]!=-1) )
       )
    {
      evidenzia(Attuale,"#fff","#fff");
      Direzione = (Direzione+1)%2;
      // cambia direzione, se puo'
      evidenzia(Attuale,"#ff0","#ccc");
      document.getElementById("crcdef").innerHTML=
        Direzione==0?Deforiz[Schema][Indicioriz[Attuale]-1]:
                     Defvert[Schema][Indicivert[Attuale]-1];
    }
    return;
  }

  if (Risolto==1)
    return;
  // non accetta altro input da tastiera se schema risolto
  // Accetta solo cambiamento direzione (invio) per permettere
  // all'utente di girellare per lo schema risolto

  x=Attuale%NumeroColonne;
  y=Math.floor(Attuale/NumeroColonne);
  // acquisisce coordinate casella attuale

  if (e.keyCode==27) // se escape (cancella carattere)
  {
    document.getElementById(crctag(Attuale)).innerHTML="";
    // cancella comunque carattere

    if (Direzione==0) // se direzione orizzontale
    {
      if (x>0)
      {
        if (Schemi[Schema].charAt(Attuale-1)!="")
        // se puo' indietreggiare
        {
          Precedente=Attuale;
          Attuale--;
          evidenzia(Attuale,"#ff0","#ccc");
          // indietreggia ed evidenzia nuova casella
        }
      }
    }
    else              // altrimenti direzione verticale
    {
      if (y>0)
      {
        if (Schemi[Schema].charAt(Attuale-NumeroColonne)!="")
        // se puo' indietreggiare
        {
          Precedente=Attuale;
          Attuale-=NumeroColonne;
          evidenzia(Attuale,"#ff0","#ccc");
          // indietreggia ed evidenzia nuova casella
        }
      }
    }
  }

  c=String.fromCharCode(e.keyCode);
  if ((c<'a'||c>'z')&&(c<'A'||c>'Z'))
    return;
  // non accetta input da tastiera diversi da invio, escape (gia' visti)
  // e caratteri alfabetici

  document.getElementById(crctag(Attuale)).innerHTML=
    String.fromCharCode(e.keyCode);
  // inserisce comunque carattere appena digitato

  if (Direzione==0) // se direzione orizzontale
  {
    if (x<(NumeroColonne-1))
    {
      if (Schemi[Schema].charAt(Attuale+1)!="")
      // se puo' avanzare
      {
        Precedente=Attuale;
        Attuale++;
        evidenzia(Attuale,"#ff0","#ccc");
        // avanza ed evidenzia nuova casella
      }
    }
  }
  else              // altrimenti direzione verticale
  {
    if (y<(NumeroRighe-1))
    {
      if (Schemi[Schema].charAt(Attuale+NumeroColonne)!="")
      // se puo' avanzare
      {
        Precedente=Attuale;
        Attuale+=NumeroColonne;
        evidenzia(Attuale,"#ff0","#ccc");
        // avanza ed evidenzia nuova casella
      }
    }
  }
}

function soluzione()
// visualizza soluzione
{
  Risolto=1;

  for (i=0;i<NumeroRighe;i++)
    for (j=0;j<NumeroColonne;j++)
      if (Schemi[Schema].charAt(i*NumeroColonne+j)!='')
        document.getElementById(crctag(i*NumeroColonne+j)).innerHTML=
        Schemi[Schema].charAt(i*NumeroColonne+j).toUpperCase();

  stopTimer();
}

// -------------------------------
// INIZIO CODICE LOCALE AGGIUNTIVO
// -------------------------------

var Indicioriz = new Array(NumeroRighe*NumeroColonne),
    Indicivert = new Array(NumeroRighe*NumeroColonne);

document.onkeydown=inkeys;
// aggancia gestore pressione tasti alla pagina

function colora(d,s)
// colora d
{
  document.getElementById(crctag(d)).style.backgroundColor=s;
}

function evidenzia(d,c1,c2)
// evidenzia d
{
  i=d;

  x=i%NumeroColonne;
  y=Math.floor(i/NumeroColonne);

  if (Direzione==0)
  {
    while (x>=0 && Schemi[Schema].charAt(y*NumeroColonne+x)!='')
      x--;
    x++;
  }
  else
    {
      while (y>=0 && Schemi[Schema].charAt(y*NumeroColonne+x)!='')
        y--;
        y++;
    }

  while (x<NumeroColonne && y<NumeroRighe &&
         Schemi[Schema].charAt(y*NumeroColonne+x)!='')
  {
    if ((y*NumeroColonne+x)==d)
      colora(y*NumeroColonne+x,c1);
    else
      colora(y*NumeroColonne+x,c2);

    if (Direzione==0)
      x++;
    else
      y++;
  }
}

function calcolaindici()
// associa ad ogni casella indici definizioni e visualizza
{
  for (i=0;i<NumeroRighe;i++)
    for (j=0;j<NumeroColonne;j++)
    {
      Indicioriz[i*NumeroColonne+j] = -1;
      Indicivert[i*NumeroColonne+j] = -1;
    }

  ind = 0;

  for (i=0;i<NumeroRighe;i++)
    for (j=0;j<NumeroColonne;)
      if ( (Schemi[Schema].charAt(i*NumeroColonne+j)=="") ||
           (j==(NumeroColonne-1))    ||
           ( (j<(NumeroColonne-1))&&
              (Schemi[Schema].charAt(i*NumeroColonne+j)!=""
              && Schemi[Schema].charAt(i*NumeroColonne+j+1)=="") )
         )
        j++;
      else
      {
        ind++;
        while ( (Schemi[Schema].charAt(i*NumeroColonne+j)!="") &&
                (j<NumeroColonne) )
        {
          Indicioriz[i*NumeroColonne+j]=ind;
          j++;
          if (j>=NumeroColonne)
            break;
        }
      }

  ind = 0;

  for (i=0;i<NumeroRighe;i++)
    for (j=0;j<NumeroColonne;j++)
      if (Indicivert[i*NumeroColonne+j]==-1)
        if (Schemi[Schema].charAt(i*NumeroColonne+j)=="" || 
            (Schemi[Schema].charAt(i*NumeroColonne+j)!="" && 
             ((i==(NumeroRighe-1)) || (i<(NumeroRighe-1) &&
             Schemi[Schema].charAt((i+1)*NumeroColonne+j)==""))
            )
           )
          Indicivert[i*NumeroColonne+j]=-1;
        else
        {
          k=i;
          ind++;
          while (Schemi[Schema].charAt(k*NumeroColonne+j)!="" &&
                 (k<NumeroRighe))
          {
            Indicivert[k*NumeroColonne+j]=ind;
            k++;
            if (k>=NumeroRighe)
              break;
          }
        }
}

function primacasella()
// individua prima casella utile
{
  y=0;
  trovato=0;
  while (y<NumeroRighe && trovato==0)
  {
    x=0;
    while (x<NumeroColonne && trovato==0)
    {
      if (Indicioriz[y*NumeroColonne+x]!=-1
          && Indicivert[y*NumeroColonne+x]!=-1)
      {
        Primacasella=y*NumeroColonne+x;
        trovato=1;
      }
      else
        x++;
    }
  }

  if (trovato==0)
  {
    alert("Schema non valido!");
    // segnala schema incongruente
    Risolto=1;
    // e poi blocca interazione con utente
  }
}