﻿// JavaScript File

	var msgSpanID = 'spnMessage';

	var allRules = new Array(27);
	
	// Regions
	allRules[0] = new Array(0, 1, 2, 9,10,11,18,19,20);
	allRules[1] = new Array(3, 4, 5,12,13,14,21,22,23);
	allRules[2] = new Array(6, 7, 8,15,16,17,24,25,26);
	
	allRules[3] = new Array(27,28,29,36,37,38,45,46,47);
	allRules[4] = new Array(30,31,32,39,40,41,48,49,50);
	allRules[5] = new Array(33,34,35,42,43,44,51,52,53);
	
	allRules[6] = new Array(54,55,56,63,64,65,72,73,74);
	allRules[7] = new Array(57,58,59,66,67,68,75,76,77);
	allRules[8] = new Array(60,61,62,69,70,71,78,79,80);

	// Rows	
	allRules[9] = new Array(0,1,2,3,4,5,6,7,8);
	allRules[10] = new Array( 9,10,11,12,13,14,15,16,17);
	allRules[11] = new Array(18,19,20,21,22,23,24,25,26);
	allRules[12] = new Array(27,28,29,30,31,32,33,34,35);
	allRules[13] = new Array(36,37,38,39,40,41,42,43,44);
	allRules[14] = new Array(45,46,47,48,49,50,51,52,53);
	allRules[15] = new Array(54,55,56,57,58,59,60,61,62);
	allRules[16] = new Array(63,64,65,66,67,68,69,70,71);
	allRules[17] = new Array(72,73,74,75,76,77,78,79,80);

	// Columns
	allRules[18] = new Array(0, 9,18,27,36,45,54,63,72);
	allRules[19] = new Array(1,10,19,28,37,46,55,64,73);
	allRules[20] = new Array(2,11,20,29,38,47,56,65,74);
	allRules[21] = new Array(3,12,21,30,39,48,57,66,75);
	allRules[22] = new Array(4,13,22,31,40,49,58,67,76);
	allRules[23] = new Array(5,14,23,32,41,50,59,68,77);
	allRules[24] = new Array(6,15,24,33,42,51,60,69,78);
	allRules[25] = new Array(7,16,25,34,43,52,61,70,79);
	allRules[26] = new Array(8,17,26,35,44,53,62,71,80);

	//--------------------------------------------------
	// Test for a completed puzzle.
	function checkComplete()
	{
		for (var i=0; i<81; i++)
		{
			if (_puzzle[i] == '0')
			{
				return false;
			}
		}
	
		for (var a=0; a<27; a++)
		{
			if (!testRule(allRules[a]))
			{
				//spnMsg.innerText = "The puzzle is not complete.";
				return false;
			}
		}
				
		//alert("Congratulations! The puzzle is complete.");
		
		return true;
	}
	
	//-------------------------------------------------------
	// Test a rule.
	function testRule(indexes)
	{
		var val;

		for (var a=0; a<9; a++)
		{
			val = getPuzzleValue([indexes[a]]);
			//alert("a = " + _puzzle[indexes[a]] + " [" + indexes[a] + "]");
			
			for (var b=(a+1); b<9; b++)
			{
				if (val == getPuzzleValue([indexes[b]]))
				{
					//alert(val + " -> " + _puzzle[indexes[b]] + " [" + indexes[b] + "]");
					return false;
				}
			}
		}
		
		return true;
	}

	function getPuzzleValue(index)
	{
		var val = 0;
		//alert("getting value for index " + index);
		if (_puzzle[index] >= 'a')
		{
			switch (_puzzle[index])
			{
				case 'a':
					val = 1;
					break;
				case 'b':
					val = 2;
					break;
				case 'c':
					val = 3;
					break;
				case 'd':
					val = 4;
					break;
				case 'e':
					val = 5;
					break;
				case 'f':
					val = 6;
					break;
				case 'g':
					val = 7;
					break;
				case 'h':
					val = 8;
					break;
				case 'i':
					val = 9;
					break;
			}
		}
		else
		{
			val = Number(_puzzle[index]);
		}
		
		//alert(_puzzle[index] + " = " + val);
		
		return val;
	}
	
	function doCellClick(ctrl, index, evt)
	{
		var e = (window.event) ? window.event : evt;
		var elem = document.getElementById("hdnPuzzle");
		var val;
		
		val = _puzzle[index];
		
		if (window.event)
		{		
			if (window.event.button == 1)
			{
				// left
				val++;
				if (val > 9)
					val = 0;
			}
			else if (window.event.button == 2)
			{
				// right
				val--;
				if (val < 0)
					val = 9;
			}
		}
		else
		{
			if (e.which == 1)
			{
				// left
				val++;
				if (val > 9)
					val = 0;
			}
			else if (e.which == 3)
			{
				// right
				val--;
				if (val < 0)
					val = 9;
			}
		}
		
		if (val > 0)
		{
			ctrl.innerHTML = val.toString();
		}
		else
		{
			ctrl.innerHTML = "&nbsp;";
		}
			
		_puzzle[index] = val.toString();

		elem.value = getPuzzleString();

		if (checkComplete())
		{
			resetCells();
			//document.getElementById(msgSpanID).innerHTML = "The puzzle is complete!";
		}
		/*
		else
		{
			document.getElementById(msgSpanID).innerHTML = "&nbsp;";
		}
		*/
		
		e.cancelBubble = true;
		return false;
	}
	
	function getPuzzleString()
	{
		var tmp = "";
		
		for (var i=0; i<81; i++)
			tmp = tmp.concat(_puzzle[i]);
			
		return tmp;
	}

	function displayPrintable()
	{
		var url = "printable.aspx?sudoku=" + getPuzzleString();
		
		window.open(url, null, "resizable=yes,status=yes,toolbar=no,menubar=yes,location=no");
	}

	//cellReadonly
	function resetCells()
	{
		var tbl;
		var node;
		
		tbl = document.getElementById("tblGrid");
		
		for (var i=0; i<tbl.rows.length; i++)
		{
			for (var c=0; c< tbl.rows[i].cells.length; c++)
			{
				node = tbl.rows[i].cells[c];
				if ((node.tagName == 'TD') && (node.id.substr(0, 4) == 'cell'))
				{
					node.className = "cellComplete";
				}
			}
		}
		
		for (var a=0; a<dd.elements.length; a++)
		{
			dd.elements[a].setDraggable(false);
		}
	}

