// QUESTA HA BISOGNO , IN TESTA DELLA js/AjaxRequest
//                     VALE PER I SUDOKU DA TRE
// CAMBIARE IL PATH DI LETTURA..
    // Utili...
function leftTrim(stringa) 
{
    while (stringa.substring(0,1) == ' ')
    {
    stringa = stringa.substring(1, stringa.length);
    }
    return stringa;
}
function rightTrim(stringa) 
{
    while (stringa.substring(stringa.length-1, stringa.length) == ' ')
    {
    stringa = stringa.substring(0,stringa.length-1);
    }
    return stringa;
}
function trim(stringa) 
{
    while (stringa.substring(0,1) == ' ')
    {
    stringa = stringa.substring(1, stringa.length);
    }
    while (stringa.substring(stringa.length-1, stringa.length) == ' ')
    {
    stringa = stringa.substring(0,stringa.length-1);
    }
    return stringa;
}

    

    // all'inizio va chiamata : function startUpNew(dime) dime=3/4/ etc..
    // La tabella si inizializza con : fillTable("???8......ect)
    // In caso di post, si richiama  : resetParams(dime)
    

    var tbF = "mainTable";
    var tb9 = "mainTable";
    var tbName = "";         
    var preFix = "";
    var subPath = "";
    var idCnt = 0;   
    var cellPerRow = 0;
    var maxId = 0;
    var idRow = 0;
    var idCol = 0;
    var idBlock = 0;
    var qPerGroup = 9;
    var qGroupPerRow = 3;
    var qRowPerGroup = 3;
    var qColPerGroup = 3;
    var cellsPerRowGroup = (qPerGroup * qGroupPerRow);
    var sdPath = "_sudoku/_sudoku9/";    
    var isForGame = false;
    
    
    
        function initView(dime)
        {
        
            idCnt = 0;   
            cellPerRow = 0;
            maxId = 0;
            idRow = 0;
            idCol = 0;
            idBlock = 0;
            if (dime==3) {
                        
               tbName = tb9;
               sdPath = "_sudoku/_sudoku9/";    
            }   
            else if (dime==4) 
            {
               tbName = tbF;       
               sdPath = "_sudoku/_sudokuF/";    
                       
            }   
            startUpNew(dime," "); // qPerGroup etc..
            
            loadNewSet(dime); // path, prefix, sNum etc...

            isForGame = false; 
            
        }
    


    
        function testKeyDown(e)
        {
            var keynum;
            
            
            if(window.event) // IE
              {
              keynum = window.event.keyCode;
              }
            else if(e.which) // Netscape/Firefox/Opera
              {
              keynum = e.which;
              }
            
            switch(keynum) {
              case 37:return("cursorLeft");
              case 38:return("cursorUp");
              case 39:return("cursorRight");
              case 40:return("cursorDown");
              default:return(String.fromCharCode(keynum));
            }            
            
        }
    
    function startRowCell(obj)
    {
        var n = 0;
        n = parseInt((obj.id),10);
        sc = myTrunc(n / cellPerRow)*cellPerRow;
        return( sc );
    }
    
    function endRowCell(obj)
    {
        ec = startRowCell(obj) + cellPerRow - 1; 
        return( ec );   
    }
    
    function startColCell(obj)
    {
        var n = 0;
        n = parseInt((obj.id),10);
        var colOfObj = n - startRowCell(obj);
        return( colOfObj );
    }
    
    function endColCell(obj)
    {
    
        var n = 0;
        n = parseInt((obj.id),10);
        
        var tb = 0;
        tb = startColCell(obj);
        
        while (tb <= maxId) {
        
               tb += cellPerRow;
        
        }
        if (tb > maxId) tb -= cellPerRow;
   
        
        return( tb );   
    }
    
    function startGroupCell(obj)
    {
        var n = 0;
        n = parseInt((obj.id),10);
        cellsInGroupAbove = myTrunc(n / cellsPerRowGroup) * cellsPerRowGroup;
        colOfObj = n - startRowCell(obj);
        //alert("id obj:"+n+": colonna oggetto:"+colOfObj+" celssabove:"+cellsInGroupAbove);
        sg = cellsInGroupAbove + myTrunc(colOfObj / qColPerGroup)*qColPerGroup;
        return( sg ); 
    
    }
    
    function getRowOfCell(obj)
    {
        a = new Array();
        a = obj.name.split("+");
        var r = 0;
        r = parseInt(a[0]);
        return(r);
        //alert("riga:"+gp.toString());
        
    }
    
    function getColOfCell(obj)
    {
        a = new Array();
        a = obj.name.split("+");
        var c = 0;
        c = parseInt(a[1]);
        return(c);
        //alert("riga:"+gp.toString());        
    }
    
    function getGroupOfCell(obj)
    {
        a = new Array();
        a = obj.name.split("+");
        var gp = 0;
        gp = parseInt(a[2]);
        return(gp);
        //alert("gruppo:"+gp.toString());        
    }
    
    
    
    function clicked()
    {
        //alert("clickato !! :"+this.name+":");
        //alert("riga:"+getRowOfCell(this)+" col:"+getColOfCell(this)
        //              +"gruppo:"+getGroupOfCell(this));
        //alert("id obj"+this.id+": startGroupCell:"+startGroupCell(this));
        // event.returnValue=false; annulla il tasto !!
        //alert("startcolcell:"+startColCell(this)+" endrowcell:"+endColCell(this));
        this.select();
        
    }
    
    function canPutKey(obj,sKey)
    {
    
        if (obj.className == "cellFixed") 
        {
             return(false);
        }
       
        
        // percorsi di test
        sKey = sKey.toUpperCase();
        
        if (sKey==" ") {
            obj.focus();
            obj.select();
            return(true);
        }
        
        if (qPerGroup ==9) {
        
            if ("123456789".indexOf(sKey)==-1) 
            {            
                return false;
            }
            
        }
        
        // loop riga...
        
        var i = 0;
        var o;
        
        for (i=startRowCell(obj); i<=endRowCell(obj); i++) 
        {          
             
             o = document.getElementById(i.toString());
             if (o.value.toUpperCase() == sKey) 
             {
                 /*
                 alert("Carattere:"+sKey+" gia' usato in colonna :"+startRowCell(obj)+" pos:"+i+" valore:"+o.value);
                 */
                 setMsg("Gia' presente in riga !");
                 return(false);
             }
        }
        
        // loop colonna...
      
        
        for (i=startColCell(obj); i<=endColCell(obj); i += cellPerRow) 
        {          
             
             o = document.getElementById(i.toString());
             if (o.value.toUpperCase() == sKey) 
             {
                 /* alert("Carattere:"+sKey+" gia' usato in colonna :"+startColCell(obj)+" pos:"+i+" valore:"+o.value);
		 */
                 setMsg("Gia' presente in colonna !");
                 return(false);
             }
        }

        for (var rStart=startGroupCell(obj); rStart<(cellsPerRowGroup+startGroupCell(obj)); rStart += cellPerRow) 
        {
             for (i=rStart; i<(qColPerGroup+rStart); i++)
             {
                 o = document.getElementById(i.toString());
                 if (o.value.toUpperCase() == sKey) 
                 {
                     setMsg("Gia' presente nel gruppo !"); 
                     return(false);
                 }
             
             }
        }

                
        return(true);
        
    
    
    }


    function checkCompleted(obj)
    {

           if (obj.className == "cellFixed") 
           {
                     return(false);
           }
           
           var tb = document.getElementById(tbName); 
           var colonne = 0;
           var cellText; 
    
            for (var r=0; r<tb.rows.length; r++) 
            {
                if (tb.rows[r].className == "sepClass")
                    continue;
            
                colonne    = tb.rows[r].cells.length;
                
                for (var c=0; c<colonne;  c++)
                {
                
                      if (tb.rows[r].cells[c].className == "sepClass")
                          continue;
                

                      cellText = tb.rows[r].cells[c].firstChild;

                      if (cellText.value=="" || cellText.value==" ") {
                          return(false);
                      }
                 }
            }
            return(true); 
            
    }
    
    function keyDown()
    {
       obj = this;
       
       var s = "";
       
       s = testKeyDown(event);
       //s = testKeyDown();

       //TOPASS IN keyDown prima si switch...
       setMsg(""); 
       //ENDTOPASS  

    
       switch (s) {
          case "cursorLeft":selectLeft(obj);
                      if (checkCompleted(obj)) {
                          completato();
                      }

                            return false;
                            break;
          case "cursorUp":selectUp(obj);
                      if (checkCompleted(obj)) {
                           completato();
                      }

                            return false;
                            break;          
          case "cursorRight":selectRight(obj);
                      if (checkCompleted(obj)) {
                           completato();
                      }

                            return false;
                            break;          
          case "cursorDown":selectDown(obj);
                      if (checkCompleted(obj)) {
                           completato();
                      }

                            return false;
                            break;          
          default:if (!canPutKey(obj,s)) {
                      event.returnValue = false;
                      return(false); 
                  }
                  else {
                      //obj.focus();
                      //obj.select(); 
                      event.returnValue = true;
                      
                      
                  }                  
                  return true; // qui test di ammissibilita'      
                  break;
       }
        
    }
    
    function doSelect()
    {
       if (this.className!="cellFixed")
          this.className = "cellSelected";       
    }
    
    function doUnselect()
    {
       if (this.className!="cellFixed")
          this.className = "cellNormal";
       
    }
    /* cursor move */
    function selectLeft(obj) 
    {
        var tb = 0;
        tb = parseInt((obj.id),10);
        if (tb > 0) {
           tb--;
           o = document.getElementById(tb.toString());
           o.select();           
           return true;
        }
        return false;
        
    }
    function selectUp(obj) 
    {
        var tb = 0;
        tb = parseInt((obj.id),10);
        var tab = document.getElementById(tbName);    
                tb -= cellPerRow;         
                if (tb >= 0) {
                   o = document.getElementById(tb.toString());
                   o.select();           
                   return true;
                }
        return false;
    }
    function selectRight(obj) 
    {
        var tb = 0;
        tb = parseInt((obj.id),10);
        var tab = document.getElementById(tbName);
        
        /*
        if (tab.rows.length > 0) {
            if (tab.rows[0].cells.length > 0) {
                var maxCells = (tab.rows.length * tab.rows[0].cells.length);
                tb++;
                if (tb < maxCells) {
        */        
                tb++;
                if (tb <= maxId) {
                   o = document.getElementById(tb.toString());
                   o.select();           
                   return true;
                }
        /*                 
            }
        }
        */
        return false;
    }
    
    function selectDown(obj) 
    {
        var tb = 0;
        tb = parseInt((obj.id),10);
        var tab = document.getElementById(tbName);    
                tb += cellPerRow;
                //alert("vado a:"+tb.toString()+" maxId:"+maxId.toString());
                if (tb <= maxId) {
                   o = document.getElementById(tb.toString());
                   o.select();           
                   return true;
                }
        return false;
       
    }
    
    function myTrunc(nn)
    {
        s = nn.toString();
        var n = 0;
        n = parseInt(s,10);
        return( n );
    
    }
    
    

    
    
    function startUpNew(dime,initValue)
    {
            qColPerGroup = dime;
            qPerGroup = dime*dime;
            qGroupPerRow = dime;
            qRowPerGroup = dime;        
            cellsPerRowGroup = (qPerGroup * qGroupPerRow);
            
            tb = document.getElementById(tbName); 

    
            for (var r=0; r<tb.rows.length; r++) 
            {
                if (tb.rows[r].className == "sepClass")
                    continue;
            
                colonne    = tb.rows[r].cells.length;
                cellPerRow = 0;
                idCol = 0;
                
                for (var c=0; c<colonne;  c++)
                {
                
                      if (tb.rows[r].cells[c].className == "sepClass")
                          continue;
                
                      
                      
                      cellPerRow++; // numero effetivo (count)   
                      
                      //alert("setting cell:"+r+" col:"+c);               
                      cellText = tb.rows[r].cells[c].firstChild;
                      if (initValue=="X") {
                          cellText.className = "cellFixed";
                          cellText.value="X";
                      }
                      else 
                      {
                          cellText.className = "cellNormal";
                          cellText.value=" ";                      
                      }                          
                      //cellText. = "20px";
                      cellText.maxlength = "1";
                      //cellText.id = ((r * colonne) + c).toString();
                      cellText.id = idCnt.toString();
                      maxId = idCnt;
                      cellText.value=" ";
                      // salvo in name il GRUPPO !
                      gp = myTrunc(idRow / qRowPerGroup)*qGroupPerRow + myTrunc(idCol / qColPerGroup);             
                      cellText.name = idRow.toString()+"+"+idCol.toString()+"+"+gp.toString();
                      cellText.onclick = clicked;
                      cellText.onkeydown = keyDown;
                      cellText.onfocus = doSelect;   
                      cellText.onblur  = doUnselect;
                      
                      idCnt++;     
                      idCol++;
                }
                if (idCol != 0) idRow++;
              }    
     }
    
    function resetParams(dime)
    {
            qColPerGroup = dime;
            qPerGroup = dime*dime;
            qGroupPerRow = dime;
            qRowPerGroup = dime;        
            cellsPerRowGroup = (qPerGroup * qGroupPerRow);
            
            tb = document.getElementById(tbName); 

    
            for (var r=0; r<tb.rows.length; r++) 
            {
                if (tb.rows[r].className == "sepClass")
                    continue;
            
                colonne    = tb.rows[r].cells.length;
                cellPerRow = 0;
                idCol = 0;
                
                for (var c=0; c<colonne;  c++)
                {
                
                      if (tb.rows[r].cells[c].className == "sepClass")
                          continue;
                
                      
                      
                      cellPerRow++; // numero effetivo (count)   
                      
                      //alert("setting cell:"+r+" col:"+c);               
                      cellText = tb.rows[r].cells[c].firstChild;
                      cellText.className = "cellNormal";
                      //cellText. = "20px";
                      cellText.maxlength = "1";
                      //cellText.id = ((r * colonne) + c).toString();
                      cellText.id = idCnt.toString();
                      maxId = idCnt;
                      // salvo in name il GRUPPO !
                      gp = myTrunc(idRow / qRowPerGroup)*qGroupPerRow + myTrunc(idCol / qColPerGroup);             
                      cellText.name = idRow.toString()+"+"+idCol.toString()+"+"+gp.toString();
                      cellText.onclick = clicked;
                      cellText.onkeydown = keyDown;
                      cellText.onfocus = doSelect;   
                      cellText.onblur  = doUnselect;
                      
                      idCnt++;     
                      idCol++;
                }
                if (idCol != 0) idRow++;
              }    
    }
    
    function fillTable(strVar)
    {
    
        var o;
        var toSel = null;
    
        for (var i=0; i<strVar.length; i++)
        {
             o = document.getElementById(i.toString());  
             
             
             
             if (strVar.charAt(i)=='?') {
                 o.value = " ";
                 o.className = "cellNormal";
                 o.readOnly = false;
                 
                 if (toSel==null) 
                 {
                     toSel = o;
                 }
             }
             else 
             {
                 o.value = strVar.charAt(i);                 
                 o.readOnly = true;
                 o.className = "cellFixed";                         
             }
             o.value = o.value.toUpperCase();
        }
        
        if (toSel)
        {
            toSel.focus();
            toSel.select(); 
        }
        
    }
    
    //startUpNew(3);
        

