var sudoku;
var loesung;
var sudnr;
var solutionSteps;
var step;
var sudokuBezeichnung;
var namen = new Array ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y');
var dieButtons = "<form name='Formular' action='#' method='post'><input class='Button' type='button' id='button' value='next' onClick='javascript:doNextStep()'><input class='Button' type='button' id='Abbruch' value='quit' onClick='javascript:quitStepByStep()'></form>";

function handleSudokuResponse() 
{ 
	if (http.readyState == 4)
  { 
		var results = http.responseText.split(",");
		sudoku = results[0];
		sudnr = results[1];
		loesung = results[2];
  	populate ();
	}
}

function handleSolutionResponse() 
{ 
	if (http.readyState == 4)
  { 
		solutionSteps = http.responseText.split("#");
    showSteps();
	}
}

function getSudoku(mode)
{
	var anz=0;
//  window.alert ("Anz: " + anz);
	switch (mode)	{
		case 0: http.open("GET", "getSudoku.php?SudokuNummer=" + document.getElementById("SudokuNummer").value + "&Level="  + document.getElementById("Level").value + "&Symmetrie="  + document.getElementById("Symmetrie").value + "&Data=" + sudokuTyp + "&LL=" + (anzZeilen*anzSpalten), true);
	          http.onreadystatechange = handleSudokuResponse;
	          http.send(null);
	          break;
	  case 1: http.open("GET", "getSolution.php?SudokuNummer=" + document.getElementById("SudokuNummer").value + "&Level="  + document.getElementById("Level").value + "&Symmetrie="  + document.getElementById("Symmetrie").value + "&Data=" + sudokuTyp + "&LL=" + anzZeilen*anzSpalten, true);
	          http.onreadystatechange = handleSolutionResponse;
	          http.send(null);
	          break;
  }
}

function getHTTPObject() {

  var xmlhttp;

  /*@cc_on
  @if (@_jscript_version >= 5)
    try {
      xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (E) {
        xmlhttp = false;
      }
    }
  @else
  xmlhttp = false;
  @end @*/

  if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
    try {
      xmlhttp = new XMLHttpRequest();
    } catch (e) {
      xmlhttp = false;
    }
  }
  return xmlhttp;
}

var http = getHTTPObject();

function showSteps ()
{
	step = 0;
	wert = -1;
  document.getElementById("buttonGetSudoku0").disabled = true;
  document.getElementById("buttonGetSudoku1").disabled = true;
  document.getElementById("buttonPrintSudoku").disabled = true;
  document.getElementById("buttonCheckSudoku").disabled = true;
  document.getElementById("buttonSolveSudoku").disabled = true;
	document.getElementById("Loesung").innerHTML = dieButtons;
}

function quitStepByStep()
{
	step = solutionSteps.length;
	doNextStep();
}

