var clickedList_var=new Array();

var object_var;
var status_var;
var request_var;
var puzzle_var;
var input_var;
var size_t;
var start_time="00:00:00";
var url_common="http://www.looppuzzle.com/";

function GetXMLHttpRequest() 
{
    var object_var = null;
    
    if (window.XMLHttpRequest) 
	{
	    object_var = new XMLHttpRequest();
	} 
    else if (window.ActiveXObject) 
	{
	    try
		{
		    object_var = new ActiveXObject("Msxml2.XMLHTTP");
		}
	    catch(e)
		{
		}
        
	    if (object_var == null)
		{
		    try
			{
			    object_var = new ActiveXObject("Microsoft.XMLHTTP");
			}
		    catch(e)
			{
			}
		}
	}
    
    if (object_var == null)
	{
	    alert("Your browser does not support AJAX");
	}
    
    return object_var;
}


function Send(url) 
{
    object_var = GetXMLHttpRequest();
    object_var.onreadystatechange = processResponse;
    object_var.open("GET", url, true);
    object_var.send("");
}

function Reset_game()
{
    clearErrors();
    fillSmallSquares();

    level_var = document.getElementById("level").value;
    level_var = level_var*2+1;
    
    for(i=0;i<level_var;i++)
	{
	    for(j=0;j<level_var;j++)
		{
		    id="id_"+i+"_"+j;

		    if(hasClassName(id, "tableblack") || hasClassName (id, "tablewhite") ||  hasClassName(id,"tablered"))
			{
			    _setClassName(id, "tableblue");
			    clickedList_var[id]="0";
			}
		}
	}
    fillSmallSquares();
    
}

function initClickedList()
{
    level_var = document.getElementById("level").value;
    level_var = level_var*2+1;
    
    for(i=0;i<level_var;i++)
	{
	    for(j=0;j<level_var;j++)
		{
		    ij = "id_"+i+"_"+j;
		    clickedList_var[ij] = 0;
		}
	}
}

function processResponse() 
{
    status_var = document.getElementById("status");
    if (object_var.readyState == 4) 
	{
	    // 200 means "OK"
	    if (object_var.status == 200) 
		{
		    if(request == "verify")
			{
			    var resp = object_var.responseText;
			    if(object_var.responseText.search("solved")!=-1)
				{
				    document.getElementById("success_timetaken").value=document.getElementById("timer").innerHTML;
				    document.getElementById("success_diff_level").value=document.getElementById("size").value;
				    document.getElementById("submitsuccess").submit();
				    status_var.innerHTML= object_var.responseText;
				}
			    else //error
				{
				    if(object_var.responseText.search("Lines")>-1)
					{
					    status_var.innerHTML = "There aren't the correct no. of lines around a square";
					    status_var.className="error";
					    var ij=getIJ(resp);
					    var i=getI(ij);
					    var j=getJ(ij);
					    document.getElementById(ij).className="error";
					    markErrorLines(i,j);					    

					}
				    else if(object_var.responseText.search("Crisscross")>-1)
					{
					    //alert(object_var.responseText);
					    status_var.className="error";
					    status_var.innerHTML = "More than 2 lines at an intersection";
					    var ij=getIJ(resp);
					    var i=getI(ij);
					    var j=getJ(ij);
					    markCrissCross(i,j);

					}
				    else if(object_var.responseText.search("Looseends")>-1)
					{
					    //alert(object_var.responseText);
					    status_var.className="error";
					    status_var.innerHTML = "Loop unfinished. There are loose ends";
					    var ij=getIJ(resp);
					    var i=getI(ij);
					    var j=getJ(ij);
					    //markCrissCross(i,j);

					}
				    else
					{
					    status_var.className="error";
					    status_var.innerHTML = object_var.responseText;
					}
                                    Start();
				}

			}
		    if(request == "new")
			{
			    puzzle_var = document.getElementById("puzzle");
			    var resp = object_var.responseText;
			    
			    var size_var = resp.substring(resp.indexOf("=")+1,resp.indexOf("puz"));
			    var puzlen=size_var*size_var;
			    var puz = resp.substring(resp.indexOf("puz")+4,puzlen+resp.indexOf("puz")+4);
			    puzzle_var.innerHTML=resp.substring(resp.indexOf(puz)+size_var*size_var);
			    status_var.innerHTML="";
			    input_var = document.getElementById("input");
			    input_var.innerHTML="<input class=\"buttonclass\" type=\"button\" name=\"verify\"' value=\"Verify\" onclick=\"verifySolution("+size_var+",'"+puz+"');\"/>";
			    document.getElementById("level").value = size_var;
			    status_var.innerHTML = "";
			    initClickedList();
			    Reset();
			    Start();

			}
		    request = "";
		} 
	    else 
		{
		    status_var.innerHTML = "Oops! There was an error. Please try again in a few seconds";
		}
	}
}