/* Navigator clicks */

function goToNum()
{
   var on = document.getElementById("sNum");
   var onTot = document.getElementById("sTot");
   
   var ss = on.value;   
   var st = onTot.value;
   
   if (ss!="" && ss!="0" && st!="" && st!="0") 
   {
   
       var sn = 0;
       var snt = 0;
   
       sn  = parseInt(ss,10);
       snt = parseInt(st,10);
       
       if (sn>0 && sn<=st) {
   
      
           on.value = sn.toString();
           loadSudoku(true);
           return;
           
       }
   }    
}

function goFirst()
{

   var on = document.getElementById("sNum");
   
   var ss = on.value;   
   
   if (ss!="" && ss!="0") 
   {
       var sn = parseInt(ss,10);
       
       if (sn>0) {
       
           on.value = "1";
           loadSudoku(true);
           return;
           
       }
   }    
}

function goPrev()
{
   var on = document.getElementById("sNum");
   var onTot = document.getElementById("sTot");
   
   var ss = on.value;   
   var st = onTot.value;
   
   if (ss!="" && ss!="0" && st!="" && st!="0") 
   {
       var sn = 0;
       var snt = 0;
   
   
       sn = parseInt(ss,10);
       snt = parseInt(st,10);
       
       if (sn>1 && sn<=snt) {
       
           sn--;
       
           on.value = sn.toString();
           loadSudoku(true);
           return;
           
       }
   }    
}

