﻿/******************************************************/
/* Game Lib � by www.Webdicksign.de                   */
/* get API on http://api.inodesign.de               */
/******************************************************/

var numbers = new Array(81);
var mem = new Array(81);
var area = new Array(81);
var options = new Array(81);
var ftype = new Array(81);
var ftypemem = new Array(81);
var colorname = new Array('#000','#005','#050','#050','#500');
var firstmem = false;
var csim = 0;
var cext = 0;
var cbru = 0;
var mcsim = 0;
var mcext = 0;
var mcbru = 0;
var call = 0;
var wrong = false;
var brute = false;
var debug = true;
var linenumber;
var console;
var starttime;

var mirrorobj = new Array(
	'empty.png',
	'mirror_bl_tr.png',
	'mirror_tl_br.png',
	'cross.png'
);
var mirrorx = -1;
var mirrory = -1;
var mirrorw = 0;
var mirrordraw = 0;
var mirrorl = new Array();
var mirrorcount = 0;
var mirrorhit = 0;
var mirrorstage;

function trim(str, chars) {
	return ltrim(rtrim(str, chars), chars);
}
 
function ltrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}
 
function rtrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}

function sudokuconsole(text) {
	if ($('startbtn').disabled == false) {
		window.location.reload();
		$('startbtn').disabled = true;
	}
	try {
		if (debug) {
			var cprint = '';
			var tm = new Date();		
			if (linenumber > 16) console.shift();
			console.push(linenumber++ + ": " + text);
			for (c = 0; c < 16; c++) if (console[c]) cprint += '<br />' + console[c]; else cprint +='<br />';
			$('console').innerHTML = 'Was Sudoku force gerade macht:' +
			cprint +
			'<br />' +
			'<span style="font-size:8px;">' +
			'Logik: <span style="color:' +
				(csim >= cext && csim >= cbru ? '#0f0' :
					(csim >= cext || csim >= cbru ? 'yellow' : 'red')
				) + '">' + csim + '</span> | ' +
			'Ausschluss Logik:  <span style="color:' +
				(cext >= csim && cext >= cbru ? '#0f0' :
					(cext >= csim || cext >= cbru ? 'yellow' : 'red')
				) + '">' + cext + '</span> | ' +
			'Geraten: <span style="color:' +
				(cbru >= csim && cbru >= cext ? '#0f0' :
					(cbru >= csim || cbru >= cext ? 'yellow' : 'red')
				) + '">' + cbru + '</span><br />Gesamt: ' +
			(call) + ' / 81 | ' +
			'Dauer: ' + Math.round((tm.getTime() - starttime)/1000) + ' sek' +
			'</span>';
		}
	} catch(err) {
		numbers = new Array(81);
		mem = new Array(81);
		area = new Array(81);
		options = new Array(81);
		wrong = false;
		brute = false;
		debug = true;
		linenumber = 1;
		console = new Array();
		starttime = 0;
	}
}

function sudokumem() {
	try {
		sudokuconsole('Letzten logischen Stand gemerkt.');
		var ofield;
		var oarea;
		mcsim = csim;
		mcext = cext;
		mcbru = cbru;

		ofield = $('sudokufield').childNodes;
		var pos = 0;
		
		for (i = 0; i < ofield.length; i++) {
			var tmp = ofield[i];
			var attr;

			try {
				attr = tmp.getAttribute('name');
			} catch(err) {
				attr = false;
			}
			if (attr === 'area') {
				oarea = tmp.childNodes;
				for (j = 0; j < oarea.length; j++) {
					var tmpa = oarea[j];
					var attra;
					
					try {
						attra = tmpa.getAttribute('name');
					} catch(err) {
						attra = false;
					}
					if (attra === 'box') {
						mem[pos] = parseInt(tmpa.value);
						ftypemem[pos] = ftype[pos];
						pos++;
					}
				}
			}
		}
	} catch(err) {
		numbers = new Array(81);
		mem = new Array(81);
		area = new Array(81);
		options = new Array(81);
		wrong = false;
		brute = false;
		debug = true;
		linenumber = 1;
		console = new Array();
		starttime = 0;
	}
}

