
var Sudoku = {
	PreInit:	function(){
		Game.Init = Sudoku.Init;		
		Game.Draw = Sudoku.Draw;		
		//Game.OverHighlight = Sudoku.OverHighlight;
		//Game.OutHighlight = Sudoku.OutHighlight;
		Game.KeyDown = Sudoku.KeyDown;
		Game.MouseClick = Sudoku.MouseClick;
		//Game.DefMouseClick = Sudoku.DefMouseClick;
		//Game.DefOverHighlight = Sudoku.DefOverHighlight;
		//Game.DefOutHighlight = Sudoku.DefOutHighlight;
	},
	
	Init: function(ID, XMLFile, Path, AutoSave, TimerInterval){
		Game.GID = ID;
		Game.Path = Path;
		Game.XMLFile = XMLFile;
		Game.Reset();
		if(true == AutoSave)
		{
			Timer.Init(TimerInterval);
		};
		
		$.ajax({
			url:Game.Path + "data/sudoku/" + XMLFile + ".xml",
			success: Sudoku.Draw
		});
	},
	
	Draw: function(XMLContent){		
		var xml = $(XMLContent);
		var i, j, p;
		
		Game.Table = document.getElementById('sudoku-grid');
		Game.Reset();
 
		Game.height = xml.find("height:first").text();
		Game.width = xml.find("width:first").text();
		
		Game.Table.oncontextmenu = function(){
			return false;
		};
		
		Game.ActiveCell = null;		
		
		for (i = 0; i < parseInt(Game.height) + 3; i++) {			
			row = Game.Table.insertRow(i);			
			for (j = 0; j < parseInt(Game.width) + 3; j++) {
				cell = row.insertCell(j);
				if((j % 4 == 0) && (i % 4 == 0))
				{
					
				}
				else if(j % 4 == 0)
				{
					cell.setAttribute('height', '60px');
					cell.setAttribute('width', '10px');					
				}				
				else if(i % 4 == 0)
				{
					cell.setAttribute('height', '10px');
					cell.setAttribute('width', '60px');	
				}
				else
				{
					cell.className = "editable-cell sudoku-editable-cell";
					cell.tag = '*';
					cell.unselectable = "on";
				}				
			}
			cell.innerHTML = "&nbsp;";
		}
		
		xml.find('nr').each(function(){
			var str = $(this).text();
			var substr = str.split("|")
			var x = parseInt(substr[0]);
			var y = parseInt(substr[1]);
			//if(x > 3) x++;
			//if(x > 6) x++;
			//if(y > 3) y++;
			//if(y > 6) y++;
			var x = parseInt(substr[0]); x += Math.ceil(x/3) - 1;
			var y = parseInt(substr[1]); y += Math.ceil(y/3) - 1;
			var nr = parseInt(substr[2]);
						
			if(!isNaN(nr) && nr != 0 )
			{
				Game.Table.rows[x].cells[y].className = "sudoku-filled";
				Game.Table.rows[x].cells[y].innerHTML = nr;		
				Game.Table.rows[x].cells[y].tag = nr;
			}
		});			
	},
	
	OutHighlight:null,
	
	OverHighlight: null,
	
	DefOverHighlight: null,
	
	DefOutHighlight: null,
	
	KeyDown: function(event){
		if (Game.ActiveCell)
		{ 
			var x = Game.ActiveCell.parentNode.rowIndex;
			var y = Game.ActiveCell.cellIndex;	
			var cell = $(Game.ActiveCell);
			var charCode = event.which;
			var key;			
			
			/*
				if(
					(Game.Table.rows[x].cells[y].innerHTML != "&nbsp;") &&
					(Game.Table.rows[x].cells[y].innerHTML != ""))
				{
					for(i = 0; i < 12; i++)
					{						
						if(y != i ) 
						{
							if((Game.Table.rows[x].cells[i].className != "sudoku-filled") && 
								(Game.Table.rows[x].cells[i].innerHTML == Game.Table.rows[x].cells[y].innerHTML))
							{
								Game.Table.rows[x].cells[i].className = "editable-cell sudoku-editable-cell";							
							}						
						}
						if(x != i )
						{
							if((Game.Table.rows[i].cells[y].className != "sudoku-filled") && 
								(Game.Table.rows[i].cells[y].innerHTML == Game.Table.rows[x].cells[y].innerHTML))
							{
								Game.Table.rows[i].cells[y].className = "editable-cell sudoku-editable-cell";								
							}	
						}
					}	
					var x_1 = Math.floor(x/4) * 4 + 1;
					var y_1 = Math.floor(y/4) * 4 + 1;
					for(i = x_1; i < x_1 + 3; i++)
					{
						for(j = y_1; j < y_1 + 3; j++)
						{						
							if(x != i || y != j)
							{							
								if((Game.Table.rows[i].cells[j].className != "sudoku-filled") &&
									(Game.Table.rows[i].cells[j].innerHTML == Game.Table.rows[x].cells[y].innerHTML))
								{
									Game.Table.rows[i].cells[j].className = "editable-cell sudoku-editable-cell";
								}								
							}
						}
					}	
				}					
			*/
			if(charCode >= 97 && charCode <= 105) 
			{
				charCode -= 48;
			}
			if (charCode == 32 || charCode == 8 || charCode == 46) { //SPACE || BACKSPACE || DEL
				Game.Table.rows[x].cells[y].className = "editable-cell sudoku-editable-cell";
				cell.html("&nbsp");
				cell.attr("tag", "*"); 
		        event.preventDefault();		        
		        Saving.Unsaved();
			}			
			else if(charCode >= 49 && charCode <= 57)
			{
				
				key = String.fromCharCode(charCode);			
			
				var exist = false;
				for(i = 0; i < 12; i++)
				{
					if(y != i && key == Game.Table.rows[x].cells[i].innerHTML) 
					{
						//if(Game.Table.rows[x].cells[i].className != "sudoku-filled" && Game.Table.rows[x].cells[i].innerHTML == Game.Table.rows[x].cells[y].innerHTML)
						{
						//	Game.Table.rows[x].cells[i].className = "editable-cell sudoku-editable-cell";
						}
						exist = true;
					}
					if(x != i && key == Game.Table.rows[i].cells[y].innerHTML)
					{
						//if(Game.Table.rows[i].cells[y].className != "sudoku-filled" && Game.Table.rows[i].cells[y].innerHTML == Game.Table.rows[x].cells[y].innerHTML)
						{
						//	Game.Table.rows[i].cells[y].className = "editable-cell sudoku-editable-cell";
						}	
						exist = true;
					}					
				}				
				var x_1 = Math.floor(x/4) * 4 + 1;
				var y_1 = Math.floor(y/4) * 4 + 1;
				for(i = x_1; i < x_1 + 3; i++)
				{
					for(j = y_1; j < y_1 + 3; j++)
					{						
						if((x != i || y != j) && key == Game.Table.rows[i].cells[j].innerHTML)
						{
							//if(Game.Table.rows[i].cells[j].className != "sudoku-filled")
							{
							//	Game.Table.rows[i].cells[j].className = "editable-cell sudoku-invalid-cell";
							}
							exist = true;
						}
					}
				}
				if(exist)
				{
					Game.Table.rows[x].cells[y].className = "editable-cell sudoku-invalid-cell";
				}
				else
				{
					Game.Table.rows[x].cells[y].className = "editable-cell sudoku-editable-cell";
				}
				cell.html(key)
				cell.attr("tag", key);
				Saving.Unsaved();
			}
		}
	},
	
	DefMouseClick: null,
	
	MouseClick: function(event){				
	    $(".sudoku-active-cell").removeClass("sudoku-active-cell");
	    $(this).addClass("sudoku-active-cell");
	    Game.ActiveCell = event.target;	
	}
};