function goNext()
{
   var on = document.getElementById("sNum");
   var onTot = document.getElementById("sTot");
   
   var ss = on.value;   
   var st = onTot.value;
   
   if (ss!="" && ss!="0" && st!="" && st!="0") 
   {
       var sn = 0;
       var snt = 0;
   
   
       sn = parseInt(ss,10);
       snt = parseInt(st,10);
       
       if (sn<st) {
       
           sn++;
       
           on.value = sn.toString();
           loadSudoku(true);
           return;
           
       }
   }    
}

function goLast()
{
   var on = document.getElementById("sNum");
   var onTot = document.getElementById("sTot");
   
   var ss = on.value;   
   var st = onTot.value;
   
   if (ss!="" && ss!="0" && st!="" && st!="0") 
   {
   
       var sn = 0;
       var snt = 0;
   
   
       sn = parseInt(ss,10);
       snt = parseInt(st,10);
       
       if (sn!=st) {
       
           sn=st;
       
           on.value = sn.toString();
           loadSudoku(true);
           return;
           
       }
   }    
}


//TOPASS MOD
function fromContentToGame(resp,theGame)
{
  resp = trim(resp);
  resp = resp.replace("\r","");
  resp = resp.replace("\n",""); 
  resp = trim(resp);
  

  var sudk = "";
  var solu = "";


  if (qPerGroup == 9) 
  {
      sudk = resp.substring(0,81);
      solu = resp.substring(81);
  }
  else if (qPerGroup == 16) 
  {
      sudk = resp.substring(0,256);
      solu = resp.substring(256);
  }
  else 
  {
     alert("Dimensione non gestita in fromContentToGame qPerGroup:"+qPerGroup.toString());
     return;     
  }



  if (theGame) 
  {
      fillTable(sudk);
  }
  else
  {
      fillTable(solu);
  }

}
//ENDTOPASS
//TOPASS NUOVA
function setMsg(msg)
{
   var on = document.getElementById("sdokMsg");

   on.innerText = msg;

}
//ENDTOPASS

