var m_iDesign;
var m_iLevel;
var m_sKakuro;
var m_iKakuro;
var m_sKakuroLoaded;
var m_sKakuroPause;
var m_selectedCell;
var m_lastCell;
var m_phpPath = '';
var m_Solved;

//timer variables
var m_tStarted;
var m_tObject;
var m_tSecs;
var m_tMins;

function levelChange() {
	
	var g = read_grid();
	g = g.replace(/0/g, "");

	var e = document.getElementById("selLevel");
	var iLevel = e.value;
	
	if (m_tStarted && g != "") {
		if (confirm("This will end your current game. Are you sure?") == false) {
			e.value = m_iLevel;
			return;
		}
	}
	m_tStarted = 0;
	m_iLevel = iLevel;
	//htmlCreateKakuro(iLevel, "", 0);
	htmlLoadKakuroList(iLevel);	
}

function kakuroChange() {
	var g = read_grid();
	g = g.replace(/0/g, "");
	
	var e = document.getElementById("selKakuro");
	var iKakuro = e.value;
	if (m_tStarted && g != "") {
		if (confirm("This will end your current game. Are you sure?") == false) {
			e.value = m_iKakuro;
			return;
		}
	}
	m_iKakuro = iKakuro;
	htmlGetKakuro(m_iLevel, m_iKakuro);
}

function create_new()
{
	htmlGetKakuro(m_iDesign);
	
}
//create new kakuro table from loaded kakuro string and design
function htmlCreateKakuro(iLevel, iKakuro, bValues)
{
    var url = m_phpPath + 'kakuroCreate.php';

    if (window.ActiveXObject) {              // for IE
         xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
         }
    else if (window.XMLHttpRequest) {   // for other browsers{
         xmlhttp=new XMLHttpRequest();
    }

    xmlhttp.onreadystatechange=xmlhttpAswerCreateKakuro;
    xmlhttp.open("POST",url,true);

    xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    var params = 'iKakuro=' + iKakuro + "&iLevel=" + iLevel + "&values=" + bValues;
    xmlhttp.send(params);
    

}
function xmlhttpAswerCreateKakuro()
{
	var x, y, b, test;
	var e, sElement;
	
	if (xmlhttp.readyState == 4)
    {
        if(xmlhttp.status == 200)
        {
			var answer = xmlhttp.responseText;
			var eTD = document.getElementById("tdData");
			eTD.innerHTML = answer;
			//document.getElementById("btnNew").disabled = false;
			//start timer.
			timer_stop();
			m_tSecs = 0;
			timer_start();
			m_tStarted = 1;
			m_iReveals = 0;
			m_Solved = false;	
			m_sKakuro = "00000";
			
			setEvents();
			//document.getElementByClassName("kakuroinput").innerHTML = m_sKakuroLoaded;
        }
        else
        {
            alert("Error loading page\n"+ xmlhttp.status +":"+ xmlhttp.statusText);
        }
    }
}
function setEvents() {

	var arrInputs = getElementsByClassName("kakuroinput");
	for (var i = 0; i < arrInputs.length; i++) {
		//alert(arrInputs[i].name);
		e = arrInputs[i];
		remove_event(e,"change",cell_change);
		//remove_event(e,"click",cell_clicked);
        //remove_event(e,"blur",cell_leave);
		//remove_event(e,"focus",cell_enter);
        add_event(e,"change",cell_change);
		//add_event(e,"click",cell_clicked);
		//add_event(e,"blur",cell_leave);
		//add_event(e,"focus",cell_enter);
	}
}
////////////////////////////
//  validation functions  //
////////////////////////////
function cell_change(e)
{
	var element = find_target(e);
	var val = element.value;
	if(val<1 || val>9 || isNaN(val)) { 
		if(val.length > 1) { //if more numbers, then possibilities.
			element.className += " valueOptions";
			//element.style.color = "#FF0000";
			val = 0;
		}
		//return 0;
	} else {
		if(element.className.indexOf("valueOptions")) { 
			element.className = element.className.replace(/ valueOptions/g,"");
			//element.style.color = "#000";
		}
	}
	//m_lastCell = m_selectedCell;
	//htmlSetCell(val);
}

