var m_iDesign;
var m_iLevel;
var m_sSudoku;
var m_sSudokuPause;
var m_selectedCell;
var m_lastCell;
var m_phpPath = '';
var m_gameStarted;

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

function designChange() {
	
	var e = document.getElementById("selDesign");
	var iDesign = e.value;
	
	if (m_gameStarted) {
		if (confirm("This will end your current game. Are you sure?") == false) {
			e.value = m_iDesign;
			return;
		}
	}
	
	m_iDesign = iDesign;
	clear_grid(false);
	timer_reset();
	m_gameStarted = false;
	htmlGetDesign(iDesign);	
}
function create_new()
{
	if (!m_iDesign) {
		alert("Please choose a jigsaw design first.");
	}

	var e = document.getElementById("txtLevel");
	m_iLevel = e.value;
	switch(m_iLevel){
		case "5" : m_sLevel = "Extreme";break;
		case "4" : m_sLevel = "Expert";break;
		case "3" : m_sLevel = "Difficult";break;
		case "2" : m_sLevel = "Standard";break;
		case "1" : m_sLevel = "Easy";break;
	}
	htmlGetNewSudoko(m_iLevel);	
}

function finished_sudoku()
{
	if (m_Solved==true) 
	{
		alert("Yes, you did it! Try a new or even harder one!");
		return;
	}
	m_sSudoku = read_grid(false);
	htmlIsSolved();
}

//get new sudoku
function htmlGetNewSudoko(iLevel)
{
    var url = m_phpPath + 'jigsawNew.php';

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

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

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

}
function xmlhttpAswer_New()
{
	if (xmlhttp.readyState == 4)
    {
        if(xmlhttp.status == 200)
        {
			var newSudoku = xmlhttp.responseText;
			m_sSudoku = newSudoku;
			update_grid(newSudoku);
			
			//start timer.
			
			timer_stop();
			m_tSecs = 0;
			timer_start();
			m_tStarted = true;
			m_iReveals = 0;
			m_gameStarted = true;
			m_Solved = false;
        }
        else
        {
            alert("Error loading page\n"+ xmlhttp.status +":"+ xmlhttp.statusText);
        }
    }
}