function markErrorLines(i,j)
{
    temp=parseInt(j)-1; left_var="id_"+i+"_"+temp;
    temp=parseInt(j)+1; right_var="id_"+i+"_"+temp;
    temp=parseInt(i)-1; top_var="id_"+temp+"_"+j;
    temp=parseInt(i)+1; bottom_var="id_"+temp+"_"+j;

    //    alert(left_var); alert(right_var); alert(top_var); alert(bottom_var);
    
    if(clickedList_var[left_var]=="1")
	_setClassName(left_var, "tablered");
    if(clickedList_var[right_var]=="1")
	_setClassName(right_var, "tablered");
    if(clickedList_var[top_var]=="1")
	_setClassName(top_var, "tablered");
    if(clickedList_var[bottom_var]=="1")
	_setClassName(bottom_var, "tablered");
}

function markCrissCross(i,j)
{
    temp=parseInt(j)-1; left_var="id_"+i+"_"+temp;
    temp=parseInt(j)+1; right_var="id_"+i+"_"+temp;
    temp=parseInt(i)-1; top_var="id_"+temp+"_"+j;
    temp=parseInt(i)+1; bottom_var="id_"+temp+"_"+j;
    markCrissCrossTopLeft(i,j,left_var, top_var);
    markCrissCrossTopRight(i,j,top_var, right_var);
    markCrissCrossBottomLeft(i,j,bottom_var, left_var);
    markCrissCrossBottomRight(i,j,bottom_var, right_var);

    markCrissCrossAdjLefts(i,j,left_var,bottom_var);
    markCrissCrossAdjTops(i,j,top_var, right_var);
    markCrissCrossAdjRights(i,j,right_var, bottom_var);
    markCrissCrossAdjBottoms(i,j,bottom_var, right_var);
}

function markCrissCrossAdjLefts(i,j,left_var, bottom_var)
{
    level_var = document.getElementById("level").value;
    level_var = level_var*2-1;

    if(i < level_var)
	{
	    tempi=parseInt(i)+2;tempj=parseInt(j)-1;next_left="id_"+tempi+"_"+tempj;
	    if(clickedList_var[left_var]=="1" && clickedList_var[next_left]=="1")
		{
		    if (clickedList_var[bottom_var]=="1")
			{
			    _setClassName(left_var, "tablered");
			    _setClassName(next_left, "tablered");
			    _setClassName(bottom_var, "tablered");
			}

		    if(j>1) 
			{
			    tempi=parseInt(i)+1;tempj=parseInt(j)-2;prev_bottom="id_"+tempi+"_"+tempj;
			    if (clickedList_var[prev_bottom]=="1")
				{
				    _setClassName(left_var, "tablered");
				    _setClassName(next_left, "tablered");
				    _setClassName(prev_bottom, "tablered");
				}
			}
		    
		}
	}
}

function markCrissCrossAdjTops(i,j,top_var, right_var)
{
    level_var = document.getElementById("level").value;
    level_var = level_var*2-1;

    if(j < level_var)
	{
	    tempi=parseInt(i)-1;tempj=parseInt(j)+2;next_top="id_"+tempi+"_"+tempj;
	    if(clickedList_var[top_var]=="1" && clickedList_var[next_top]=="1")
		{
		    if (clickedList_var[right_var]=="1")
			{
			    _setClassName(top_var, "tablered");
			    _setClassName(next_top, "tablered");
			    _setClassName(right_var, "tablered");
			}

		    if(i>1) 
			{
			    tempi=parseInt(i)-2;tempj=parseInt(j)+1;prev_right="id_"+tempi+"_"+tempj;
			    if (clickedList_var[prev_right]=="1")
				{
				    _setClassName(top_var, "tablered");
				    _setClassName(next_top, "tablered");
				    _setClassName(prev_right, "tablered");
				}
			}
		    
		}
	}
}