function getElementsByClassName(className, tag, elm){
	var testClass = new RegExp("(^|\\\\s)" + className + "(\\\\s|$)");
	var tag = tag || "*";
	var elm = elm || document;
	var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
	var returnElements = [];
	var current;
	var length = elements.length;
	for(var i=0; i<length; i++){
		current = elements[i];
		if(testClass.test(current.className)){
			returnElements.push(current);
		}
	}
	return returnElements;
}
function find_target(e) {
	var element;
	if (!e) var e = window.event;
	if (e.target) element = e.target;
	else if (e.srcElement) element = e.srcElement;
	if (element.nodeType == 3) element = element.parentNode;// Safari bug
	return element;
}

//create new kakuro table from loaded kakuro string and design
function htmlLoadKakuroList(iLevel)
{
    var url = m_phpPath + 'kakuroLoadList.php';

    if (window.ActiveXObject) {              // for IE
         xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
         }
    else if (window.XMLHttpRequest) {   // for other browsers{
         xmlhttp=new XMLHttpRequest();
    }

    xmlhttp.onreadystatechange=xmlhttpAswerKakuroLoadList;
    xmlhttp.open("POST",url,true);

    xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    var params = 'iLevel=' + iLevel;
    xmlhttp.send(params);
    

}
function xmlhttpAswerKakuroLoadList()
{
	var x, y, b, test;
	var e, sElement;
	
	if (xmlhttp.readyState == 4)
    {
        if(xmlhttp.status == 200)
        {
			var answer = xmlhttp.responseText;
			var eKL = document.getElementById("kakuroList");
			eKL.innerHTML = answer;
			kakuroChange();
        }
        else
        {
            alert("Error loading page\n"+ xmlhttp.status +":"+ xmlhttp.statusText);
        }
    }
}
//get new kakuro string - load random
function htmlGetKakuro(iLevel, iKakuro)
{
    var url = m_phpPath + 'kakuroGet.php';

    if (window.ActiveXObject) {              // for IE
         xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
         }
    else if (window.XMLHttpRequest) {   // for other browsers{
         xmlhttp=new XMLHttpRequest();
    }

    xmlhttp.onreadystatechange=xmlhttpAswerGetKakuro;
    xmlhttp.open("POST",url,true);

    xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    var params = 'iKakuro=' + iKakuro + "&iLevel=" + iLevel;
    xmlhttp.send(params);

}
function xmlhttpAswerGetKakuro()
{
	var x, y, b, test;
	var e, sElement;
	
	if (xmlhttp.readyState == 4)
    {
        if(xmlhttp.status == 200)
        {
			var answer = xmlhttp.responseText;
			m_sKakuroLoaded = answer;
			htmlCreateKakuro(m_iLevel, m_iKakuro, 1);
        }
        else
        {
            alert("Error loading page\n"+ xmlhttp.status +":"+ xmlhttp.statusText);
        }
    }
}

function finished_kakuro()
{
	if (!m_tStarted) return;
	if (m_Solved==true) 
	{
		alert("Yes, you did it! Try a new or even harder one!");
		return;
	}
	m_sKakuro = read_grid(false);
	if (m_sKakuro == m_sKakuroLoaded) // is the one loaded
	{
		timer_stop();
	   	   
	   	alert("Congratulations, you have solved this Kakuro!");
	   	m_Solved = true;
	   	   
		htmlSaveSolved();
	}
	else 
	{
		alert("You are not finished yet!");
	}
}

