// Global Variables
var diameter_0=297;
var diameter_1=181;
var radius_0=(diameter_0-1)/2;
var radius_1=(diameter_1-1)/2;
//var area_0=Math.PI*radius_0*radius_0;	//Theory=68813
var area_0=68777;	//Fact=68777
//var area_1=25445;	//Not used yet

var backgroundWidth = 400;
var backgroundHeight = 400;

var n;
var score;
var rest;
var time_start;
var time_used;
var interval_1;
var pArray=new Array(diameter_0*diameter_0);
var cxArray=new Array(5);
var cyArray=new Array(5);

// Functions
function addEvent(obj, evType, fn)
{
	if(obj.addEventListener)
	{
		obj.addEventListener(evType, fn, false);
		return true;
	}else if(obj.attachEvent)
	{
		var r = obj.attachEvent("on"+evType, fn);
		return r;
	}else
	{
		return false;
	}
}

function removeEvent(obj, evType, fn)
{
	if(obj.removeEventListener)
	{
		obj.removeEventListener(evType, fn, false);
		return true;
	}else if(obj.detachEvent)
	{
		var r = obj.detachEvent("on"+evType, fn);
		return r;
	}else
	{
		return false;
	}
}

function addText(obj, str)
{
	if(navigator.appName.indexOf("Explorer") > -1)
	{
		obj.innerText=str;
	}else
	{
		obj.textContent=str;
	}
}

function GetAbsoluteLocationEx(element)
{
    if ( arguments.length != 1 || element == null )
    {
        return null;
    }
    var elmt = element;
    var offsetTop = elmt.offsetTop;
    var offsetLeft = elmt.offsetLeft;
    var offsetWidth = elmt.offsetWidth;
    var offsetHeight = elmt.offsetHeight;
    while( elmt = elmt.offsetParent )
    {
        if ( elmt.style.position == 'absolute' || elmt.style.position == 'relative'
            || ( elmt.style.overflow != 'visible' && elmt.style.overflow != '' ) )
        {
            break;
        }
        offsetTop += elmt.offsetTop;
        offsetLeft += elmt.offsetLeft;
    }
    return { absoluteTop: offsetTop, absoluteLeft: offsetLeft,
        offsetWidth: offsetWidth, offsetHeight: offsetHeight };
}

function body_onselectstart()
{
	return false;
}

function div_circle_adjust_z_order(o)
{
	var z=o.style.zIndex;
	var k;

	for(k=1;k<=5;k++)
	{
		var el=eval('document.getElementById("div_circle_'+k+'")');

		if(el==o)
		{
			el.style.zIndex=5;
		}else
		{
			if(el.style.zIndex>z)el.style.zIndex--;
		}
	}
}

function div_circle_calc(o)
{
	var i,j,k;
	var s=0;
	var al;
	var l,t;
	var cx,cy;

	al=GetAbsoluteLocationEx(document.getElementById("div_circle_0"));
	l=al.absoluteLeft;
	t=al.absoluteTop;

	al=GetAbsoluteLocationEx(o);
	cx=al.absoluteLeft+radius_1-l;
	cy=al.absoluteTop+radius_1-t;
	cxArray[5-n]=cx;
	cyArray[5-n]=cy;

	for(i=0;i<diameter_0;i++)
	{
		for(j=0;j<diameter_0;j++)
		{
			if(pArray[i*diameter_0+j]==1)
			{

				var cxx=i-cx;
				var cyy=j-cy;

				if(cxx*cxx+cyy*cyy<=radius_1*radius_1)
				{
					pArray[i*diameter_0+j]=2;
					s++;
				}
			}else if(pArray[i*diameter_0+j]==2)
			{
				s++;
			}
		}
	}

	score=Math.floor(10000*s/area_0)/100;
	rest=area_0-s;

	addText(document.getElementById("div_button_1_span_1"), "Rest: "+rest+" of "+area_0);
}