function markCrissCrossAdjRights(i,j,right_var, bottom_var)
{
    level_var = document.getElementById("level").value;
    level_var = level_var*2-1;

    if(i < level_var)
	{
	    tempi=parseInt(i)+2;tempj=parseInt(j)+1;next_right="id_"+tempi+"_"+tempj;
	    if(clickedList_var[right_var]=="1" && clickedList_var[next_right]=="1")
		{
		    if (clickedList_var[bottom_var]=="1")
			{
			    _setClassName(right_var, "tablered");
			    _setClassName(next_right, "tablered");
			    _setClassName(bottom_var, "tablered");
			}

		    if(j<level_var) 
			{
			    tempi=parseInt(i)+1;tempj=parseInt(j)+2;next_bottom="id_"+tempi+"_"+tempj;
			    if (clickedList_var[next_bottom]=="1")
				{
				    _setClassName(right_var, "tablered");
				    _setClassName(next_right, "tablered");
				    _setClassName(next_bottom, "tablered");
				}
			}
		    
		}
	}
}

function markCrissCrossAdjBottoms(i,j,bottom_var, right_var)
{
    level_var = document.getElementById("level").value;
    level_var = level_var*2-1;

    if(j < level_var)
	{
	    tempi=parseInt(i)+1;tempj=parseInt(j)+2;next_bottom="id_"+tempi+"_"+tempj;
	    if(clickedList_var[bottom_var]=="1" && clickedList_var[next_bottom]=="1")
		{
		    if (clickedList_var[right_var]=="1")
			{
				    _setClassName(bottom_var, "tablered");
				    _setClassName(next_bottom, "tablered");
				    _setClassName(right_var, "tablered");
			}

		    if(i<level_var) 
			{
			    tempi=parseInt(i)+2;tempj=parseInt(j)+1;next_bottom="id_"+tempi+"_"+tempj;
			    if (clickedList_var[next_right]=="1")
				{
				    _setClassName(bottom_var, "tablered");
				    _setClassName(next_bottom, "tablered");
				    _setClassName(next_right, "tablered");
				}
			}
		    
		}
	}
}

function markCrissCrossTopLeft(i,j,left_var, top_var)
{
    if(clickedList_var[left_var]=="1" && clickedList_var[top_var]=="1")
	{
    	    if(i>1)
		{
		    tempi=parseInt(i)-2;tempj=parseInt(j)-1;prev_left="id_"+tempi+"_"+tempj;
		    if(clickedList_var[prev_left]=="1")
			{
			    _setClassName(prev_left, "tablered");
			    _setClassName(left_var, "tablered");
			    _setClassName(top_var, "tablered");
			}
		    
		}
	    if(j>1)
		{
		    tempi=parseInt(i)-1;tempj=parseInt(j)-2;prev_top="id_"+tempi+"_"+tempj;
		    if(clickedList_var[prev_top]=="1")
			{
			    _setClassName(prev_top, "tablered");
			    _setClassName(left_var, "tablered");
			    _setClassName(top_var, "tablered");
			}
		}

	}
}

function markCrissCrossTopRight(i,j,top_var, right_var)
{
    if(clickedList_var[top_var]=="1" && clickedList_var[right_var]=="1")
	{
    	    if(i>1)
		{
		    tempi=parseInt(i)-2;tempj=parseInt(j)+1;prev_right="id_"+tempi+"_"+tempj;
		    if(clickedList_var[prev_right]=="1")
			{
			    _setClassName(prev_right, "tablered");
			    _setClassName(top_var, "tablered");
			    _setClassName(right_var, "tablered");
			}
		    
		}
	    
	    level_var = document.getElementById("level").value;
	    level_var = level_var*2-1;
	    if(j<level_var)
		{
		    tempi=parseInt(i)-1;tempj=parseInt(j)+2;next_top="id_"+tempi+"_"+tempj;
		    if(clickedList_var[next_top]=="1")
			{
			    _setClassName(next_top, "tablered");
			    _setClassName(top_var, "tablered");
			    _setClassName(right_var, "tablered");
			}
		}

	}
}