function sudokures() {
	try {
		csim = mcsim;
		cext = mcext;
		cbru = mcbru;
		wrong = false;
		sudokuconsole('Letzten logischen Stand wiederhergestellt.');
		var ofield;
		var oarea;
		ofield = $('sudokufield').childNodes;
		var pos = 0;
		
		for (i = 0; i < 81; i++) ftype[i] = 0;
		
		for (i = 0; i < ofield.length; i++) {
			var tmp = ofield[i];
			var attr;

			try {
				attr = tmp.getAttribute('name');
			} catch(err) {
				attr = false;
			}
			if (attr === 'area') {
				oarea = tmp.childNodes;
				for (j = 0; j < oarea.length; j++) {
					var tmpa = oarea[j];
					var attra;

					try {
						attra = tmpa.getAttribute('name');
					} catch(err) {
						attra = false;
					}
					if (attra === 'box') {
						if (mem[pos] > 0) {
							tmpa.value = mem[pos];
							ftype[pos] = ftypemem[pos]
						} else {
							tmpa.value = '';
							tmpa.disabled = false;
							tmpa.style.border = "1px solid #ff0";
						}
						pos++;
					}
				}
			}
		}
	} catch(err) {
		numbers = new Array(81);
		mem = new Array(81);
		area = new Array(81);
		options = new Array(81);
		wrong = false;
		brute = false;
		debug = true;
		linenumber = 1;
		console = new Array();
		starttime = 0;
	}
}

function sudokuforce() {
	if (firstmem == false) {
		firstmem = true;
		sudokumem();
	}
	try {
		sudokuconsole('<span style="color: #ff0;">Lese Feld neu ein.</span>');
		var ofield;
		var oarea;
		ofield = $('sudokufield').childNodes;
		var pos = 0;
		call = 0;
		
		for (i = 0; i < ofield.length; i++) {
			var tmp = ofield[i];
			var attr;

			try {
				attr = tmp.getAttribute('name');
			} catch(err) {
				attr = false;
			}
			if (attr === 'area') {
				oarea = tmp.childNodes;
				for (j = 0; j < oarea.length; j++) {
					var tmpa = oarea[j];
					var attra;

					try {
						attra = tmpa.getAttribute('name');
					} catch(err) {
						attra = false;
					}
					if (attra === 'box') {
						area[pos] = tmpa;
						numbers[pos] = parseInt(tmpa.value);
						tmpa.disabled = true
						if (parseInt(tmpa.value) > 0) {
							if (!ftype[pos]) ftype[pos] = 1;
							call++;
							tmpa.style.border = '1px solid ' + colorname[ftype[pos]];
						} else {
							tmpa.style.border = '1px solid #ff0';
						}
						tmpa.style.backgroundColor = colorname[ftype[pos]];
						pos++;
					}
				}
			}
		}
		
		for (f = 0; f < 81; f++) {
			// Kontrolle Kasten
			var count = 0;
			for (s = 0; s < 9; s++) {
				var fieldpos = f-(f%9)+s;
				var actnr = parseInt(numbers[fieldpos])-1;
				if (actnr >= 0) count++;
			}
			if (count == 9) {
				for (s = 0; s < 9; s++) {
					var fieldpos = f-(f%9)+s;
					area[fieldpos].style.border = '1px solid #0f0';
				}	
			}
			
			// Suche Horizontal
			count = 0;
			for (s = 0; s < 9; s++) {
				if (f < 9  && f >= 0) b = 0;
				if (f < 18 && f >= 9) b = 9;
				if (f < 27 && f >= 18) b = 18;
				if (f < 36 && f >= 27) b = 0;
				if (f < 45 && f >= 36) b = 9;
				if (f < 54 && f >= 45) b = 18;
				if (f < 63 && f >= 54) b = 0;
				if (f < 72 && f >= 63) b = 9;
				if (f < 81 && f >= 72) b = 18;
				if (s < 9) sb = s-6+18;
				if (s < 6) sb = s-3+9;
				if (s < 3) sb = s;
				var fieldpos = f-(f%3)-b+sb;
				var actnr = parseInt(numbers[fieldpos])-1;
				if (actnr >= 0) count++;
			}
			if (count == 9) {
				for (s = 0; s < 9; s++) {
					if (f < 9  && f >= 0) b = 0;
					if (f < 18 && f >= 9) b = 9;
					if (f < 27 && f >= 18) b = 18;
					if (f < 36 && f >= 27) b = 0;
					if (f < 45 && f >= 36) b = 9;
					if (f < 54 && f >= 45) b = 18;
					if (f < 63 && f >= 54) b = 0;
					if (f < 72 && f >= 63) b = 9;
					if (f < 81 && f >= 72) b = 18;
					if (s < 9) sb = s-6+18;
					if (s < 6) sb = s-3+9;
					if (s < 3) sb = s;
					var fieldpos = f-(f%3)-b+sb;
					area[fieldpos].style.border = '1px solid #0f0';
				}	
			}
			
			// Suche Vertikal
			count = 0;
			for (s = 0; s < 9; s++) {
				if (f < 9  && f >= 0) b = 0;
				if (f < 18 && f >= 9) b = 9;
				if (f < 27 && f >= 18) b = 18;
				if (f < 36 && f >= 27) b = 0;
				if (f < 45 && f >= 36) b = 9;
				if (f < 54 && f >= 45) b = 18;
				if (f < 63 && f >= 54) b = 0;
				if (f < 72 && f >= 63) b = 9;
				if (f < 81 && f >= 72) b = 18;
				if (s < 9) sb = (s-6)*3+54;
				if (s < 6) sb = (s-3)*3+27;
				if (s < 3) sb = s*3;
				var fieldpos = b+(f%3)+sb;
				var actnr = parseInt(numbers[fieldpos])-1;
				if (actnr >= 0) count++;
			}
			if (count == 9) {
				for (s = 0; s < 9; s++) {
					if (f < 9  && f >= 0) b = 0;
					if (f < 18 && f >= 9) b = 9;
					if (f < 27 && f >= 18) b = 18;
					if (f < 36 && f >= 27) b = 0;
					if (f < 45 && f >= 36) b = 9;
					if (f < 54 && f >= 45) b = 18;
					if (f < 63 && f >= 54) b = 0;
					if (f < 72 && f >= 63) b = 9;
					if (f < 81 && f >= 72) b = 18;
					if (s < 9) sb = (s-6)*3+54;
					if (s < 6) sb = (s-3)*3+27;
					if (s < 3) sb = s*3;
					var fieldpos = b+(f%3)+sb;
					area[fieldpos].style.border = '1px solid #0f0';
				}	
			}
		}
		if (sudokucheck()) {
			var tm = new Date();
			sudokuconsole('<blink style="color: #0f0;">Sudoku innerhalb ' + Math.round((tm.getTime() - starttime)/1000) + ' Sekunden gel&ouml;st!</blink>');
		} else {
			window.setTimeout('sudokusimplelogic();',1);
		}
	} catch(err) {
		numbers = new Array(81);
		mem = new Array(81);
		area = new Array(81);
		options = new Array(81);
		wrong = false;
		brute = false;
		debug = true;
		linenumber = 1;
		console = new Array();
		starttime = 0;
	}
}