//TOPASS MODIFICATA
function loadSudoku(theGame)
{

   var on = document.getElementById("sNum");
   
   var sn = on.value;
   
   
   if (sn!="" && sn!="0") 
   {
   
      while (sn.length<8) sn = "0"+sn;
      
      
      if (qPerGroup == 9)       
      {
          sn = prefix + "9" + sn;
      }
      else if (qPerGroup == 16)    
      {
          sn = prefix + "F" + sn;      
      }    

      
      sn = sdPath+subPath+sn+".bin";
      
      AjaxRequest.get(
        {
         'url': sn
        ,'onLoading':function() { setMsg("Loading.. attendere"); }
        ,'onLoaded':function() { setMsg(""); }
        ,'onSuccess':function(req){ setMsg(""); fromContentToGame(req.responseText,theGame); }
        ,'onError':function(req){   setMsg(""); alert('Error!\nStatusText='+req.statusText+'\nContents='+req.responseText); }
        }
       );
   } 
}
function loadSolution()
{
   loadSudoku(false);
}
function askSolution()
{
   return(confirm("Verra' proposta la soluzione, ma lo stato attuale del Sudoku andra' perso. Conferma ?"));
}
function setInfoFolder(resp)
{
    resp = trim(resp);
    a = new Array();
    a = resp.split("|");
    
    var q = a[0]; // quanti sudoku
    var d = a[1]; // data in formato ggmmaaaa
    
    var on1 = document.getElementById("sNum");
    var on2 = document.getElementById("sTot");
    
    if (q==0) {
        on1.value = q;
        on2.value = q;
    }
    else 
    {
        on1.value = "1";
        on2.value = q;    
    }
    

}
function loadNewSet(dime)
{

   var on = document.getElementById("selLevel");  
   
   subPath = on.value +"/"; // easy Medio etc
   
   if (subPath.charAt(0).toUpperCase()=="M")
   {
       prefix = "m";
   }
   else prefix = "s";    
   
   var infoPath = sdPath+subPath+"info.txt";
   
   AjaxRequest.get(
        {
         'url': infoPath
        ,'onLoading':function() { setMsg("Loading.. attendere"); }
        ,'onLoaded':function() { setMsg(""); }
        ,'onSuccess':function(req){ setMsg(""); setInfoFolder(req.responseText); }
        ,'onError':function(req){   setMsg(""); alert('Error!\nStatusText='+req.statusText+'\nContents='+req.responseText); }
        }
       );

}
var startDate = new Date();
var startDay  = 0;
var startHour = 0;
var startMinute = 0;
var startSecond = 0;
var tmId = 0;
var gameNmb = 0;

