function JSBox(varname,initObj, t1, t2, t3, target)
{
	this.onImg = false;
	this.onBox = false;
	this.boxOpen = false;
	this.inTransition = false;
	this.active = false;
	this.sequence = 0;
	this.target = target;
	this.t1 = t1;
	this.t2=t2;
	this.t3=t3;
	this.initObj = initObj;
	this.varname = varname;
	//this.heartbeat = true;
	this.hbseq = 0;
	this.hbduration = 1000;
	this.hbpulse = 50;
		
}

//Starts a  box heartbeat
JSBox.prototype.initHeartbeat = function()
{
clearTimeout(this.hbseq);
//this.heartbeat = true;
this.hbseq = setTimeout(this.varname + ".checkBeat(" + this.hbduration + ")",this.hbpulse);
//alert(this.varname + " New Heartbeat");
//alert(duration);
//alert(pulse);
}

//Every (this.hbpulse) milliseconds, this checks to see if the mouse cursor is considered to be on either the box or the link.
//If either is the case, then remaining is reset to this.hbduration.
//If not, then remaining is decreased by this.hbpulse.
//If the box misses too many heartbeats (and remaining <= 0) then the box closes.
JSBox.prototype.checkBeat = function(remaining)
{
	if(this.onBox || this.onImg)
	{
		this.hbseq = setTimeout(this.varname + ".checkBeat(" + this.hbduration + ")",this.hbpulse);
	}
	else if(remaining > 0)
	{
		this.hbseq = setTimeout(this.varname + ".checkBeat(" + (remaining - this.hbpulse) + ")",this.hbpulse);
	}
	else
	{
		//this.heartbeat = false;
		//alert(this.varname + " Heartbeat Dead");
		this.confirmClose();
	}
}

//Makes the next heartbeat fatal if the cursor is considered to neither be on the box or on the link
//Useful in quickly switching menus
JSBox.prototype.killBeat = function()
{
clearTimeout(this.hbseq);
this.checkBeat(0);

}

JSBox.prototype.resetStaticBox = function(initname,tw,th,padding,direction)
{

//alert('Hi!');
	if(initname==this.initObj)
	{
	//alert('1');
	this.active=true;
	return
	}
	else 
	{
		//alert('2');
		this.active=true;
		this.initObj=initname;
		//alert("RSB");
		this.animTotalSetup(tw,th,padding,direction);
		this.moveOnImg();
		
	}
}


JSBox.prototype.resetBox = function(initname,tw,th,padding,direction)
{
	if(initname==this.initObj)
	{
	
	this.active=true;
	return
	}
	else 
	{
	
		this.active=true;
		clearTimeout(this.sequence);
		this.initObj=initname;
		this.animTotalSetup(tw,th,padding,direction);
		this.sequence=this.adaptiveBox(direction);
		this.initObj = initname;
		this.moveOnImg();
		
	}
}

JSBox.prototype.openSequence = function()
{
	if(this.active)
		{
		//alert(getActive());
		this.initHeartbeat();
		this.inTransition = true
		setTimeout("toggleDiv('" + this.t1 +"',1)",50)
		setTimeout("changeDiv('" + this.t1 +"','" + this.t2 +"')",100)
		setTimeout("changeDiv('" + this.t2 +"','" + this.t3 +"')",150)
		setTimeout("changeDiv('" + this.t3 +"','" + this.target + "')",200)
		setTimeout(this.varname + ".inTransition = false",201)
		this.boxOpen = true
		}
//document.getElementById("testing").innerHTML="I think the box is open"

}

JSBox.prototype.closeSequence = function()
{
this.inTransition = true

//alert(target);
setTimeout("changeDiv('" + this.target + "','" + this.t3 +"')",100)
setTimeout("changeDiv('" + this.t3 +"','" + this.t2 +"')",150)
setTimeout("changeDiv('" + this.t2 +"','" + this.t1 +"')",200)
setTimeout("toggleDiv('" + this.t1 +"',0)",225)
setTimeout(this.varname + ".inTransition = false",226)
this.onBox = false
this.boxOpen = false
this.killBeat();
//document.getElementById("testing").innerHTML="I think the box is closed"

}