function sudokuoptions() {
	try {
		for (f = 0; f < 81; f++) {
			if (numbers[f] >= 0) continue;
			if (parseInt(area[f].value) > 0) continue;
			var tmp = false;
			for (i = 0; i < 9; i++) {
				if (!options[f][i]) {
					tmp = true;
					break;
				}
			}
			if (!tmp) {
				sudokuconsole('<span style="color: #ff0;">L&ouml;sungsfehler!!!</span>');
				area[f].style.border = '1px solid #f00';
				wrong = true;
			}
		}
	} catch(err) {
		numbers = new Array(81);
		mem = new Array(81);
		area = new Array(81);
		options = new Array(81);
		wrong = false;
		brute = false;
		debug = true;
		linenumber = 1;
		console = new Array();
		starttime = 0;
	}
}

function sudokucheck() {
	try {
		var num = 0;
		for (f = 0; f < 81; f++) {
			if (numbers[f] > 0) num++;
		}
		return (num == 81);
	} catch(err) {
		numbers = new Array(81);
		mem = new Array(81);
		area = new Array(81);
		options = new Array(81);
		wrong = false;
		brute = false;
		debug = true;
		linenumber = 1;
		console = new Array();
		starttime = 0;
	}
}

function sudokusimplelogic() {
	try {
		var newnumber = 0;
		// Suche Zahlen
		for (f = 0; f < 81; f++) {
			options[f] =  new Array(false,false,false,
									false,false,false,
									false,false,false
			);
			if (numbers[f] > 0) continue;
			
			// Suche Kasten
			for (s = 0; s < 9; s++) {
				var fieldpos = f-(f%9)+s;
				var actnr = parseInt(numbers[fieldpos])-1;
				if (actnr >= 0) options[f][actnr] = true;
			}
			
			// Suche Horizontal
			for (s = 0; s < 9; s++) {
				if (f < 9  && f >= 0) b = 0;
				if (f < 18 && f >= 9) b = 9;
				if (f < 27 && f >= 18) b = 18;
				if (f < 36 && f >= 27) b = 0;
				if (f < 45 && f >= 36) b = 9;
				if (f < 54 && f >= 45) b = 18;
				if (f < 63 && f >= 54) b = 0;
				if (f < 72 && f >= 63) b = 9;
				if (f < 81 && f >= 72) b = 18;
				if (s < 9) sb = s-6+18;
				if (s < 6) sb = s-3+9;
				if (s < 3) sb = s;
				var fieldpos = f-(f%3)-b+sb;
				var actnr = parseInt(numbers[fieldpos])-1;
				if (actnr >= 0) options[f][actnr] = true;
			}
			
			// Suche Vertikal
			for (s = 0; s < 9; s++) {
				if (f < 9  && f >= 0) b = 0;
				if (f < 18 && f >= 9) b = 9;
				if (f < 27 && f >= 18) b = 18;
				if (f < 36 && f >= 27) b = 0;
				if (f < 45 && f >= 36) b = 9;
				if (f < 54 && f >= 45) b = 18;
				if (f < 63 && f >= 54) b = 0;
				if (f < 72 && f >= 63) b = 9;
				if (f < 81 && f >= 72) b = 18;
				if (s < 9) sb = (s-6)*3+54;
				if (s < 6) sb = (s-3)*3+27;
				if (s < 3) sb = s*3;
				var fieldpos = b+(f%3)+sb;
				var actnr = parseInt(numbers[fieldpos])-1;
				if (actnr >= 0) options[f][actnr] = true;
			}
			
			count = 0;
			for (i = 0; i < 9; i++) {
				if (!options[f][i]) {
					count++;
				}
			}
			if (count === 1) {
				for (i = 0; i < 9; i++) {
					if (!options[f][i]) {
						numbers[f] = i+1;
						area[f].value = i+1;
						area[f].style.border = '1px solid #fff';
						area[f].disabled = true;
						if (!ftype[f]) ftype[f] = 2;
						newnumber++;
						csim++;
					}
				}
			}
		}
		if (newnumber > 0) {
			sudokuconsole('<span style="color: #0f0;">Einfache Logik: ' + newnumber + ' Zahl' + (newnumber != 1 ? 'en' : '') + '.</span>');
			window.setTimeout('sudokuforce();',1);
		} else {
			sudokuconsole('<span style="color: #f00;">Einfache Logik: keine neue Zahl gefunden!</span>');
			window.setTimeout('sudokuoptions();',1);
			window.setTimeout('sudokuexclusionlogic();',1);
		}
	} catch(err) {
		numbers = new Array(81);
		mem = new Array(81);
		area = new Array(81);
		options = new Array(81);
		wrong = false;
		brute = false;
		debug = true;
		linenumber = 1;
		console = new Array();
		starttime = 0;
	}
}