function read_grid(bSeperator)
{
	var x, y, val;
	var e, sElement, sKakuro = "";
	
	for (var a = 0; a < 10; a++)
    {
    	for (var b = 0; b < 10; b++)
    	{
	    	sElement = "txtC" + b + a;
	        e = document.getElementById(sElement);
	        if (e) {
	        	val = e.value;
	        } else {
	        	val = "0";
	        }

	        sKakuro += '' + val;
	        if (bSeperator) {
        		sKakuro += ",";
        	}
	    }
    }
    return(sKakuro);   
}
function update_grid_pause(sKakuro)
{
	var x, y, val, iTab = 1, iPos, i = 0;
	var e, sElement;
	for (var a = 0; a < 10; a++)
    {
    	for (var b = 0; b < 10; b++)
    	{
    		iPos = sKakuro.indexOf(",");
	        val = sKakuro.substring(0, iPos);
	        
	        sKakuro = sKakuro.substring(iPos + 1, sKakuro.length);
	    	sElement = "txtC" + b + a;
	        e = document.getElementById(sElement);
	        if (e) {
	        
		        if (val != 0)
		        {
		        	e.value = val;
		        } else {
		        	e.value = "";
		        }
		    }
	        iPos = i;
		}
    }
}
function clear_grid()
{
	var x, y, val;
	var e, sElement;
	var sBreak = "                            mypuzzle  .org              game    paused";
	
	for (var a = 0; a < 10; a++)
    {
    	for (var b = 0; b < 10; b++)
    	{
	    	sElement = "txtC" + b + a;
	        e = document.getElementById(sElement);
	        if (e) {
	            e.value = "";
	        }
	    }
    }
}


//save solved statistic
function htmlSaveSolved()
{
    var url = m_phpPath + 'kakuro_savesolved.php';
    var sQryStr = "";

    if (window.ActiveXObject) {              // for IE
         xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
         }
    else if (window.XMLHttpRequest) {   // for other browsers{
         xmlhttp=new XMLHttpRequest();
    }

    xmlhttp.onreadystatechange=xmlhttpAswerSave;
    xmlhttp.open("POST",url,true);

    xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    
    sQryStr = 'level=' + m_iLevel + '&kakuro=' + m_iKakuro + '&duration=' + m_tSecs;
    xmlhttp.send(sQryStr);

}
function xmlhttpAswerSave()
{
	if (xmlhttp.readyState == 4)
    {
        if(xmlhttp.status == 200)
        {
           var saveStatus = xmlhttp.responseText;
        }
        else
        {
            //alert("Error loading page\n"+ xmlhttp.status +":"+ xmlhttp.statusText);
        }
    }
}
///////////////////////////
//   timer functions     //
///////////////////////////
function timer_start()
{
	if (!m_tSecs) m_tSecs = 0;
	
	m_tSecs++;
	var s = m_tSecs % 60;
	var m = Math.floor(m_tSecs/60);
	if(s<10) s = "0" + s;
	if(m<10) m = "0" + m;  
	
	var e = document.getElementById("time");

	e.innerHTML = "Time: " + m + ":" + s;
	
	m_tObject = window.setTimeout("timer_start()",1000);
	
}
function timer_stop()
{
	if (m_tObject) window.clearTimeout(m_tObject);
}
function timer_switch()
{
	if (!m_sKakuro) return;
	
	if (m_tStarted){
		timer_stop();
		gamePause();
	} else {
		gameResume();
		timer_start();	
	}
}

function gamePause() {
	m_sKakuroPause = read_grid(true);
	clear_grid();
	m_tStarted = false;
	document.getElementById("selLevel").disabled = true;
	document.getElementById("selKakuro").disabled = true;
}

function gameResume() {
	update_grid_pause(m_sKakuroPause);
	m_tStarted = true;
	document.getElementById("selLevel").disabled = false;
	document.getElementById("selKakuro").disabled = false;
}

function is_paused()
{
	if (m_tStarted)
	{
		return false;
	} else {
		return true;
	}
}

///////////////////////////
//   event functions     //
///////////////////////////
function add_event(element, evType, func) {
	if (element.addEventListener) {
		element.addEventListener(evType, func, false);
		return true;
	}
	else if (element.attachEvent) {
		var r = element.attachEvent('on' + evType, func);
		return r;
	}
	else {
		element['on' + evType] = func;
	}
}
function remove_event(element, evType, func) {
	if (element.removeEventListener) {
		element.removeEventListener(evType, func, false);
		return true;
	}
	else if (element.detachEvent) {
		var r = element.detachEvent('on' + evType, func);
		return r;
	}
	else {
		elm['on' + evType] = '';
	}
}