//----------------------------------------------------------------------
// Puzzle stuff
//
		var cellHilite = null;
		var cellStart = null;
		
		function updateCellValue(index, val)
		{
			var elem = document.getElementById("hdnPuzzle");
			_puzzle[index] = val.toString();

			elem.value = getPuzzleString();

			if (checkComplete())
			{
				resetCells();
				//document.getElementById(msgSpanID).innerHTML = "The puzzle is complete!";
			}
			/*
			else
			{
				document.getElementById(msgSpanID).innerHTML = "&nbsp;";
			}
			*/
		}
		
		function updateCell(tdID, valID)
		{
			var index = Number(tdID.substr(4, 2));
			var val = Number(valID.substr(1, 1));

			updateCellValue(index, val);			
		}
		
		function getEleX(node)
		{
			var px;
			
			px = node.offsetLeft;
			
			if (node.offsetParent)
				px += getEleX(node.offsetParent);
				
			return px;
		}
		
		function getEleY(node)
		{
			var py;
			
			py = node.offsetTop;
			
			if (node.offsetParent)
				py += getEleY(node.offsetParent);
				
			return py;
		}
		//cellReadonly
		function getTargetById(id)
		{
			var tbl;
			var node;
			var px, py, rx, ry;
			
			tbl = document.getElementById("tblGrid");
			
			for (var i=0; i<tbl.rows.length; i++)
			{
				for (var c=0; c< tbl.rows[i].cells.length; c++)
				{
					node = tbl.rows[i].cells[c];
					//alert(node.tagName);
					
					//window.status = node.tagName;
					
					if ((node.id == id) && (node.tagName == 'TD') && (node.id.substr(0, 4) == 'cell'))
					{
						return node;
					}
				}
			}
			
			return null;
		}
		
		function getTarget(x, y)
		{
			var tbl;
			var node;
			var px, py, rx, ry;
			
			tbl = document.getElementById("tblGrid");
			
			for (var i=0; i<tbl.rows.length; i++)
			{
				for (var c=0; c< tbl.rows[i].cells.length; c++)
				{
					node = tbl.rows[i].cells[c];
					//alert(node.tagName);
					
					//window.status = node.tagName;
					
					if ((node.tagName == 'TD') && (node.id.substr(0, 4) == 'cell'))
					{
						//px = node.offsetLeft + node.offsetParent.offsetLeft;
						px = getEleX(node);
						//py = node.offsetTop + node.offsetParent.offsetTop;
						py = getEleY(node);
						rx = px + node.offsetWidth;
						ry = py + node.offsetHeight;
						
						if (x > px && x < rx && y > py && y < ry)
							return node;
					}
				}
			}
			
			return null;
		}
		
		function dragFromCell(x, y)
		{
			cellStart = getTarget(x, y);
		}
		
		function dropOnCell(x, y)
		{
			//var target = document.elementFromPoint(x, y);
			var target = getTarget(x, y);
			var below;

			if (target != null)
			{
				target.className = 'cell';
				
				var offsetx, offsety;
				offsetx = getEleX(target) + 5; // target.offsetLeft + target.offsetParent.offsetLeft + 5;
				offsety = getEleY(target) + 5; // target.offsetTop + target.offsetParent.offsetTop + 5;
				
				dd.obj.moveTo(offsetx, offsety);
				
				updateCell(target.id, dd.obj.id);
				
				below = dd.obj.getEltBelow();
				
				if (cellStart != null)
				{
					offsetx = getEleX(cellStart) + 5; // cellStart.offsetLeft + cellStart.offsetParent.offsetLeft + 5;
					offsety = getEleY(cellStart) + 5; // cellStart.offsetTop + cellStart.offsetParent.offsetTop + 5;
				}
				
				if (below != null)
				{
					if (cellStart != null)
					{
						below.moveTo(offsetx, offsety);
						
						updateCell(cellStart.id, below.id);
					}
					else
					{
						below.moveTo(below.defx, below.defy);
					}
				}
				else if (cellStart != null)
				{
					updateCell(cellStart.id, '_0');
				}
			}
			else
			{
				dd.obj.moveTo(dd.obj.defx, dd.obj.defy);
				
				if (cellStart != null)
				{
					updateCell(cellStart.id, '_0');
				}
			}
			
			cellHilite = null;
			cellStart = null;
		}
		
		function selectCell(x, y)
		{
			//var target = document.elementFromPoint(x, y);
			var target = getTarget(x, y);
			
			//window.status = x + "," + y + " - " + dd.obj.x + "," + dd.obj.y;
			
			if ((target != null) && (target != cellHilite))
			{
				if (cellHilite != null)
					cellHilite.className = 'cell';

				cellHilite = target;
				cellHilite.className = 'cellSelect';
			}
			
			if ((target == null) && (cellHilite != null))
			{
				cellHilite.className = 'cell';
				cellHilite = null;
			}
		}
		
		function initCell(id, img, index)
		{
			var target;
			var px, py;
			
			target = getTargetById(id);
			
			if (target != null)
			{
				px = getEleX(target) + 5; // cellStart.offsetLeft + cellStart.offsetParent.offsetLeft + 5;
				py = getEleY(target) + 5; // cellStart.offsetTop + cellStart.offsetParent.offsetTop + 5;
			
				//alert(dd.elements[img].copies.length);
				//dd.elements[img].copy();
				//alert(dd.elements[img].copies.length);
				
				//index = dd.elements[img].copies.length - 1;
				
				if (index < dd.elements[img].copies.length)
					dd.elements[img].copies[index].moveTo(px, py);
				else
					dd.elements[img].moveTo(px, py);
			}
		}

/*
function my_PickFunc()
{
	var x, y;
	
	x = dd.obj.x + (dd.obj.w / 2);
	y = dd.obj.y + (dd.obj.h / 2);

	dragFromCell(x, y);
}

function my_DragFunc()
{
	//window.status = 'dd.elements.' + dd.obj.name + '.x  = ' + dd.obj.x + '	 dd.elements.' + dd.obj.name + '.y = ' + dd.obj.y;
	var x, y;
	
	x = dd.obj.x + (dd.obj.w / 2);
	y = dd.obj.y + (dd.obj.h / 2);

	//selectCell(dd.obj.x, dd.obj.y);
	selectCell(x, y);
}

function my_DropFunc()
{
	var x, y;
	
	x = dd.obj.x + (dd.obj.w / 2);
	y = dd.obj.y + (dd.obj.h / 2);
	
	//dropOnCell(dd.obj.x, dd.obj.y);
	dropOnCell(x, y);
}
*/