function twoDigits(ss)
{

   while (ss.length < 2) ss = "0"+ss;
   
   return(ss);
}

// DA CHIAMARE ALL'APERTURA DELLA PAGINA...
function initViewForGame(dime)
{

    idCnt = 0;   
    cellPerRow = 0;
    maxId = 0;
    idRow = 0;
    idCol = 0;
    idBlock = 0;
    if (dime==3) 
    {
                
       tbName = tb9;
       sdPath = "_sudoku/_sudoku9/";    
    }   
    else if (dime==4) 
    {
       tbName = tbF;       
       sdPath = "_sudoku/_sudokuF/";    
               
    }   
    startUpNew(dime,"X"); // qPerGroup etc..
    
    faceNone();
    
    //TOPASS dopo FACENON IN initViewForGame
    
    if (tmId != 0) 
    {
       clearInterval(tmId);
       tmId = 0;
    }
    
    s = "00:00:00:00";
    
    on = document.getElementById("divTimeTrascorso");
    
    on.innerHTML = s;        
    
    on = document.getElementById("divStartTime");
    
    on.innerHTML = s;        
    
    //
    
    
    isForGame = true;
    
}



// DA CHIAMARE AL CLICK PER IL NUOVO GIOCO....
function initNewGame(dime,pathLevel)
{

    idCnt = 0;   
    cellPerRow = 0;
    maxId = 0;
    idRow = 0;
    idCol = 0;
    idBlock = 0;
    
    if (tmId != 0) 
    {
       clearInterval(tmId);
       tmId = 0;
    }    
    
    if (dime==3) 
    {
                
       tbName = tb9;
       sdPath = "_sudoku/_sudoku9/";    
    }   
    else if (dime==4) 
    {
       tbName = tbF;       
       sdPath = "_sudoku/_sudokuF/";    
               
    }   

    startUpNew(dime," "); // qPerGroup etc..

    loadNewSetForGame(dime,pathLevel); // path, prefix, sNum etc...
    
    facePensa();
    
}

