// var sicherung = new Array();
var sicherung 	= null;  
var	dStartTime 	= 0; 

function deleteChildNodes(startNode) 
{
	while (startNode.hasChildNodes()) 
	{
		startNode.removeChild(startNode.lastChild);
	}
}

function SetDimension()
{
	var element = document.getElementById("sel_dimension");
		
	if (element == null)
		return;
		
	selectDropdownOption (element, dimension);
}

function SetTextField (id, text)
{
	var node = document.getElementById(id);
	if (node == null)
		return;

	node.value = text;
}

function SetText(id, text)
{
	var node = document.getElementById(id);
	if (node == null)
		return;
	
	deleteChildNodes(node);
	
	var inhalt    = document.createTextNode(text);
	node.appendChild(inhalt);
}

function SetClass (id, myclassname)
{
	var node = document.getElementById(id);
	
	if(node == null)
		return;
	
	node.className = myclassname;
}

function SetDescription ()
{
	switch (dimension)
	{
		case 4: text  = "2x2"; break;
		case 6: text  = "2x3"; break;		
		case 9: text  = "3x3"; break;
		case 12: text = "3x4"; break;
	}

	switch (level)
	{
		case 0: text += "; leicht"; break;
		case 1: text += "; mittel"; break;		
		case 2: text += "; schwer"; break;
		case 3: text += "; gemein"; break;
	}

	SetText("sudoku_label", text);
}


function SetLevel()
{
	var node = document.getElementById("sel_level");
	if (node == null)
		return;
	
	selectDropdownOption (node, level);
}

function onSchummelnClick()
{
	var node = document.getElementById("chkSchummeln");
	
	if (node == null)
		return;

	/* cheatmode festlegen über den Wert der Checkbox*/
	bSchummelnMode = node.checked;
	
	/* allen felder neues layout verpassen */
	for (var id=0; id<aufgabe.length; id++)
		set_input_format ("FELD" + id);
}


function onBilderSchummelnClick()
{
	var node = document.getElementById("chkSchummeln");
	
	if (node == null)
		return;

	/* cheatmode festlegen über den Wert der Checkbox*/
	bSchummelnMode = node.checked;
	
	/* Allen Feldern neues Layout verpassen */
	for (var id=0; id<aufgabe.length; id++)
	{
		set_bild_format (id);
	}
}

function onStoppUhrClick()
{
	var node = document.getElementById("chkStoppUhr");
	
	if (node == null)
		return;

	/* Festlegen, ob die Uhr gestartet werden soll */
	bClock = node.checked;

	/* Und starten falls gewollt */
	if (bClock)
		StartTimer();
}

function new_game()
{
	// neue url im aktiven fenster laden
	document.form_menu.submit();
}

function solve_sudoku()
{
	document.form_spielfeld.submit();
}

// Dies ist die Initialisierungsmethode für Bildersudokus
function init_bilder_sudoku()
{
	// Setze die richtigen Formate 	
	onBilderSchummelnClick();		

	// Starte StoppUhr falls gewuenscht
	onStoppUhrClick();
	
	// Text verschwinden lassen
	SetText ("message", ""); 
}


// Dies ist die neue Initialisierungsmethode für
// Standard-Sudokus, die auch aus Cookies nachgeladen werden können
function init_sudoku()
{
	// Setze die richtigen Formate 	
	onSchummelnClick();			

	// Starte StoppUhr falls gewuenscht
	onStoppUhrClick();
	
	// Text verschwinden lassen
	SetText ("message", ""); 
}

function init_game()
{
	for (var i=0; i<aufgabe.length; i++)
	{
		// Feld ermitteln
		node = document.getElementById("FELD" + i );
		
		// Die erste Sicherung ist die Aufgabemstellung selbst 
		// rgo sicherung [i] = aufgabe[i];		

		// Die leeren Felder bekommen einen anderen Style
		if (aufgabe[i] == "")
		{
			node.className = "grid_memo";
			node.value     = "";
		}
		else
		{
			node.className = 'grid_aufgabe';
			node.value = aufgabe[i];
			node.readOnly = true;
		}
	}

	/* Initialisiere die Level-Listbox */
	SetLevel 	 (); 

	/* Initialisiere die Dimension-Listbox */
	SetDimension ();

	/* Setze die Werte in der CheckBox entsprechend den Variablen vom Server*/
	SetCheckBox ("chkSchummeln", bSchummeln);
	SetCheckBox ("chkStoppUhr" , bStoppUhr);

	// Setze die richtigen Formate 	
	onSchummelnClick();			

	// Starte StoppUhr falls gewuenscht
	onStoppUhrClick();
	
	// Text verschwinden lassen
	SetText ("message", ""); 
}

