/// ***************************************** Sudoku Oberflaeche ********************************************************* ///


var StartZeit = 0;
var StoppZeit = 0;
var SpielZeit = 0;
var Fehler = 0;
var AuswahlSpalte = -1;
var AuswahlZeile = -1;

var JaNeinListe = new Array( "Ja", "Nein" );

/**********************************************************************************/
/**********************************************************************************/
/**********************************************************************************/

function ElementSichtbar( parameter, doc ) {
	try {
		var container;
		if( typeof( parameter ) == "string" ) {
			container = getElement( "id", parameter, "", doc );
		} else if( typeof( parameter ) == "object" ) {
			container = parameter;
		} else {
			throw( "ElementSichtbar: Fehler - Parametertyp " + typeof( parameter ) + " wird nicht unterstuetzt!" );
		}
		if (NS4) {
			if( container.visibility == "show" ) return true;
		} else {
			if( container.style.visibility == "visible" ) return true;
		}
	} catch( e ) { }
	return false;
}

function ElementEinAusBlenden( parameter, einaus, doc ) {
	try {
		var container;
		if( typeof( parameter ) == "string" ) {
			container = getElement( "id", parameter, "", doc );
		} else if( typeof( parameter ) == "object" ) {
			container = parameter;
		} else {
			throw( "ElementEinAusBlenden: Fehler - Parametertyp " + typeof( parameter ) + " wird nicht unterstuetzt!" );
		}
		if( container.visibility ) {
			if( typeof( einaus ) != "boolean" ) {
				einaus = (container.visibility == "show") ? false : true;
			}
			container.visibility = einaus ? "show" : "hide";
		}
		if( container.style.visibility ) {
			if( typeof( einaus ) != "boolean" ) {
				einaus = (container.style.visibility == "visible") ? false : true;
			}
			container.style.visibility = einaus ? "visible" : "hidden";
		}
	} catch( e ) { }
}

function WennWertGeaendert( name, wert, arg ) {
//	alert( "WennWertGeaendert: " + name + " neuer Wert: '" + wert + "' Argument: '" + arg + "'" );			
}

/// ***************************************** Sudoku Oberflaeche ********************************************************* ///
	
var Oberflaeche = null;
	
