
//
// frastr.js
// gestione gioco interattivo 'Frase in strisce'
//

// **********************************************
//                   DATI LOCALI
// **********************************************
MAX_COLONNE = 10; // numero massimo colonne schema
MAX_RIGHE   = 10; // numero massimo righe schema

var prima,         // indice prima colonna scelta
    seconda,       // indice seconda colonna scelta
    selezionate=0; // numero di colonne scelte

var disposizione  = new Array(MAX_COLONNE), // disposizione casuale colonne
    SchemaGiocato = new Array(MAX_COLONNE); // disposizione colonne utente

var colonne, // miglior numero colonne schema da visualizzare
    righe;   // miglior numero righe schema da visualizzare

Dim=35;

function reset_schema()
// imposta strutture dati per (ri)partire col gioco
{
  if (Risolto || SoluzioneVista || VediSoluzione || VediInfo)
    return;

  for (i=0;i<colonne;i++)
    SchemaGiocato[i]=disposizione[i];
  // carica disposizione iniziale di gioco

  vedi_schema();
}

function nuovo_schema()
// calcola e imposta schema scelto
{
  var dim;

  dim=Esposto.length;                 // acquisisce dimensioni frase
  colonne=Math.floor(Math.sqrt(dim)); // calcola prima approssimazione

  while ((dim/colonne)!=(Math.floor(dim/colonne)))
    colonne--;
  // cerca migliore scomposizione, ottenendo numero colonne

  righe=dim/colonne;

  disposizione_casuale();
  // crea sequenza casuale non banale colonne schema
}

function vedi_schema()
// visualizza numeri e lettere schema scelto
{
  var i, j, sorg;

  ss='<table align="center" width="100%"><tr><td><table align="center">';
  // corpo tabelle contenenti schema

  ss+='<tr>';
  for (j=0;j<colonne;j++)
    ss+='<td><div class="csl" onClick="cliccata('+j+'); return false;"'+
        ' id="'+eittag(j)+'"></div></td>';
  ss+="</tr>";
  // riga contenente numeri colonne

  for (i=0;i<righe;i++)
  {
    ss+='<tr>';
    for (j=0;j<colonne;j++)
      ss+='<td><div class="csl" id="'+
        eittag((i+1)*colonne+j)+'"></div></td>';
    ss+='</tr>';
  }
  // righe contenenti frase da ricostruire

  ss+='</table></td></tr></table>';
  // chiusura tabelle

  document.getElementById('eitsk').innerHTML=ss;
  // inserisce codice html intero schema

  zooma_font(0);

  for (i=0;i<colonne;i++)
    document.getElementById(eittag(i)).innerHTML=i+1;
  // visualizza numeri colonne schema scelto

  for (i=0;i<righe;i++)
    for (j=0;j<colonne;j++)
    {
      sorg=
       Esposto.charAt(i*colonne+disposizione[j]).toUpperCase();
                                            // lettera frase
      document.getElementById(eittag((i+1)*colonne+j)).innerHTML=sorg;
      // visualizza effettivamente quanto selezionato
    }
  // visualizza lettere schema scelto
}

function cliccata(num)
// scambia due colonne schema, se deve
{
  var i, temp;

  if (Risolto || VediSoluzione)
    return;

  switch(selezionate)
  {
    case 0: 
      if ((num>=0)&&(num<colonne))
      {
        prima=num;
        // ancora nessuna colonna selezionata
        selezionate=1;
      }
      break;
    case 1:
      if ((num>=0)&&(num<colonne))
      {
        if (prima==num)
        // selezionata una seconda colonna ma uguale alla prima
          selezionate=0;
        else
         // selezionata una seconda colonna diversa dalla prima
         {
           seconda=num;

           for (i=0;i<righe;i++)
           {
             temp=document.getElementById(eittag((i+1)*colonne+
               prima)).innerHTML;
             document.getElementById(eittag((i+1)*colonne+
               prima)).innerHTML=
               document.getElementById(eittag((i+1)*colonne+
               seconda)).innerHTML;
             document.getElementById(eittag((i+1)*colonne+
               seconda)).innerHTML=temp;
           } // scambia le colonne
           temp=SchemaGiocato[prima];
           SchemaGiocato[prima]=SchemaGiocato[seconda];
           SchemaGiocato[seconda]=temp;
           // scambia indici in soluzione utente

           selezionate=0;
           // reimposta contatore colonne selezionate

           controlla();
         }
      }
      break;
   default:
      break;
  }
}

function inkeys(e)
// gestore pressione tasti
{
  return false;
}

function controlla()
// controlla soluzione parziale costruita da utente
{
  i=0;
  while (SchemaGiocato[i]==i && i<colonne)
    i++;
  // confronta indici colonne scambiate da utente e indici reali

  if (i==colonne)
  // se indici colonne corrispondono tutti
  {
    Risolto=true;
    stopTimer();
    //   gioco risolto
    vediApplauso();
    //   richiama animazione sfinge Kidi che applaude
    // confirm("Ottimo!");
  }
  else
  {
  // altrimenti
  //   richiama adeguata animazione Kidi
  }
}

function soluzione()
// mostra soluzione schema scelto
{
  if (VediInfo)
    return;

  SoluzioneVista=true;
  VediSoluzione=!VediSoluzione;

  for (i=0;i<righe;i++)
    for (j=0;j<colonne;j++)
    {
      if (VediSoluzione)
        c=Esposto.charAt(i*colonne+j).toUpperCase();
      else
        c=Esposto.charAt(i*colonne+SchemaGiocato[j]).toUpperCase();
      document.getElementById(eittag((i+1)*colonne+j)).innerHTML=c;
    }

  stopTimer();
}

// -------------------------------
// INIZIO CODICE LOCALE AGGIUNTIVO
// -------------------------------

document.onkeydown=inkeys;
// aggancia gestore pressione tasti alla pagina

function disposizione_casuale()
// crea sequenza casuale non banale con la quale disporre colonne schema
{
  var i, min_dist, temp;
  var presi = new Array(MAX_COLONNE);

  do
  // ripeti
  {
    for (i=0;i<colonne;i++)
      presi[i]=0;
    // nessun indice ancora inserito in disposizione

    for (i=0;i<colonne;i++)
    {
      do
        temp=Math.floor(Math.random()*colonne);
      while (presi[temp]!=0);
      presi[temp]=1;
      disposizione[i]=temp;
    }
    // calcola disposizione

    min_dist=MAX_COLONNE+1;
    for (i=1;i<(colonne-1);i++)
    {
      temp=Math.abs(disposizione[i]-disposizione[i-1]);
      if (temp<min_dist)
        min_dist=temp;
    }  
    // calcola minima distanza in disposizione colonne
  }
  while (min_dist<2);
  // finche' minima distanza < 2
}