JSBox.prototype.moveOnImg = function()
{
	
	this.onImg = true;
	this.confirmOpen();

	//alert("HELLO?");
//if(!(onImg | onBox)) openSequence()

//document.getElementById("testing").innerHTML="Moved on Image"
//document.getElementById("image").innerHTML="onImg TRUE"
}

JSBox.prototype.moveOnBox = function()
{
	this.onBox = true;
	this.confirmOpen();

	
//if(!(onImg | onBox)) openSequence()
//onBox = true

//document.getElementById("testing").innerHTML="Moved on Box"
//document.getElementById("box").innerHTML="onBox TRUE"
}

JSBox.prototype.moveOffImg = function()
{
	
	this.onImg = false;
	//setTimeout(this.varname + ".confirmClose()",500)

//onImg = false
//if(!(onImg | onBox)) closeSequence()
//document.getElementById("testing").innerHTML="Moved off Image"
//document.getElementById("image").innerHTML="onImg False"

}

JSBox.prototype.moveOffBox = function()
{
	
	this.onBox = false
	//setTimeout(this.varname + ".confirmClose()",500)
	
//onBox = false
//if(!(onImg | onBox)) closeSequence()
//document.getElementById("testing").innerHTML="Moved off Box"
//document.getElementById("box").innerHTML="onBox False"

}

JSBox.prototype.confirmOpen = function()
{
	
	
if(!this.inTransition & !this.boxOpen & this.active) {  this.openSequence() }

//"!(onImg & onBox) &"
//alert(getActive().value);
}


JSBox.prototype.confirmClose = function()
{
	
	
if(!(this.onImg || this.onBox) && !this.inTransition && this.boxOpen) this.closeSequence()

//"!(onImg & onBox) &"
//alert(getActive().value);
}

JSBox.prototype.animPosSetup = function(iLeft, iTop, fLeft, fTop)
{
	//alert(iLeft);
	//alert(iTop);
	//alert(fLeft);
	//alert(fTop);
	var lUnitDif = (fLeft - iLeft)/6
	var tUnitDif = (fTop - iTop)/6
	var l1 = iLeft + (2*lUnitDif)
	var l2 = l1 + (2*lUnitDif)
	var l3 = l2 + lUnitDif
	var t1 = iTop + tUnitDif
	var t2 = t1 + tUnitDif
	var t3 = t2 + (2*tUnitDif)
	document.getElementById(this.t1).style.left=l1+"px"
	document.getElementById(this.t2).style.left=l2+"px"
	document.getElementById(this.t3).style.left=l3+"px"
	document.getElementById(this.t1).style.top=t1+"px"
	document.getElementById(this.t2).style.top=t2+"px"
	document.getElementById(this.t3).style.top=t3+"px"
	document.getElementById(this.target).style.left=fLeft+"px"
	document.getElementById(this.target).style.top=fTop+"px"

}

JSBox.prototype.animSizeSetup = function(iWidth, iHeight, fWidth, fHeight)
{
	var wUnitDif = (fWidth - iWidth)/6
	var hUnitDif = (fHeight - iHeight)/6
	var w1 = iWidth + (2*wUnitDif)
	var w2 = w1 + (2*wUnitDif)
	var w3 = w2 + wUnitDif
	var h1 = iHeight + hUnitDif
	var h2 = h1 + hUnitDif
	var h3 = h2 + (2*hUnitDif)
	document.getElementById(this.t1).style.width=w1+"px"
	document.getElementById(this.t2).style.width=w2+"px"
	document.getElementById(this.t3).style.width=w3+"px"
	document.getElementById(this.t1).style.height=h1+"px"
	document.getElementById(this.t2).style.height=h2+"px"
	document.getElementById(this.t3).style.height=h3+"px"
	document.getElementById(this.target).style.width=fWidth +"px"
	document.getElementById(this.target).style.height=fHeight +"px"
}


