var num_color = [ '#666666','#FFFFFF', '#FFFFFF' , '#FFFFFF' ,'#FFFFFF' , '#FFFFFF' , '#FFFFFF', '#FFFFFF' ,'#FFFFFF' , '#FFFFFF' , '#AFAEDF'];
//var bg_color = [ '#FFFFFF','#009999', '#3333CC' , '#996633' ,'#FF3399' , '#006633' , '#33FF00', '#FF0000' ,'#990099' , '#FF9900' ];
var bg_color = [ '#FFFFFF','#83031A', '#3333CC' , '#996633' ,'#FF3399' , '#006633' , '#33FF00', '#FF0000' ,'#990099' , '#FF9900' ];
var newentry = false;
var found_error = false;
var checkvalidity = true;
var moves = new Array() ;
var moves_count = 0;
var filled_cells_count = 0;
var solution_help=false;
var usepencil = false;
//var startTimer = false; //to be deleted
var num_count = [0,0,0,0,0,0,0,0,0,0];
var click_seq = [];
var click_itr = 0;
var disp_seq= [];
var disp_itr = 0;
var eleIds=[];
var tabColEIs=[];
var blink=false;
var timeNumDisplay = 500;
var timeInterval =timeNumDisplay+0;
var mem_step=0;
var boxcount=4;
var temp = [];
var temp_order = [];
var lost_game=false;
function IsNumeric(strChar) // check for valid numeric strings
{
	var strValidChars="123456789";
	var blnResult=true;

	if (strChar.length === 0)
	{
		return false;
	}
	if (strValidChars.indexOf(strChar) == -1)
	{
		blnResult=false;
	}
	return blnResult;
}
function toAlpha(numSudoku)
{
	var i=0;
	var j=0;
	var alphaSudoku = "";
	var currentChar = "";
	for (j = 1; j <= 9; j++) 
	{
		for (i = 1; i <= 9; i++) 
		{ 
			var elem_no = (j-1)*9+(i-1);
			if(numSudoku.charAt(elem_no)!='0')
			{
				currentChar = numSudoku.charAt(elem_no);
				switch(currentChar)
				{
					case '1':
						alphaSudoku = alphaSudoku+"a";
						break;
					case '2':
						alphaSudoku = alphaSudoku+"b";
						break;
					case '3':
						alphaSudoku = alphaSudoku+"c";
						break;
					case '4':
						alphaSudoku = alphaSudoku+"d";
						break;
					case '5':
						alphaSudoku = alphaSudoku+"e";
						break;
					case '6':
						alphaSudoku = alphaSudoku+"f";
						break;
					case '7':
						alphaSudoku = alphaSudoku+"g";
						break;
					case '8':
						alphaSudoku = alphaSudoku+"h";
						break;
					case '9':
						alphaSudoku = alphaSudoku+"i";
						break;
					default:
						alphaSudoku = alphaSudoku+currentChar;
						break;

				}
			}
			else
			{
				alphaSudoku = alphaSudoku+"0";
			}
		}
	}
	
	return alphaSudoku;
}
function fillin(puzzlestr)
{
	if(document.getElementById('alphaid'))
	{
		if(document.getElementById('alphaid').value==1)
		{
			puzzlestr = toAlpha(puzzlestr);
		}
	}
	var i=0;
	var j=0;
	for (j = 1; j <= 9; j++) 
	{
		for (i = 1; i <= 9; i++) 
		{ 
			var elem_no = (j-1)*9+(i-1);
			if(puzzlestr.charAt(elem_no)!='0')
			{
				document.getElementById("r" + j + "c"+ i).value = puzzlestr.charAt(elem_no);
				document.getElementById("r" + j + "c"+ i).readOnly=true;
			}
			else
			{
				document.getElementById("r" + j + "c"+ i).value = ""; 
				document.getElementById("r" + j + "c"+ i).readOnly=false;
			}
		}
	}
}
function import_sudoku() 
{
	reset_innerhtml();
	solution_help=true;
	blink=false;
	var dstring;
	var actualstr = "";
	var c, i, j, s, t;
	var i=0;
	var j=0;
	var save_dstring ="type in here";
	dstring = window.prompt("Enter a string of 81 numbers with as many spaces as you want(please express blanks as '0' or '*' or '_' or '.')", save_dstring);
	if (dstring === null) 
	{
		return;
	}
	if (dstring.length === 0) 
	{
		return;
	}
	save_dstring = dstring;
	actualstr = "";
	for (i = 0; i < dstring.length; i++) 
	{
		c = dstring.charAt(i);
		if (IsNumeric(c) || c === "0") 
		{
			actualstr = actualstr + dstring.charAt(i);
		} else if (c == "." || c == "*" || c == "_") 
		{
			actualstr = actualstr + "0";
		}
	}
	if (actualstr.length != 81) 
	{
		okay = false;
		alert("Your submission contained " + actualstr.length + " numbers. Please check it and press 'Import' again");
		return;
	}
	fillin(actualstr);
	colorcode();
	update_nooffilledcells();
}
function toSudChar(sudNum)
{
	var retNum;
	switch(sudNum)
	{
		case 1:
			retNum = 'a';
			break;
		case 2:
			retNum = 'b';
			break;
		case 3:
			retNum = 'c';
			break;
		case 4:
			retNum = 'd';
			break;
		case 5:
			retNum = 'e';
			break;
		case 6:
			retNum = 'f';
			break;
		case 7:
			retNum = 'g';
			break;
		case 8:
			retNum = 'h';
			break;
		case 9:
			retNum = 'i';
			break;
		default:
			break;
	}
	return retNum;
}
function toNum(alphaVal)
{
	var retNum;
	switch(alphaVal)
	{
		case 'a':
			retNum = 1;
			break;
		case 'b':
			retNum = 2;
			break;
		case 'c':
			retNum = 3;
			break;
		case 'd':
			retNum = 4;
			break;
		case 'e':
			retNum = 5;
			break;
		case 'f':
			retNum = 6;
			break;
		case 'g':
			retNum = 7;
			break;
		case 'h':
			retNum = 8;
			break;
		case 'i':
			retNum = 9;
			break;
		default:
			break;
	}
	return retNum;
}
function colorcode()
{
	//if(document.getElementById("colorcodecb").checked == true)
	{
		var i=0;
		var cur_val;
		for(i=0;i<81;i++)
		{
			if(document.getElementById(eleIds[i]))
			{
				cur_val = Number(document.getElementById(eleIds[i]).value);
				if(document.getElementById('alphaid'))
				{
					if(document.getElementById('alphaid').value==1)
					{
						cur_val = document.getElementById(eleIds[i]).value;
						cur_val = toNum(cur_val);
					}
				}
				document.getElementById(eleIds[i]).style.background= bg_color[cur_val];
				document.getElementById(eleIds[i]).style.color = num_color[cur_val];
			}
		}
	}
}
function undo_colorcode()
{

	var elem_id = "";
	var i=0;
	var j=0;
	for(i=1;i<=9;i++)
	{
		for(j=1;j<=9;j++)
		{
			elem_id = "r"+i+"c"+j;
			if(document.getElementById(elem_id))
			{
				document.getElementById(elem_id).style.background= '#FFFFFF';
				document.getElementById(elem_id).style.color = '#000000';
			}
		}
	}
}
function import_todayssudoku()
{
	var todayspuzzle;
	todayspuzzle = document.getElementById("todayssudoku").value;
	fillin(todayspuzzle);
	colorcode();
	update_nooffilledcells();
	drawgraph();
}
function initial_import()
{
	var tobefilledpuzzle;
	var elem_id;
	var newrow, newcol,newpos,newelement,newnumber;
	creEleIds();
	if(document.getElementById("solutionpuzzle").value!="") 
	{
		solution_help=true;
		tobefilledpuzzle= document.getElementById("solutionpuzzle").value;
		if(document.getElementById("pno_of_steps").value=="One")
		{
			document.getElementById("newrowcol").style.visibility = "visible";
			newrow = document.getElementById("newrow").value ; 
			newcol = document.getElementById("newcol").value ;
			elem_id = "r" + newrow + "c" +newcol; 
			newpos= (newrow-1)*9+(newcol-1);
			newelement = tobefilledpuzzle.charAt(newpos);
			if(document.getElementById('alphaid'))
			{
				if(document.getElementById('alphaid').value==1)
				{
					newelement = toAlpha(newelement);
				}
			}
			newnumber = "<span class=\"newelemsol\">"+newelement+"</span>";
			document.getElementById("newrowcol").innerHTML=newnumber+" at row "+newrow+" column "+newcol;
			document.getElementById("newrowcol").style.color= "#339900";
		}
	}
	else
	{
		var drand = range_rand(3);
		switch(drand)
		{
			case 0:
				tobefilledpuzzle = document.getElementById("todayseasysudoku").value;
				changeTabStyle("Easy");
				break;
			case 1:
				tobefilledpuzzle = document.getElementById("todaysmediumsudoku").value;
				changeTabStyle("Medium");
				break;
			case 2:
				tobefilledpuzzle = document.getElementById("todayshardsudoku").value;
				changeTabStyle("Hard");
				break;
			case 3:
				tobefilledpuzzle = document.getElementById("todaysevilsudoku").value;
				changeTabStyle("Evil");
				break;
			default:
				alert("error from switch case");
		}
	}
	fillin(tobefilledpuzzle);
	colorcode();
	//update_nooffilledcells();
	if(document.getElementById("solutionpuzzle").value!="") 
	{
		if(document.getElementById("pno_of_steps").value=="One")
		{
			document.getElementById(elem_id).style.color = "#000000";
		}
		//changeTabStyle(document.getElementById("hdnDiffLevel").value);
	}
	//drawgraph();
}
function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	var i=0;
	var j=0;
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}
function save_puzzle()
{
	var puzzlename = "puzzle1";
	var userpuzzle = "";
	var puzzlename = window.prompt("Enter a name for your puzzle ",puzzlename);
	var i=0;
	var j=0;
	for (j = 1; j <= 9; j++) 
	{
		for (i = 1; i <= 9; i++) 
		{ 
			var elem_no = (j-1)*9+(i-1);
			if(!document.getElementById("r" + j + "c"+ i))
			{
				userpuzzle = userpuzzle + "0";
			}
			else if(document.getElementById("r" + j + "c"+ i).value=="")
			{
				userpuzzle = userpuzzle + "0";
			}
			else
			{
				userpuzzle = userpuzzle + document.getElementById("r" + j + "c"+ i).value;
			}
		}
	}
	createCookie(puzzlename,userpuzzle,'999');
	alert('Your puzzle has been saved!!');

}
function load_puzzle()
{
	var puzzlename = "puzzle1";
	var userpuzzle = "";
	var puzzlename = window.prompt("Enter the name of puzzle you want to load ",puzzlename);
	blink=false;
	reset_innerhtml();
	fillin(readCookie(puzzlename));
	EveryTime();

}
function addmove(current_row,current_col,key)
{
	moves[moves_count]= new Array();
	moves[moves_count]["row"]=current_row;
	moves[moves_count]["col"]=current_col;
	moves[moves_count]["val"]=key;
	moves_count++;

}
function newnumber(rowcolint,key)
{
	if(usepencil)
	{
		pencilnewnumber(rowcolint,key);
		return;
	}
	var rowcol = "" + rowcolint + "";
	var current_row = rowcol.charAt(0);
	var current_col = rowcol.charAt(1);
	//setfocus(current_row,current_col,key);
	var i=0;
	var j=0;
	newentry = true;
	var elem_id = "r"+rowcol.charAt(0)+"c"+rowcol.charAt(1);
	var telem_id = "tr"+rowcol.charAt(0)+"c"+rowcol.charAt(1);
	var next_elem_col;
	var next_elem_row;
	addmove(current_row,current_col,key);
	if(document.getElementById(elem_id))
	{
		if(document.getElementById(elem_id).value=="")
		{
			document.getElementById(elem_id).style.background= bg_color[0];
			document.getElementById(elem_id).style.color = num_color[0];
		}
		else
		{
			k=document.getElementById(elem_id).value;
			if(document.getElementById('alphaid'))
			{
				if(document.getElementById('alphaid').value==1)
				{
					cur_val = k;
					k = toNum(cur_val);
				}
			}
			document.getElementById(elem_id).style.background= bg_color[k];
			document.getElementById(elem_id).style.color = num_color[10];
		}
	}
	check_validity();
	//update_nooffilledcells();
	//drawgraph();
}
function pencilnewnumber(rowcolint,key)
{
	var rowcol = "" + rowcolint + "";
	var elem_id = "tr"+rowcol.charAt(0)+"c"+rowcol.charAt(1);
	var taelemid = "ta" + elem_id;
	if(key>=32&&key<=126)
	{
		document.getElementById(elem_id).innerHTML = textareahtml(taelemid,elem_id,key);
		document.getElementById(taelemid).focus();
	}
	//drawgraph();
}
/*
function setfocus(current_row,current_col,key)
{
	var next_elem_col;
	var next_elem_row;
	if(key>=48&&key<=57)
	{
		if(current_col=='9')
		{
			next_elem_col = '1';
			next_elem_row = Number(current_row)+1;
		}
		else
		{
			next_elem_col = Number(current_col)+1;
			next_elem_row = current_row;
		}
		next_elem = getnextrowcol(current_row,current_col);

		if(document.getElementById(next_elem))
		{
			var cur_val = Number(document.getElementById(next_elem).value);
			if(!(cur_val>0&&cur_val<=9))
			{
				document.getElementById(next_elem).value='';
				document.getElementById(next_elem).focus();
			}
		}
	}
}
function getnextrowcol(current_row,current_col)
{
	var next_elem_col;
	var next_elem_row;
	if(current_col=='9')
	{
		next_elem_col = '1';
		next_elem_row = Number(current_row)+1;
	}
	else
	{
		next_elem_col = Number(current_col)+1;
		next_elem_row = current_row;
	}
	next_elem = "r"+next_elem_row+"c"+next_elem_col;
	return next_elem;
}
*/
function check_validity()
{
	blink=false;

	if(checkvalidity==false)
	{
		return;
	}
	var i=0;
	var j=0;
	found_error = false;
	for (j = 1; j <= 9; j++) 
	{
		for (i = 1; i <= 9; i++) 
		{ 
			var elem_no = (j-1)*9+(i-1);
			if(document.getElementById("r" + j + "c"+ i))
			{
				value = document.getElementById("r" + j + "c"+ i).value;
				if(value != 0)
				{
					check_row(j,value);
					check_column(i,value);
					check_block(j,i,value);
				}
			}
		}
	}
	//to be deleted
	/*
	if((!found_error)&&(newentry))
	{
		switch(document.getElementById("hdnDiffLevel").value)
		{
			case "Easy":
				document.getElementById("newrowcol").style.visibility = "visible";
				document.getElementById("newrowcol").innerHTML = document.getElementById("todayseasysudokumesg").value;
				document.getElementById("newrowcol").style.color= "#339900";
				break;
			case "Medium":
				document.getElementById("newrowcol").style.visibility = "visible";
				document.getElementById("newrowcol").innerHTML = document.getElementById("todaysmediumsudokumesg").value;
				document.getElementById("newrowcol").style.color= "#339900";
				break;
			case "Hard":
				document.getElementById("newrowcol").style.visibility = "visible";
				document.getElementById("newrowcol").innerHTML = document.getElementById("todayshardsudokumesg").value;
				document.getElementById("newrowcol").style.color= "#339900";
				break;
			case "Evil":
				document.getElementById("newrowcol").style.visibility = "visible";
				document.getElementById("newrowcol").innerHTML = document.getElementById("todaysevilsudokumesg").value;
				document.getElementById("newrowcol").style.color= "#339900";
				break;
			case "None":
				break;
			default:
				alert("error from switch case");
		}
	}
	*/
	newentry = false;
}
function check_row(rowno,value)
{
	var count = 0;
	var i = 0;
	var error_cell=[];
	for(i=1;i<=9;i++)
	{
		if(document.getElementById("r" + rowno + "c"+ i))
		{
			cur_val = document.getElementById("r" + rowno + "c"+ i).value;
			if(cur_val == value)
			{
				error_cell[count++]="r"+rowno+"c"+i;
			}
		}
	}
	if(count>1)
	{
		found_error = true;
		blink=true;
		blink_numbers(error_cell[0],error_cell[1]);
	}
}
function check_column(colno,value)
{
	var count = 0;
	var i = 0;
	var error_cell=[];
	for(i=1;i<=9;i++)
	{
		if(document.getElementById("r" + i + "c"+ colno))
		{
			cur_val = document.getElementById("r" + i + "c"+ colno).value;
			if(cur_val == value) 
			{
				error_cell[count++]="r"+i+"c"+colno;
			}
		}
	}
	if(count>1)
	{
		found_error = true;
		blink=true;
		blink_numbers(error_cell[0],error_cell[1]);
	}
}
function check_block(rowno,colno, value)
{
	var count = 0;
	var rowmin = 0;
	var colmin = 0 ;
	var error_cell=[];
	if((rowno%3)==0)
	{
		rowmin = rowno -2;
	}
	else
	{
		rowmin = rowno - (rowno%3)+1;
	}
	if((colno%3)==0)
	{
		colmin = colno -2;
	}
	else
	{
		colmin = colno - (colno%3)+1;
	}
	var i =0;
	var j=0;
	for(i=rowmin;i<rowmin+3;i++)
	{
		for(j=colmin;j<colmin+3;j++)
		{
			if(document.getElementById("r" + i + "c"+ j))
			{
				cur_val = document.getElementById("r" + i + "c"+ j).value;
				if(cur_val == value)
				{
					error_cell[count++]="r" + i + "c"+ j;
				}
			}
		}
	}
	if(count>1)
	{
		found_error = true;
		blink=true;
		blink_numbers(error_cell[0],error_cell[1]);
	}

}
function update_nooffilledcells()
{
	var i=0;
	var j=0;
	var count = 0;
	var cur_val;
	var regExp = /^[A-Ia-i]$/;
	for (j = 1; j <= 9; j++) 
	{
		for (i = 1; i <= 9; i++) 
		{ 
			if(document.getElementById("r" + j + "c"+ i))
			{
				if(document.getElementById('alphaid'))
				{
					if(document.getElementById('alphaid').value==1)
					{
						cur_val = document.getElementById("r" + j + "c"+ i).value;
						if(cur_val.match(regExp))
						{
							count++;
						}
					}
					else
					{
						alert('logical error, alphamode');
					}
				}
				else
				{
					cur_val = Number(document.getElementById("r" + j + "c"+ i).value);
					if(cur_val>0&&cur_val<=9)
					{
						count++;
					}
				}
			}
		}
	}
	document.getElementById("noofcells").innerHTML = "No of filled cells: "+count;
	if(count==81)
	{
		if(!found_error)
		{

			document.getElementById("newrowcol").innerHTML = "Congratulations!! You have successfully solved the puzzle.";
			//startTimer = false; //to be deleted
			Stop();
			//document.getElementById("btnStStpTmr").value="Start";
			if(!solution_help)
			{
				document.getElementById("success_timetaken").value = document.getElementById("divTime").innerHTML;
				document.getElementById("success_diff_level").value = document.getElementById("hdnDiffLevel").value;
				document.getElementById("submitsuccess").submit();
			}
		}
	}
	filled_cells_count = count;

}
function mimic_success()
{
	Stop();
	document.getElementById("success_timetaken").value = document.getElementById("divTime").innerHTML;
	document.getElementById("success_diff_level").value = document.getElementById("hdnDiffLevel").value;
	document.getElementById("submitsuccess").submit();
}
function submittoprint()
{
	var i=0;
	var j=0;
	var currentpuzzle = "";
	for (j = 1; j <= 9; j++) 
	{
		for (i = 1; i <= 9; i++) 
		{ 

			if((document.getElementById("r" + j + "c"+ i))&&(document.getElementById("r" + j + "c"+ i).value!=""))
			{
				currentpuzzle = currentpuzzle + document.getElementById("r" + j + "c"+ i).value;
			}
			else
			{
				currentpuzzle = currentpuzzle + "0";
			}
		}
	}
	document.getElementById("sudokuform").action = "http://www.sudoku-solver.net/printsudoku.php?puzzle="+currentpuzzle;
	document.getElementById("sudokuform").submit();
}
function printonload()
{
	window.print();
}
function pseudoreset()
{
	reset_innerhtml();
	undo_colorcode();
	document.getElementById("noofcells").innerHTML = "No of filled cells: 0 ";
	filled_cells_count = 0;
	document.getElementById("newrowcol").style.visibility = "hidden";
	changeTabStyle("None");
	document.getElementById('hdnDiffLevel').value="None";

}
function get_langactionstr()
{
	var actionstr="";
	switch(document.getElementById("langoption").value)
	{
		case "0":
			actionstr+="lang=English";
			break;
		case "1":
			actionstr+="lang=French";
			break;
		case "2":
			actionstr+="lang=German";
			break;
		case "3":
			actionstr+="lang=Finnish";
			break;
		case "4":
			actionstr+="lang=Dutch";
			break;
		case "5":
			actionstr+="lang=Italian";
			break;
		case "6":
			actionstr+="lang=Spanish";
			break;
		case "7":
			actionstr+="lang=Turkish";
			break;
		case "8":
			actionstr+="lang=Portuguese";
			break;
		case "9":
			actionstr+="lang=Chinese";
			break;
		case "10":
			actionstr+="lang=Russian";
			break;
		default:
			actionstr+="lang=English";
			break;

	}
	return actionstr;
}
function load_random()
{

	document.getElementById("sudokuform").action = "index.php?randomsudoku=y&"+get_langactionstr();
	document.getElementById("sudokuform").submit();
}
function toggle_colorcode()
{
	if(document.getElementById("colorcodecb").checked == true)
	{
		colorcode();
	}
	else
	{
		undo_colorcode();
	}
}
function toggle_checkvalidity()
{
	if(document.getElementById("checkvaliditycb").checked == true)
	{
		checkvalidity = true;
		check_validity();
	}
	else
	{
		checkvalidity = false;
		document.getElementById("newrowcol").innerHTML = "";
	}
}
function toggleMoreOptions()
{

	var moreoptvis = document.getElementById("moreoptions").style.display;
	if(moreoptvis=="block")
	{
		document.getElementById("moreoptions").style.display="none";
	}
	else
	{
		document.getElementById("moreoptions").style.display="block";
	}
	/*
	var moreoptvis= document.getElementById("moreoptions").style.visibility;
	if(moreoptvis=="visible")
	{
		document.getElementById("moreoptions").style.visibility="hidden";
	}
	else
	{
		document.getElementById("moreoptions").style.visibility="visible";
	}
	*/

}
function ToggleDiffLevel(selected)
{

	if(selected=="Easy")
	{
		reset_innerhtml();
		fillin(document.getElementById("todayseasysudoku").value);
		document.getElementById("newrowcol").innerHTML = document.getElementById("todayseasysudokumesg").value;
		document.getElementById("newrowcol").style.color= "#339900";
		document.getElementById("newrowcol").style.visibility = "visible";
		document.getElementById("hdnDiffLevel").value="Easy";
		document.getElementById("tabDiffLevelEasy").className="clsSelTab";

	}
	else if(selected=="Medium") 
	{
		reset_innerhtml();
		fillin(document.getElementById("todaysmediumsudoku").value);
		document.getElementById("newrowcol").innerHTML = document.getElementById("todaysmediumsudokumesg").value;
		document.getElementById("newrowcol").style.color= "#339900";
		document.getElementById("newrowcol").style.visibility = "visible";
		document.getElementById("hdnDiffLevel").value="Medium";
		document.getElementById("tabDiffLevelMedium").className="clsSelTab";
	}
	else if(selected=="Hard")
	{
		reset_innerhtml();
		fillin(document.getElementById("todayshardsudoku").value);
		document.getElementById("newrowcol").innerHTML = document.getElementById("todayshardsudokumesg").value;
		document.getElementById("newrowcol").style.color= "#339900";
		document.getElementById("newrowcol").style.visibility = "visible";
		document.getElementById("hdnDiffLevel").value="Hard";
		document.getElementById("tabDiffLevelHard").className="clsSelTab";
	}
	else if(selected=="Evil")
	{
		reset_innerhtml();
		fillin(document.getElementById("todaysevilsudoku").value);
		document.getElementById("newrowcol").innerHTML = document.getElementById("todaysevilsudokumesg").value;
		document.getElementById("newrowcol").style.color= "#339900";
		document.getElementById("newrowcol").style.visibility = "visible";
		document.getElementById("hdnDiffLevel").value="Evil";
		document.getElementById("tabDiffLevelEvil").className="clsSelTab";
	}
	else
	{
		alert("error");
	}
	blink=false;
	changeTabStyle(selected);
	Reset();
	Start();
	EveryTime();

}
function EveryTime()
{
	colorcode();
	check_validity();
	update_nooffilledcells();
	drawgraph();
}
function submittosolve()
{
	document.getElementById("sudokuform").action = "index.php?solve=y&steps=complete&"+get_langactionstr();
	document.getElementById("sudokuform").submit();
}
function submittosolveonestep()
{
	document.getElementById("sudokuform").action = "index.php?"+get_langactionstr()+"&solve=y&steps=one";
	document.getElementById("sudokuform").submit();
}
function textareahtml(textareaid,tdid,key)
{
	var ch = String.fromCharCode(key);
	var current_row = tdid.charAt(2);
	var current_col = tdid.charAt(4);
	var current_elem = ((Number(current_row)-1)*9)+Number(current_col);
	var textareahtml = "<textarea tabindex="+String(current_elem)+" class=\"penciltextarea\" id=\""+textareaid+"\" onKeyUp=\"textnewnumber(\'"+tdid+"\',event.keyCode);\" rows='3' cols='3'>"+ch+"</textarea>";
	return textareahtml;

}
function toggle_pencil()
{
	if(!document.getElementById("pencilcb").checked)
	{
		usepencil = false;
	}
	else
	{
		usepencil = true;
	}
}
function textnewnumber(tdid,key)
{
	var rowcol = "" + tdid + "";
	var current_row = rowcol.charAt(2);
	var current_col = rowcol.charAt(4);
	var in_html = "<input onKeyUp='newnumber("+current_row+current_col+",event.keyCode);' class='sudokuinput' size='1' maxlength='1' type='text' id='r"+current_row+"c"+current_col+"' name='r"+current_row+"c"+current_col+"' value='' >";
	/*
	if(!startTimer)
	{
		startTimer = true;
		Start();
		//to be deleted
		//document.getElementById("btnStStpTmr").value="Stop";
	}
	*/
	if(!usepencil)
	{
		document.getElementById(tdid).innerHTML = in_html;
		if(key>=48&&key<=57)
		{
			document.getElementById('r'+current_row+'c'+current_col).value = String.fromCharCode(key);
			EveryTime();
		}
		else
		{
			document.getElementById('r'+current_row+'c'+current_col).focus();
		}
		addmove(current_row,current_col,key);
	}
	
}
function reset_innerhtml()
{
	var i;
	var j;
	var tdid;
	var elem_id;
	var in_html;  
	var tabindex_num = 1;
	solution_help=false;
	for(i=1;i<10;i++)
	{
		for(j=1;j<10;j++)
		{
			tdid = "tr"+ String(i)+ "c" + String(j);
			elem_id = "r" + String(i)+"c"+String(j);
			in_html = "<input onKeyUp='newnumber("+String(i)+String(j)+",event.keyCode);' tabindex="+String(tabindex_num)+" class='sudokuinput' size='1' maxlength='1' type='text' id='r"+String(i)+"c"+String(j)+"' name='r"+String(i)+"c"+String(j)+"' value='' >";
			document.getElementById(tdid).innerHTML = in_html;
			tabindex_num++;
		}
	}
}