function sudokuexclusionlogic() {
	try {
		var newnumber = 0;
		// Suche Zahlen
		for (f = 0; f < 81; f++) {
			if (numbers[f] > 0) continue;
			
			for (o = 0; o < 9; o++) {
				if (options[f][o] == true) continue;
				// Suche Kasten
				var ncount = 0;
				for (s = 0; s < 9; s++) {
					var fieldpos = f-(f%9)+s;
					var actnr = parseInt(numbers[fieldpos])-1;
					if (!(actnr >= 0)) {
						if (options[fieldpos][o] == false) ncount++;
					}
				}
				if (ncount === 1) {
					numbers[f] = o+1;
					options[f][o] = true;
					area[f].value = o+1;
					area[f].style.border = '1px solid #fff';
					area[f].disabled = true;
					if (!ftype[f]) ftype[f] = 3;
					newnumber++;
					cext++;
					break;
				}
			}
		}
		if (newnumber > 0) {
			sudokuconsole('<span style="color: #0f0;">Ausschluss Logik: ' + newnumber + ' Zahl' + (newnumber != 1 ? 'en' : '') + '.</span>');
			window.setTimeout('sudokuforce();',1);
		} else {
			sudokuconsole('<span style="color: #f00;">Ausschluss Logik: keine neue Zahl gefunden!</span>');
			window.setTimeout('sudokuoptions();',1);
			if (sudokucheck()) {
				var tm = new Date();
				sudokuconsole('<blink style="color: #0f0;">Sudoku innerhalb ' + Math.round((tm.getTime() - starttime)/1000) + ' Sekunden gel&ouml;st!</blink>');
			} else {
				if (wrong) {
					window.setTimeout('sudokures();',1);
					window.setTimeout('sudokuforce();',1);
					return false;
				}
				else if (!brute) {
					window.setTimeout('sudokumem();',1);
				}
				window.setTimeout('sudokubrute();',1);
			}
		}
	} catch(err) {
		numbers = new Array(81);
		mem = new Array(81);
		area = new Array(81);
		options = new Array(81);
		wrong = false;
		brute = false;
		debug = true;
		linenumber = 1;
		console = new Array();
		starttime = 0;
	}
}

function sudokubrute() {
	try {
		brute = true;
		do {
			var rnd = Math.round(Math.random() * 80);
			if (!(numbers[rnd] > 0)) {
				do {
					var rndo = Math.round(Math.random() * 8);
					if (options[rnd][rndo] == false) {
						numbers[rnd] = rndo;
						if (!ftype[rnd]) ftype[rnd] = 4;
						area[rnd].value = rndo+1;
						break;
					}
				} while(true);
				break;
			}
		} while(true);
		cbru++;
		sudokuconsole('<span style="color: #0f0;">Brute force methode: 1 Zahl.</span>');
		window.setTimeout('sudokuforce();',1);
	} catch(err) {
		numbers = new Array(81);
		mem = new Array(81);
		area = new Array(81);
		options = new Array(81);
		wrong = false;
		brute = false;
		debug = true;
		linenumber = 1;
		console = new Array();
		starttime = 0;
	}
}