function markCrissCrossBottomLeft(i,j,bottom_var, left_var)
{
    if(clickedList_var[bottom_var]=="1" && clickedList_var[left_var]=="1")
	{

	    level_var = document.getElementById("level").value;
	    level_var = level_var*2-1;
    	    if(i<level_var)
		{
		    tempi=parseInt(i)+2;tempj=parseInt(j)-1;next_left="id_"+tempi+"_"+tempj;
		    if(clickedList_var[next_left]=="1")
			{
			    _setClassName(next_left, "tablered");
			    _setClassName(bottom_var, "tablered");
			    _setClassName(left_var, "tablered");
			}
		    
		}
	    if(j>1)
		{
		    tempi=parseInt(i)+1;tempj=parseInt(j)-2;prev_bottom="id_"+tempi+"_"+tempj;
		    if(clickedList_var[prev_bottom]=="1")
			{
			    _setClassName(prev_bottom, "tablered");
			    _setClassName(bottom_var, "tablered");
			    _setClassName(left_var, "tablered");
			}
		}

	}
}

function markCrissCrossBottomRight(i,j,bottom_var, right_var)
{
    if(clickedList_var[bottom_var]=="1" && clickedList_var[right_var]=="1")
	{
	    level_var = document.getElementById("level").value;
	    level_var = level_var*2-1;

    	    if(i<level_var)
		{
		    tempi=parseInt(i)+2;tempj=parseInt(j)+1;next_right="id_"+tempi+"_"+tempj; 
		    if(clickedList_var[next_right]=="1")
			{
			    _setClassName(next_right, "tablered");
			    _setClassName(bottom_var, "tablered");
			    _setClassName(right_var, "tablered");
			}
		    
		}
	    if(j<level_var)
		{
		    tempi=parseInt(i)+1;tempj=parseInt(j)+2;next_bottom="id_"+tempi+"_"+tempj; 
		    if(clickedList_var[next_bottom]=="1")
			{
			    _setClassName(next_bottom, "tablered");
			    _setClassName(bottom_var, "tablered");
			    _setClassName(right_var, "tablered");
			}
		}

	}
}

function getIJ(resp)
{
    var ij = resp.substring(resp.indexOf(":")+1);
    var i = getI(ij);
    var j = getJ(ij);
    i=parseInt(i)*2+1;j=parseInt(j)*2+1;
    ij = "id_"+i+"_"+j;
    return ij;
}

function getI(ij)
{
    var temp = ij.substring(ij.indexOf("id_")+3);
    var i = temp.substring(0,ij.indexOf("_")-1);
    return i;
}


function getJ(ij)
{
    var temp = ij.substring(ij.indexOf("id_")+3);
    var j = temp.substring(ij.indexOf("_"));
    return j;
}



function clearErrors()
{
    status_var = document.getElementById("status");
    status_var.className="normal";
    status_var.innerHTML="";
    level_var = document.getElementById("level").value;
    for(i=0;i<level_var;i++)
	{
	    for(j=0;j<level_var;j++)
		{
		    var k = i*2+1; var l =j*2+1;
		    var ij = "id_"+k+"_"+l;
		    if(document.getElementById(ij).className=="error")
			document.getElementById(ij).className="normal";
		}
	}
}

function noteClicked(id)
{
    clearErrors();

    if(hasClassName(id, "tableblack"))
	{
	    clickedList_var[id]="0";
	    _setClassName(id,"tableblue");
	}
    else{
	_setClassName(id,"tableblack");
	clickedList_var[id]="1";
    }
    fillSmallSquares();
}


function noteCancelled(id)
{

    clearErrors();

    _setClassName(id,"tablewhite");
    fillSmallSquares();
    clickedList_var[id]="0";

}


function verifySolution(gridSize, prob)
{
    Stop();
    request="verify";
    status_var = document.getElementById("status");
    status_var.innerHTML= "<img border='0' src='lib/template/images/loading_small.gif'/> Verifying solution...";
    var str="";
    len = gridSize*2+1;
    for(i=0;i<len;i++)
	{
	    for(j=0;j<len;j++)
		{
		    if(i%2==0)
			{
			    if(j%2!=0)
				{
				    id = "id_"+i+"_"+j;
				    //if(clickedList_var[id]==undefined)
				    //clickedList_var[id]="0";
				    str = str + clickedList_var[id];
				}
			}
		    else
			{
			    if(j%2==0)
				{
				    id = "id_"+i+"_"+j;
				    //if(clickedList_var[id]==undefined)
				    //clickedList_var[id]="0";
				    str = str + clickedList_var[id];
				}
			}
		}
	}
    url  =  url_common + 'utilities.php?q=verify&sol=' + str+'&prob='+prob+'&level='+gridSize;
    Send(url);
}