function div_circle_drag(o){
	if(!(navigator.appName.indexOf("Explorer") > -1))
	{
		o.firstChild.onmousedown=function(){return false;};
	}
	o.onmousedown=function(a){
		var d=document;if(!a)a=window.event;
		var x=a.layerX?a.layerX:a.offsetX,y=a.layerY?a.layerY:a.offsetY;
		var move_flag=true;

		if(o.setCapture)
			o.setCapture();
		else if(window.captureEvents)
			window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP);

		div_circle_adjust_z_order(o);
		o.style.borderWidth="1px";
		o.style.borderStyle="dashed";
		o.style.borderColor="#FFFFFF";

		if(!(navigator.appName.indexOf("Explorer") > -1))
		{
			al=GetAbsoluteLocationEx(o);
			var l=al.absoluteLeft;
			var t=al.absoluteTop;
			o.style.left=l-1;
			o.style.top=t-1;
		}

		d.onmousemove=function(a){
			if(!a)a=window.event;
			if(a.pageX===undefined)a.pageX=a.clientX+document.body.scrollLeft;
			if(a.pageY===undefined)a.pageY=a.clientY+document.body.scrollTop;
			if(document.body.clientLeft)a.pageX-=document.body.clientLeft;
			if(document.body.clientTop)a.pageY-=document.body.clientTop;
			var tx=a.pageX-x,ty=a.pageY-y;
			var txx,tyy;

			al=GetAbsoluteLocationEx(o);
			var l=al.absoluteLeft;
			var t=al.absoluteTop;
			if(move_flag || (a.pageX > l && a.pageX < (l+o.offsetWidth-1) && a.pageY > t && a.pageY <(t+o.offsetHeight-1)))
			{
				al=GetAbsoluteLocationEx(document.getElementById("div_circle_0"));
				var l0=al.absoluteLeft;
				var t0=al.absoluteTop;
				al=GetAbsoluteLocationEx(document.getElementById("div_background_2"));
				var l2=al.absoluteLeft;
				var t2=al.absoluteTop;
				var w2=al.offsetWidth;
				var h2=al.offsetHeight;
				r=[l0-diameter_1,l2+w2-o.offsetWidth,t0-diameter_1,t2+h2-o.offsetHeight];
				txx=tx<r[0]?r[0]:tx>r[1]?r[1]:tx;
				tyy=ty<r[2]?r[2]:ty>r[3]?r[3]:ty;
				o.style.left=txx;
				o.style.top=tyy;
				move_flag=true;
			}else
			{
				txx=l;
				tyy=t;
			}

			if(tx!=txx)
			{
				x=a.pageX-txx;
				move_flag=false;
			}
			if(ty!=tyy)
			{
				y=a.pageY-tyy;
				move_flag=false;
			}

		};

		d.onmouseup=function(){
			if(o.releaseCapture)
				o.releaseCapture();
			else if(window.captureEvents)
				window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP);
			d.onmousemove=null;
			d.onmouseup=null;

			o.style.borderWidth="0px";
			o.style.borderStyle="none";
			o.style.borderColor="#FFFFFF";

			if(!(navigator.appName.indexOf("Explorer") > -1))
			{
				al=GetAbsoluteLocationEx(o);
				var l=al.absoluteLeft;
				var t=al.absoluteTop;
				o.style.left=l+1;
				o.style.top=t+1;
			}

			//Judge whether it is a valid move
			al=GetAbsoluteLocationEx(document.getElementById("div_circle_0"));
			var x0=al.absoluteLeft+radius_0;
			var y0=al.absoluteTop+radius_0;
			al=GetAbsoluteLocationEx(o);
			var cx=al.absoluteLeft+radius_1-x0;
			var cy=al.absoluteTop+radius_1-y0;
			if(cx*cx+cy*cy<=(radius_0+radius_1)*(radius_0+radius_1))
			{
				//Calculate covered area
				o.onmousedown=null;
				div_circle_calc(o);
				n--;

				if(n==0)
				{
					clearInterval(interval_1);interval_1=null;
					document.getElementById("div_background_2").style.visibility="hidden";
					GameHint();

					if(rest<=document.getElementById("maxTopRest").value)
					{
						updateScore(document.getElementById("username").value,score,rest,time_used);
					}
				}
			}
		};
	};
	o.style.visibility="visible";
}