function doNextStep ()
{
	var art, werte;
  var wert, zeile, spalte;
	if (step<solutionSteps.length)
	{
 		document.getElementById("Loesung").innerHTML = dieButtons;
		art = solutionSteps[step].substr(0,2);
		werte = solutionSteps[step].substr(3,solutionSteps[step].length).split(",");
		// PB:w1,w2,b1,z1,s1,z2,s2 Werte w1 und w2 können in Box b1 nur in Zeile/Spalte z1/s1 und z2/s2 auftreten, im Rest der Box streichen
   	if (art == "PB")
   	{
   		document.getElementById("Loesung").innerHTML += "Werte " + werte[0] + " und " + werte[1] + " können in Box " + werte[2] + " nur in Zeile/Spalte " + werte[3] + "/" + werte[4] + " und " + werte[5] + "/" + werte[6] + " auftreten, im Rest der Box streichen";
   		wert = -1;
   	}
		// PZ:w1,w2,z1,s1,s2 Werte w1 und w2 können in Zeile z1 nur in den Spalten s1 und s2 vorkommen, im Rest der Zeile streichen
   	if (art == "PZ")
   	{
   		document.getElementById("Loesung").innerHTML += "Werte " + werte[0] + " und " + werte[1] + " können in Zeile " + werte[2] + " nur in den Spalten " + werte[3] + " und " + werte[4] + " vorkommen, im Rest der Zeile streichen";
   		wert = -1;
   	}
		// PS:w1,w2,s1,z1,z2 Werte w1 und w2 können in Spalte s1 nur in den Zeilen z1 und z2 vorkommen, im Rest der Spalte streichen
   	if (art == "PS")
   	{
   		document.getElementById("Loesung").innerHTML += "Werte " + werte[0] + " und " + werte[1] + " können in Spalte " + werte[2] + " nur in den Zeilen " + werte[3] + " und " + werte[4] + " vorkommen, im Rest der Spalte streichen";
   		wert = -1;
   	}
  	// TZ:w1,w2,w3,z1,s1,s2,s3 Werte w1, w2 und w3 können in Zeile z1 nur in den Spalten s1, s2 und s3 vorkommen, im Rest der Spalte streichen
   	if (art == "TZ")
   	{
   		document.getElementById("Loesung").innerHTML += "Werte " + werte[0] + ", " + werte[1] + " und " + werte[2] + " können in Zeile " + werte[3] + " nur in den Spalten " + werte[4] + ", " + werte[5] + " und " + werte[6] + " vorkommen, im Rest der Spalte streichen";
   		wert = -1;
   	}
  	// TS:w1,w2,w3,s1,z1,z2,z3 Werte w1, w2 und w3 können in Spalte s1 nur in den Zeilen z1, z2 und z3 vorkommen, im Rest der Spalte streichen
   	if (art == "TS")
   	{
   		document.getElementById("Loesung").innerHTML += "Werte " + werte[0] + ", " + werte[1] + " und " + werte[2] + " können in Spalte " + werte[3] + " nur in den Zeilen " + werte[4] + ", " + werte[5] + " und " + werte[6] + " vorkommen, im Rest der Spalte streichen";
   		wert = -1;
   	}
	  // 1B:w,b,z,s Wert w kann in Box b nur in Zeile z, Spalte s vorkommen
   	if (art == "1B")
   	{
   		document.getElementById("Loesung").innerHTML += "Wert " + werte[0] + " kann in Box " + werte[1] + " nur in Zeile " + werte[2] + ", Spalte " + werte[3] + " vorkommen";
   		wert = werte[0];
   		zeile = werte[2];
   		spalte = werte[3];
   	}
	  // 1Z:w,Z,z,s Wert w kann in globaler Zeile Z nur in Zeile z und Spalte s vorkommen
   	if (art == "1Z")
   	{
   		document.getElementById("Loesung").innerHTML += "Wert " + werte[0] + " kann in Zeile " + werte[2] + " nur in Spalte " + werte[3] + " vorkommen";
   		wert = werte[0];
   		zeile = werte[2];
   		spalte = werte[3];
   	}
  // 1S:w,S,z,s Wert w kann in globaler Spalte S nur in Zeile z und Spalte s vorkommen
   	if (art == "1S")
   	{
   		document.getElementById("Loesung").innerHTML += "Wert " + werte[0] + " kann in Spalte " + werte[3] + " nur in Zeile " + werte[2] + " vorkommen";
   		wert = werte[0];
   		zeile = werte[2];
   		spalte = werte[3];
   	}
  // 1W:w,z,s Wert w ist der einzig mögliche Wert in Zeile z, Spalte s
   	if (art == "1W")
   	{
   		document.getElementById("Loesung").innerHTML += "Wert " + werte[0] + " ist der einzig mögliche Wert in Zeile " + werte[1] + ", Spalte " + werte[2];
   		wert = werte[0];
   		zeile = werte[1];
   		spalte = werte[2];
   	}
  // BZ:w,b,z Wert w kann in Box b nur in Zeile z vorkommen, im Rest der Zeile streichen
   	if (art == "BZ")
   	{
   		document.getElementById("Loesung").innerHTML += "Wert " + werte[0] + " kann in Box " + werte[1] + " nur in Zeile " + werte[2] + " vorkommen, im Rest der Zeile streichen";
   		wert = -1;
   	}
  // BS:w,b,s Wert w kann in Box b nur in Spalte s vorkommen, im Rest der Spalte streichen
   	if (art == "BS")
   	{
   		document.getElementById("Loesung").innerHTML += "Wert " + werte[0] + " kann in Box " + werte[1] + " nur in Spalte " + werte[2] + " vorkommen, im Rest der Spalte streichen";
   		wert = -1;
   	}
  // ZB:w,z,b Wert w kann in Zeile z nur in Box b vorkommen, im Rest der Box streichen
   	if (art == "ZB")
   	{
   		document.getElementById("Loesung").innerHTML += "Wert " + werte[0] + " kann in Zeile " + werte[0] + " nur in Box " + werte[0] + " vorkommen, im Rest der Box streichen";
   		wert = -1;
   	}
  // SB:w,s,b Wert w kann in Spalte s nur in Box b vorkommen, im Rest der Box streichen
   	if (art == "SB")
   	{
   		document.getElementById("Loesung").innerHTML += "Wert " + werte[0] + " kann in Spalte " + werte[0] + " nur in Box " + werte[0] + " vorkommen, im Rest der Box streichen";
   		wert = -1;
   	}
   	if (wert > 0)
   	{
     	document.getElementById("f" + namen [zeile-1] + namen [spalte-1]).style.color = "green";
     	document.getElementById("f" + namen [zeile-1] + namen [spalte-1]).value = "" + wert;
   	}
    step++;
  }
  else
  {
		document.getElementById("Loesung").innerHTML = "";
    document.getElementById("buttonGetSudoku0").disabled = false;
    document.getElementById("buttonGetSudoku1").disabled = false;
    document.getElementById("buttonPrintSudoku").disabled = false;
    document.getElementById("buttonCheckSudoku").disabled = false;
    document.getElementById("buttonSolveSudoku").disabled = false;
	}
}