function doToolTip(e, msg) {
  if ( typeof Tooltip == "undefined" || !Tooltip.ready ) return;
  Tooltip.show(e, msg);
}

function hideTip() {
  if ( typeof Tooltip == "undefined" || !Tooltip.ready ) return;
  Tooltip.hide();
}
function drawgraph()
{
	var cur_val;
	var num_count = [0,0,0,0,0,0,0,0,0,0];
	var cur_alp;
	for(k=0;k<81;k++)
	{
		if(document.getElementById(eleIds[k]))
		{
			cur_val = Number(document.getElementById(eleIds[k]).value); 
			if(document.getElementById('alphaid'))
			{
				if(document.getElementById('alphaid').value==1)
				{
					cur_alp = document.getElementById(eleIds[k]).value; 
					cur_val = toNum(cur_alp);
				}
			}
			num_count[cur_val]++;
		}
	}
	for(k=1;k<10;k++)
	{
		document.getElementById(tabColEIs[k]).innerHTML = bartable(num_count[k],k);
	}
}

function bartable(count,num)
{
	var ret_str="";
	var num_val = num;
	if(document.getElementById('alphaid'))
	{
		if(document.getElementById('alphaid').value==1)
		{
			num = toSudChar(num);
		}
	}
	if(count>9)count=9;
	ret_str = ret_str+"<table class=\"tablet0\">";
	for(i=0;i<count;i++)
	{
		ret_str+="<tr><td><font class=\"font0\">"+num+"</font></td></tr>";
	}
	for(i=count;i<9;i++)
	{
		ret_str+="<tr><td><font class=\"font"+num_val+"\">"+num+"</font></td></tr>";
	}
	ret_str = ret_str+"</table>";
	return ret_str;

}
/*
 //to be deleted
function bartable1(count,num)
{
	var ret_str="";
	ret_str="<table class=\"tablet0\"> ";
	for(i=0;i<count;i++)
	{
		ret_str+="<tr><td><font class=\"font0\" >"+String(num)+"</font></td></tr>";
	}
	ret_str = ret_str+"</table>";
	ret_str = ret_str+" <table class=\"tablet"+String(num)+"\">";
	for(i=count;i<9;i++)
	{
		ret_str+="<tr><td>"+String(num)+"</td></tr>";
	}
	ret_str = ret_str+"</table>";
	return ret_str;

}
*/