function onListChange ()
{
	/* aktuellen Level auslesen */
	var node = document.getElementById("sel_level");
	var new_level = node.value;

	/* aktuellen Level auslesen */
	node = document.getElementById("sel_dimension");
	var new_dimension = node.value;

	if ((new_dimension == 12 || new_dimension == 4)	&& new_level == 3)
	{
		alert ("Leider haben wir für die Spielgrößen 2x2 und 3x4 keine 'gemeinen' Spiele. \n Der Schwierigkeitsgrad wird daher auf 'schwer' gesetzt.");

		var element = document.getElementById("sel_level");
		selectDropdownOption (element, 2);
	}
}

function set_bild_format (index)
{
	var feldid = "td_cell" + index;
	
	/* Die Layoutklasse der gesetzten Felder ändert sich nie */
	if (aufgabe[index] != 0)
		return;

	if (bSchummelnMode)
	{
		/* Markiere die Falschen Bilder mit einem roten Rahmen */
		if (spielstand[index] == 0)
		{
			SetClass (feldid, "cell_zu_loesen");			
		}
		else
		{
			if (loesung[index] != spielstand[index])
			{
				SetClass (feldid, "cell_error");
			}
			else
			{
				SetClass (feldid, "cell_zu_loesen");			
			}
		}
	}
	else
	{
		SetClass (feldid, "cell_zu_loesen");
	}
}

function set_input_format (feldid)
{
	var node = document.getElementById (feldid);
	
	/* Index hinter "FELD" auswerten */
	var index = parseInt(node.id.substr(4));

	var text = node.value;
	
	/* Die Layoutklasse der gesetzten Felder ändert sich nie */
	if (aufgabe[index] != "")
		return;
	
	/* Memofelder haben immer grid_memo*/
	if (text.length != 1)
	{
		node.className = 'grid_memo';
		return;
	}
	
	/* Der Rest haengt vom modus und vom Inhalt ab.*/
	if (text.length == 1)
	{
		if (bSchummelnMode)
		{
			if (node.value == loesung[index] )
			{
				node.className = 'grid_richtig';		
			}
			else
			{
				node.className = 'grid_falsch';		
			}
		}
		else
		{
			node.className = 'grid_zu_loesen';		
		}
	}
}

// Zeigt die Lösung an 
// Wird zur Zeit nur zu Testzwecken benutzt
function show_solution()
{
	for (var i=0; i<aufgabe.length; i++)
	{
		// Nur in die zu loeesenden felder etwas eintragen
		if (aufgabe[i] == "")
		{
			/* Feld ermitteln*/
			var node = document.getElementById("FELD" + i );
			
			/* Style für die Lösungsfelder festlegen*/
			node.className = "grid_zu_loesen";
			
			/* Einfach den Lösungsvektor einspielen */		
			node.value = loesung[i];
		}
	}
}

function show_original_version()
{
	setStyle('Original');
}

function AddNewFavorite() 
{ 
	var url=location.href;
	var title = "Online SUDOKU";
	
	if (window.sidebar) 
	{ 
		// Mozilla
		window.sidebar.addPanel(title, url, "");	
	} 
	else if (window.external) 
	{ 
		// IE
		window.external.AddFavorite(url, title) 
	} 
	else 
	{ 
		alert("Schade, Ihr Browser unterstützt diese Funktion nicht!"); 
	}
}