function printSudoku ()
{
window.open ("print" + sudokuTyp + ".php?sudoku=" + sudoku + "&sudnr=" + sudokuBezeichnung, "Sudoku ausdrucken", "location=no, menubar=no, scrollbars=no, status=no, toolbar=no, innerWidth=0, innerHeight=0");
}


function blackAgain() {
  var index = 0;
  var zeile;
  var spalte;
  for (zeile = 0; zeile < anzZeilen; zeile++)
    for (spalte = 0; spalte < anzSpalten; spalte++) {
	    if (sudoku.substring (index, index+1) != loesung.substring (index, index+1)) {
  	    if (sudoku.substring (index, index+1) != ' ') {
	      	document.getElementById("f" + namen [zeile] + namen [spalte]).style.color = "black";
	      	document.getElementById("f" + namen [zeile] + namen [spalte]).style.textDecoration = "none";
	      }
      }
      index++;
    }
}

function checkSudoku ()
{
  var index = 0;
  var zeile;
  var spalte;
  sudoku = '';
  rote = 0;
  for (zeile = 0; zeile < anzZeilen; zeile++)
    for (spalte = 0; spalte < anzSpalten; spalte++) {
      item = document.getElementById("f" + namen [zeile] + namen [spalte]).value;
      sudoku += (item == '') ? ' ' : item;
      index++;
    }
	index = 0;
  for (zeile = 0; zeile < anzZeilen; zeile++)
    for (spalte = 0; spalte < anzSpalten; spalte++) {
	    if (sudoku.substring (index, index+1) != loesung.substring (index, index+1)) {
  	    if (sudoku.substring (index, index+1) != ' ') {
	      	document.getElementById("f" + namen [zeile] + namen [spalte]).style.color = "red";
	      	document.getElementById("f" + namen [zeile] + namen [spalte]).style.textDecoration = "blink";
	      }
      	rote++;
      }
      index++;
    }
 	window.setTimeout("blackAgain()", 5000);
  if (rote == 0)
    alert ('Bravo, Sudoku gelöst');
  else {
    alert ('Leider nicht richtig gelöst, ' + rote + 'Fehler');
  }
}

function showLoesung ()
{
  var index = 0;
  var zeile;
  var spalte;
  for (zeile = 0; zeile < anzZeilen; zeile++)
    for (spalte = 0; spalte < anzSpalten; spalte++) {
      document.getElementById("f" + namen [zeile] + namen [spalte]).value = loesung.substring (index, index+1);
     	document.getElementById("f" + namen [zeile] + namen [spalte]).style.color = "black";
      index++;
    }
}

function populate ()
{
  var index = 0;
  var zeile;
  var spalte;
  for (zeile = 0; zeile < anzZeilen; zeile++)
    for (spalte = 0; spalte < anzSpalten; spalte++) {
      document.getElementById("f" + namen [zeile] + namen [spalte]).value = (sudoku.substring (index, index+1) == ' ') ? '' : sudoku.substring (index, index+1);
      if (sudoku.substring (index, index+1) == ' ')
      {
      	document.getElementById("f" + namen [zeile] + namen [spalte]).readOnly = null;
      	document.getElementById("f" + namen [zeile] + namen [spalte]).style.color = "black";
      }
      else
      {
      	document.getElementById("f" + namen [zeile] + namen [spalte]).readOnly = "readonly";
      	document.getElementById("f" + namen [zeile] + namen [spalte]).style.color = "darkblue";
      }
      index++;
    }
  if (sudnr != "")
  {
  	sudokuBezeichnung = getFullName(sudokuTyp) + " Nummer " + document.getElementById("SudokuNummer").value + " - " + document.getElementById("Level"+document.getElementById("Level").value).innerHTML + " - " + document.getElementById("Symmetrie"+document.getElementById("Symmetrie").value).innerHTML;
    document.getElementById("SudNr").innerHTML = sudokuBezeichnung;
    document.getElementById("MaxNr").innerHTML = getAnzahl(sudokuTyp);
  }
}

function init ()
{
  document.getElementById("SudokuNummer").value = "1";
  document.getElementById("Level").value = 0;
  document.getElementById("Symmetrie").value = 0;
  getSudoku (0);
}