var dw_event = {
  
  add: function(obj, etype, fp, cap) {
    cap = cap || false;
    if (obj.addEventListener) obj.addEventListener(etype, fp, cap);
    else if (obj.attachEvent) obj.attachEvent("on" + etype, fp);
  }, 

  remove: function(obj, etype, fp, cap) {
    cap = cap || false;
    if (obj.removeEventListener) obj.removeEventListener(etype, fp, cap);
    else if (obj.detachEvent) obj.detachEvent("on" + etype, fp);
  }, 

  DOMit: function(e) { 
    e = e? e: window.event;
    e.tgt = e.srcElement? e.srcElement: e.target;
    
    if (!e.preventDefault) e.preventDefault = function () { return false; }
    if (!e.stopPropagation) e.stopPropagation = function () { if (window.event) window.event.cancelBubble = true; }
        
    return e;
  }
  
}

var Tooltip = {
    followMouse: true,
    offX: 8,
    offY: 12,
    tipID: "tipDiv",
    showDelay: 100,
    hideDelay: 200,
    
    ready:false, timer:null, tip:null, 
  
    init: function() {  
        if ( document.createElement && document.body && typeof document.body.appendChild != "undefined" ) {
            if ( !document.getElementById(this.tipID) ) {
                var el = document.createElement("DIV");
                el.id = this.tipID; document.body.appendChild(el);
            }
            this.ready = true;
        }
    },
    
    show: function(e, msg) {
        if (this.timer) { clearTimeout(this.timer);	this.timer = 0; }
        this.tip = document.getElementById( this.tipID );
        if (this.followMouse) // set up mousemove 
            dw_event.add( document, "mousemove", this.trackMouse, true );
        this.writeTip("");  // for mac ie
        this.writeTip(msg);
        viewport.getAll();
        this.positionTip(e);
        this.timer = setTimeout("Tooltip.toggleVis('" + this.tipID + "', 'visible')", this.showDelay);
    },
    
    writeTip: function(msg) {
        if ( this.tip && typeof this.tip.innerHTML != "undefined" ) this.tip.innerHTML = msg;
    },
    
    positionTip: function(e) {
        if ( this.tip && this.tip.style ) {
            // put e.pageX/Y first! (for Safari)
            var x = e.pageX? e.pageX: e.clientX + viewport.scrollX;
            var y = e.pageY? e.pageY: e.clientY + viewport.scrollY;
    
            if ( x + this.tip.offsetWidth + this.offX > viewport.width + viewport.scrollX ) {
                x = x - this.tip.offsetWidth - this.offX;
                if ( x < 0 ) x = 0;
            } else x = x + this.offX;
        
            if ( y + this.tip.offsetHeight + this.offY > viewport.height + viewport.scrollY ) {
                y = y - this.tip.offsetHeight - this.offY;
                if ( y < viewport.scrollY ) y = viewport.height + viewport.scrollY - this.tip.offsetHeight;
            } else y = y + this.offY;
            
            this.tip.style.left = x + "px"; this.tip.style.top = y + "px";
        }
    },
    
    hide: function() {
        if (this.timer) { clearTimeout(this.timer);	this.timer = 0; }
        this.timer = setTimeout("Tooltip.toggleVis('" + this.tipID + "', 'hidden')", this.hideDelay);
        if (this.followMouse) // release mousemove
            dw_event.remove( document, "mousemove", this.trackMouse, true );
        this.tip = null; 
    },

    toggleVis: function(id, vis) { // to check for el, prevent (rare) errors
        var el = document.getElementById(id);
        if (el) el.style.visibility = vis;
    },
    
    trackMouse: function(e) {
    	e = dw_event.DOMit(e);
     	Tooltip.positionTip(e);
    }
    
}
  