function loadNewSetForGame(dime,pathLevel)
{
   
   subPath = pathLevel +"/"; // easy Medio etc
   
   if (subPath.charAt(0).toUpperCase()=="M")
   {
       prefix = "m";
   }
   else prefix = "s";    
   
   var infoPath = sdPath+subPath+"info.txt";
   
   AjaxRequest.get(
        {
         'url': infoPath
        ,'onLoading':function() { setMsg("Loading.. attendere"); }
        ,'onLoaded':function() { setMsg(""); }
        ,'onSuccess':function(req){ setMsg(""); setInfoFolderForGame(req.responseText); }
        ,'onError':function(req){   setMsg(""); alert('Error!\nStatusText='+req.statusText+'\nContents='+req.responseText); }
        }
       );

}

function setInfoFolderForGame(resp)
{
    resp = trim(resp);
    a = new Array();
    a = resp.split("|");
    
    var q = a[0]; // quanti sudoku

    var snt = 0;
    snt = parseInt(q,10);       
    var randomnumber = Math.floor(Math.random()*snt)+1;
/* alert("setInfoFolder..getsudoku:"+randomnumber);  */   
    gameNmb = randomnumber;
    loadSudokuForGame(randomnumber,true);
    gameStarted();
    
}

function markTable(forFixed)
{
  // dopo il completamento mette tutte le celle a FIXED.
           var tb = document.getElementById(tbName); 
           var colonne = 0;
           var cellText; 
    
            for (var r=0; r<tb.rows.length; r++) 
            {
                if (tb.rows[r].className == "sepClass")
                    continue;
            
                colonne    = tb.rows[r].cells.length;
                
                for (var c=0; c<colonne;  c++)
                {
                
                      if (tb.rows[r].cells[c].className == "sepClass")
                          continue;
                      cellText = tb.rows[r].cells[c].firstChild;
                      cellText.className = "cellFixed";

                 }
            }


}