function mirrorcolor(obj) {
	try {
		var ofield;
		ofield = $('control').childNodes;
	
		for (i = 0; i < ofield.length; i++) {
			var tmp = ofield[i];
			var attr;

			try {
				attr = tmp.getAttribute('class');
			} catch(err) {
				attr = false;
			}
			if (attr == 'mirrorboxselect') {
				tmp.className = 'mirrorbox';
			}
		}
	} catch(err) {}
	
	obj.className = 'mirrorboxselect';
}

function mirrorset(obj) {
	try {
		if (mirrorx == -1) {
			if (obj.className == '') return false;
			var ofield;
			ofield = $('control').childNodes;
		
			for (i = 0; i < ofield.length; i++) {
				var tmp = ofield[i];
				var attr;

				try {
					attr = tmp.getAttribute('class');
				} catch(err) {
					attr = false;
				}
				if (attr == 'mirrorboxselect') {
					var sp = tmp.getElementsByTagName('span');
					var nr = parseInt(sp[0].id);
					var va = parseInt($(nr).innerHTML);
					if ((va !== 0) && parseInt(obj.name) > 0 && parseInt($(parseInt(obj.name)).innerHTML) > -1) {
						$(parseInt(obj.name)).innerHTML = parseInt($(parseInt(obj.name)).innerHTML) + 1;
					}
					if (va !== 0) {
						tmp = obj.name;
						obj.name = nr;
						obj.src = 'http://api.inodesign.de/images/mirror/' + mirrorobj[nr];
					}
					if (va > 0) {
						if (nr != 0 || tmp != '0') $(nr).innerHTML = (parseInt($(nr).innerHTML) - 1);
					}
				}
			}
		}
	} catch(err) {}
}

function mirrorstart(obj) {
	try {
		if (obj.title == 'Laser starten') {
			if (parseInt($('start').innerHTML) != 0) {
				obj.title = 'Laser stoppen';
				var im = obj.getElementsByTagName('img');
				im[0].src = 'http://api.inodesign.de/images/mirror/start_b.png';
				if (parseInt($('start').innerHTML) > 0)	$('start').innerHTML = parseInt($('start').innerHTML)-1;
				window.setTimeout('mirrorroute()', 1);
			} else {
				$('tipp').innerHTML = '<span style="color:#f00;">Dein Laser hat keine Energie mehr :-(</span>';
			}
		} else {
			obj.title = 'Laser starten';
			var im = obj.getElementsByTagName('img');
			im[0].src = 'http://api.inodesign.de/images/mirror/start_laser.png';
			$('laser').innerHTML = '';
			mirrorx = -1;
			mirrory = -1;
		}
	} catch(err) {}
}