var viewport = {
  getWinWidth: function () {
    this.width = 0;
    if (window.innerWidth) this.width = window.innerWidth - 18;
    else if (document.documentElement && document.documentElement.clientWidth) 
  		this.width = document.documentElement.clientWidth;
    else if (document.body && document.body.clientWidth) 
  		this.width = document.body.clientWidth;
  },
  
  getWinHeight: function () {
    this.height = 0;
    if (window.innerHeight) this.height = window.innerHeight - 18;
  	else if (document.documentElement && document.documentElement.clientHeight) 
  		this.height = document.documentElement.clientHeight;
  	else if (document.body && document.body.clientHeight) 
  		this.height = document.body.clientHeight;
  },
  
  getScrollX: function () {
    this.scrollX = 0;
  	if (typeof window.pageXOffset == "number") this.scrollX = window.pageXOffset;
  	else if (document.documentElement && document.documentElement.scrollLeft)
  		this.scrollX = document.documentElement.scrollLeft;
  	else if (document.body && document.body.scrollLeft) 
  		this.scrollX = document.body.scrollLeft; 
  	else if (window.scrollX) this.scrollX = window.scrollX;
  },
  
  getScrollY: function () {
    this.scrollY = 0;    
    if (typeof window.pageYOffset == "number") this.scrollY = window.pageYOffset;
    else if (document.documentElement && document.documentElement.scrollTop)
  		this.scrollY = document.documentElement.scrollTop;
  	else if (document.body && document.body.scrollTop) 
  		this.scrollY = document.body.scrollTop; 
  	else if (window.scrollY) this.scrollY = window.scrollY;
  },
  
  getAll: function () {
    this.getWinWidth(); this.getWinHeight();
    this.getScrollX();  this.getScrollY();
  }
  
}
function change_center_div_width()
{
	var wid_left = document.getElementById("floatleft").offsetWidth;
	//var wid_right= document.getElementById("floatright").offsetWidth; //use this only if you call this function after loading right div
	//var wid_right = wid_left + 40; // change this if you floatright and floatleft dont have equal widht (200-160=40)

	var wid_right = 0;
	if(document.getElementById('floatright'))
	{
		wid_right = wid_left; // change this if you floatright and floatleft dont have equal widht (200-160=40)
	}
	var middle_padding = 5; // assign this to whatever you set in CSS
	var new_width = document.body.offsetWidth - wid_left - wid_right - 2*middle_padding;
	if(new_width<728)
	{
		document.body.style.width= "1100px";
		document.getElementById("floatmiddle").style.width = "728px";
	}
	else
	{
		document.getElementById("floatmiddle").style.width = new_width+"px";
	}
}
function equalize_div_heights()
{
	var left_ht =0;
	var right_ht =0;
	var max_ht = 0 ;
	var  left_ht = document.getElementById("floatleft").offsetHeight;
	var  middle_ht = document.getElementById("floatmiddle").offsetHeight;
	if(document.getElementById('floatright'))
	{
		right_ht = document.getElementById("floatright").offsetHeight;
	}
	if(left_ht>right_ht)
	{
		if(left_ht>middle_ht)
		{
			max_ht = left_ht;
		}
		else
		{
			max_ht = middle_ht;
		}
	}
	else
	{
		if(right_ht>middle_ht)
		{
			max_ht = right_ht;
		}
		else
		{
			max_ht = middle_ht;
		}
	}
	var middle_padding = 5; // assign this to whatever you set in CSS
	document.getElementById("floatleft").style.height= max_ht + "px";
	if(document.getElementById('floatright'))
	{
		document.getElementById("floatright").style.height= max_ht + "px";
	}
	document.getElementById("floatmiddle").style.height= max_ht+ "px";


}
function afterloading()
{
	change_center_div_width();
	equalize_div_heights();
	Start();
	//initial_import();
}
var timerID = 0;
var tStart  = null;

