/*******************
isudoku.js
*******************/
    var MTXNUM;     // Spelbordet
    var MTXFIX;     // Spelbordet
    var SELR =0;    
    var SELK =0;
    var SELNUM=0;   // eyecatch nummer

    var UNDOR = ""
    var UNDOK = ""
    var UNDOV = ""


  function storeUndo(rr,kk,oldVal)
  {
     UNDOR = UNDOR + rr;
     UNDOK = UNDOK + kk;
     UNDOV = UNDOV + oldVal;
  }// storeUndo

  function undo()
  {
     var len = UNDOR.length;
     if (len>0)
       { 
	  var r = UNDOR.charAt(len-1);
	  var k = UNDOK.charAt(len-1);
	  var v = UNDOV.charAt(len-1);

	  setNum(r,k, v)

          UNDOR = UNDOR.substring(0, len-1);
          UNDOK = UNDOK.substring(0, len-1);
          UNDOV = UNDOV.substring(0, len-1);

	  storeState();

	  strKrd = idStr(r,k);
          mtxClick(strKrd);
       }
  }// Undo


  
  /*******************************************************************************
  ANROP:       saveCookie(namn,  värde, antaldagar);
  VERSION:     090214 RAG
  UPPGIFT:     Sparar en kaka
  *******************************************************************************/

  /*******************************************************************************
  ANROP:       saveCookie(namn,  värde, antaldagar);
  VERSION:     090214 RAG
  UPPGIFT:     Sparar en kaka
  *******************************************************************************/
  function saveCookie(namn, innehall, numDays)
  {
    numDays=parseInt(eval(numDays));  
    var numMS  = numDays*24*60*60*1000;

    var datum = new Date();                            // dagens datum.
    datum.setTime(datum.getTime() + numMS); 
    datum=datum.toGMTString(); 
    var datumsnutt="; expires=" +datum; 

    // spara kakvärdet i escape:ad form samtdatumsnutten 

    var kaka = namn+"="+escape(innehall)+datumsnutt;    
    
    document.cookie=kaka;
  }//saveCookie



  /*******************************************************************************
  ANROP:       str = getCookie(namn);
  VERSION:     090214 RAG
  UPPGIFT:     Returnerar angiven kaksträng
  *******************************************************************************/
  function getCookie(namn)
   {
     var kakor=document.cookie;    //alla kakor
     
     var kakor_delar=kakor.split("; ");  
     for (ix=0;ix<kakor_delar.length;ix++)    
       {
	 tva_delar=kakor_delar[ix].split("="); 
	 if (tva_delar[0]==namn)
	   return unescape(tva_delar[1]); 
       }
     return "";    // kakan fanns ej
   }// getCookie



  /*******************************************************************************
  ANROP:       str = idStr(r,k);
  VERSION:     090214 RAG
  UPPGIFT:     Returnerar strängen "rk"
  *******************************************************************************/
    function idStr(r,k)
    {
      return ""+r+""+k;
    }//idStr

  /*******************************************************************************
  ANROP:       o = obj( id );
  VERSION:     090214 RAG
  UPPGIFT:     returnerar angiven cell från digittabellen
  *******************************************************************************/
    function obj( nr )
    {
      return document.getElementById(nr);
    }//obj

  /*******************************************************************************
  ANROP:       o = obj2(r,k);
  VERSION:     090214 RAG
  UPPGIFT:     returnerar angiven cell från sudokumatrisen
  *******************************************************************************/
    function obj2( r, k )
    {
        str = idStr(r,k);
	return document.getElementById(str);
    }// obj


  /*******************************************************************************
  ANROP:       storeState()
  VERSION:     090214 RAG
  UPPGIFT:     lagrar aktuellt sudokuspel i en kaka med namn "board"
  *******************************************************************************/
   function storeState()
   {
     var state = "";
     for (var r=1; r<=9;++r)
       {
	 for (var k=1; k<=9;++k)
	   if (MTXFIX[r][k])
	     state = state + MTXNUM[r][k];
	   else
	     {
	       var ch =  "abcdefghijklm".charAt( MTXNUM[r][k] );
	       state = state + ch; 
	     }
       }
     saveCookie("board", state, 365);

     saveCookie("UNDOR", UNDOR, 365);
     saveCookie("UNDOK", UNDOK, 365);
     saveCookie("UNDOV", UNDOV, 365);
   }// storeState




  /*******************************************************************************
  ANROP:       initBoard( state )
  VERSION:     090214 RAG
  UPPGIFT:     Initierar globalerna MTXNUM och MTXFIX samt sudokutabellen 
               med data från state
  *******************************************************************************/
  function initBoard( state )
  {
    window.scrollTo(0,1);

    MTXNUM = new Array(10);
    MTXFIX = new Array(10);

    var ix=0;
    for (var r=1; r<=9;++r)
      { 
	MTXNUM[r] = new Array(10);
	MTXFIX[r] = new Array(10);
	
	for (var k=1; k<=9 ;++k)
	  { 
	    var ch = state.charCodeAt(ix++);
	    MTXFIX[r][k] = true;
	    if (ch>"9".charCodeAt(0))
	      {
		MTXFIX[r][k] = false;
		ch = ch -"a".charCodeAt(0);
	      }
	    else ch = ch -"0".charCodeAt(0);

	    var num = parseInt(ch)
	    setNum(r,k, num);
	    if (MTXFIX[r][k])
	         obj2(r,k).style.background = "F0F0F0";
	    else obj2(r,k).style.background = "FFFFFF";
	  }
      }
    eyeCatchNum(0);
  }//initBoard


  /*******************************************************************************
  ANROP:       runGame();
  VERSION:     090214 RAG
  UPPGIFT:     Initierar spelet med den information som finns lagrad i kakorna
  *******************************************************************************/
  function runGame()
  {
    var str = getCookie( "board");

    UNDOR = getCookie("UNDOR");
    UNDOK = getCookie("UNDOK");
    UNDOV = getCookie("UNDOV");

    if (str.length!=9*9)
      {  
	var state = "aabaaaaa7aaaa6aa3aa5a7a2a4a24aaaaaaaa3a49aa8aaaaaa65aaa2a67a4a3aa6a8aaaa1aaaa37aa";
        UNDOR = "";
        UNDOK = "";
        UNDOV = "";

	saveCookie("board", state, 365);
	saveCookie("UNDOR", UNDOR, 365);
	saveCookie("UNDOK", UNDOK, 365);
	saveCookie("UNDOV", UNDOV, 365);

	str = getCookie( "board");
      }
    initBoard(str);
  }// runGame



  /*******************************************************************************
  ANROP:       setNum(r,k, num)
  VERSION:     090214 RAG
  UPPGIFT:     Sätter angiven koordinat till nummret både i MTXNUM och i html-tabellen
  *******************************************************************************/
  function setNum(r,k, num)
  {
    MTXNUM[r][k] = num;

    strKrd = idStr(r,k)

    var txt = num;
    if (num==0)
	txt = "";

    var obj = document.getElementById(strKrd);
    if (obj==null)
        return null;

    if (document.all)
         obj.innerText = txt;
    else obj.textContent = txt; // firefox
  }//setNum



  /*******************************************************************************
  ANROP:       indicateSelection( 
  VERSION:     090214 RAG
  UPPGIFT:     
  *******************************************************************************/
  function indicateSelection( idStr, selectedFlag )
  {
    var obj = document.getElementById(idStr);
    if (obj==null)
	return;

    if (selectedFlag)
	{ 
            obj.style.color        = "#0000FF";
	    obj.style.background   = "#FFFF00";
        }
    else
	{ 
            obj.style.color        = "#0000F0";
	    obj.style.background   = "#ffffff";
        }
  }// indicateSelection


  /*******************************************************************************
  ANROP:       mtxClick(id);
  VERSION:     090214 RAG
  UPPGIFT:     
  *******************************************************************************/
  function mtxClick(id)
  {
    var r = parseInt( parseInt(id)/10);
    var k = parseInt(id)%10;

    // Erase old "selection"
    eyeCatchNum(0);
    var str = idStr(SELR,SELK);
    indicateSelection( str, false );
    indicateSelection( SELNUM, false );  // släck föregående nummer


    if (r==SELR && k==SELK)  // deselect om klickar pa samma ruta igen
      { 
	SELR=0;
        SELK=0;
        SELNUM =0;
	return;
      }

    SELR = r;
    SELK = k;
    if (MTXFIX[r][k])
      { 
	if (MTXNUM[r][k]!=SELNUM)
	  eyeCatchNum(MTXNUM[r][k]);
        SELNUM = MTXNUM[r][k];
	return;
      }

    SELNUM = MTXNUM[r][k];
    // Indicate new selection
    eyeCatchNum(MTXNUM[r][k]);
    str = idStr(SELR,SELK);
    indicateSelection( str, true );
    indicateSelection( SELNUM, true );

  }// mtxClick

  /*******************************************************************************
  ANROP:       eyeCatchNum( num )
  VERSION:     090214 RAG
  UPPGIFT:     
  *******************************************************************************/
  function eyeCatchNum(num)
  {
    for (var r=1;r<=9;++r)
        for (var k=1;k<=9;++k)
	    if (MTXNUM[r][k]==num)
	      { obj2(r,k).style.fontWeight = 800;
		if (MTXFIX[r][k])
		     obj2(r,k).style.color = "#000000";
		else obj2(r,k).style.color = "#000080";
	      }
            else
	      { obj2(r,k).style.fontWeight = 400;
		if (MTXFIX[r][k])
		     obj2(r,k).style.color = "#808080";
		else obj2(r,k).style.color = "#0000ff";
	      }
    for (var d=1;d<=9;++d)
      if (d==num)
	   obj(d).style.fontWeight=800;
      else obj(d).style.fontWeight=400;

  }// eyeCatchNum

  /*******************************************************************************
  ANROP:       numClick(id);
  VERSION:     090214 RAG
  UPPGIFT:     
  *******************************************************************************/
  function numClick(id)
  { var nr = parseInt( id );

    indicateSelection( SELNUM, false );
    if (SELR>0 && !MTXFIX[SELR][SELK])
      { 
	 storeUndo(SELR, SELK, MTXNUM[SELR][SELK]);

         setNum(SELR, SELK, nr);
	 indicateSelection( nr, true );
	 storeState();
      }      
    eyeCatchNum(nr);
    SELNUM = nr;
  }//numClick


  /*******************************************************************************
  ANROP:       
  VERSION:     090214 RAG
  UPPGIFT:     
  *******************************************************************************/
  function ajaxFunction()
  {
    var xmlHttp;
    try
      {
        // Firefox, Opera 8.0+, Safari
	  xmlHttp=new XMLHttpRequest();
      }
    catch (e)
      {
	// Internet Explorer
	try
	  {
	    xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
	  }
	catch (e)
	  {
	    try
	      {
		xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
	      }
	    catch (e)
	      {
		alert("Your browser does not support AJAX!");
		return false;
	      }
	  }
      }
    xmlHttp.onreadystatechange=function()
      {
	if(xmlHttp.readyState==4)
	{
	  initBoard( xmlHttp.responseText );
	  storeState();
	}
      }
    xmlHttp.open("GET","http://www.sudokuassistant.com/publicsudoku/sudokucode.php?id=66&mindiff=1&maxdiff=1",true);
    xmlHttp.send(null);
  }//ajaxFunction