function mirrorroute() {
	try {
		// Kein Startpunkt -> Suchen
		if (mirrorx === -1 && mirrory === -1) {
			var ofield;
			var oarea;
			var x = 0;
			var y = 0;
			mirrorcount = 0;
			mirrorhit = 0;
			ofield = $('mirrorfield').childNodes;
			for (i = 0; i < ofield.length; i++) {
				if (ofield[i].tagName == 'IMG') {
					ofield[i].id = 'x' + x + 'y' + y;
					if (typeof mirrorl[x] == 'undefined') mirrorl[x] = new Array();
					mirrorl[x][y] = false;
					tmp = ofield[i].getAttribute('name');
					if (tmp == 'f2') {mirrorw = 0; mirrorx = x; mirrory = y;}
					if (tmp == 'f3') {mirrorw = 1; mirrorx = x; mirrory = y;}
					if (tmp == 'f4') {mirrorw = 2; mirrorx = x; mirrory = y;}
					if (tmp == 'f5') {mirrorw = 3; mirrorx = x; mirrory = y;}
					if (tmp == 'f10') mirrorcount++;
					if (tmp == 'f11') mirrorcount++;
					if (tmp == 'f12') mirrorcount++;
					if (tmp == 'f13') mirrorcount++;
					if (tmp == 'f22') mirrorcount++;
					x++;
				}
				if (ofield[i].tagName == 'BR') {
					x = 0;
					y++;
				}
			}
			
			window.setTimeout('mirrordrawway();',1);
		} else {
			switch(mirrorw) {
				case 0: mirrory--; break;
				case 1: mirrorx++; break;
				case 2: mirrory++; break;
				case 3: mirrorx--; break;
			}
			//alert($('x' + mirrorx + 'y' + mirrory).getAttribute('name') + ' - ' + mirrorw);
			var n = $('x' + mirrorx + 'y' + mirrory).getAttribute('name');
			switch(n) {
				default: 
					// Fehler
				break;
				case 'f22':
					mirrorhit++;
				case '0':
					// Unsicheres Feld
					if (mirrorl[mirrorx][mirrory]) {
						$('tipp').innerHTML = '<span style="color:#f00;">Der Laser darf sich nicht kreuzen!</span>';
						break;
					}
				case 'f18':
				case 'f19':
					if ((mirrorw != 1 && mirrorw != 3) && n == 'f18') break;
					if ((mirrorw != 0 && mirrorw != 2) && n == 'f19') break;
				case 'f20':
				case '3':
					// Sichere Steine
					window.setTimeout('mirrordrawway();',1);
				break;
				case 'f13':
				case 'f10':
					mirrorhit++;
					if ((mirrorw == 2 || mirrorw == 1) && n == 'f13') break;
					if ((mirrorw == 3 || mirrorw == 0) && n == 'f10') break;
				case '1':
					if (mirrorw == 0) mirrorw = 1;
					else if (mirrorw == 3) mirrorw = 2;
					else if (mirrorw == 1) mirrorw = 0;
					else if (mirrorw == 2) mirrorw = 3;
					window.setTimeout('mirrordrawway();',1);
				break;
				case 'f11':
				case 'f12':
					mirrorhit++;
					if ((mirrorw == 0 || mirrorw == 1) && n == 'f11') break;
					if ((mirrorw == 3 || mirrorw == 2) && n == 'f12') break;
				case '2':
					if (mirrorw == 0) mirrorw = 3;
					else if (mirrorw == 3) mirrorw = 0;
					else if (mirrorw == 1) mirrorw = 2;
					else if (mirrorw == 2) mirrorw = 1;
					window.setTimeout('mirrordrawway();',1);
				break;
				case 'f6':
				case 'f7':
				case 'f8':
				case 'f9':
					if ((
						mirrorw == 2 && n == 'f6' ||
						mirrorw == 3 && n == 'f7' ||
						mirrorw == 0 && n == 'f8' ||
						mirrorw == 1 && n == 'f9'
						) &&
						mirrorhit == mirrorcount
					) {
						mirrorx = -1;
						mirrory = -1;
						$('tipp').innerHTML = '<span style="color:#0f0;">Yeah, du hast die Welt gemeistert! Gleich geht es weiter!</span>';
						window.setTimeout(function() {
							window.open('/Webapp/Mirror/' + (mirrorstage + 1) + '.html', '_self');
						}, 5000);
						break;
					} else {
						if ((
							mirrorw == 2 && n == 'f6' ||
							mirrorw == 3 && n == 'f7' ||
							mirrorw == 0 && n == 'f8' ||
							mirrorw == 1 && n == 'f9'
							) &&
							mirrorhit != mirrorcount
						) {
							$('tipp').innerHTML = '<span style="color:#f00;">Du musst alle Steinspiegel und Kristalle mit dem Laser passieren!</span>';
							break;
						}
					}
				case 'f1':
				case 'f2':
				case 'f3':
				case 'f4':
				case 'f5':
				case 'f14':
				case 'f15':
				case 'f16':
				case 'f17':
					// Mauer
					$('tipp').innerHTML = '<span style="color:#f00;">Der Laser darf nicht gegen eine Mauer kommen!</span>';
				break;
			}
		}
	} catch(err) {}
}

function mirrordrawway() {
	try {
		var limit = 1;
		if (mirrordraw < limit) {
			var posx = $('x' + mirrorx + 'y' + mirrory).offsetLeft;
			var posy = $('x' + mirrorx + 'y' + mirrory).offsetTop;
			if (mirrorw == 0) {var im = 'laser_v.gif'; posy -= 10;}
			if (mirrorw == 1) {var im = 'laser_h.gif'; posx += 10;}
			if (mirrorw == 2) {var im = 'laser_v.gif'; posy += 10;}
			if (mirrorw == 3) {var im = 'laser_h.gif'; posx -= 10;}
			$('laser').innerHTML += '<img style="position:absolute;left:' + posx + 'px;top:' + posy + 'px;" src="http://api.inodesign.de/images/mirror/' + im + '" />';
			mirrordraw++;
			mirrorl[mirrorx][mirrory] = true;
			window.setTimeout('mirrordrawway();',100);
		} else {
			mirrordraw = 0;
			window.setTimeout('mirrorroute();',1);
		}
	} catch (err) {}
}