function fillForGame(resp,toPlay)
{
  resp = trim(resp);
  resp = resp.replace("\r","");
  resp = resp.replace("\n",""); 
  resp = trim(resp);
  

  var sudk = "";
  var solu = ""; /* solo x test veloci */
  


  if (qPerGroup == 9) 
  {
      sudk = resp.substring(0,81);  
      solu = resp.substring(81);  
  }
  else if (qPerGroup == 16) 
  {
      sudk = resp.substring(0,256);
      solu = resp.substring(256);  
  }
  else 
  {
     alert("Dimensione non gestita in fromContentToGame qPerGroup:"+qPerGroup.toString());
     return;     
  }

  if (toPlay)
  {
    fillTable(sudk);
  }
  else 
  {
    fillTableForTest(solu);  
  }

}

function loadSudokuForGame(nmb,toPlay)
{

      var sn = nmb.toString();
   
      while (sn.length<8) sn = "0"+sn;
      
      
      if (qPerGroup == 9)       
      {
          sn = prefix + "9" + sn;
      }
      else if (qPerGroup == 16)    
      {
          sn = prefix + "F" + sn;      
      }    

      
      sn = sdPath+subPath+sn+".bin";
      

      
      AjaxRequest.get(
        {
         'url': sn
        ,'onLoading':function() { setMsg("Loading.. attendere"); }
        ,'onLoaded':function() { setMsg(""); }
        ,'onSuccess':function(req){ setMsg(""); fillForGame(req.responseText,toPlay); }
        ,'onError':function(req){   setMsg(""); alert('Error!\nStatusText='+req.statusText+'\nContents='+req.responseText); }
        }
       );
    
}

function gameStarted()
{

    if (tmId != 0) 
    {
       clearInterval(tmId);
       tmId = 0;
    }
    
    

    startDate = new Date();
    startDay  = startDate.getDate();
    startHour = startDate.getHours();
    startMinute = startDate.getMinutes();
    startSecond  = startDate.getSeconds();
    
    var s = //twoDigits( startDay.toString() )+
            "00:"+
            twoDigits( startHour.toString() )+":"+
            twoDigits( startMinute.toString() )+":"+
            twoDigits( startSecond.toString() );            

            
    var on = document.getElementById("divStartTime");
    

    
    on.innerHTML = s;        
    
    s = "00:00:00:00";
    
    on = document.getElementById("divTimeTrascorso");
    
    on.innerHTML = s;        
           
    tmId = setInterval("calcolaTempo()",1000);
    
    facePensa();
    
}

function calcolaTempo()
{

  var nowDate = new Date();

  var s = diffTime(nowDate,startDate);

  var on = document.getElementById("divTimeTrascorso");
    
  on.innerHTML = s;        

}

function diffTime(date1,date2)
{
  diff = new Date();

  diff.setTime(Math.abs(date1.getTime() - date2.getTime()));

  timediff = diff.getTime();

  weeks = Math.floor(timediff / (1000 * 60 * 60 * 24 * 7));
  timediff -= weeks * (1000 * 60 * 60 * 24 * 7);

  days = Math.floor(timediff / (1000 * 60 * 60 * 24)); 
  timediff -= days * (1000 * 60 * 60 * 24);

  hours = Math.floor(timediff / (1000 * 60 * 60)); 
  timediff -= hours * (1000 * 60 * 60);

  mins = Math.floor(timediff / (1000 * 60)); 
  timediff -= mins * (1000 * 60);

  secs = Math.floor(timediff / 1000); 
  timediff -= secs * 1000;
  
  return(   twoDigits( days.toString() )+":"+
            twoDigits( hours.toString() )+":"+
            twoDigits( mins.toString() )+":"+
            twoDigits( secs.toString() ) );
            
}

function fillTableForTest(strVar)
{

    var o;
    var toSel = null;

    for (var i=0; i<strVar.length; i++)
    {
         o = document.getElementById(i.toString());  
         
         
         
         if (strVar.charAt(i)=='?') {
             o.value = " ";
             o.className = "cellNormal";
             o.readOnly = false;
             
             if (toSel==null) 
             {
                 toSel = o;
             }
         }
         else 
         {
             o.value = strVar.charAt(i);                 
             o.readOnly = true;
             o.className = "cellNormal";                         
         }
         o.value = o.value.toUpperCase();
    }
    
    if (toSel)
    {
        toSel.focus();
        toSel.select(); 
    }
    
}