function SodukuSpielOberflaeche( ) {
	try {
		this.SuDoKuSpiel = new SudokuSpiel( );
		this.SuDoKuParameter = new StatischeParameterGruppen( 
			new Array( 
				new Array(
					"Parameter",
					new Array(
						"NurEindeutige",						false,			WennWertGeaendert, null,
						"MaxSchwierigkeit",					0,					WennWertGeaendert, null,
						"FehlerSofort",							true,				WennWertGeaendert, null,
						"LoesungsWeg",							false,			WennWertGeaendert, null,
						"MaxLoesungen",							20,					WennWertGeaendert, null
					)
				),
				new Array(
					"Optionen",
					new Array(
						"Schrift",									"Verdana, Arial, Helvetica, Geneva, sans-serif", WennWertGeaendert, null,
						"HintergrundFarbe",					"#000055",	WennWertGeaendert, null,
						"TextFarbe",								"#00ee77",	WennWertGeaendert, null,
						"ZahlFarbe",								"blue",			WennWertGeaendert, null,
						"ZahlFarbeVorgabe",					"#000000",	WennWertGeaendert, null,
						"ZahlSchriftgroesse",				5,					WennWertGeaendert, null,
						"AuswahlFarbe",							"#55ccff",	WennWertGeaendert, null,
						"FeldFarbe1",								"#efefff",	WennWertGeaendert, null,
						"FeldFarbe2",								"#bcbccc",	WennWertGeaendert, null,
						"ParameterSchriftgroesse",	1.5,				WennWertGeaendert, null
					)
				)
			),
			document 
		);
		var layout = 1;

		// temporaer
		var altZeile = -1;
		var altSpalte = -1;
		var mussFehlerLoeschen = false;
		var mouseIstImSpielfeld = false;
		
		var spielTimer = null;
		var spielerzeugenTimer = null;
		var druckTimer = null;
		var spielerloesenTimer = null;
		
		var parameterEingabe = false;
		
		var spielstaende = new Array( );
		var spielstandIndex = 0;
		var spielstandVorherigerDisabled = true; 
		var spielstandSpeichernDisabled = true; 
		var spielstandNaechsterDisabled = true; 
		var loesungsIndex = -1;
			
		///////////////////////////////////////////////////////////////////////////////
		var erzeugeParameterForm = function( ) {
			try {
				var neuDokument = "";
				neuDokument += "<div id=\"ParameterContainer\" style=\"position:absolute; top:50px; left:20px; visibility:hidden; border-width:1px; border-style:solid;\" visibility=\"hide\" ><FORM id=\"Parameter\" name=\"Parameter\" >";
				neuDokument += "<table id=\"ParameterTabelle\" CELLSPACING=5 bgcolor=\"" + parent.Oberflaeche.SuDoKuParameter.Get( "Optionen", "HintergrundFarbe" ) + "\"><TR>";

				neuDokument += "<td align=\"center\"><font size=\"" + parent.Oberflaeche.SuDoKuParameter.Get( "Optionen", "ParameterSchriftgroesse" ) + "\"><BR>Nur eindeutige<BR>Spiel erzeugen&nbsp;</font><BR><SELECT onfocus=\"parent.Oberflaeche.StartStoppParameterEingabe( true )\" onblur=\"parent.Oberflaeche.StartStoppParameterEingabe( false )\" id=\"NurEindeutigeSelect\" name=\"NurEindeutigeSelect\" onchange=\"parent.Oberflaeche.SetzeParameterNurEindeutige( )\">";
				var NurEindeutigeText = ( parent.Oberflaeche.SuDoKuParameter.Get( "Parameter", "NurEindeutige" ) ) ? "Ja" : "Nein";
				for( var n in JaNeinListe ) {
					neuDokument += "<option value=\"" + n + "\"";
					if( JaNeinListe[n] == NurEindeutigeText ) {
						neuDokument += " selected";		
					}
					neuDokument += ">" + JaNeinListe[n] + "</option>";
				}
				neuDokument += "</TR><TR>";
				neuDokument += "<td align=\"center\"><font size=\"" + parent.Oberflaeche.SuDoKuParameter.Get( "Optionen", "ParameterSchriftgroesse" ) + "\"><BR>Maximaler<BR>Schwierigkeitsgrad&nbsp;</font><BR><SELECT onfocus=\"parent.Oberflaeche.StartStoppParameterEingabe( true )\" onblur=\"parent.Oberflaeche.StartStoppParameterEingabe( false )\" id=\"MaxSchwierigkeitSelect\" name=\"MaxSchwierigkeitSelect\" onchange=\"parent.Oberflaeche.SetzeParameterMaxSchwierigkeit( )\">";
				for( var n in parent.Oberflaeche.SuDoKuSpiel.SchwierigkeitsgradNamen ) {
					neuDokument += "<option value=\"" + parent.Oberflaeche.SuDoKuSpiel.SchwierigkeitsgradNamen[n] + "\"";
					if( n == parent.Oberflaeche.SuDoKuParameter.Get( "Parameter", "MaxSchwierigkeit" ) ) {
						neuDokument += " selected";		
					}
					neuDokument += ">" + parent.Oberflaeche.SuDoKuSpiel.SchwierigkeitsgradNamen[n] + "</option>";
				}
				neuDokument += "</TR><TR>";
				neuDokument += "<td align=\"center\"><font size=\"" + parent.Oberflaeche.SuDoKuParameter.Get( "Optionen", "ParameterSchriftgroesse" ) + "\"><BR>Fehler<BR>sofort melden</font><BR><SELECT onfocus=\"parent.Oberflaeche.StartStoppParameterEingabe( true )\" onblur=\"parent.Oberflaeche.StartStoppParameterEingabe( false )\" id=\"FehlerSofortSelect\" name=\"FehlerSofortSelect\" onchange=\"parent.Oberflaeche.SetzeParameterFehlerSofort( )\">";
				var FehlerSofotText = ( parent.Oberflaeche.SuDoKuParameter.Get( "Parameter", "FehlerSofort" ) ) ? "Ja" : "Nein";
				for( var n in JaNeinListe ) {
					neuDokument += "<option value=\"" + n + "\"";
					if( JaNeinListe[n] == FehlerSofotText ) {
						neuDokument += " selected";		
					}
					neuDokument += ">" + JaNeinListe[n] + "</option>";
				}
				neuDokument += "</TR><TR>";
				neuDokument += "<td align=\"center\"><font size=\"" + parent.Oberflaeche.SuDoKuParameter.Get( "Optionen", "ParameterSchriftgroesse" ) + "\"><BR>L&ouml;sungs-<BR>Weg</font><BR><SELECT onfocus=\"parent.Oberflaeche.StartStoppParameterEingabe( true )\" onblur=\"parent.Oberflaeche.StartStoppParameterEingabe( false )\" id=\"LoesungsWegSelect\" name=\"LoesungsWegSelect\" onchange=\"parent.Oberflaeche.SetzeParameterLoesungsWeg( )\">";
				var LoesungsWegText = ( parent.Oberflaeche.SuDoKuParameter.Get( "Parameter", "LoesungsWeg" ) ) ? "Ja" : "Nein";
				for( var n in JaNeinListe ) {
					neuDokument += "<option value=\"" + n + "\"";
					if( JaNeinListe[n] == LoesungsWegText ) {
						neuDokument += " selected";		
					}
					neuDokument += ">" + JaNeinListe[n] + "</option>";
				}
				neuDokument += "</TR><TR>";
				neuDokument += "<td align=\"center\"><font size=\"" + parent.Oberflaeche.SuDoKuParameter.Get( "Optionen", "ParameterSchriftgroesse" ) + "\"><BR>Maximal<BR>L&ouml;sungen</font><BR><INPUT onfocus=\"parent.Oberflaeche.StartStoppParameterEingabe( true )\" onblur=\"parent.Oberflaeche.StartStoppParameterEingabe( false )\" size=\"3\" maxlength=\"3\" value=\"" + parent.Oberflaeche.SuDoKuParameter.Get( "Parameter", "MaxLoesungen" ) + "\" id=\"MaxLoesungenInput\" name=\"MaxLoesungenInput\" onchange=\"parent.Oberflaeche.SetzeParameterMaxLoesungen( )\">";
				neuDokument += "</TR><TR>";
				neuDokument += "<TD align=\"center\"><BR>";
				if( layout == 0 ) {
					neuDokument += "<a href=\"JavaScript:parent.ElementEinAusBlenden( 'ParameterContainer', false, parent.SpielFrame.document )\"  >Schlie&szlig;en</a>";
				} else {
					neuDokument += "<button type=\"button\" onClick=\"parent.ElementEinAusBlenden( 'ParameterContainer', false, parent.SpielFrame.document )\" ID=\"ParameterSchliessenButton\">Schlie&szlig;en</button>";
				}
				neuDokument += "<TD>";
				neuDokument += "</tr></table></FORM></div>";
				return neuDokument;
			} catch( exception ) { 
				setContent( "id", "ErsterKommentar", "", "Fehler: kann Parameter-Dialog nicht erzeugen!", parent.SpielFrame.document );
//				alert( "erzeugeParameterForm: Fehler!\n" + exception ); 
			}
		}

		var erzeugeOptionenForm = function ( ) {
			try {
				var neuDokument = "";
				neuDokument += "<div id=\"OptionenContainer\"  style=\"position:absolute; top:50px; right:20px; visibility:hidden; border-width:1px; border-style:solid;\"  visibility=\"hide\"> <FORM id=\"Optionen\" name=\"Optionen\">";
				neuDokument += "<table id=\"OptionenTabelle\" CELLSPACING=5 bgcolor=\"" + parent.Oberflaeche.SuDoKuParameter.Get( "Optionen", "HintergrundFarbe" ) + "\"><tr>";
				neuDokument += "<td align=\"center\"><font size=\"" + parent.Oberflaeche.SuDoKuParameter.Get( "Optionen", "ParameterSchriftgroesse" ) + "\"><BR>Schriftart&nbsp;</font><BR><INPUT onchange=\"parent.Oberflaeche.SetzeSchrift( )\" onfocus=\"parent.Oberflaeche.StartStoppParameterEingabe( true )\" onblur=\"parent.Oberflaeche.StartStoppParameterEingabe( false )\" size=\"30\" maxlength=\"50\" value=\"" + parent.Oberflaeche.SuDoKuParameter.Get( "Optionen", "Schrift" ) + "\" id=\"SchriftartInput\" name=\"SchriftartInput\" ></td>";
				neuDokument += "</tr><tr>";
				neuDokument += "<td align=\"center\"><font size=\"" + parent.Oberflaeche.SuDoKuParameter.Get( "Optionen", "ParameterSchriftgroesse" ) + "\"><BR>Hintergrundfarbe</font><BR><INPUT onchange=\"parent.Oberflaeche.SetzeHintergrung( )\" onfocus=\"parent.Oberflaeche.StartStoppParameterEingabe( true )\" onblur=\"parent.Oberflaeche.StartStoppParameterEingabe( false )\" size=\"7\" maxlength=\"7\" value=\"" + parent.Oberflaeche.SuDoKuParameter.Get( "Optionen", "HintergrundFarbe" ) + "\" id=\"HintergrundfarbeInput\" name=\"HintergrundfarbeInput\" ></td>";
				neuDokument += "</tr><tr>";
				neuDokument += "<td align=\"center\"><font size=\"" + parent.Oberflaeche.SuDoKuParameter.Get( "Optionen", "ParameterSchriftgroesse" ) + "\"><BR>Textfarbe</font><BR><INPUT onchange=\"parent.Oberflaeche.SetzeSchrift( )\" onfocus=\"parent.Oberflaeche.StartStoppParameterEingabe( true )\" onblur=\"parent.Oberflaeche.StartStoppParameterEingabe( false )\" size=\"7\" maxlength=\"7\" value=\"" + parent.Oberflaeche.SuDoKuParameter.Get( "Optionen", "TextFarbe" ) + "\" id=\"TextfarbeInput\" name=\"TextfarbeInput\" ></td>";
				neuDokument += "</tr><tr>";
				neuDokument += "<td align=\"center\"><font size=\"" + parent.Oberflaeche.SuDoKuParameter.Get( "Optionen", "ParameterSchriftgroesse" ) + "\"><BR>Zahlfarbe</font><BR><INPUT onchange=\"parent.Oberflaeche.SetzeOptionen( )\" onfocus=\"parent.Oberflaeche.StartStoppParameterEingabe( true )\" onblur=\"parent.Oberflaeche.StartStoppParameterEingabe( false )\" size=\"7\" maxlength=\"7\" value=\"" + parent.Oberflaeche.SuDoKuParameter.Get( "Optionen", "ZahlFarbe" ) + "\" id=\"ZahlfarbeInput\" name=\"ZahlfarbeInput\" ></td>";
				neuDokument += "</tr><tr>";
				neuDokument += "<td align=\"center\"><font size=\"" + parent.Oberflaeche.SuDoKuParameter.Get( "Optionen", "ParameterSchriftgroesse" ) + "\"><BR>Vorgabefarbe</font><BR><INPUT onchange=\"parent.Oberflaeche.SetzeOptionen( )\" onfocus=\"parent.Oberflaeche.StartStoppParameterEingabe( true )\" onblur=\"parent.Oberflaeche.StartStoppParameterEingabe( false )\" size=\"7\" maxlength=\"7\" value=\"" + parent.Oberflaeche.SuDoKuParameter.Get( "Optionen", "ZahlFarbeVorgabe" ) + "\" id=\"VorgabefarbeInput\" name=\"VorgabefarbeInput\" ></td>";
				neuDokument += "</tr><tr>";
				neuDokument += "<td align=\"center\"><font size=\"" + parent.Oberflaeche.SuDoKuParameter.Get( "Optionen", "ParameterSchriftgroesse" ) + "\"><BR>Schriftgr&ouml;&szlig;e</font><BR><INPUT onchange=\"parent.Oberflaeche.SetzeOptionen( )\" onfocus=\"parent.Oberflaeche.StartStoppParameterEingabe( true )\" onblur=\"parent.Oberflaeche.StartStoppParameterEingabe( false )\" size=\"3\" maxlength=\"3\" value=\"" + parent.Oberflaeche.SuDoKuParameter.Get( "Optionen", "ZahlSchriftgroesse" ) + "\" id=\"ZahlSchriftgroesseInput\" name=\"ZahlSchriftgroesseInput\" ></td>";
				neuDokument += "</tr><tr>";
				neuDokument += "<td align=\"center\"><font size=\"" + parent.Oberflaeche.SuDoKuParameter.Get( "Optionen", "ParameterSchriftgroesse" ) + "\"><BR>Auswahlfarbe</font><BR><INPUT onchange=\"parent.Oberflaeche.SetzeOptionen( )\" onfocus=\"parent.Oberflaeche.StartStoppParameterEingabe( true )\" onblur=\"parent.Oberflaeche.StartStoppParameterEingabe( false )\" size=\"7\" maxlength=\"7\" value=\"" + parent.Oberflaeche.SuDoKuParameter.Get( "Optionen", "AuswahlFarbe" ) + "\" id=\"AuswahlFarbeInput\" name=\"AuswahlFarbeInput\" ></td>";
				neuDokument += "</tr><tr>";
				neuDokument += "<td align=\"center\"><font size=\"" + parent.Oberflaeche.SuDoKuParameter.Get( "Optionen", "ParameterSchriftgroesse" ) + "\"><BR>Feldfarbe&nbsp;1</font><BR><INPUT onchange=\"parent.Oberflaeche.SetzeOptionen( )\" onfocus=\"parent.Oberflaeche.StartStoppParameterEingabe( true )\" onblur=\"parent.Oberflaeche.StartStoppParameterEingabe( false )\" size=\"7\" maxlength=\"7\" value=\"" + parent.Oberflaeche.SuDoKuParameter.Get( "Optionen", "FeldFarbe1" ) + "\" id=\"Feldfarbe1Input\" name=\"Feldfarbe1Input\" ></td>";
				neuDokument += "</tr><tr>";
				neuDokument += "<td align=\"center\"><font size=\"" + parent.Oberflaeche.SuDoKuParameter.Get( "Optionen", "ParameterSchriftgroesse" ) + "\"><BR>Feldfarbe&nbsp;2</font><BR><INPUT onchange=\"parent.Oberflaeche.SetzeOptionen( )\" onfocus=\"parent.Oberflaeche.StartStoppParameterEingabe( true )\" onblur=\"parent.Oberflaeche.StartStoppParameterEingabe( false )\" size=\"7\" maxlength=\"7\" value=\"" + parent.Oberflaeche.SuDoKuParameter.Get( "Optionen", "FeldFarbe2" ) + "\" id=\"Feldfarbe2Input\" name=\"Feldfarbe2Input\" ></td>";
				neuDokument += "</tr><tr>";
				neuDokument += "<td align=\"center\"><BR>";
				if( layout == 0 ) {
					neuDokument += "<a href=\"JavaScript:parent.Oberflaeche.SetzeOptionen( )\">&Uuml;bernehmen</a><BR>";
					neuDokument += "<a href=\"JavaScript:parent.Oberflaeche.StandartOptionen( )\">Zur&uuml;cksetzen</a><BR>";
					neuDokument += "<a href=\"JavaScript:parent.ElementEinAusBlenden( 'OptionenContainer', false, parent.SpielFrame.document )\"  >Schlie&szlig;en</a>";
				} else {
					neuDokument += "<button type=\"button\" onClick=\"parent.Oberflaeche.SetzeOptionen( )\" ID=\"OptionenUebernehmenButton\">&Uuml;bernehmen</button><BR><font size=\"1\"><BR></font>";
					neuDokument += "<button type=\"button\" onClick=\"parent.Oberflaeche.StandartOptionen( )\" ID=\"OptionenZuruecketzenButton\">Zur&uuml;cksetzen</button><BR><font size=\"1\"><BR></font>";
					neuDokument += "<button type=\"button\" onClick=\"parent.ElementEinAusBlenden( 'OptionenContainer', false, parent.SpielFrame.document )\" ID=\"OptionenSchliessenButton\">Schlie&szlig;en</button> ";
				
				}
				neuDokument += "</TD>";
				neuDokument += "</tr></table></FORM></div>";
				return neuDokument;
			} catch( exception ) { 
				setContent( "id", "ErsterKommentar", "", "Fehler: kann Optionen-Dialog nicht erzeugen!", parent.SpielFrame.document );
//				alert( "erzeugeOptionenForm: Fehler!\n" + exception ); 
			}
		}	
		
		var erzeugeTastaturForm = function( ) {
			try {
				var neuDokument = "";

				neuDokument += "<div style=\"position:absolute; top:-50px; left:-50px;\"><form ID=\"ZahlAuswahForm\"><input id=\"ZahlInput\" name=\"ZahlInput\" value=\"\"></form></div>";
				neuDokument += "<div id=\"Tastatur\" style=\"position:absolute; top:-50px; left:-50px; visibility:hidden; background-color: silver; -moz-opacity: 0.50; filter:alpha(opacity=50); opacity: 0.50;\">";

				neuDokument += "<table cellpadding=0 cellspacing=0 ID=\"ZahlAuswahFormTable\">";
				neuDokument += "<tr valign=\"middle\"><td height=\"35\" width=\"35\" align=\"center\"><a class=nummern id=\"a1\" accesskey=\"1\" href=\"JavaScript:parent.Oberflaeche.ZahlEingabe( 1 )\">&nbsp;1&nbsp;</a></td><td height=\"35\" width=\"35\" align=\"center\"><a class=nummern id=\"a2\" accesskey=\"2\" href=\"JavaScript:parent.Oberflaeche.ZahlEingabe( 2 )\">&nbsp;2&nbsp;</a></td><td height=\"35\" width=\"35\" align=\"center\"><a class=nummern id=\"a3\" accesskey=\"3\" href=\"JavaScript:parent.Oberflaeche.ZahlEingabe( 3 )\">&nbsp;3&nbsp;</a></td></tr>";
				neuDokument += "<tr valign=\"middle\"><td height=\"35\" width=\"35\" align=\"center\"><a class=nummern id=\"a4\" accesskey=\"4\" href=\"JavaScript:parent.Oberflaeche.ZahlEingabe( 4 )\">&nbsp;4&nbsp;</a></td><td height=\"35\" width=\"35\" align=\"center\"><a class=nummern id=\"a5\" accesskey=\"5\" href=\"JavaScript:parent.Oberflaeche.ZahlEingabe( 5 )\">&nbsp;5&nbsp;</a></td><td height=\"35\" width=\"35\" align=\"center\"><a class=nummern id=\"a6\" accesskey=\"6\" href=\"JavaScript:parent.Oberflaeche.ZahlEingabe( 6 )\">&nbsp;6&nbsp;</a></td></tr>";
				neuDokument += "<tr valign=\"middle\"><td height=\"35\" width=\"35\" align=\"center\"><a class=nummern id=\"a7\" accesskey=\"7\" href=\"JavaScript:parent.Oberflaeche.ZahlEingabe( 7 )\">&nbsp;7&nbsp;</a></td><td height=\"35\" width=\"35\" align=\"center\"><a class=nummern id=\"a8\" accesskey=\"8\" href=\"JavaScript:parent.Oberflaeche.ZahlEingabe( 8 )\">&nbsp;8&nbsp;</a></td><td height=\"35\" width=\"35\" align=\"center\"><a class=nummern id=\"a9\" accesskey=\"9\" href=\"JavaScript:parent.Oberflaeche.ZahlEingabe( 9 )\">&nbsp;9&nbsp;</a></td></tr>";
				neuDokument += "<tr valign=\"middle\"><td colspan=\"3\" height=\"35\" align=\"center\"><a class=nummern id=\"a0\" accesskey=\"0\" href=\"JavaScript:parent.Oberflaeche.ZahlEingabe( 0 )\">l&ouml;schen</a></td></tr>";
				neuDokument += "</table>";
				neuDokument += "</div>";
				return neuDokument;
			} catch( exception ) { 
				setContent( "id", "ErsterKommentar", "", "Fehler: kann Tastatur nicht erzeugen!", parent.SpielFrame.document );
//				alert( "erzeugeTastaturForm: Fehler!\n" + exception ); 
			}
		}
		var erzeugeSpielFeld = function( feldFarbe1, feldFarbe2 ) {
			try {
				var text = "<BR>";
				var farbe;
				var zahlFarbe;
				text += "<FONT><DIV id=\"ErsteKopfZeile\" name=\"ErsteKopfZeile\">F&uuml;r Markus</DIV></FONT>";
				text += "<FONT size=\"-1\"><DIV id=\"ZweiteKopfZeile\" name=\"ZweiteKopfZeile\">&nbsp;</DIV></FONT>";
				text += "<FORM id=\"Spielfeld\">";
				
				text += erzeugeTastaturForm( ); // 10.06.08

				text += "<TABLE id=\"Tabelle\" onMouseOver=\"parent.Oberflaeche.MouseUeberSpielfeld( true )\" onMouseOut=\"parent.Oberflaeche.MouseUeberSpielfeld( false )\" border=\"0\" cellpadding=\"1\" cellspacing=\"1\">";
				text += "<TR align=\"center\" valign=\"bottom\"><TD><FONT size=1>&nbsp;</FONT></TD><TD><FONT size=1>A</FONT></TD><TD><FONT size=1>B</FONT></TD><TD><FONT size=1>C</FONT></TD><TD><FONT size=1>D</FONT></TD><TD><FONT size=1>E</FONT></TD><TD><FONT size=1>F</FONT></TD><TD><FONT size=1>G</FONT></TD><TD><FONT size=1>H</FONT></TD><TD><FONT size=1>I</FONT></TD></TR>";
				for ( var z=0; z < 9; z++) {
					text += "<TR><TD align=\"right\" valign=\"center\"><FONT size=1>" + String( z + 1 ) + "</FONT></TD>";
					for ( var s=0; s < 9; s++) {
						var nummer = 0;
						if( (Math.floor(s/3) % 2) == 1 ) {
							if( (Math.floor(z/3) % 2) == 1 ) {
								farbe = feldFarbe1;
							} else {
								farbe = feldFarbe2;
							}
						} else {
							if( (Math.floor(z/3) % 2 ) != 1 ) {
								farbe = feldFarbe1;
							} else {
								farbe = feldFarbe2;
							}
						}
						zahlFarbe = ( 1 > nummer || nummer > 9 ) ? farbe : this.SuDoKuParameter.Get( "Optionen", "ZahlFarbeVorgabe" );
						text += "<TD id=\"Feld" + z.toString( ) + s.toString( ) + "\" bgcolor=\"" + farbe + "\" onMousedown=\"parent.Oberflaeche.FeldAuswahl( " + z.toString( ) + ", " + s.toString( ) + ", this )\">";
						text += "<B><font id=\"Feld" + z.toString( ) + s.toString( ) + "Farbe\" color=\"" + zahlFarbe + "\" size=\"" + parent.Oberflaeche.SuDoKuParameter.Get( "Optionen", "ZahlSchriftgroesse" ) + "\" face=\"" + parent.Oberflaeche.SuDoKuParameter.Get( "Optionen", "Schrift" ) + "\"><span id=\"Feld" + z.toString( ) + s.toString( ) + "Text\">&nbsp;" + nummer + "&nbsp;</span></font></B>";
						text += "</TD>";
					} // for s
					text += "<TD align=\"right\" valign=\"center\"><FONT size=1>" + String( z + 1 ) + "</FONT></TD></TR>";
				} // for z
				text += "<TR align=\"center\" valign=\"bottom\"><TD><FONT size=1>&nbsp;</FONT></TD><TD><FONT size=1>A</FONT></TD><TD><FONT size=1>B</FONT></TD><TD><FONT size=1>C</FONT></TD><TD><FONT size=1>D</FONT></TD><TD><FONT size=1>E</FONT></TD><TD><FONT size=1>F</FONT></TD><TD><FONT size=1>G</FONT></TD><TD><FONT size=1>H</FONT></TD><TD><FONT size=1>I</FONT></TD></TR>";
				text +="</TABLE></FORM>";
				
				text +="<FONT size=\"+1\"><DIV id=\"ErsterKommentar\" >&nbsp;</DIV></FONT>";
				if( layout == 0 ) {
					text += "<a href=\"JavaScript:parent.Oberflaeche.SpielstandSetzen( -1 )\">Vorheriger</a> | ";
					text += "<a href=\"JavaScript:parent.Oberflaeche.SpielstandSetzen( 0 )\">Speichern</a> | ";
					text += "<a href=\"JavaScript:parent.Oberflaeche.SpielstandSetzen( 1 )\">N&auml;chster</a> ";
				} else {
					text += "<button type=\"button\" onClick=\"parent.Oberflaeche.SpielstandSetzen( -1 )\" ID=\"SpielstandVorherigerButton\">Vorheriger</button>&nbsp; ";
					text += "<button type=\"button\" onClick=\"parent.Oberflaeche.SpielstandSetzen( 0 )\" ID=\"SpielstandSpeichernButton\">Speichern</button>&nbsp; ";
					text += "<button type=\"button\" onClick=\"parent.Oberflaeche.SpielstandSetzen( 1 )\" ID=\"SpielstandNaechsterButton\">N&auml;chster</button> ";
				}
				text += "<FONT><DIV id=\"ZweiterKommentar\" >von Andreas 12.07.2006</DIV></FONT>";

				text += "<FONT><DIV id=\"LoesungenKontrolle\" style=\"visibility:hidden;\" visibility=\"hide\"><font size=\"1\"><BR></font>";
				text += "<button type=\"button\" class=klein onClick=\"parent.Oberflaeche.LoesungSetzen( -1 )\" ID=\"LoesungVorherigeButton\">&lt;</button>";
				text += "&nbsp;<SPAN id=\"LoesungText\">L&ouml;sung x von y</SPAN>&nbsp;";
				text += "<button type=\"button\" class=klein onClick=\"parent.Oberflaeche.LoesungSetzen( 1 )\" ID=\"LoesungNaechsteButton\">&gt;</button>";
				text += "</DIV></FONT>";
				
				
				return text;
			} catch( exception ) { 
//				alert( "erzeugeSpielFeld: Fehler!\n" + exception ); 
				setContent( "id", "ErsterKommentar", "", "Fehler: kann Spielfeld nicht erzeugen!", parent.SpielFrame.document );
			}
		}

		this.SetzeSchrift = function ( ) {
			try {
				var aktFeld = getElement( "id", "TextFont", "", parent.SpielFrame.document );
				aktFeld.face	= this.SuDoKuParameter.Set( "Optionen", "Schrift", parent.SpielFrame.document.Optionen.SchriftartInput.value );
				aktFeld.color	= this.SuDoKuParameter.Set( "Optionen", "TextFarbe", parent.SpielFrame.document.Optionen.TextfarbeInput.value );
				aktFeld = getElement( "id", "Hintergrund", "", parent.SpielFrame.document );
				aktFeld.text	= this.SuDoKuParameter.Get( "Optionen", "TextFarbe" );
				alleFelderAktualisieren( this.SuDoKuSpiel.Spiel,  this.SuDoKuSpiel.Vorgabe );
			} catch( exception ) { 
//				alert( "SetzeSchrift: Fehler!\n" + exception ); 
			}
		}
		this.SetzeHintergrung = function( ) {
			try {
				var neuFarbe = parent.SpielFrame.document.Optionen.HintergrundfarbeInput.value;
				var aktFeld = null;
				this.SuDoKuParameter.Set( "Optionen", "HintergrundFarbe", neuFarbe );
				aktFeld = getElement( "id", "Hintergrund", "", parent.SpielFrame.document );
				if( aktFeld ) {
					aktFeld.bgColor	= neuFarbe
				}
				aktFeld = getElement( "id", "ParameterTabelle", "", parent.SpielFrame.document );
				if( aktFeld ) {
					aktFeld.bgColor	= neuFarbe;
				}
				aktFeld = getElement( "id", "OptionenTabelle", "", parent.SpielFrame.document );
				if( aktFeld ) {
					aktFeld.bgColor	= neuFarbe;
				}
			} catch( exception ) { 
//				alert( "SetzeHintergrung: Fehler!\n" + exception ); 
			}
		}
		this.SetzeParameterNurEindeutige = function( ) {
			try {
				var bool = ( parent.SpielFrame.document.Parameter.NurEindeutigeSelect.selectedIndex == 0 ) ? true : false;
				this.SuDoKuParameter.Set( "Parameter", "NurEindeutige", bool );
			} catch( exception ) { 
//				alert( "SetzeParameterNurEindeutige: Fehler!\n" + exception ); 
			}
		}
		
		this.SetzeParameterMaxSchwierigkeit = function( ) {
			try {
				this.SuDoKuParameter.Set( "Parameter", "MaxSchwierigkeit", parent.SpielFrame.document.Parameter.MaxSchwierigkeitSelect.selectedIndex );
				if( 0 > this.SuDoKuParameter.Get( "Parameter", "MaxSchwierigkeit" ) || this.SuDoKuParameter.Get( "Parameter", "MaxSchwierigkeit" ) > 3 ) {
					this.SuDoKuParameter.Set( "Parameter", "MaxSchwierigkeit", 0 );
					parent.SpielFrame.document.Parameter.MaxSchwierigkeitSelect.selectedIndex = this.SuDoKuParameter.Get( "Parameter", "MaxSchwierigkeit" );
				}
			} catch( exception ) { 
//				alert( "SetzeParameterMaxSchwierigkeit: Fehler!\n" + exception ); 
			}
		}

		this.SetzeParameterFehlerSofort = function ( ) {
			try {
				var bool = ( parent.SpielFrame.document.Parameter.FehlerSofortSelect.selectedIndex == 0 ) ? true : false;
				this.SuDoKuParameter.Set( "Parameter", "FehlerSofort", bool );
			} catch( exception ) { 
//				alert( "SetzeParameterFehlerSofort: Fehler!\n" + exception ); 
			}
		}

		this.SetzeParameterLoesungsWeg = function( ) {
			try {
				var bool = ( parent.SpielFrame.document.Parameter.LoesungsWegSelect.selectedIndex == 0 ) ? true : false;
				this.SuDoKuParameter.Set( "Parameter", "LoesungsWeg", bool );
			} catch( exception ) { 
//				alert( "SetzeParameterLoesungsWeg: Fehler!\n" + exception ); 
			}
		}
		this.SetzeParameterMaxLoesungen = function( ) {
			try {
				this.SuDoKuParameter.Set( "Parameter", "MaxLoesungen", parent.SpielFrame.document.Parameter.MaxLoesungenInput.value );
			} catch( exception ) { 
//				alert( "SetzeParameterMaxLoesungen: Fehler!\n" + exception ); 
			}
		}

		this.StandartOptionen = function( ) {
			try {
				this.SuDoKuParameter.Get( "Optionen" ).Zuruecksetzen( );
				parent.SpielFrame.document.Optionen.SchriftartInput.value = this.SuDoKuParameter.Get( "Optionen", "Schrift" );
				parent.SpielFrame.document.Optionen.HintergrundfarbeInput.value = this.SuDoKuParameter.Get( "Optionen", "HintergrundFarbe" );
				parent.SpielFrame.document.Optionen.TextfarbeInput.value = this.SuDoKuParameter.Get( "Optionen", "TextFarbe" );
				parent.SpielFrame.document.Optionen.ZahlfarbeInput.value = this.SuDoKuParameter.Get( "Optionen", "ZahlFarbe" );
				parent.SpielFrame.document.Optionen.VorgabefarbeInput.value = this.SuDoKuParameter.Get( "Optionen", "ZahlFarbeVorgabe" );	
				parent.SpielFrame.document.Optionen.ZahlSchriftgroesseInput.value = this.SuDoKuParameter.Get( "Optionen", "ZahlSchriftgroesse" );
				parent.SpielFrame.document.Optionen.AuswahlFarbeInput.value = this.SuDoKuParameter.Get( "Optionen", "AuswahlFarbe" );
				parent.SpielFrame.document.Optionen.Feldfarbe1Input.value = this.SuDoKuParameter.Get( "Optionen", "FeldFarbe1" );
				parent.SpielFrame.document.Optionen.Feldfarbe2Input.value = this.SuDoKuParameter.Get( "Optionen", "FeldFarbe2" );
				
				this.SetzeSchrift( );
				this.SetzeHintergrung( );
				alleFelderAktualisieren( this.SuDoKuSpiel.Spiel,  this.SuDoKuSpiel.Vorgabe );
			} catch( exception ) { 
//				alert( "StandartOptionen: Fehler!\n" + exception ); 
			}
		}

		this.SetzeOptionen = function( ) {
			try {
			//	alert( "Optionen!" );
				this.SuDoKuParameter.Set( "Optionen", "Schrift", parent.SpielFrame.document.Optionen.SchriftartInput.value );
				this.SuDoKuParameter.Set( "Optionen", "HintergrundFarbe", parent.SpielFrame.document.Optionen.HintergrundfarbeInput.value );
				this.SuDoKuParameter.Set( "Optionen", "TextFarbe", parent.SpielFrame.document.Optionen.TextfarbeInput.value );
				this.SuDoKuParameter.Set( "Optionen", "ZahlFarbe", parent.SpielFrame.document.Optionen.ZahlfarbeInput.value );
				this.SuDoKuParameter.Set( "Optionen", "ZahlFarbeVorgabe", parent.SpielFrame.document.Optionen.VorgabefarbeInput.value );
				this.SuDoKuParameter.Set( "Optionen", "ZahlSchriftgroesse", parent.SpielFrame.document.Optionen.ZahlSchriftgroesseInput.value );
				this.SuDoKuParameter.Set( "Optionen", "AuswahlFarbe", parent.SpielFrame.document.Optionen.AuswahlFarbeInput.value );
				this.SuDoKuParameter.Set( "Optionen", "FeldFarbe1", parent.SpielFrame.document.Optionen.Feldfarbe1Input.value );
				this.SuDoKuParameter.Set( "Optionen", "FeldFarbe2", parent.SpielFrame.document.Optionen.Feldfarbe2Input.value );

				alleFelderAktualisieren( this.SuDoKuSpiel.Spiel,  this.SuDoKuSpiel.Vorgabe );
			} catch( exception ) { 
//				alert( "SetzeOptionen: Fehler!\n" + exception ); 
			}
		}


		this.StartStoppParameterEingabe = function ( startStopp ) {
			parameterEingabe = startStopp;
		}


		this.Tick = function( ) {
			try {
				var jetzt = new Date();
				var aktZeit = jetzt.getTime() / 1000;
				var aktDauer = 0;
				var nochOffen = 0;
				var stunden;
				var minuten;
				var sekunden;
				var stundenText = "";
				var minText = "";
				var sekText = "";

				if( spielTimer ) {
					parent.window.clearTimeout( spielTimer );
				}
				try {
					if( parent.mussFehlerLoeschen ) {
						this.SetzeHintergrung( );
						parent.mussFehlerLoeschen = false;
					}
				} catch( e ) {}
				
				try {
					nochOffen = this.SuDoKuSpiel.Spiel.AnzahlLeereFelder( );
				} catch( e ) {}
				try {
					aktDauer = Math.floor( aktZeit - parent.StartZeit );
				} catch( e ) {}
				minuten = Math.floor( aktDauer / 60 );
				stunden = Math.floor( minuten / 60 );
				stundenText = stunden.toString( );
				minuten = minuten % 60;
				minText = minuten.toString( );
				if( minText.length == 1 ) minText = "0" + minText;
				sekunden = aktDauer % 60;
				sekText = sekunden.toString( );
				if( sekText.length == 1 ) sekText = "0" + sekText;
				if( nochOffen > 0 ) {
					kommentar1 = "Spielstand " + spielstandIndex + ": noch " + nochOffen + " Felder offen";
					setContent( "id", "ErsterKommentar", "", kommentar1, parent.SpielFrame.document );
					if( parent.StartZeit ) {
						kommentar2 = "Spielzeit: " + stundenText + ":" + minText + ":" + sekText;
						if( parent.Fehler ) {
							kommentar2 += "   " + parent.Fehler + " Fehler";
						}		
						setContent( "id", "ZweiterKommentar", "", kommentar2, parent.SpielFrame.document );
					}
					spielTimer = parent.window.setTimeout( "parent.Oberflaeche.Tick( )", 1000);
				} else {
			//alert( "Fertig!" );	
				}
			} catch( exception ) { 
//				alert( "Tick: Fehler!\n" + exception ); 
			}
		}

		this.ZahlEingabe = function( text ) {
			try {
				var jetzt = new Date();
				var aktZeit = jetzt.getTime() / 1000;
				var aktDauer = 0;

				parent.ElementEinAusBlenden( 'Tastatur', false, parent.SpielFrame.document );
				
				if( ! ( this.SuDoKuSpiel && this.SuDoKuSpiel.Spiel ) ) {
//					alert( "Fehler - Zahleingabe: Es ist kein Spiel definiert!" );
					setContent( "id", "ErsterKommentar", "", "Fehler: es ist kein Spiel definiert!", parent.SpielFrame.document );
					return;
				}

				if( parent.AuswahlSpalte != -1 && parent.AuswahlZeile != -1 ) {
					var aktNummer = Number( text );
					if( 1 <= aktNummer && aktNummer <= 9 ) {
						var altNummer = this.SuDoKuSpiel.Spiel.Get( parent.AuswahlZeile, parent.AuswahlSpalte );
						if( (! this.SuDoKuSpiel.Vorgabe ||this.SuDoKuSpiel.Vorgabe.Get( parent.AuswahlZeile, parent.AuswahlSpalte) == '0') ) {
							this.SuDoKuSpiel.Spiel.Set( parent.AuswahlZeile, parent.AuswahlSpalte, String( aktNummer ) );
						}
						if( ! (
							this.SuDoKuSpiel.Spiel.TesteZeile( parent.AuswahlZeile ) && 
							this.SuDoKuSpiel.Spiel.TesteSpalte( parent.AuswahlSpalte ) && 
							this.SuDoKuSpiel.Spiel.TesteUnterfeld( parent.AuswahlZeile, parent.AuswahlSpalte )
						) ) {				
							if( this.SuDoKuParameter.Get( "Parameter", "FehlerSofort" ) ) {
								parent.Fehler++;	
								this.SuDoKuSpiel.Spiel.Set( parent.AuswahlZeile, parent.AuswahlSpalte, altNummer );
								if( spielTimer ) {
									parent.window.clearTimeout( spielTimer );
								}
								soundAbspielen( "fehlersound", 0 );
								var aktFeld = getElement( "id", "Hintergrund", "", parent.SpielFrame.document );
								if( aktFeld ) aktFeld.bgColor	= "#FF0000";
								parent.mussFehlerLoeschen = true;
								spielTimer = parent.window.setTimeout( "parent.Oberflaeche.Tick( )", 500 );
							}
						}
					} else {
							this.SuDoKuSpiel.Spiel.Set( parent.AuswahlZeile, parent.AuswahlSpalte, '0' );
							if( this.SuDoKuSpiel.Vorgabe ) this.SuDoKuSpiel.Vorgabe.Set( parent.AuswahlZeile, parent.AuswahlSpalte, '0' );
					}
				}
				feldAktualisieren( this.SuDoKuSpiel.Spiel, parent.AuswahlZeile, parent.AuswahlSpalte, this.SuDoKuSpiel.Vorgabe );

				var nochOffen = this.SuDoKuSpiel.Spiel.AnzahlLeereFelder( );
				var stunden;
				var minuten;
				var sekunden;
				var stundenText = "";
				var minText = "";
				var sekText = "";
				try {
					aktDauer = Math.floor( aktZeit - parent.StartZeit );
				} catch( e ) {}
				minuten = Math.floor( aktDauer / 60 );
				stunden = Math.floor( minuten / 60 );
				stundenText = stunden.toString( );
				minuten = minuten % 60;
				minText = minuten.toString( );
				if( minText.length == 1 ) minText = "0" + minText;
				sekunden = aktDauer % 60;
				sekText = sekunden.toString( );
				if( sekText.length == 1 ) sekText = "0" + sekText;

				if( parent.StartZeit ) {
					kommentar2 = "Spielzeit: " + stundenText + ":" + minText + ":" + sekText;
				} else {
					kommentar2 = "";
				}
				if( parent.Fehler ) {
					kommentar2 += "   " + parent.Fehler + " Fehler";
				}		
				setContent( "id", "ZweiterKommentar", "", kommentar2, parent.SpielFrame.document );

				if( nochOffen == 0 && this.SuDoKuSpiel.Spiel.Teste( ) ) {
					parent.StoppZeit = aktZeit;
					parent.SpielZeit = aktDauer;
					kommentar1 = "Herzlichen Gl" + ueZeichen + "ckwunsch";
					setContent( "id", "ErsterKommentar", "", kommentar1, parent.SpielFrame.document );
					soundAbspielen( "erfolgsound", 1 );
				} else {
					kommentar1 = "Spielstand " + spielstandIndex + ": noch " + nochOffen + " Felder offen";
					setContent( "id", "ErsterKommentar", "", kommentar1, parent.SpielFrame.document );
					
					spielstandIndex = spielstaende.length;
					spielstandVorherigerDisabled = (spielstandIndex <= 0);
					spielstandSpeichernDisabled = false;
					spielstandNaechsterDisabled = true;

					var button;
					button = getElement( "id", "SpielstandVorherigerButton", "", parent.SpielFrame.document );
					if( button ) button.disabled = spielstandVorherigerDisabled;
					button = getElement( "id", "SpielstandSpeichernButton", "", parent.SpielFrame.document );
					if( button ) button.disabled = spielstandSpeichernDisabled;
					button = getElement( "id", "SpielstandNaechsterButton", "", parent.SpielFrame.document );
					if( button ) button.disabled = spielstandNaechsterDisabled;
				}
			} catch( exception ) { 
//				alert( "ZahlEingabe: Fehler!\n" + exception ); 
				setContent( "id", "ErsterKommentar", "", "Eingabefehler: " + exception , parent.SpielFrame.document );
			}
		}

		var spielEingabe = function( e ) {
			try {
				if( parameterEingabe ) return;
				if( ! e ) {
					if( parent.SpielFrame.window.event ) {
						e = parent.SpielFrame.window.event;
					} else {
						return;
					}
				}
				if( typeof( e.keyCode ) == 'number'  ) {
					Tastencode = e.keyCode;
				} else if( typeof( e.which ) == 'number' ) {
					Tastencode = e.which;
				} else if( typeof( e.charCode ) == 'number'  ) {
					Tastencode = e.charCode;
				} else {
					return;
				}
				text = String.fromCharCode( Tastencode );
			//alert( "test: Tastencode " + Tastencode + " Text " + text );  

				if( Tastencode ) {
					parent.ElementEinAusBlenden( 'Tastatur', false, parent.SpielFrame.document );
					switch( Tastencode ) {
					case 37:  // Links
			//alert( "Eingabe Links!" );	
						if( 0 < parent.AuswahlSpalte && parent.AuswahlSpalte < 9 ) {
							parent.AuswahlSpalte--;
			//alert( "Spalte--  => " + String( parent.AuswahlSpalte ) );
						} else {
							parent.AuswahlSpalte = 8;
			//alert( "Spalte  == " + String( parent.AuswahlSpalte ) );
						}
						if( 0 > parent.AuswahlZeile || parent.AuswahlZeile > 8 ) {
							parent.AuswahlZeile = 0;
						}
						parent.Oberflaeche.FeldAuswahl( parent.AuswahlZeile, parent.AuswahlSpalte );
						return;
					case 38:  // Oben
						if( 0 < parent.AuswahlZeile && parent.AuswahlZeile < 9 ) {
							parent.AuswahlZeile--;
						} else {
							parent.AuswahlZeile = 8;
						}
						if( 0 > parent.AuswahlSpalte || parent.AuswahlSpalte > 8 ) {
							parent.AuswahlSpalte = 0;
						}
						parent.Oberflaeche.FeldAuswahl( parent.AuswahlZeile, parent.AuswahlSpalte );
						return;
					case 39: // Rechts
						if( 0 <= parent.AuswahlSpalte && parent.AuswahlSpalte < 8 ) {
							parent.AuswahlSpalte++;
						} else {
							parent.AuswahlSpalte = 0;
						}
						if( 0 > parent.AuswahlZeile || parent.AuswahlZeile > 8 ) {
							parent.AuswahlZeile = 0;
						}
						parent.Oberflaeche.FeldAuswahl( parent.AuswahlZeile, parent.AuswahlSpalte );
						return;
					case 40: // Unten
						if( 0 <= parent.AuswahlZeile && parent.AuswahlZeile < 8 ) {
							parent.AuswahlZeile++;
						} else {
							parent.AuswahlZeile = 0;
						}
						if( 0 > parent.AuswahlSpalte || parent.AuswahlSpalte > 8 ) {
							parent.AuswahlSpalte = 0;
						}
						parent.Oberflaeche.FeldAuswahl( parent.AuswahlZeile, parent.AuswahlSpalte );
						return;
					case 46: // Delete
						if( parent.AuswahlSpalte != -1 && parent.AuswahlZeile != -1 ) {
							parent.Oberflaeche.SuDoKuSpiel.Spiel.Set( parent.AuswahlZeile, parent.AuswahlSpalte, '0' );
							if( parent.Oberflaeche.SuDoKuSpiel.Vorgabe ) parent.Oberflaeche.SuDoKuSpiel.Vorgabe.Set( parent.AuswahlZeile, parent.AuswahlSpalte, '0' );
							feldAktualisieren( parent.Oberflaeche.SuDoKuSpiel.Spiel, parent.AuswahlZeile, parent.AuswahlSpalte, parent.Oberflaeche.SuDoKuSpiel.Vorgabe );
						}
						return;
					default:
						break;
					}
				}
				parent.Oberflaeche.ZahlEingabe( text );
			} catch( exception ) { 
//				alert( "spielEingabe: Fehler!\n" + exception ); 
				setContent( "id", "ErsterKommentar", "", "Fehler: " + exception, parent.SpielFrame.document );
			}
		}

		var soundAbspielen = function( name, index ) {
			try {
				var sound = getElement( "id", name, "", parent.SpielFrame.document );
				if( ! sound ) { // fuer den lieben FireFox...
					sound = getElement( "tagname", "embed", index, parent.SpielFrame.document );
				}
				if( sound ) {
					//alert( "Sound: " + sound );
					try {
						sound.DoPlay( );
						//alert( "Sound.DoPlay( ) OK!" );
						return; 
					} catch (e) {
					}
					try {
						sound.Play( );
						//alert( "Sound.DoPlay( ) OK!" );
						return; 
					} catch (e) {
					}
				} else {
					alert( "Sound " + name + " nicht gefunden!" );	
				}
			} catch( exception ) { 
//				alert( "soundAbspielen: Fehler!\n" + exception ); 
				setContent( "id", "ErsterKommentar", "", "Fehler: kann Sound nicht abspielen!", parent.SpielFrame.document );
			}
		}

		var feldAktualisieren = function( spiel, zeile, spalte, vorgabe ) {
			try {
				if( zeile == -1 || spalte == -1 ) return;
				var feldFarbe1 = Oberflaeche.SuDoKuParameter.Get( "Optionen", "FeldFarbe1" );
				var feldFarbe2 = Oberflaeche.SuDoKuParameter.Get( "Optionen", "FeldFarbe2" );
				var nameFeld = "Feld" + zeile.toString( ) + spalte.toString( );
				var nameText = nameFeld + "Text";
				var nameFarbe = nameFeld + "Farbe";
				var farbe = ( vorgabe && vorgabe.Get(zeile, spalte ) != '0' ) ? Oberflaeche.SuDoKuParameter.Get( "Optionen", "ZahlFarbeVorgabe" ) : Oberflaeche.SuDoKuParameter.Get( "Optionen", "ZahlFarbe" );
				var font = getElement( "id", nameFarbe, "", parent.SpielFrame.document );
				var feld = getElement( "id", nameFeld, "", parent.SpielFrame.document );
				var aktText = spiel ? spiel.Get( zeile, spalte ) : '0';
				var bgFarbe;
				if( (Math.floor(spalte/3) % 2) == 1 ) {
					if( (Math.floor(zeile/3) % 2) == 1 ) {
						bgFarbe = feldFarbe1;
					} else {
						bgFarbe = feldFarbe2;
					}
				} else {
					if( (Math.floor(zeile/3) % 2 ) != 1 ) {
						bgFarbe = feldFarbe1;
					} else {
						bgFarbe = feldFarbe2;
					}
				}
				if( parent.AuswahlZeile == zeile && parent.AuswahlSpalte == spalte ) {
					bgFarbe = Oberflaeche.SuDoKuParameter.Get( "Optionen", "AuswahlFarbe" );
				}
				if( aktText == '0' ) {
					farbe = bgFarbe;
				}
				if( feld ) feld.bgColor = bgFarbe;
				setContent( "id", nameText, "", leerZeichen + aktText + leerZeichen, parent.SpielFrame.document );
				if( font ) {
					font.color	= farbe;
					font.size = Oberflaeche.SuDoKuParameter.Get( "Optionen", "ZahlSchriftgroesse" );
					font.face = Oberflaeche.SuDoKuParameter.Get( "Optionen", "Schrift" );
				}
			} catch( exception ) { throw( "feldAktualisieren: Fehler!\n" + exception ); }
		}
		
		var alleFelderAktualisieren = function( spiel, vorgabe ) {
			try {
				for( var z = 0; z < 9; z++ ) {
					for( var s = 0; s < 9; s++ ) {
						feldAktualisieren( spiel, z, s, vorgabe );
					}
				}	
			} catch( exception ) { 
//				alert( "alleFelderAktualisieren: Fehler!\n" + exception ); 
				setContent( "id", "ErsterKommentar", "", "Fehler: kann Felder nicht aktualisieren!", parent.SpielFrame.document );
			}
		} // alleFelderAktualisieren

		this._neuesSpiel = function( ) {
			try {
				if( spielerzeugenTimer ) {
					parent.window.clearTimeout( spielerzeugenTimer );
				}
				spielstaende.splice( 0, spielstaende.length );
				
				Oberflaeche.SuDoKuSpiel.NeuesSpiel( 
					Oberflaeche.SuDoKuParameter.Get( "Parameter", "NurEindeutige" ), 
					Oberflaeche.SuDoKuParameter.Get( "Parameter", "MaxLoesungen" ), 
					Oberflaeche.SuDoKuParameter.Get( "Parameter", "MaxSchwierigkeit" ) 
				);
				if( ! ( Oberflaeche.SuDoKuSpiel.Loesungen && Oberflaeche.SuDoKuSpiel.Loesungen.length ) ) {
					setContent( "id", "ErsteKopfZeile", "", "Fehler: Kann kein Spiel berechen!", parent.SpielFrame.document );
					setContent( "id", "ZweiteKopfZeile", "", "", parent.SpielFrame.document );
					return;
				}
				spielstandSpeichernDisabled = false;
				this.SpielstandSetzen( 0 );
				alleFelderAktualisieren( Oberflaeche.SuDoKuSpiel.Spiel,  Oberflaeche.SuDoKuSpiel.Vorgabe );
					
				var jetzt = new Date();
				parent.StartZeit = jetzt.getTime() / 1000;
				this.SpielInfoAnzeige( );
				setContent( "id", "ErsterKommentar", "", "Spielstand: bitte warten...", parent.SpielFrame.document );
				spielTimer = parent.window.setTimeout( "Oberflaeche.Tick( )", 1 );
			} catch( exception ) { // kommt beim IE 7.0 oeffter vor....
//				setContent( "id", "ErsterKommentar", "", "NeuesSpiel: Fehler abgefangen!!! " + exception, parent.SpielFrame.document );
				spielerzeugenTimer = parent.window.setTimeout( "parent.Oberflaeche._neuesSpiel( )", 1 );
			}
		}

		this.NeuesSpiel = function( ) {
			try {
				if( spielTimer ) {
					parent.window.clearTimeout( spielTimer );
				}

				parent.Fehler = 0;
				parent.AuswahlSpalte = -1;
				parent.AuswahlZeile = -1;
				
				ElementEinAusBlenden( 'LoesungenKontrolle', false, parent.SpielFrame.document );
				setContent( "id", "ErsteKopfZeile", "", "Spiel wird berechnet!", parent.SpielFrame.document );
				setContent( "id", "ZweiteKopfZeile", "", "Bitte warten...", parent.SpielFrame.document );
				setContent( "id", "ErsterKommentar", "", "Spielstand: bitte warten...", parent.SpielFrame.document );
				setContent( "id", "ZweiterKommentar", "", "", parent.SpielFrame.document );
				this.SuDoKuSpiel.Leeren( );
				alleFelderAktualisieren( this.SuDoKuSpiel.Spiel,  this.SuDoKuSpiel.Vorgabe );
				spielerzeugenTimer = parent.window.setTimeout( "parent.Oberflaeche._neuesSpiel( )", 1 );
			} catch( exception ) { 
//				alert( "NeuesSpiel: Fehler!\n" + exception ); 
			}
		}

		this.SpielInfoAnzeige = function( ) {
			try {
				if( this.SuDoKuSpiel ) {
					var text = "";
					var sep = "";
					if( this.SuDoKuSpiel.Unloesbar || ! this.SuDoKuSpiel.Loesungen || ! this.SuDoKuSpiel.Loesungen.length ) {
						setContent( "id", "ErsteKopfZeile", "", "Unl" + oeZeichen + "sbar!", parent.SpielFrame.document );
						setContent( "id", "ZweiteKopfZeile", "", leerZeichen, parent.SpielFrame.document );
						setContent( "id", "ErsterKommentar", "", "Es gibt keine L" + oeZeichen + "sung!!!", parent.SpielFrame.document );
					} else {
						if( ! this.SuDoKuSpiel.EindeutigeLoesung ) {
							if( this.SuDoKuSpiel.ZuVieleVerzweigungen || this.SuDoKuSpiel.ZuVieleLoesungen ) {
								text += sep + "L" + oeZeichen + "sungen: > " + (this.SuDoKuSpiel.Loesungen.length - 1); sep = "\n";
							} else {
								text += sep + "L" + oeZeichen + "sungen: " + this.SuDoKuSpiel.Loesungen.length; sep = "\n";
							}
						}
						text += sep + "Schwierigkeitgrad: " + this.SuDoKuSpiel.GetSchwierigkeitText( ); sep = "\n";
						setContent( "id", "ErsteKopfZeile", "", text, parent.SpielFrame.document );
						
						text = ""; sep = "";
						text += sep + "Eindeutige Felder: ";
						if( this.SuDoKuSpiel.MoeglichkeitenMinimal > 0 ) {
							text += "min. " + this.SuDoKuSpiel.MoeglichkeitenMinimal; sep = "\n";
						}
						text += sep + "duchschnittlich " + this.SuDoKuSpiel.MoeglichkeitenDurchschnittlich; sep = "\n";
						if( this.SuDoKuSpiel.ZuVieleVerzweigungen || this.SuDoKuSpiel.ZuVieleLoesungen ) {
							text += sep + "Sackgassen: m" + oeZeichen + "glich"; sep = "\n";
							text += sep + "maximale Tiefe unbekannt"; sep = "\n";
						} else if( this.SuDoKuSpiel.Sackgassen > 0 ) {
							text += sep + "Sackgassen: " + this.SuDoKuSpiel.Sackgassen; sep = "\n";
							text += sep + "maximale Tiefe " + this.SuDoKuSpiel.SackgassenTiefeMaximal; sep = "\n";
						}
						setContent( "id", "ZweiteKopfZeile", "", text, parent.SpielFrame.document );
					}
				} else {
					setContent( "id", "ErsteKopfZeile", "", "", parent.SpielFrame.document );
					setContent( "id", "ZweiteKopfZeile", "", "", parent.SpielFrame.document );
				}
			} catch( exception ) { 
//				alert( "SpielInfoAnzeige: Fehler!\n" + exception ); 
			}
		}

		this.LeeresSpiel = function( ) {
			try {
				if( spielTimer ) {
					parent.window.clearTimeout( spielTimer );
				}
				spielstaende.splice( 0, spielstaende.length );
				parent.StartZeit = 0;
				ElementEinAusBlenden( 'LoesungenKontrolle', false, parent.SpielFrame.document );
				this.SuDoKuSpiel.Leeren( );
				setContent( "id", "ErsteKopfZeile", "", "", parent.SpielFrame.document );
				setContent( "id", "ZweiteKopfZeile", "", "", parent.SpielFrame.document );
				setContent( "id", "ErsterKommentar", "", "Spielstand: bitte Zahlen eingeben", parent.SpielFrame.document );
				setContent( "id", "ZweiterKommentar", "", "", parent.SpielFrame.document );
				this.SpielstandSetzen( );
				alleFelderAktualisieren( this.SuDoKuSpiel.Spiel,  this.SuDoKuSpiel.Vorgabe );
			} catch( exception ) { 
//				alert( "LeeresSpiel: Fehler!\n" + exception ); 
			}
		}

		this._druckDokument = function( ) {
			try {
				if( druckTimer ) {
					parent.window.clearTimeout( druckTimer );
				}

				var druckDokument = "";
				var druckSpalten = 2;
				var druckZeilen = 3;
				var druckHitergrundFarbe = "#ffffff";
				var druckSchrift = "Verdana, Arial, Helvetica, Geneva, sans-serif";
				var druckSchriftGroesse = 4;
				var druckSchriftFarbe = "#000000";
				var druckFeld1Farbe = "#ffffff";
				var druckFeld2Farbe = "#eeeeFF";
				
				var druckfelder = new Array( druckSpalte );
				druckDokument += "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML-Print 1.0//EN\"\n";
				druckDokument += "\"http://www.w3.org/MarkUp/DTD/xhtml-print10.dtd\">\n";
				druckDokument += "<HTML><head><meta name=\"Geschrieben von Andreas Wittich\"><title>SuDoKu</title>";
				druckDokument += "<style type=\"text/css\">;";
				druckDokument += "@page {\n";
				druckDokument += "        size:21.0cm 29.7cm;\n";
				druckDokument += "        margin-top:0.5cm;\n";
				druckDokument += "        margin-bottom:0.5cm;\n";
				druckDokument += "        margin-left:0.5cm;\n";
				druckDokument += "        margin-right:0.5cm\n";
				druckDokument += "}\n"; // ende @page
				druckDokument += "</style>\n";

				druckDokument += "</head><BODY BGCOLOR=\"" + druckHitergrundFarbe + "\" TEXT=\"" + druckSchriftFarbe + "\">";
				druckDokument += "<FONT face=\"" + druckSchrift + "\" size=\"" + druckSchriftGroesse + "\">";
				druckDokument += "<CENTER><div align=\"center\">Sudoku</div>";
				druckDokument += "<TABLE border=\"0\" rules=\none\" cellpadding=\"1\" cellspacing=\"1\">";

				for( var druckZeile = 0; druckZeile < druckZeilen; druckZeile++ ) {
					var sep = "";
					druckDokument += "<TR>";
					for( var druckSpalte = 0; druckSpalte < druckSpalten; druckSpalte++ ) {
						var spiel;
						do {
							try {
								spiel = new SudokuSpiel( 
									this.SuDoKuParameter.Get( "Parameter", "NurEindeutige" ), 
									this.SuDoKuParameter.Get( "Parameter", "MaxLoesungen" ), 
									this.SuDoKuParameter.Get( "Parameter", "MaxSchwierigkeit" ) 
								);
							} catch( exception ) { // kommt beim IE 7.0 oeffter vor...
								spiel = null;
							}
						} while( ! spiel );
						druckfelder[druckSpalte] = spiel.Vorgabe;
						druckDokument += sep + "<TD aligen=\"center\" colspan=" + (9+2) + "><font size=\"1\">";
						druckDokument += spiel.GetSchwierigkeitText( );
						if( ! spiel.EindeutigeLoesung ) {
							if( spiel.ZuVieleVerzweigungen || spiel.ZuVieleLoesungen ) {
								druckDokument +=  " >&nbsp;" + (spiel.Loesungen.length - 1) + "&nbsp;L" + oeZeichen + "sungen";
							} else {
								druckDokument += " " + spiel.Loesungen.length + "&nbsp;L" + oeZeichen + "sungen";
							}
						}
						druckDokument += "</font></TD>";
						if( druckZeile == 0 ) {
							sep = "<TD width=\"50\" rowspan=\"" + String( (druckZeilen * (9+2)) + druckZeilen-1 + (druckZeilen * 2) + druckZeilen) + "\">&nbsp;</TD>";
						}
					}	 
					druckDokument += "</TR>";
					for ( var z=0; z < 9; z++) {
						druckDokument += "<TR>";
						for( var druckSpalte = 0; druckSpalte < druckSpalten; druckSpalte++ ) { 
							for ( var s=0; s < 9; s++) {
								var text = druckfelder[druckSpalte].Get( z, s );
								if( (Math.floor(s/3) % 2) == 1 ) {
									if( (Math.floor(z/3) % 2) == 1 ) {
										farbe = druckFeld1Farbe;
									} else {
										farbe = druckFeld2Farbe;
									}
								} else {
									if( (Math.floor(z/3) % 2 ) != 1 ) {
										farbe = druckFeld1Farbe;
									} else {
										farbe = druckFeld2Farbe;
									}
								}
								if( text == '0' ) {
									text = "&nbsp;&nbsp;";
								}
								druckDokument += "<TD style=\"border-width:1px; border-style:solid;\" bgcolor=\"" + farbe + "\">&nbsp;" + text + "&nbsp;</TD>";
								if( s == 2 || s == 5 ) {
									druckDokument += "<TD width=\"5\"><font size=\"1\">&nbsp;</font></TD>";
								}
							} // for s
						} // for druckSpalten
						druckDokument +='</TR>';
						if(  z == 2 || z == 5 ) {
							druckDokument += "<TR><TD height=\"5\" colspan=\"" + String( (druckSpalten * 9) + druckSpalten-1 + (druckSpalten * 2) ) + "\"><font size=\"1\">&nbsp;</font></TD><TR>";
						}
					} // for z
					if( (druckZeile+1) < druckZeilen ) {
						druckDokument += "<TR><TD height=\"50\" colspan=\"" + String( (druckSpalten * 9) + druckSpalten-1 + (druckSpalten * 2) ) + "\">&nbsp;</TD></TR>";
					}
				} // for druckZeilen
				druckDokument +="</TABLE></font><font size=\"1\">";
				druckDokument +="&copy;Andreas Wittich 2006</font></BODY></HTML>";
				
				druckFenster = parent.ParameterFrame.open( window.location.href, "SuDoKuDrucken", "width=420,height=594,left=0,top=0,dependent=yes,location=no,menubar=no,status=no,toolbar=no,scrollbars=yes");
				try {
					druckFenster.document.open( );
					druckFenster.document.write( druckDokument );
					druckFenster.document.close( );
					druckFenster.focus( );
					druckFenster.print( );
					druckFenster.close( );
				} catch( e ) {
					throw( "Kann Druckfenster nicht oeffnen! - " + e );
				}
				alleFelderAktualisieren( this.SuDoKuSpiel.Spiel,  this.SuDoKuSpiel.Vorgabe );
				this.SpielInfoAnzeige( );
				spielTimer =  parent.window.setTimeout( "parent.Oberflaeche.Tick( )", 1 );
			} catch( exception ) { 
//				alert( "_druckDokument: Fehler!\n" + exception ); 
				setContent( "id", "ErsterKommentar", "", "Fehler: kann Druckfenster nicht oeffnen!", parent.SpielFrame.document );
			}
		} // DruckDokument

		this.DruckDokument = function( ) {
			try {
				if( spielTimer ) {
					parent.window.clearTimeout( spielTimer );
				}

				parent.Fehler = 0;
				parent.AuswahlSpalte = -1;
				parent.AuswahlZeile = -1;
				
				setContent( "id", "ErsteKopfZeile", "", "Druckseite wird berechnet!", parent.SpielFrame.document );
				setContent( "id", "ZweiteKopfZeile", "", "Bitte warten...", parent.SpielFrame.document );
				setContent( "id", "ErsterKommentar", "", "Spielstand: bitte warten...", parent.SpielFrame.document );
				setContent( "id", "ZweiterKommentar", "", "", parent.SpielFrame.document );
				alleFelderAktualisieren( null );
				druckTimer = parent.window.setTimeout( "parent.Oberflaeche._druckDokument( )", 1 );
			} catch( exception ) { 
//				alert( "DruckDokument: Fehler!\n" + exception ); 
			}
		}

		this._loesen = function( ) {
			try {
				var testDokument = "";
				if( spielerloesenTimer ) {
					parent.window.clearTimeout( spielerloesenTimer );
				}
				if( this.SuDoKuParameter.Get( "Parameter", "LoesungsWeg" ) ) {
					testDokument += "<HTML><head><meta name=\"Geschrieben von Andreas Wittich\"><title>SuDoKu-Loesungsweg</title>";
					testDokument += "</head><BODY><CENTER>";
					this.SuDoKuSpiel.Protokoll = "";
				}
				this.SuDoKuSpiel.Loesen( this.SuDoKuParameter.Get( "Parameter", "MaxLoesungen" ), 1000, this.SuDoKuParameter.Get( "Parameter", "LoesungsWeg" ) );
				setContent( "id", "ErsterKommentar", "", "Spielstand " + spielstandIndex + ": gel" + oeZeichen + "st", parent.SpielFrame.document );

				if( this.SuDoKuParameter.Get( "Parameter", "LoesungsWeg" ) ) {
					testDokument += this.SuDoKuSpiel.Protokoll;
					testDokument += "</BODY></HTML>";
					testFenster = parent.ParameterFrame.open( window.location.href, "SuDoKuLoesungsweg", "left=0,top=0,dependent=yes,scrollbars=yes");
					try {
						testFenster.document.open( );
						testFenster.document.write( testDokument );
						testFenster.document.close( );
						testFenster.focus( );
					} catch( e ) {
						setContent( "id", "ErsterKommentar", "", "Fehler: kann L" + oeZeichen + "sungsfenster nicht " + oeZeichen + "ffnen", parent.SpielFrame.document );
					}
				}
				
				if( this.SuDoKuSpiel.Loesungen && this.SuDoKuSpiel.Loesungen.length ) {
					loesungsIndex = 0;
					if( ! this.SuDoKuSpiel.EindeutigeLoesung ) {
						var loesungsText;
						if( this.SuDoKuSpiel.ZuVieleVerzweigungen || this.SuDoKuSpiel.ZuVieleLoesungen ) {
							loesungsText = "L" + oeZeichen + "sung " + String( loesungsIndex + 1 ) + " von " + ueZeichen + "ber " + (this.SuDoKuSpiel.Loesungen.length - 1);
						} else {
							loesungsText = "L" + oeZeichen + "sung " + String( loesungsIndex + 1) + " von " + this.SuDoKuSpiel.Loesungen.length;
						}
						setContent( "id", "LoesungText", "", loesungsText, parent.SpielFrame.document )						
						ElementEinAusBlenden( 'LoesungenKontrolle', true, parent.SpielFrame.document )
					}
					this.SuDoKuSpiel.Spiel = new SudokuFeld( this.SuDoKuSpiel.Loesungen[loesungsIndex] );
					alleFelderAktualisieren( this.SuDoKuSpiel.Spiel,  this.SuDoKuSpiel.Vorgabe );
					spielstandSpeichernDisabled = false;
					this.SpielstandSetzen( 0 );
				}
				this.SpielInfoAnzeige( );
			} catch( exception ) { 
//				alert( "_loesen: Fehler!\n" + exception ); 
			}
		}

		this.Loesen = function( ) {
			try {		
				if( spielTimer ) {
					parent.window.clearTimeout( spielTimer );
				}
				parent.StartZeit = 0;
				setContent( "id", "ErsterKommentar", "", "Spielstand: bitte warten...", parent.SpielFrame.document );
				setContent( "id", "ZweiterKommentar", "", "", parent.SpielFrame.document );
				if( ! this.SuDoKuSpiel.Spiel.Teste( ) ) {
					setContent( "id", "ErsterKommentar", "", "Spielstand: Die Vorgabe ist fehlerhaft!", parent.SpielFrame.document );
					return;
				} 
				this.SpielstandSetzen( 0 );
				this.SuDoKuSpiel.Vorgabe = new SudokuFeld( this.SuDoKuSpiel.Spiel );
				setContent( "id", "ErsteKopfZeile", "", "Spiel wird gel" + oeZeichen + "st!", parent.SpielFrame.document );
				setContent( "id", "ZweiteKopfZeile", "", "Bitte warten...", parent.SpielFrame.document );
				spielerloesenTimer = parent.window.setTimeout( "parent.Oberflaeche._loesen( )", 1 );
			} catch( exception ) { 
//				alert( "Loesen: Fehler!\n" + exception ); 
			}
		}
/*** ALT
		var wennMouseKlick = function( e ) {
			//alert( "wennMouseKlick" );
			try {
				if( ! mouseIstImSpielfeld ) {
alert( "wennMouseKlick: Nicht im Spielfeld!" );
					return;
				}

				if( ! e ) {
					if( parent.SpielFrame.window.event ) {
						e = parent.SpielFrame.window.event;
					} else {
alert( "wennMouseKlick: Kein Event!" );
						return;
					}
				}
				var x = e.pageX ? e.pageX : e.clientX;
				var y = e.pageY ? e.pageY : e.clientY;
				var tasten = getElement( "id", "Tastatur", "", parent.SpielFrame.document );
				var input = getElement( "id", "ZahlInput", "", parent.SpielFrame.document );
				
				if( ! parent.ElementSichtbar( 'Tastatur', parent.SpielFrame.document ) ) {
					tasten.style.left = x - 49;
					tasten.style.top = y - 49;
					parent.ElementEinAusBlenden( tasten, true );
					alert( "wennMouseKlick: Tastatur einblenden: X " + tasten.style.left + " y " + tasten.style.top ); 
					try {
						tasten.focus( ); // nur fuer Opera
					} catch ( e ) { };
					if( input ) input.focus( );
				} else {
					tasten.style.left = x -1; // + 3; //- 12;
					tasten.style.top = y - 60;
					alert( "wennMouseKlick: Tastatur neue Position: X " + tasten.style.left + " y " + tasten.style.top ); 
				}
			} catch( exception ) { 
				alert( "wennMouseKlick: Fehler!\n" + exception ); 
			}
		}
***/		
		this.TastaturAnzeigen = function( sender ) {
			//alert( "TastaturAnzeigen: Sender " + sender + " Top " + sender.offsetTop + "Left" + sender.offsetLeft );
			try {
				var tasten = getElement( "id", "Tastatur", "", parent.SpielFrame.document );
				var input = getElement( "id", "ZahlInput", "", parent.SpielFrame.document );
				var tabelle = getElement( "id", "Tabelle", "", parent.SpielFrame.document );
				var x = tabelle.offsetLeft + sender.offsetLeft;
				var y = tabelle.offsetTop + sender.offsetTop;
				
				tasten.style.left = x - 49;
				tasten.style.top = y - 49;
				parent.ElementEinAusBlenden( tasten, true );
				//alert( "TastaturAnzeigen: Tastatur einblenden: X " + tasten.style.left + " y " + tasten.style.top ); 
				try {
					tasten.focus( ); // nur fuer Opera
				} catch ( e ) { };
				if( input ) input.focus( );

			} catch( exception ) { 
				alert( "TastaturAnzeigen: Fehler!\n" + exception ); 
			}
		}
		this.FeldAuswahl = function( z, s, sender ) {
//			alert( "FeldAuswahl: z " + z + " s " + s );
			try {
				parent.AuswahlZeile = z;
				parent.AuswahlSpalte = s;
				if( altZeile != -1 && altSpalte != -1 ) {
					feldAktualisieren( this.SuDoKuSpiel.Spiel, altZeile, altSpalte, this.SuDoKuSpiel.Vorgabe );
				}
				altZeile = z;
				altSpalte = s;
				feldAktualisieren( this.SuDoKuSpiel.Spiel, z, s, this.SuDoKuSpiel.Vorgabe );
				var tasten = getElement( "id", "Tastatur", "", parent.SpielFrame.document );
//alert( "FeldAuswahl tasten = " + tasten );
				var input = getElement( "id", "ZahlInput", "", parent.SpielFrame.document );
				try {
					tasten.focus( ); // nur fuer Opera
					if( input ) input.focus( );
				} catch ( e ) { };
				if( sender ) {
					this.TastaturAnzeigen( sender );
				}
			} catch( exception ) { 
				alert( "FeldAuswahl: Fehler!\n" + exception ); 
			}
		}
		
		this.MouseUeberSpielfeld = function( neu ) {
			try {
				if( neu != null ) {
					if( neu ) parent.ElementEinAusBlenden( 'Tastatur', false, parent.SpielFrame.document );
					mouseIstImSpielfeld = neu;
				}
				return mouseIstImSpielfeld;
			} catch( exception ) { 
//				alert( "MouseUeberSpielfeld: Fehler!\n" + exception ); 
			}
		}

		this.SpielstandSetzen = function( parameter ) {
			var button;
			if( parameter == -1 && spielstandIndex > 0 ) {
				if( ! spielstandSpeichernDisabled && spielstandIndex >= spielstaende.length ) {
					this.SpielstandSetzen( 0 );
					spielstandIndex--;
				}
				if( spielstandIndex > 0 ) spielstandIndex--;
				this.SuDoKuSpiel.Spiel = new SudokuFeld( spielstaende[spielstandIndex] );
				alleFelderAktualisieren( this.SuDoKuSpiel.Spiel,  this.SuDoKuSpiel.Vorgabe );
			} else if( parameter == 1 && spielstandIndex < (spielstaende.length - 1) ) {
				spielstandIndex++;
				this.SuDoKuSpiel.Spiel = new SudokuFeld( spielstaende[spielstandIndex] );
				alleFelderAktualisieren( this.SuDoKuSpiel.Spiel,  this.SuDoKuSpiel.Vorgabe );
			} else if( parameter == 0 && ! spielstandSpeichernDisabled ) {
				spielstandIndex = spielstaende.length;
				spielstaende[spielstandIndex] = new SudokuFeld( this.SuDoKuSpiel.Spiel );
			}

			spielstandVorherigerDisabled = ! ( spielstandIndex > 0 );
			spielstandSpeichernDisabled = true;
			spielstandNaechsterDisabled = ! ( spielstandIndex < (spielstaende.length - 1) );

			try {
				var	nochOffen = this.SuDoKuSpiel.Spiel.AnzahlLeereFelder( );
				if( nochOffen > 0 ) {
					var kommentar1 = "Spielstand " + spielstandIndex + ": noch " + nochOffen + " Felder offen";
					setContent( "id", "ErsterKommentar", "", kommentar1, parent.SpielFrame.document );
				} else {
					setContent( "id", "ErsterKommentar", "", "Spielstand " + spielstandIndex + ": gel" + oeZeichen + "st", parent.SpielFrame.document );
				}
			} catch( e ) {}

			button = getElement( "id", "SpielstandVorherigerButton", "", parent.SpielFrame.document );
			if( button ) button.disabled = spielstandVorherigerDisabled;
			button = getElement( "id", "SpielstandSpeichernButton", "", parent.SpielFrame.document );
			if( button ) button.disabled = spielstandSpeichernDisabled;
			button = getElement( "id", "SpielstandNaechsterButton", "", parent.SpielFrame.document );
			if( button ) button.disabled = spielstandNaechsterDisabled;
		}

		this.LoesungSetzen = function( parameter ) {
			if( ! ( this.SuDoKuSpiel.Loesungen.length && this.SuDoKuSpiel.Loesungen.length ) ) {
				ElementEinAusBlenden( 'LoesungenKontrolle', false, parent.SpielFrame.document );
				return;
			}
			if( parameter == -1 ) loesungsIndex--;
			else if( parameter == 1 ) loesungsIndex++;
			if( loesungsIndex >= this.SuDoKuSpiel.Loesungen.length ) loesungsIndex = 0;
			else if( loesungsIndex < 0 ) loesungsIndex = this.SuDoKuSpiel.Loesungen.length - 1;
			
			var loesungsText;
			if( this.SuDoKuSpiel.ZuVieleVerzweigungen || this.SuDoKuSpiel.ZuVieleLoesungen ) {
				loesungsText = "L" + oeZeichen + "sung " + String( loesungsIndex + 1 ) + " von " + ueZeichen + "ber " + (this.SuDoKuSpiel.Loesungen.length - 1);
			} else {
				loesungsText = "L" + oeZeichen + "sung " + String( loesungsIndex + 1 ) + " von " + this.SuDoKuSpiel.Loesungen.length;
			}
			setContent( "id", "LoesungText", "", loesungsText, parent.SpielFrame.document )						
			alleFelderAktualisieren( this.SuDoKuSpiel.Loesungen[loesungsIndex],  this.SuDoKuSpiel.Vorgabe );
		}
		
		// Konstruktor
		var neuDokument = "";
		Oberflaeche = this;
		
		neuDokument += "<html><head><meta name=\"Geschrieben von Andreas Wittich\"><title>SuDoKu</title>";
		neuDokument += "<meta http-equiv=\"expires\" content=\"0\">";
		neuDokument += "<" + "script language=\"JavaScript\" src=\"Sudoku.js\" >" + "<" + "/script>";
		neuDokument += "<STYLE type=text/css>\n";
		neuDokument += ".ZahlSelectStyle { font-size:12px; width:22px; border-style:solid; border-width:1px; }\n";
		neuDokument += "a.nummern:link { text-decoration:none; font-weight:normal; color:gray; font-size:19px;}\n";
		neuDokument += "a.nummern:visited { text-decoration:none; font-weight:normal; color:gray; font-size:19px;}\n";
		neuDokument += "a.nummern:hover { text-decoration:none; font-weight:bold; color:red; font-size:30px; }\n";
		neuDokument += "a.nummern:active { text-decoration:none; font-weight:bold; color:green; font-size:30px;}\n";
		neuDokument += "a.nummern:focus { text-decoration:none; font-weight:normal; color:gray; font-size:19px;}\n";
		neuDokument += "button { width:90px; color:blue; font-size:12px;}\n";
		neuDokument += "button.klein { width:20px; color:blue; font-size:12px;}\n";
		neuDokument += "</STYLE>";
		
		neuDokument += "</head>";
		neuDokument += "<body topmargin=\"0\" id=\"Hintergrund\" vlink=\"#00ccff\" alink=\"#55ccff\" link=\"#00ffff\" BGCOLOR=\"" + this.SuDoKuParameter.Get( "Optionen", "HintergrundFarbe" ) + "\" TEXT=\"" + this.SuDoKuParameter.Get( "Optionen", "TextFarbe" ) + "\"><center>";
		
	/// neuDokument += this.SuDoKuParameter.GetHTMLText( ) +  "<BR>";
			
		neuDokument += "<DIV style=\"position:absolute; bottom:20px; right:20px;\"><font size=\"1\"><a href=\"http://www.andreaswittich.de/\" target=\"_blank\">&copy;Andreas Wittich</a></font></DIV>";
		neuDokument += "<font id=\"TextFont\" face=\"" + this.SuDoKuParameter.Get( "Optionen", "Schrift" ) + "\"><BR>";
		if( layout == 0 ) {
			neuDokument += "<a href=\"JavaScript:parent.ElementEinAusBlenden( 'ParameterContainer', null, parent.SpielFrame.document )\"  >Parameter</a> | ";
			neuDokument += "<a href=\"JavaScript:parent.Oberflaeche.NeuesSpiel( )\">Neues Spiel</a> | ";
			neuDokument += "<a href=\"JavaScript:parent.Oberflaeche.LeeresSpiel( )\">Leeres Spiel</a> | ";
			neuDokument += "<a href=\"JavaScript:parent.Oberflaeche.Loesen( )\">L&ouml;sen</a> | ";
			neuDokument += "<a href=\"JavaScript:parent.Oberflaeche.DruckDokument( )\">Drucken</a> | ";
			neuDokument += "<a href=\"JavaScript:parent.ElementEinAusBlenden( 'OptionenContainer', null, parent.SpielFrame.document )\"  >Optionen</a>";
		} else {
			neuDokument += "<button type=\"button\" onClick=\"parent.ElementEinAusBlenden( 'ParameterContainer', null, parent.SpielFrame.document )\" ID=\"ParameterButton\">Parameter</button>&nbsp; ";
			neuDokument += "<button type=\"button\" onClick=\"parent.Oberflaeche.NeuesSpiel( )\" ID=\"NeuesSpielButton\">Neues Spiel</button>&nbsp; ";
			neuDokument += "<button type=\"button\" onClick=\"parent.Oberflaeche.LeeresSpiel( )\" ID=\"LeeresSpielButton\">Leeres Spiel</button>&nbsp; ";
			neuDokument += "<button type=\"button\" onClick=\"parent.Oberflaeche.Loesen( )\" ID=\"LoesenButton\">L&ouml;sen</button>&nbsp; ";
			neuDokument += "<button type=\"button\" onClick=\"parent.Oberflaeche.DruckDokument( )\" ID=\"DruckDokumentButton\">Drucken</button>&nbsp; ";
			neuDokument += "<button type=\"button\" onClick=\"parent.ElementEinAusBlenden( 'OptionenContainer', null, parent.SpielFrame.document )\" ID=\"OptionenButton\">Optionen</button> ";
		
		}
		neuDokument += "<BR><BR>";
		neuDokument += "<font face=\"Tahoma\" size=24><B>SuDoKu</B></font>";

		neuDokument += erzeugeSpielFeld( this.SuDoKuParameter.Get( "Optionen", "FeldFarbe1" ), this.SuDoKuParameter.Get( "Optionen", "FeldFarbe2" ) );
		neuDokument += erzeugeParameterForm( );
		neuDokument += erzeugeOptionenForm( );
//		neuDokument += erzeugeTastaturForm( );
		// Quick Time spielt nicht mit, wenn embed hidden="true" !!!! hidden=\"true\"
		neuDokument += "<embed id=\"fehlersound\" name=\"fehlersound\" src=\"Sound/fehler.wav\" autostart=\"false\" loop=\"false\" height=\"0\" width=\"0\" enablejavascript=\"true\">";
		neuDokument += "<embed id=\"erfolgsound\" name=\"erfolgsound\" src=\"Sound/erfolg.wav\" autostart=\"false\" loop=\"false\" height=\"0\" width=\"0\" enablejavascript=\"true\">";


		neuDokument += "</center></font></body></html>";

		parent.SpielFrame.document.open( );
		parent.SpielFrame.document.write( neuDokument );
		parent.SpielFrame.document.close( );

		parent.SpielFrame.focus( );
		parent.SpielFrame.document.onkeyup = spielEingabe;
//		parent.SpielFrame.document.onmousedown = wennMouseKlick;
		
		spielTimer = parent.window.setTimeout( "parent.Oberflaeche.NeuesSpiel( )", 2000);

	} catch( exception ) { alert( "SodukuSpielOberflaeche: Fehler!\n" + exception ); }
}

/// *************************************** Ende Sudoku Oberflaeche ****************************************************** ///