var cubeselect = new Array(false,false,false,false,false);
var cubevalue = new Array(0,0,0,0,0);
var cubeplayer = 0;
var cubecurplayer = 0;
var cuberound = 0;
var cuberounds = 0;
var cubestarted = false;
var cubelasthover;
var cubeplayermax = 0;

function cubechange(obj) {
	if (trim(obj.innerHTML) != '' && cuberound < 3) {
		if (cubeselect[parseInt(obj.id.substr(1,1))-1] == true) {
			obj.style.backgroundColor = '#ffffff';
			cubeselect[parseInt(obj.id.substr(1,1))-1] = false;
		} else {
			obj.style.backgroundColor = '#55ff55';
			cubeselect[parseInt(obj.id.substr(1,1))-1] = true;
		}
	}
}

function cubenewgame(player,cpu) {
	cubeplayer = player;
	cubeplayermax = player + cpu;
	cubestarted = true;
	$('cuberoll').style.display = 'block';
	$('sp1').parentNode.style.border = '1px solid #00ff00';
	$('tipp').innerHTML = $('sp' + (cubecurplayer+1)).value + ' ist am Zug, bitte w&uuml;rfeln.<br />';
}

function cubenextround() {
	$('cuberoll').style.display = 'block';
	$('sp' + (cubecurplayer + 1)).parentNode.style.border = '1px solid #555';
	cubecurplayer++;
	cuberound = 0;
	cubelasthover = '';
	if (cubecurplayer == cubeplayermax) {
		cubecurplayer = 0;
		cuberounds++;
		if (cuberounds == 13) {
			$('tipp').style.color = '#00ff00';
			var tmppl = 0;
			var maxscore = 0;
			for (i = 1; i <= cubeplayermax; i++)
			if (parseInt($('sg' + i).innerHTML) > maxscore) {
				maxscore = parseInt($('sg' + i).innerHTML);
				tmppl = i;
			}
			$('tipp').innerHTML = $('sp' + tmppl).value + ' ist mit ' + maxscore + ' Punkten der Gewinner! <a href="#" onclick="sndReq(\'code:jiffel\');">Neues Spiel starten?</a><br />';
			$('cuberoll').style.display = 'none';
			return false;
		}
	}
	$('sp' + (cubecurplayer + 1)).parentNode.style.border = '1px solid #00ff00';
	for (i = 0; i < 5; i++) {
		obj = $('c'+(i+1));
		obj.style.backgroundColor = '#ffffff';
		obj.innerHTML = '';
		cubeselect[i] = false;
		cubevalue[i] = 0;
	}
	$('tipp').innerHTML = $('sp' + (cubecurplayer+1)).value + ' ist am Zug, bitte w&uuml;rfeln. <br />';
}

function cubenumber(cube,num) {
	$('c' + cube).innerHTML = '<img src="http://api.inodesign.de/game/cube/cube' + num + '.png" title="' + num + '" />';
}

function cuberandom(obj) {
	if (cubeplayer > cubecurplayer && cubestarted) {
		if (cuberound < 3) {
			for (i = 1; i < 6; i++) {
				if (cubeselect[i-1] == true) continue;
				var timeelapse = 0;
				for (j = 0; j < 10; j++) {
					timeelapse += 20 * j;
					var rnd = Math.floor(Math.random() * 6 + 1);
					window.setTimeout(
						"cubenumber(" + i + "," + rnd + ");",
						timeelapse
					);
					cubevalue[i-1] = rnd;
				}
			}
			cuberound++;
			if (cuberound < 3) $('tipp').innerHTML = $('sp' + (cubecurplayer+1)).value + ' ist am Zug, bitte ' + (cuberound+1) + '.Wurf w&uuml;rfeln oder setzen.<br />' + cubetip(cubecurplayer+1);
			else {
				$('tipp').innerHTML = $('sp' + (cubecurplayer+1)).value + ' ist am Zug, bitte setzen.<br />' + cubetip(cubecurplayer+1);
				$('cuberoll').style.display = 'none';
				for (i = 0; i < 5; i++) {
					obj = $('c'+(i+1));
					obj.style.backgroundColor = '#ffffff';
				}
			}
		}
	}
}