function mouseOut(id)
{
    if(!hasClassName(id, "tableblack") && !hasClassName(id, "tablewhite") && !hasClassName(id, "tablered"))
	{
	    _setClassName(id, "tableblue");
	}
}

function mouseIn(id){

    if(!hasClassName(id, "tableblack") && !hasClassName(id, "tablewhite") && !hasClassName(id, "tablered"))
	{
	    _setClassName(id, "tabledarkblue");
	}
}


function LoadingDone()
{
    initClickedList();
    document.getElementById("puzzle").style.display="block";
    status_var = document.getElementById("status");
    status_var.innerHTML = "";
    Start();
    size_t = document.getElementById("size").value;
    document.getElementById("size").value="5_easy";
}

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("timer").innerHTML=""+timetaken;
    timerID = setTimeout("UpdateTimer()", 1000);
}

function Start()
{
    if(!tStart)
       tStart   = new Date();

    if(document.getElementById("timer"))
        {
	    document.getElementById("timer").innerHTML=start_time;
	    timerID  = setTimeout("UpdateTimer()", 1000);
        }
}

function Stop()
{
    if(timerID)
        {
	    clearTimeout(timerID);
	    timerID  = 0;
        }
    //tStart = null;
    start_time=document.getElementById("timer").innerHTML;
}

function Reset()
{
    tStart = null;
    start_time="00:00:00";
    document.getElementById("timer").innerHTML=start_time;
}

function loadnew()
{
    Stop();
    request = "new";
    status_var = document.getElementById("status");
    status_var.innerHTML= "<img border='0' src='lib/template/images/loading_small.gif'/> Loading New Puzzle...";
    url  =  url_common + 'utilities.php?q=new&type=' + document.getElementById("size").value;
    Send(url);
}

function hasClassName(el, name)
{

    if(document.getElementById(el).className.indexOf(name)!=-1)
	return true;
    return false;
    /*
    var re = new RegExp('(^| )' + name + '( |$)');

    if(re.test(el.className))
	return true;
    return false;
    */
}

function _setClassName(id, name)
{
    if(hasClassName(id,"horizontal5"))
	document.getElementById(id).className= name + " horizontal5";
    if(hasClassName(id,"vertical5"))
	document.getElementById(id).className= name + " vertical5";
    if(hasClassName(id,"horizontal7"))
	document.getElementById(id).className= name + " horizontal7";
    if(hasClassName(id,"vertical7"))
	document.getElementById(id).className= name + " vertical7";
    if(hasClassName(id,"horizontal10"))
	document.getElementById(id).className= name + " horizontal10";
    if(hasClassName(id,"vertical10"))
	document.getElementById(id).className= name + " vertical10";
}


function fillSmallSquares()
{
    level_var = document.getElementById("level").value;
    var len = level_var*2;
    for(i=0;i<=len;i++)
	{
	    for(j=0;j<=len;j++)
		{
		    if((i%2==0)&&(j%2==0))
			{
			    checkSmallSqure(i,j,len);
			}
		}
	}
}

function checkSmallSqure(i,j, len)
{
    var ij = "id_"+i+"_"+j;
    var left_line=null;
    var right_line=null;
    var top_line=null;
    var bottom_line=null;

    if(j>0)
	{
	    left_line = "id_"+i + "_"+(j-1);
	}

    if(j<len)
	{
	    right_line = "id_"+i + "_"+(j+1);
	}

    if(i>0)
	{
	    top_line = "id_"+(i-1)+"_"+j;
	}

    if(i<len)
	{
	    bottom_line = "id_"+(i+1)+"_"+j;
	}

    var black_count =0;

    
    if(left_line && (hasClassName(left_line, "tableblack") || hasClassName(left_line, "tablered")))
	{
	    black_count++;
	}
    if(right_line && (hasClassName(right_line, "tableblack") || hasClassName(right_line, "tablered")))
	{
	    black_count++;
	}
    
    if(top_line && (hasClassName(top_line, "tableblack") || hasClassName(top_line, "tablered")))
	{
	    black_count++;
	}

    if(bottom_line && (hasClassName(bottom_line,"tableblack") || hasClassName(bottom_line, "tablered")))
	{
	    black_count++;
	}
    if(black_count>1)
	{
	    document.getElementById(ij).style.backgroundImage = "url(lib/template/images/dot.gif)";
	}
    else
	{
	    document.getElementById(ij).style.backgroundImage = "none";
	}
}