function check_solution()
{
	var node;
	var attempt  =0;
	var correct =0;

	for (var i=0; i<aufgabe.length; i++)
	{
		/* Feld ermitteln*/
		node = document.getElementById("FELD" + i );

		if (node.value.length == 1)
		{
			attempt++;
		}
		if (node.value == loesung[i])
		{
			correct++;
		}
	}

	node = document.getElementById("message");
	
	if (attempt == aufgabe.length)
	{
		if (correct == aufgabe.length)
		{
			SetText ("message", "Bravo! Sie haben das Rätsel gelöst."); 
			SetClass("message", "message");
		}
		else
		{
			SetText ("message", "Sie haben leider noch einen Fehler.");
			SetClass("message", "errmessage");
		}	
	}
	else
	{
		SetText("message", "");
	}
}

function save_position ()
{
	sicherung = new Array();

	// Werte sichern
	for (var i=0; i<aufgabe.length; i++)
		sicherung [i] = document.getElementById("FELD" + i ).value;
	
	SetClass("btn_last_pos", "navbutton");	
}

function last_position ()
{
	if (sicherung == null)
	{
		alert ("Es gibt keine gesicherte Stellung.");

		return;
	}

	// Werte wieder einspielen 
	for (var i=0; i<aufgabe.length; i++)
		document.getElementById("FELD" + i ).value = sicherung [i];
}

function selectDropdownOption (element,  wert)
{
	for (var i=0; i<element.options.length; i++) 
	{
		if (element.options[i].value == wert) 
		{
			element.options[i].selected = true;		
		}
		else
		{
			element.options[i].selected = false;	
		}
	}
}

function StartTimer()
{
  	bClock 		= true;          // merken, dass Stoppuhr laeuft
  	dStartTime  = new Date();    // Startzeit merken
  	ShowTime();                  // Vertrichene Zeit anzeigen 
}

function StopTimer()
{
  	bClock = false;         // Stoppuhr als angehalten merken
}

// ShowTime() zeigt die aktuelle Zeit der Stoppuhr an und veranlasst,
// dass diese Routine automatisch nach Ablauf von 1 Sekunde wieder
// aufgerufen wird - ausser die Stoppuhr wurde zwischenzeitlich 
// angehalten
function ShowTime()
{
	// Minutenanteil der Differenz
  	if(! bClock) 
  		return;
  
  	var dDeltaTime = new Date();  // Variable dDeltaTime als Datumsvariable deklarieren

  	dDeltaTime.setTime( new Date() - dStartTime ); // Differenz: Aktuelle Zeit und Startzeit

	// verstrichene Minuten Sekunden und Stunden berechnen
  	var sMin 	= dDeltaTime.getMinutes(); 
  	var sSec	= dDeltaTime.getSeconds(); 
  	var sHours  = Math.floor( dDeltaTime / 3600000 );

	// Fehlende fuehrende Null ergaenzen
  	sMin = ( sMin < 10 ) ? "0" + sMin : sMin;
  	sSec = ( sSec < 10 ) ? "0" + sSec : sSec;

	// Und anzeigen
	SetText("sudoku_clock", sHours + ":" + sMin + ":" + sSec)
  
  	// Und das jetzt jede Sekunde wiederholen
 	setTimeout('ShowTime()', 1000);
}

function ShowHelp(url)
{
	var width = 600;
	var height = screen.availHeight;

	window.open (url, "SUDOKU_Hilfe", "scrollbars=yes,toolbar=no,menubar=no,location=no,width=" + width + ",height=" + height);	
}


function checkFormMenu (f)
{
	return (checkDate (f.txtDatum.value, ErstesSpiel));
}

function StoreStandardGameToCookie()
{
	if (cookiesEnabled() != 1)
	{
		alert ("Um das Spiel speichern zu können, müssen Sie das anlegen von Cookies in Ihrem Browser ermöglichen.");
		return;		
	}

	// Lege einen String mit dem aktuellem Spielstand an.
	// Da in einem Spielfeld auch Merker stehen können, muß 
	// man die Daten komma-separiert ablegen 
	var spielstand_string = "";
	
	for (var i=0; i<aufgabe.length; i++)
	{
		// Bei den Standardsudokus ermittelt man den Spielstand aus den Textinhalten der Quadrate
		var node = document.getElementById("FELD"+i);
	
		var separator = (i<aufgabe.length-1) ? "," : "" ;
		spielstand_string += node.value + separator;
	}
	
	var cooky = datum + "@" + level + "@" + spielstand_string;

	setCookie ("standard_game_cooky", cooky, 5); 
}