JSBox.prototype.animTotalSetup = function(fw,fh,padding,direction)
{
	var iw = document.getElementById(this.initObj).width
	var ih = document.getElementById(this.initObj).height
	var initX = getObjPos(this.initObj)[0]
	var initY = getObjPos(this.initObj)[1]

	switch(direction)
	{
	//Keypad Directions (Look at your keypad for guidance to where these end up)
	case 1:
	this.animPosSetup(initX,initY,initX-fw-(padding/2),initY+ih+(padding/2))
	break    
	case 2:
	this.animPosSetup(initX,initY,xCenterVertical(initX,iw,fw),initY+ih+padding)
	break
	case 3:
	this.animPosSetup(initX,initY,initX+iw+(padding/2),initY+ih+(padding/2))
	break    
	case 4:
	this.animPosSetup(initX,initY,initX-fw-padding,yCenterHorizontal(initY,ih,fh))
	break	
	case 5:
	this.animPosSetup(initX,initY,xCenterVertical(initX,iw,fw),yCenterHorizontal(initY,ih,fh))
	break    
	case 6:
	this.animPosSetup(initX,initY,initX+iw+padding,yCenterHorizontal(initY,ih,fh))
	break	
	case 7:
	this.animPosSetup(initX,initY,initX-fw-(padding/2),initY-(padding/2)-fh)
	break    
	case 8:
	this.animPosSetup(initX,initY,xCenterVertical(initX,iw,fw),initY-padding-fh)
	break
	case 9:
	this.animPosSetup(initX,initY,initX+iw+(padding/2),initY-(padding/2)-fh)
	break
	
	//Custom Placement Mode: Positioned at InitX + XOffset, InitY + YOffset. Padding = 10000*XOffset + 5000 - YOffset (Limit offset to < 5000)
	case 0:
	this.animPosSetup(initX,initY,initX+Math.floor(padding/10000),initY+(5000 - (Math.abs(padding)%10000)))
	break
	default:
	//alert("Invalid Direction specified for box: " + direction)
	this.animPosSetup(initX,initY,xCenterVertical(initX,iw,fw),yCenterHorizontal(initY,ih,fh))
	break
	}
this.animSizeSetup(iw,ih,fw,fh)

}

JSBox.prototype.adaptiveBox = function(origdirection)
{
	var iw = document.getElementById(this.initObj).width
	var ih = document.getElementById(this.initObj).height
	var initX = getObjPos(this.initObj)[0]
	var initY = getObjPos(this.initObj)[1]
	var	fw = parseInt(document.getElementById(this.target).style.width.split("px")[0])
	var	fh = parseInt(document.getElementById(this.target).style.height.split("px")[0])
	var fX = getObjPos(this.target)[0]
	var fY = getObjPos(this.target)[1]
	var direction = origdirection
	
	for(i=0; i<=9; i++)
	{
		//alert("direction = " + dirSearchOrder(origdirection, i))
		this.animTotalSetup(fw,fh,10,dirSearchOrder(origdirection, i))
		fw = parseInt(document.getElementById(this.target).style.width.split("px")[0])
		fh = parseInt(document.getElementById(this.target).style.height.split("px")[0])
		//alert(document.getElementById('contentDiv').style.width)
		//alert(fw + "," + fh)
		fX = getObjPos(this.target)[0]
		fY = getObjPos(this.target)[1]
		//alert(/*getScrollPosition()[0] + getWindowSize()[0] - */(fX + fw))
		//alert(/*getScrollPosition()[1] + getWindowSize()[1] -*/(fY + fh))
		
		if((fX - getScrollPosition()[0]) > 0)
		{
		
			if((fY - getScrollPosition()[1]) > 0)
			{
			
				if((fX + fw) < getScrollPosition()[0] + getWindowSize()[0])
				{
				
					if((fY + fh) < getScrollPosition()[1] + getWindowSize()[1])
					{
					
					direction = dirSearchOrder(origdirection, i);
					//alert(direction)
					this.sequence = setTimeout(this.varname + ".adaptiveBox(" + direction + ");",100);
					return; 
					
					}	
				}
			}
		}
		
	}
	this.sequence = setTimeout(this.varname + ".adaptiveBox(" + direction + ");",100);
	return; 


}



	
function dirSearchOrder(initial, i)
{
	if(i==0)
	{
		return initial
	}
	else
	{
		switch(i)
		{
			case 1: return 2
			case 2: return 6
			case 3: return 4
			case 4: return 8
			case 5: return 1
			case 6: return 3
			case 7: return 7
			case 8: return 9
			case 9: return 5
			//default: alert("Something is very wrong here"); return 5;
		}
	}
}