function cubetip(player) {
	var maxscore = -1;
	var maxpos = 0;
	var bestoption = new Array(
		'Einer',
		'Zweier',
		'Dreier',
		'Vierer',
		'F'+unescape("%FC")+'nfer',
		'Sechser',
		'Dreierpasch',
		'Viererpasch',
		'Full House',
		'Kleine Strasse',
		'Grosse Strasse',
		'F'+unescape("%FC")+'nferpasch',
		'Chance'
	);
	for (a = 1; a < 14; a++) {
		var tmpscore = cubegetscore(a);
		if (tmpscore >= maxscore) {
			var tmpp = 0;
			for (isp = 0; isp < $('r'+a).childNodes.length; isp++) {
				if ($('r'+a).childNodes[isp].tagName == 'TD') {
					tmpp++;
					if (tmpp-1 == player && trim($('r'+a).childNodes[isp].innerHTML) == '' && (maxscore < 1 || a < 13)) {
						maxpos = a;
						maxscore = tmpscore;
					}
				}
			}
		}
	}
	return 'Tipp: ' + maxscore + ' Punkt' + (maxscore != 1 ? 'e' : '') + ' bei ' + bestoption[maxpos-1] + '.';
}

function cubefield(obj, cubeset) {
	var player = 0;
	var tmp = obj;
	var first;
	while (tmp = tmp.previousSibling) {
		if (tmp.tagName == 'TD') {
			player++;
			first = tmp;
		}
	}
	player = player-1;
	if (player == cubecurplayer && cubestarted && cuberound > 0 && cubeplayer > cubecurplayer && trim(obj.innerHTML) == '') {
		if (cubelasthover == obj) {
			cubelasthover = '';
			obj.style.border = '1px solid #555';
			first.style.border = '1px solid #555';
		} else {
			var score = cubegetscore(cubeset);
			obj.title = (score == 0 ? 'keine' : score) + ' Punkt' + (score != 1 ? 'e' : '') + ' eintragbar. ' + cubetip(player+1);
			obj.style.border = '1px solid #ffff00';
			first.style.border = '1px solid #00ff00';
			cubelasthover = obj;
		}
	}
}

function cubegetscore(cubeset) {
	var score = 0;
	var score = 0;
	var count = new Array(0,0,0,0,0,0);
	for (i = 0; i < 5; i++) count[cubevalue[i]-1]++;
	switch (cubeset) {
		default:
			score = cubeset * count[cubeset-1];
		break;
		case 7:
			for (i = 0; i < 6; i++) if (count[i] >= 3) for (j = 0; j < 5; j++) score += cubevalue[j];
		break;
		case 8:
			for (i = 0; i < 6; i++) if (count[i] >= 4) for (j = 0; j < 5; j++) score += cubevalue[j];
		break;
		case 9:
			for (i = 0; i < 6; i++) if (count[i] == 2) for (j = 0; j < 6; j++) if (count[j] == 3) score = 25;
		break;
		case 10:
			for (i = 0; i < 3; i++) {
				var set = true;
				for (j = 0; j < 4; j++) if (count[i+j] == 0) set = false;
				if (set) {
					score = 30;
					break;
				}
			}
		break;
		case 11:
			for (i = 0; i < 2; i++) {
				var set = true;
				for (j = 0; j < 5; j++) if (count[i+j] == 0) set = false;
				if (set) {
					score = 40;
					break;
				}
			}
		break;
		case 12:
			for (i = 0; i < 6; i++) if (count[i] >= 5) score = 50;
		break;
		case 13:
			for (i = 0; i < 5; i++) score += cubevalue[i];
		break;
	}
	return score;
}

function cubeset(obj,cubeset) {
	var score = cubegetscore(cubeset);
	var player = 0;
	var tmp = obj;
	while (tmp = tmp.previousSibling) {
		if (tmp.tagName == 'TD') {
			player++;
			first = tmp;
		}
	}
	if ((player-1) == cubecurplayer && cubestarted && cuberound > 0 && cubeplayer > cubecurplayer && trim(obj.innerHTML) == '') {
		obj.innerHTML = (score ? score : '-');
		if (cubeset < 7) {
			var scoretop = parseInt($('sob'+player).innerHTML);
			if (!(scoretop > 0)) scoretop = 0;
			var scorebottom = parseInt($('su'+player).innerHTML);
			if (!(scorebottom > 0)) scorebottom = 0;
			scoretop += score;
			$('sob'+player).innerHTML = scoretop;
			if (scoretop >= 63) {
				$('b'+player).innerHTML = 35;
				scoretop += 35;
			}
			$('smb'+player).innerHTML = scoretop;
			$('so'+player).innerHTML = scoretop;
			$('sg'+player).innerHTML = scorebottom+scoretop;
		} else {
			var scorebottom = parseInt($('su'+player).innerHTML);
			if (!(scorebottom > 0)) scorebottom = 0;
			var scoretop = parseInt($('so'+player).innerHTML);
			if (!(scoretop > 0)) scoretop = 0;
			scorebottom += score;
			$('su'+player).innerHTML = scorebottom;
			$('sg'+player).innerHTML = scorebottom+scoretop;
		}
		cubelasthover = '';
		obj.style.border = '1px solid #555';
		first.style.border = '1px solid #555';
		cubenextround();
	}
}