function UpdateTimer() 
{
	if(timerID) 
	{
		clearTimeout(timerID);
		clockID  = 0;
	}

	if(!tStart)
	{
		tStart   = new Date();
	}
	var   tDate = new Date();
	var   tDiff = tDate.getTime() - tStart.getTime();
	var totHrs = "" + ((tDiff)/3600000) + "";
	var totSec = (Number(tDiff)/1000)%60;
	var totMin = Number(tDiff)/60000%60;
	var totSecstr = String(totSec).split('.');
	var totMinstr = String(totMin).split('.');
	var totHrsstr = totHrs.split('.');
	if(totSecstr[0].length==1)
	{
		totSecstr[0] = '0'+totSecstr[0];
	}
	if(totMinstr[0].length==1)
	{
		totMinstr[0] = '0'+totMinstr[0];
	}
	if(totHrsstr[0].length==1)
	{
		totHrsstr[0] = '0'+totHrsstr[0];
	}
	timetaken = ""+totHrsstr[0]+ ":" +totMinstr[0]+ ":" + totSecstr[0];
	//document.getElementById("divTime").innerHTML=" tDiff="+tDiff+" totSec="+totSec+" totMin="+totMin+" "+totMinstr[0]+ ":" + totSecstr[0];
	//document.getElementById("divTime").innerHTML=""+totMinstr[0]+ ":" + totSecstr[0];
	document.getElementById("divTime").innerHTML=""+timetaken;
	timerID = setTimeout("UpdateTimer()", 1000);
}