function StoreBilderGameToCookie()
{
	if (cookiesEnabled() != 1)
	{
		alert ("Um das Spiel speichern zu können, müssen Sie das anlegen von Cookies in Ihrem Browser ermöglichen.");
		return;		
	}

	var spielstand_string = "";
	
	for (var i=0; i<spielstand.length; i++)
	{
		var separator = (i<spielstand.length-1) ? "," : "";
		
		// Bei den Bildersudokus ermittelt man den Spielstand aus dem separaten Array spielstand[]
		spielstand_string += spielstand[i] + separator;
	}
	
	var cooky = datum + "@" + level + "@" + spielstand_string;
	
	setCookie ("bilder_game_cooky", cooky, 5); 
}

function ReloadGameFromCookie(typ)
{
	var cooky = getCookie (typ + "_game_cooky");

	if (cooky == null)
	{
		alert ("Es gibt zur Zeit keinen gesicherten Spielstand.");
		return;
	}
	
	var param = cooky.split ("@");
	
	// Das cookie muss drei Felder enthalten
	if (param.length != 3)
	{
		alert ("Das cookie hat ein falsches Format");
		return;
	}
	
	var strdatum = param[0];  
	level = param[1];
	var stand = param[2];  
	

	SetTextField ("txtDatum", strdatum);
	SetLevel	 ();
	SetTextField ("txtSpielStand", stand);

	document.form_menu.submit();
}

function SetPicture (index)
{
	if (spielstand[index] == cur)
	{
		/* nix zu tun */
		return;
	}
	
	/* Neuen Wert sichern */
	spielstand[index] = cur;
	
	/* und natürlich auch darstellen */
	FP_swapImg("FELD" + index, cur);

	/* und den richtigen Rahmen setzen */
	set_bild_format (index)
	
	/* und nach jedem neuen Bild pruefen, ob das Raetsel vielleicht gelöst ist*/
	check_bilder_solution();
}

function SetMarked (index)
{
	if (index == cur)
		return;
	
	/* alten Markierung entfernen */
	SetClass ("td_auswahl" + cur, "cell_small")

	/* Neue Markierung setzen */
	SetClass ("td_auswahl" + index, "cell_small_marked")

	cur = index;
}

function check_bilder_solution()
{
	var attempt = 0;
	var correct = 0;

	for (var i=0; i<aufgabe.length; i++)
	{
		if (spielstand [i] != 0)
		{
			attempt++;
		}
		if (spielstand [i] == loesung[i])
		{
			correct++;
		}
	}

	node = document.getElementById("message");
	
	/* Pruefe, ob alle Felder befüllt sind mit Bildern*/
	if (attempt == aufgabe.length)
	{
		/* Alle bilder richtig */
		if (correct == aufgabe.length)
		{
			SetText ("message", "Bravo! Sie haben das Rätsel gelöst."); 
			SetClass("message", "message");
		}
		else /* mindestens eins war noch falsch */
		{
			SetText ("message", "Sie haben leider noch mindestens einen Fehler.");
			SetClass("message", "errmessage");
		}	
	}
	else
	{
		SetText("message", "");
	}
}

function checkDate (txtDatum)
{
	var theDate = ConvertToDate(txtDatum);

	if (theDate == null) 	
	{
		alert ("Das Datumsformat ist fehlerhaft. Bitte beachten Sie auch, dass das Jahr 4-stellig sein muß!");
		return false;
	}
	
	var firstDate = ConvertToDate(ErstesSpiel);
	if (firstDate == null) 	
	{
		/* Dann gibt es nur Spiele fuer heute */
		firstDate = new Date();
	}
	
	// Pruefe, ob das Datum nicht vor dem datum des ersten Spiels liegt
	if (theDate.getTime() < firstDate.getTime())
	{
		alert ("Das Datum darf nicht vor dem " + ErstesSpiel + " liegen!");
		return false;
	}
	
	var heute = new Date();

	if (theDate.getTime() > heute.getTime())
	{
		alert ("Das Datum darf nicht in der Zukunft liegen!");
		return false;
	}
	
	return true;
}