function div_circle_init()
{
	var al=GetAbsoluteLocationEx(document.getElementById("div_background"));
	var l=al.absoluteLeft;
	var t=al.absoluteTop;

	for(k=1;k<=5;k++)
	{
		var el=eval('document.getElementById("div_circle_'+k+'")');
		el.style.left=l+backgroundWidth+2+1+10;
		el.style.top=t+backgroundHeight+2-diameter_1+1-10;
		el.style.zIndex=6-k;
		if(!(navigator.appName.indexOf("Explorer") > -1))
		{
			el.style.left++;
		}
	}
}

function GameHint()
{
	time_used=Math.floor((new Date() - time_start)/1000);
	if(time_used>=1)
	{
		addText(document.getElementById("div_hint"), "Score: "+score+"% Time: "+time_used);
	}

	var k;
	var str="";
	for(k=0;k<5;k++)
	{
		str+="x: "+cxArray[k]+",y: "+cyArray[k]+"\n";
		//addText(document.getElementById("div_debug"), str);
	}
}

function GameInit()
{
	addEvent(document,'selectstart',body_onselectstart);

	var al=GetAbsoluteLocationEx(document.getElementById("div_background"));
	var l=al.absoluteLeft;
	var t=al.absoluteTop;
	document.getElementById("div_hint").style.left=l+backgroundWidth+2+1-250;
	document.getElementById("div_hint").style.width=250;
	document.getElementById("div_circle_0").style.left=l+52;
	document.getElementById("div_circle_0").style.top=t+52;
	document.getElementById("div_circle_0").style.visibility="visible";
	//document.getElementById("div_debug").style.left=l+backgroundWidth+2+1+160;
	//document.getElementById("div_debug").style.top=t+backgroundWidth+2-110;
	//document.getElementById("div_debug").style.width=250;
	//document.getElementById("div_debug").style.height=250;
	document.getElementById("div_background_2").style.left=l+backgroundWidth+2+1;
	document.getElementById("div_background_2").style.top=t+backgroundHeight+2-200;
	document.getElementById("div_background_2").style.width=200;
	document.getElementById("div_background_2").style.height=200;
	if(navigator.appName.indexOf("Explorer") > -1)
	{
		document.getElementById("div_background_2").style.borderLeftStyle="none";
	}

	var al=GetAbsoluteLocationEx(document.getElementById("div_username"));
	var t=al.absoluteTop;
	document.getElementById("div_hint").style.top=t;

	interval_1=null;

	var i,j;
	for(i=0;i<diameter_0;i++)
	{
		for(j=0;j<diameter_0;j++)
		{
			if((i-radius_0)*(i-radius_0)+(j-radius_0)*(j-radius_0)<=radius_0*radius_0)
			{

				pArray[i*diameter_0+j]=1;
			}else
			{
				pArray[i*diameter_0+j]=0;
			}
		}
	}

	loadScore(10);
}

function GameGo()
{
	var pattern = /^\s*(\S.*\S)\s*$/;
	if(pattern.test(document.getElementById("username").value.toLowerCase()))
	{
		document.getElementById("username").value=RegExp.$1;
		addText(document.getElementById("div_username")," Username: "+RegExp.$1);

		document.getElementById("div_button").style.display="block";
		document.getElementById("div_form").style.display="none";

		document.getElementById("div_hint").style.visibility="visible";

		GameRestart();
	}else
	{
		document.getElementById("username").value="";
		document.getElementById("username").focus();
		alert("Please input your name !");
	}
}

function GameRestart()
{
	document.getElementById("div_background_2").style.visibility="visible";
	addText(document.getElementById("div_button_1_span_1"), "");

	div_circle_init();
	//div_circle_init_solve();
	div_circle_drag(document.getElementById("div_circle_1"));
	div_circle_drag(document.getElementById("div_circle_2"));
	div_circle_drag(document.getElementById("div_circle_3"));
	div_circle_drag(document.getElementById("div_circle_4"));
	div_circle_drag(document.getElementById("div_circle_5"));

	if(!interval_1)
	{
		time_start=new Date();
		interval_1=setInterval('GameHint();',500);
	}

	var i,j;
	for(i=0;i<diameter_0;i++)
	{
		for(j=0;j<diameter_0;j++)
		{
			if(pArray[i*diameter_0+j]>0)
			{

				pArray[i*diameter_0+j]=1;
			}
		}
	}

	n=5;
	score=0;
}

addEvent(window,"load",GameInit);