function Start() 
{
	tStart   = new Date();
	if(document.getElementById("divTime"))
	{
		document.getElementById("divTime").innerHTML="00:00";
		timerID  = setTimeout("UpdateTimer()", 1000);
	}
}

function Stop() 
{
	if(timerID) 
	{
		clearTimeout(timerID);
		timerID  = 0;
	}
	tStart = null;
}

function Reset() 
{	
	tStart = null;
	document.getElementById("divTime").innerHTML="00:00";
}
function changeTabStyle(selectedTab)
{
	return;
		switch(selectedTab)
		{
			case "Easy":
				document.getElementById("tabDiffLevelEvil").className="clsTab";
				document.getElementById("tabDiffLevelHard").className="clsTab";
				document.getElementById("tabDiffLevelMedium").className="clsTab";
				document.getElementById("tabDiffLevelEasy").className="clsSelTab";
				break;
			case "Medium":
				document.getElementById("tabDiffLevelEvil").className="clsTab";
				document.getElementById("tabDiffLevelHard").className="clsTab";
				document.getElementById("tabDiffLevelMedium").className="clsSelTab";
				document.getElementById("tabDiffLevelEasy").className="clsTab";
				break;
			case "Hard":
				document.getElementById("tabDiffLevelEvil").className="clsTab";
				document.getElementById("tabDiffLevelHard").className="clsSelTab";
				document.getElementById("tabDiffLevelMedium").className="clsTab";
				document.getElementById("tabDiffLevelEasy").className="clsTab";
				break;
			case "Evil":
				document.getElementById("tabDiffLevelEvil").className="clsSelTab";
				document.getElementById("tabDiffLevelHard").className="clsTab";
				document.getElementById("tabDiffLevelMedium").className="clsTab";
				document.getElementById("tabDiffLevelEasy").className="clsTab";
				break;
			case "None":
				document.getElementById("tabDiffLevelEvil").className="clsTab";
				document.getElementById("tabDiffLevelHard").className="clsTab";
				document.getElementById("tabDiffLevelMedium").className="clsTab";
				document.getElementById("tabDiffLevelEasy").className="clsTab";
				break;
			default:
				alert("error");
		}
}
//to be deleted
/*
function toggleTimer()
{
	if(document.getElementById("btnStStpTmr").value=="Start")
	{
		document.getElementById("btnStStpTmr").value="Stop";
		Start();
		startTimer = true;
	}
	else
	{
		document.getElementById("btnStStpTmr").value="Start";
		Stop();
		startTimer = false;
	}

}
*/
function mouOutDifLev(diffLevel)
{
	if(diffLevel!=document.getElementById('hdnDiffLevel').value)
	{
		var id = 'tabDiffLevel'+diffLevel;
		document.getElementById(id).className = 'clsTab';
	}
}
function creEleIds()
{
	var i;
	var j;
	var k=0;
	for (j = 1; j <= 9; j++) 
	{
		for (i = 1; i <= 9; i++) 
		{ 
			if(document.getElementById("r" + j + "c"+ i))
			{
				eleIds[k++]="r" + j + "c"+ i; 
			}
		}
	}
	for(i=1;i<10;i++)
	{
		tabColEIs[i]= "tabletcollection"+String(i);
	}
}
function blink_numbers(elem1,elem2)
{
	document.getElementById(elem1).style.color="black";
	document.getElementById(elem2).style.color="black";
	var func = "blink_numbers_revert('"+elem1+"','"+elem2+"')";
	setTimeout(func,500);
}
function blink_numbers_revert(elem1,elem2)
{
	document.getElementById(elem2).style.color="white";
	document.getElementById(elem1).style.color="white";
	if(blink)
	{
		var func = "blink_numbers('"+elem1+"','"+elem2+"')";
		setTimeout(func,200);
	}
}
function ToggleLang()
{

	document.getElementById("langform").submit();
}
function undo()
{
	//to be deleted
	/*
	for(i=0;i<moves_count;i++)
	{
		alert(moves[i]["row"]+moves[i]["col"]+moves[i]["val"]);
	}
	*/
	var elemid = "r"+moves[moves_count-1]["row"]+"c"+moves[moves_count-1]["col"];
	document.getElementById(elemid).value="";
	moves_count--;
	EveryTime();
}
function pop_display_order()
{
	for(i=0;i<boxcount;i++)
	{
		temp_order[i]=i;
	}
	for(i=0;i<boxcount;i++)
	{
		swap_pos=range_rand(boxcount-1-i);
		swap_val=temp_order[swap_pos];
		temp_order[swap_pos]=temp_order[boxcount-1-i];
		temp_order[boxcount-1-i]=swap_val;
	}
	disp_seq_order=temp_order;
	
}
function pop_display()
{
	for(i=0;i<boxcount;i++)
	{
		temp[i]=i;
	}
	for(i=0;i<boxcount;i++)
	{
		swap_pos=range_rand(boxcount-1-i);
		swap_val=temp[swap_pos];
		temp[swap_pos]=temp[boxcount-1-i];
		temp[boxcount-1-i]=swap_val;
	}
	disp_seq=temp;
	
}
function range_rand(max)
{
	if(max==0)
	{
		return 0;
	}
	random_num = Math.random()*100;
	random_num = Math.ceil(random_num%max);
	return random_num;
}
function startcolorboxgame()
{
	boxcount = document.getElementById("totalboxes").value;
	pop_display();
	document.getElementById("instdiv").innerHTML="Now watch the boxes carefully:) Good Luck!";
	showtime=0;
	for(i=0;i<boxcount;i++)
	{
		bid="boxid"+disp_seq[i];
		func_str= "blinkboxcolor('"+bid+"','"+disp_seq[i]+"')";
		setTimeout(func_str,showtime);
		showtime=showtime+timeInterval;
	}
	func_str="colormemquestion()";
	setTimeout(func_str,showtime);
}
function startboxgame()
{
	boxcount = document.getElementById("totalboxes").value;
	pop_display();
	pop_display_order();
	document.getElementById("instdiv").innerHTML="Now watch the boxes carefully:) Good Luck!";
	showtime=0;
	for(i=0;i<boxcount;i++)
	{
		bid="boxid"+disp_seq_order[i];
		//bid="boxid"+i;
		func_str= "blinkbox('"+bid+"','"+disp_seq[i]+"')";
		setTimeout(func_str,showtime);
		showtime=showtime+timeInterval;
	}
	func_str="memquestion()";
	setTimeout(func_str,showtime);
}
function memquestion()
{
	document.getElementById("instdiv").innerHTML="Now click on the colored boxes in the increasing order of the numbers shown before.";
}
function noteclick(crow,ccol)
{
	boxval = crow*boxcount/2+ccol;
	boxid="boxid"+boxval;
	for(i=0;i<boxcount;i++)
	{
		if(disp_seq_order[i]==boxval)
		{
			current_val = i;
		}
	}
	document.getElementById(boxid).innerHTML=disp_seq[current_val];
	if(click_itr==0)
	{
		lost_game=false;
	}
	click_seq[click_itr]= disp_seq[current_val];
	if((click_seq[click_itr]!=click_seq[click_itr-1]+1)&&(click_itr!=0))
	{
		lost_game=true;
		document.getElementById("instdiv").innerHTML="You lost!! Click here to try again. <br><input class='buttonclass' name='startgame' onclick='javascript:startsamestep();' id='startgame' type='button' value='Start' />";
	}
	if(click_itr==0&&click_seq[0]!=0)
	{
		lost_game=true;
		document.getElementById("instdiv").innerHTML="You lost!! Click here to try again. <br><input class='buttonclass' name='startgame' onclick='javascript:startsamestep();' id='startgame' type='button' value='Start' />";
	}
	click_itr++;
	if((click_itr==boxcount)&&(lost_game==false))
	{
		document.getElementById("instdiv").innerHTML="Congrats! Click to start to try a faster one.<br><input class='buttonclass' name='startgame' onclick='javascript:startnextstep();' id='startgame' type='button' value='Start' />";
	}
}
function blinkboxcolor(boxid,blinkchar)
{
	document.getElementById(boxid).innerHTML=blinkchar;
	func_str= "blinkboxcolor('"+boxid+"','&nbsp;')";
	if(blinkchar!="&nbsp;")
	{
		setTimeout(func_str,timeNumDisplay);
	}
}
function blinkbox(boxid,blinkchar)
{
	document.getElementById(boxid).innerHTML=blinkchar;
	func_str= "blinkbox('"+boxid+"','&nbsp;')";
	if(blinkchar!="&nbsp;")
	{
		setTimeout(func_str,timeNumDisplay);
	}
}
function startsamestep()
{
	click_itr=0;
	reset_box();
	startboxgame();
	
}
function reset_box()
{
	for(i=0;i<boxcount;i++)
	{
		boxid="boxid"+i;
		document.getElementById(boxid).innerHTML="";
	}
	click_itr=0;
	disp_seq=[];
	click_seq=[];
	temp = [];
	for(i=0;i<boxcount;i++)
	{
		temp[i]=i;
	}
}
function startnextstep()
{
	reset_box();
	mem_step++;
	if(mem_step==4)
	{
		window.location = "memorygame.php?level="+document.getElementById('nextlevel').value;
	}
	timeNumDisplay=timeNumDisplay-100;
	timeInterval =timeNumDisplay+0;
	startboxgame();
}

//dont remove puzzle no on error