// 
function faceNone()
{
      var pensa    = document.getElementById("facciaGameWait");
      var vince    = document.getElementById("facciaGameOk");
      var perde    = document.getElementById("facciaGameNo");
      var btnClear    = document.getElementById("divClear");
      var btnRestart  = document.getElementById("divRestart");
      btnClear.className = "divNotVisible";
      btnRestart.className = "divNotVisible";
      pensa.className = "divNotVisible";
      vince.className = "divNotVisible";
      perde.className = "divNotVisible";
      
}
function facePensa()
{
      var pensa    = document.getElementById("facciaGameWait");
      var vince    = document.getElementById("facciaGameOk");
      var perde    = document.getElementById("facciaGameNo");
      var btnClear    = document.getElementById("divClear");
      var btnRestart  = document.getElementById("divRestart");
      btnClear.className = "divIsVisible";
      btnRestart.className = "divIsVisible";      
      pensa.className = "divIsVisible";
      vince.className = "divNotVisible";
      perde.className = "divNotVisible";
}
function faceVince()
{
      var pensa    = document.getElementById("facciaGameWait");
      var vince    = document.getElementById("facciaGameOk");
      var perde    = document.getElementById("facciaGameNo");
      var btnClear    = document.getElementById("divClear");
      var btnRestart  = document.getElementById("divRestart");
      btnClear.className = "divIsVisible";
      btnRestart.className = "divIsVisible";
      
      pensa.className = "divNotVisible";
      vince.className = "divIsVisible";
      perde.className = "divNotVisible";
}
function facePerde()
{
      var pensa    = document.getElementById("facciaGameWait");
      var vince    = document.getElementById("facciaGameOk");
      var perde    = document.getElementById("facciaGameNo");
      var btnClear    = document.getElementById("divClear");
      var btnRestart  = document.getElementById("divRestart");
      btnClear.className = "divIsVisible";
      btnRestart.className = "divIsVisible";      
      pensa.className = "divNotVisible";
      vince.className = "divNotVisible";
      perde.className = "divIsVisible";
}


function setMinMax(minimo,massimo)
{
      var idMin    = document.getElementById("divRecordTime");
      var idMax    = document.getElementById("divRecordMax");
      
      idMin.innerText = minimo;
      idMax.innerText = massimo;   
}

function completato()
{
  if (!isForGame)
  {
      alert("Complimenti, hai risolto il Sudoku !");
      markTable(true);
  }
  else
  {
      var idMax    = document.getElementById("divRecordMax");
      var idMin    = document.getElementById("divRecordTime");

      
      var massimo = idMax.innerHTML;   
      var minimo  = idMin.innerHTML;
      
      
     if (tmId != 0) 
     {
       clearInterval(tmId);
       tmId = 0;
     }
     calcolaTempo();
     
     var on = document.getElementById("divTimeTrascorso");
     
    
     var res = on.innerHTML;
     
     var tbxTempo = document.getElementById("ASPxPopupControl1_tbxTempo");
     
     tbxTempo.value = res;
     
     
     if (res < massimo) 
     {
        faceVince();
        
        if (res < minimo)
        {
            if (confirm("Congratulazioni ! Il tuo tempo "+res+" e' il migliore !\n"+
                  "Se vuoi puoi registrare il tuo record !")
               ) 
            {
                
                cinRegForm.Show();
            }                   
            // qui visible registra record...      
        }        
        else 
        {
            if (confirm("Complimenti ! Anche se non hai battuto il record !\n"+
                  "Il tuo tempo "+res+" e' tra i primi 10.\n"+
                  "Se vuoi puoi registrarlo !")
               )
            {
                cinRegForm.Show();
            }                   
                  
            // qui visible registra record...      
            
        }
     }
     else
     {
            alert("Complimenti, hai risolto il Sudoku in:"+res);
            facePerde();
     }
     markTable(true);
 
  }  
}

function loadSolutionForGame()
{
     loadSudokuForGame(gameNmb,false);
}

function reloadForGameClear()
{
    loadSudokuForGame(gameNmb,true);
}


function showButtonRegister(doIt)
{
  var imgB    = document.getElementById("imgHelp");
  
  imgB.visible = doIt;
  
}