function tellMeScrollPos()
{
alert("The current scroll position is: " + getScrollPosition()[0] + "," + getScrollPosition()[1])
setTimeout("tellMeScrollPos()",5000)
}

//tellMeScrollPos()

function getWindowSize() {
  var myWidth = 0, myHeight = 0;
  if( typeof( window.innerWidth ) == 'number' ) {
    //Non-IE
    myWidth = window.innerWidth;
    myHeight = window.innerHeight;
  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    myWidth = document.documentElement.clientWidth;
    myHeight = document.documentElement.clientHeight;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    myWidth = document.body.clientWidth;
    myHeight = document.body.clientHeight;
  }
return [myWidth,myHeight]
}


function getActive()
{
if ((document.getElementById("active").value) == 1) return true;
return false;
}

function getValue(id)
{
return document.getElementById(id).value
}

function setValue(id,newvalue)
{
document.getElementById(id).value = newvalue;
}

function setBoxValue(id, newvalue)
{
	var i;
	var box=document.getElementById(id);

	for (i=0;i < box.length;i++)
	{
		if(box.options[i].value==newvalue)
		{
			box.selectedIndex = i
			return
		}
	}
	box.selectedIndex = 0
	return
}

function toggleDiv(id,flagit) {
if (flagit=="1"){
if (document.layers) document.layers[''+id+''].visibility = "show"
else if (document.all) document.all[''+id+''].style.visibility = "visible"
else if (document.getElementById) document.getElementById(''+id+'').style.visibility = "visible" 
}
else
if (flagit=="0"){

if (document.layers) document.layers[''+id+''].visibility = "hide"
else if (document.all) document.all[''+id+''].style.visibility = "hidden"
else if (document.getElementById) document.getElementById(''+id+'').style.visibility = "hidden"
}
}

function changeDiv(idold, idnew)
{
toggleDiv(idnew,1)
toggleDiv(idold,0)
}

function getObjPos(el) {
	obj = document.getElementById(el)
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop];
}

function xCenterVertical(startPosX,iWidth, fWidth)
{
return startPosX - ((fWidth-iWidth)/2)
}

function yCenterHorizontal(startPosY, iHeight, fHeight)
{
return startPosY - ((fHeight-iHeight)/2)
}

function getScrollPosition() 
{
	var scrollX, scrollY;
	if (document.all) 
	{
		if (!document.documentElement.scrollLeft) 
			scrollX = document.body.scrollLeft;
		else 
			scrollX = document.documentElement.scrollLeft;
		if (!document.documentElement.scrollTop) 
			scrollY = document.body.scrollTop;
		else 
			scrollY = document.documentElement.scrollTop;
	}
	else 
	{ 
	scrollX = window.pageXOffset;
	scrollY = window.pageYOffset;
	}
return [scrollX,scrollY];
}

function xyOffsetToPadding(xOffset,yOffset)
{
if(xOffset >= 0)
{
return ((10000*xOffset) - yOffset + 5000) 
}
else
{
return ((10000*xOffset) + yOffset - 5000)
}

}