//get new sudoku
function htmlGetDesign(iDesign)
{
    var url = m_phpPath + 'jigsawGetDesign.php';

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

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

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

}
function xmlhttpAswerGetDesign()
{
	var x, y, b, test;
	var e, sElement;
	
	if (xmlhttp.readyState == 4)
    {
        if(xmlhttp.status == 200)
        {
        	
			var answer = xmlhttp.responseText;
			var tmp = answer.split(";");
			for(var t = 0; t < 81; t++) {
				test = tmp[t];
				var tmp2 = test.split(",");
				x = parseInt(tmp2[0]); 
				y = parseInt(tmp2[1]); 
				b = parseInt(tmp2[2]); 
				sElement = "txtC" + (x+1) + (y+1);
				
	            e = document.getElementById(sElement);
	            switch (b) {
	            	case 0: e.style.background = "#9fb4d5"; break;
					case 1: e.style.background = "#a0a0a0"; break;
	            	case 2: e.style.background = "#c0c0c0"; break;
	            	case 3: e.style.background = "#f8e289"; break;
	            	case 4: e.style.background = "#f8ca89"; break;
					case 5: e.style.background = "#f8ab89"; break;
					case 6: e.style.background = "#95cbdb"; break;
	            	case 7: e.style.background = "#7d89e8"; break;
	            	case 8: e.style.background = "#e4e4e4"; break; 
				}
	            //e = document.getElementById("btnNew");
	            //e.disabled = false;
			}
        }
        else
        {
            alert("Error loading page\n"+ xmlhttp.status +":"+ xmlhttp.statusText);
        }
    }
}
//check, whether puzzle has been solved
function htmlIsSolved()
{
    var url = m_phpPath + 'jigsawSolved.php';
    var frm;

    if (window.ActiveXObject) {              // for IE
         xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
         }
    else if (window.XMLHttpRequest) {   // for other browsers{
         xmlhttp=new XMLHttpRequest();
    }
    
    xmlhttp.onreadystatechange=xmlhttpAswer_IsSolved;
    xmlhttp.open("POST",url,true);

    xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    var params = 'solution=' + m_sSudoku + '&jigsaw=' + m_iDesign;
    
    xmlhttp.send(params);

}
function xmlhttpAswer_IsSolved()
{
	if (xmlhttp.readyState == 4)
    {
        if(xmlhttp.status == 200)
        {
           var cellVal = xmlhttp.responseText;
           if (cellVal == 1) // value is invalid
           {
           	   timer_stop();
           	   
           	   alert("Congratulations, you have solved this jigsaw-sudoku!");	
           	   m_tStarted = false;
           	   m_Solved = true;
           	   htmlSaveSolved(m_iLevel, m_iDesign)
           }
           else //value is valid
           {
           		alert("You are not finished yet!");
           }
        }
        else
        {
            alert("Error loading page\n"+ xmlhttp.status +":"+ xmlhttp.statusText);
        }
    }
}
//save solved statistic
function htmlSaveSolved(iLevel, iDesign)
{
    var url = m_phpPath + 'savesolvedJigsaw.php';

    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');
    xmlhttp.send('level=' + iLevel + '&design=' + iDesign + '&duration=' + m_tSecs);

}
function xmlhttpAswerSave()
{
	if (xmlhttp.readyState == 4)
    {
        if(xmlhttp.status == 200)
        {
           var saveStatus = xmlhttp.responseText;
        }
        else
        {
            //alert("Error loading page\n"+ xmlhttp.status +":"+ xmlhttp.statusText);
        }
    }
}
//////////////////////////////////
///////// grid function //////////
//////////////////////////////////
function update_grid_pause(sSudoku)
{
	var x, y, val, iTab = 1, iPos;
	var e, sElement;
	for (var i = 0; i < 81; i++)
    {
    	x = parseInt(i % 9) + 1;
        y = parseInt(i / 9) + 1;
        iPos = sSudoku.indexOf(",");
        val = sSudoku.substring(0, iPos);
        
        sSudoku = sSudoku.substring(iPos + 1, sSudoku.length);
        sElement = "txtC" + x + y;
        e = document.getElementById(sElement);
        if (val != 0)
        {
        	e.value = val;
        } else {
        	e.value = "";
        }
        iPos = i;
    }
}
function update_grid(sSudoku)
{
	var x, y, val, iTab = 1;
	var e, sElement;
	
	for (var i = 0; i < 81; i++)
    {
    	x = parseInt(i / 9) + 1;
        y = parseInt(i % 9) + 1;
        val = sSudoku.substring(i, i + 1);
        sElement = "txtC" + x + y;
        e = document.getElementById(sElement);
        remove_event(e,"change",check_cell);
		add_event(e,"change",check_cell);
		if(e.className.indexOf("valueOptions")) { 
			e.className = e.className.replace(/ valueOptions/g,"");
		}
		
        if (val != 0)
        {
           e.value = val;
		   setReadOnly(e);
		   e.style.color = "#555555";
		   e.style.cursor = "default";
		}
        else
        {
        	e.value = "";
			removeReadOnly(e);
			e.style.color = "#000000";
			e.style.cursor = "text";
        }
    }
    for (var x = 1; x <= 9; x++)
    {
    	for (var y = 1; y <= 9; y++)
    	{
    		sElement = "txtC" + y + x;
	        e = document.getElementById(sElement);
	        val = e.value;
	        if (val=="")
	        {
	        	e.tabIndex = iTab;
	        	iTab++;
	        } else {
	        	e.tabIndex = 100;
	        }
    	}
    }
}
function check_cell(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 clear_grid(bBreak)
{
	var x, y, val;
	var e, sElement;
	var sBreak = "                            mypuzzle  .org              game    paused";
	
	for (var i = 0; i < 81; i++)
    {
    	x = parseInt(i % 9) + 1;
        y = parseInt(i / 9) + 1;
    	val = sBreak.substring(i, i + 1);
        sElement = "txtC" + x + y;
        e = document.getElementById(sElement);
        if (bBreak) {
        	e.value = val;
        } else {
        	e.value = "";
        }
	}
}

function read_grid(bSeperator)
{
	var x, y, val;
	var e, sElement, sSudoku = "";
	
	for (var i = 0; i < 81; i++)
    {
    	x = parseInt(i % 9) + 1;
        y = parseInt(i / 9) + 1;
        sElement = "txtC" + x + y;
        e = document.getElementById(sElement);
        val = e.value;
        if (IsEmpty(e)) {
        	val = "0"; 
        }
        sSudoku += '' + val;
        if (bSeperator) {
        	sSudoku += ",";
        }
    }
    return(sSudoku);
    
}

//helper classes
function setReadOnly(element){
	// For IE
	if (window.ActiveXObject) {   
		element.setAttribute('readOnly', true);
	// Other browsers
	}else{
		element.setAttribute('readonly', true); 	
	}
}
function removeReadOnly(element){
	// For IE
	if (window.ActiveXObject) {   
		element.removeAttribute('readOnly'); 
	// Other browsers
	}else{
		element.removeAttribute('readonly'); 	
	}
}
///////////////////////////
//   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_reset()
{
	timer_stop();
	
	var e = document.getElementById("time");
	e.innerHTML = "Time: 00:00";
}
function timer_switch()
{
	if (!m_sSudoku) return;
	
	if (m_tStarted){
		timer_stop();
		m_sSudokuPause = read_grid(true);
		clear_grid(true);
		m_tStarted = false;
		e = document.getElementById("btnPause");
		e.value = "Go on";
	} else {
		update_grid_pause(m_sSudokuPause);
		timer_start();
		m_tStarted = true;
		e = document.getElementById("btnPause");
		e.value = "Pause";
	}
}
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] = '';
	}
}
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;
}

function IsEmpty(aTextField) {
   if ((aTextField.value.length==0) ||
   (aTextField.value==null)) {
      return true;
   }
   else { return false; }
}
/* level change */
function changeLevel()
{
	var e = document.getElementById("selLevel");
	var iLevel = e.value;
	
	if (m_gameStarted) {
		if (confirm("This will end your current game. Are you sure?") == false) {
			e.value = m_iLevel;
			return;
		}
	}
	
	m_iLevel = iLevel;
	switch(m_iLevel){
		case "3" : m_sLevel = "Difficult";break;
		case "2" : m_sLevel = "Standard";break;
		case "1" : m_sLevel = "Easy";break;
	}
	clear_grid(false);
	timer_reset();
	m_gameStarted = false;
	//set html properties to new level info	
	var e = document.getElementById("txtLevel");
	e.value = m_iLevel;
	var e = document.getElementById("levelHeader");
	e.innerHTML = "- " +  m_sLevel + " Level";
}
