
/********************************************
 * Copyright (c) 2006 - 2010 Geoffrey Swift *
 * All rights reserved                      *
 ********************************************/


/* sudoku.js : 2008-04-08T22:51:41+01:00 */

function sodukoPopulate(form, s)
{
	for (var i = 0; i < form.elements.length; i++)
	{
		if ('text' == form.elements[i].type)
		{
			var v = s.substr(i, 1);
			if (v != '0')
			{
				form.elements[i].value = v;
			}
		}
	}
}

function sudokuFormPuzzleString(form)
{
	var s = '';
	for (var i = 0; i < form.elements.length; i++)
	{
		if (form.elements[i].value.match(/^[1-9]$/))
		{
			s += form.elements[i].value;
		}
		else
		{
			s += '0';
		}
	}
	return s;
}

function sudokuURL(puzzle, mode)
{
	return uribase + 'sodit.php?puzzle=' + escape(puzzle) + '&mode=' + mode;
}

function sudokuSolve(form)
{
	var puzzle = sudokuFormPuzzleString(form);
	loadXML2(sudokuURL(puzzle, 'solve'),
		function (response)
		{
			if (response.match(/^[1-9]{81}$/))
			{
				sodukoPopulate(form, response);
			}
			else
			{
				
			}
		});
	
	return false;
}

function sudokuValidatePuzzle(form)
{
	var puzzle = sudokuFormPuzzleString(form);
	var response = loadXML(sudokuURL(puzzle, 'validate'));
	if (response)
	{
		if (response.match(/^[0-9]{81}$/))
		{
			sodukoPopulate(form, response);
			return true;
		}
	}
	return false;
}

function sudokuKeyPress(element, event, regex)
{
	var key = keypressEventToString(event);
	var i;
	var e = element;
	if (event)
	{
		switch(event.keyCode)
		{
			case 37:
				e = moveFormElement(element, -1);
			break;

			case 38:
				e = moveFormElement(element, -9);
			break;

			case 39:
				e = moveFormElement(element, 1); 
			break;
	
			case 40:
				e = moveFormElement(element, 9); 
			break;

			default:
				e = element;
		}
		e.focus();
	}
	if (key.match(/^[1-9]$/))
	{
		var oldvalue = element.value;
		element.value = key;
		var result = sudokuValidatePuzzle(element.form);
		if (result)
		{
			e = element;
			do
			{
				e = moveFormElement(e, 1);
			}
			while ((e != element) && (e.value != ''))
			e.focus();
		}
		else
		{
			element.value = oldvalue;
		}
		return false;
	}
	else if (key < ' ')
	{
		return true;
	}
	else
	{
		return false;
	}
}

function initSudoku()
{
	var inputs = document.getElementsByTagName('input');
	for (var i = 0; i < 81; i++)
	{
		inputs[i].setAttribute('autocomplete', 'off');
		inputs[i].removeAttribute('value');
	}
}

if (typeof onloadFunctions != 'undefined')
{
	onloadFunctions.push(initSudoku);
}
