//Javascript Document

/* 
 * $Author$
 * $Date$
 * $Revision$
 *
 * dyninterface
 * 
 * Developped in 2008, 2009 and 2010 by Pierre-Luc Blain
 * Concept by Pierre-Luc Blain
 *
 * mART productions 2010, All rights reserved
 */


var utimer;
var ttimer;
var curBox;
var autoscrollOff=false;

//OPTIONS
var spdFactor=12.5;//0.001 to 100
var sweetSpotSize=3;//Size of the inactive scrolling area 
var sweetSpotUnit=0.125; //12.5 %
var sensitivity=2;//The level of mouse sensibility 1 to 1000

/*
 Guideline:
 The sensitivity controls the mouse response.
 Using a high sensitivity means that a little move would results in a high scrolling.
 
 Incrasing the sensibility cause the moves to be executed faster
 Use the spdFactor variable to compensate while speed is too high
 or too slow.

*/

function CycleChildren()
{
	var n;
	var y;
	var maxy;
	n=curBox.firstChild;
	y=curBox.scrollTop;
	maxy=n.offsetHeight;
	if(y>0)
	{
		if((curBox.scrollTop)%(n.offsetHeight+6)==0)
		{
			curBox.appendChild(n);
			return;
		}
	}
	curBox.scrollTop+=2;
}

function GetMaxX()
{
	//Static var simulator
	if(GetMaxX.value==null)
	{
		GetMaxX.value=maxX=(curBox.scrollWidth-sweetSpotUnit*sweetSpotSize*curBox.scrollWidth)/2;
	}
	return GetMaxX.value;
}

function GetMaxY()
{
	//Static var simulator
	if(GetMaxY.value==null)
	{
		GetMaxY.value=(curBox.scrollHeight-sweetSpotUnit*sweetSpotSize*curBox.scrollHeight)/2;
	}
	return GetMaxY.value;
}


function GetAcclByOneDDir(curBox, oneDDir)
{
	maxX=GetMaxX();
	maxY=GetMaxY();

	xSpd=(xSpdFactor-sweetSpotUnit*sweetSpotSize/2)*spdFactor;
	ySpd=(ySpdFactor-sweetSpotUnit*sweetSpotSize/2)*spdFactor;
	ss=sensitivity/100;

	yAccl=(maxY*ySpd*ss);
	xAccl=(maxX*xSpd*ss);
	
	switch(oneDDir)
	{
		case 'N':
			if(curBox.scrollTop-yAccl<0)
			{
				return curBox.scrollTop;
			}
			return yAccl;
			break;
		case 'S':
			if(curBox.scrollTop+yAccl>curBox.scrollHeight)
			{
				return curBox.scrollHeight-curBox.scrollTop;
			}
			return yAccl;
			break;
		case 'E':
			if(curBox.scrollLeft+xAccl>curBox.scrollWidth)
			{
				return curBox.scrollWidth-curBox.scrollLeft;
			}
			return xAccl;
			break;
		case 'W':
			if(curBox.scrollLeft-xAccl<0)
			{
				return curBox.scrollLeft;
			}
			return xAccl;
			break;
	}
}

function GetMinSpeed()
{
	return sweetSpotUnit*sweetSpotSize;
}

function GetScrollBox(evt)
{
	var elm;
	if(navigator.appName=='Microsoft Internet Explorer')
	{
		elm=evt.srcElement.offsetParent.childNodes[2];
	}
	else
	{
		elm=evt.target.parentNode.childNodes[3];
	}
	
	return elm;
}

function GetScrollMask(evt)
{
	var elm;
	if(navigator.appName=='Microsoft Internet Explorer')
	{
		elm=evt.srcElement;
	}
	else
	{
		elm=evt.target;
	}
	return elm;
}	

function OmegaScroll_OnLoad(obj)
{
	clearInterval(utimer);
	curBox=obj.parentElement.lastChild;
	utimer=setInterval(CycleChildren, 50);
}

function AutoScroll_OnMousemove(evt)
{
	var yCenter;
	var xCenter;
	var ySpeed;
	var xSpeed;
	var minSpeed;
	var y;
	var x;
	var yDirection="N";
	var xDirection="W";
	
	if(navigator.appName=='Microsoft Internet Explorer')
	{
		scrollMask=GetScrollMask(evt);
		curBox=GetScrollBox(evt);//evt.srcElement.offsetParent.lastChild;			
		yCenter=scrollMask.height/2;
		y=yCenter-evt.offsetY;//evt.offsetY;
		
		if(evt.offsetY>yCenter)
		{
			y=evt.offsetY-yCenter;
			yDirection="S";
		}
		
		xCenter=evt.srcElement.offsetWidth/2;
				
		x=xCenter-evt.offsetX;
		if(evt.offsetX>xCenter)
		{
			x=evt.offsetX-xCenter;
			xDirection="E";
		}
	}
	else
	{	
		yCenter=evt.target.offsetHeight/2;
		curBox=GetScrollBox(evt);
		
		y=yCenter-evt.layerY;
		if(evt.layerY>yCenter)
		{
			y=evt.layerY-yCenter;
			yDirection="S";
		}
		
		
		xCenter=evt.target.offsetWidth/2;
		
		x=xCenter-evt.layerX;
		if(evt.layerX>xCenter)
		{
			x=evt.layerX-xCenter;
			xDirection="E";
		}
		
	}

	ySpdFactor=y/yCenter;
	xSpdFactor=x/xCenter;

	
	//clearInterval(ttimer);
	
	
	if(autoscrollOff)
	{
		if(y==lastYPos)return 0;
		if(x==lastXPos)return 0;
	}
	
	minSpdFactor=GetMinSpeed();
	
	if(ySpdFactor<minSpdFactor)
	{
		ySpdFactor=0;
		yDirection="";
	}
	
	if(xSpdFactor<minSpdFactor)
	{
		xSpdFactor=0;
		xDirection="";
	}
	
	//window.status="(" + x + "," + y + ") | speed (" + xSpdFactor + "," + ySpdFactor + ") | DIR " + yDirection + xDirection;
	clearInterval(utimer);
	utimer=setInterval("Scroll('" + yDirection + xDirection + "')", 100);
}


function AutoVScroll_OnMousemove(evt)
{
	AutoScroll_OnMousemove(evt);
}

function AutoVScroll_OnMouseout()
{
	return AutoScroll_OnMouseout();
}

function AutoScroll_OnMouseout()
{
	clearInterval(utimer);
	clearInterval(ttimer);
	return;
}

function AutoScroll_OnClick(evt)
{
	//Allows anchors to be clicked through the mask.
	var elm;
	var mask;
	var zIdx;
	var x; 
	var y;

	mask=GetScrollMask(evt);
	zIdx=1;
	mask.style.zIndex=0;
	y=0;
	
	if(navigator.appName=='Microsoft Internet Explorer')
	{
		box=GetScrollBox(evt);
		childs=box.getElementsByTagName("a");
		y=evt.offsetY;
		x=evt.offsetX;
	}
	else
	{
		box=GetScrollBox(evt);
		elm=evt.target.parentNode.childNodes[3].childNodes[1];
		childs=elm.getElementsByTagName("a");
		y=evt.layerY;
		x=evt.layerX;
	}
	
	for(i=0;i<childs.length;i++)
	{
		elm=null;

		c1=(GetOffsetLeft(childs[i])+ childs[i].offsetWidth -box.scrollLeft)>x;
		c2=(GetOffsetLeft(childs[i])- box.scrollLeft)<x;
		c3=(GetOffsetTop(childs[i])+ childs[i].offsetHeight -box.scrollTop)>y;
		//c4=(GetOffsetTop(childs[i])- box.scrollTop)<y;TODO: Make this work!!!
		
		
		window.status=x + '=' + (GetOffsetLeft(childs[i])+ childs[i].offsetWidth -box.scrollLeft-box.offsetLeft);
		if(c1 && c2 && c3)
		{
			elm=childs[i];
			break;
		}
	}
		
	if(elm!=null)
	{
		if(elm.onclick)
		{
			elm.onclick();
		}
		else
		{
			if(elm.target=="_blank")
			{
				window.open(elm.href);
			}
			else
			{
				document.location=elm.href;
			}
		}
	}
	
	mask.style.zIndex=zIdx;
}

function GetOffsetLeft(elm)
{
	var left=0;
	var obj;
	
	obj=elm;
	while(obj!=null)
	{
		left+=obj.offsetLeft;
		obj=obj.offsetParent;
	}
	return left;
}

function GetOffsetTop(elm)
{
	var top=0;
	var obj;
	
	obj=elm;
	while(obj!=null)
	{
		top+=obj.offsetTop;	
		obj=obj.offsetParent;
	}
	return top;
}

function AutoScroll_OnDrag(evt)
{
	
}

function ScrollUp()
{
	if(curBox.scrollTop>0)
	{
		curBox.scrollTop-=(yAccl);
	}
	else
	{
		clearInterval(utimer);
	}
}

function Scroll(direction)
{
	
	/*ySpd=(ySpdFactor-sweetSpotUnit*sweetSpotSize/2)*spdFactor;
	maxY=(curBox.scrollHeight-sweetSpotUnit*sweetSpotSize*curBox.scrollHeight)/2;
	ss=sensitivity/100;*/
	switch(direction)
	{
		case 'N':
			curBox.scrollTop-=GetAcclByOneDDir(curBox, direction);
			break;
		case 'S':
			curBox.scrollTop+=GetAcclByOneDDir(curBox, direction);
			break;
		case 'E':
			curBox.scrollLeft+=GetAcclByOneDDir(curBox, direction);
			break;
		case 'W':
			curBox.scrollLeft-=GetAcclByOneDDir(curBox, direction);
			break;
		case 'NE':
			curBox.scrollTop-=GetAcclByOneDDir(curBox, 'N');
			curBox.scrollLeft+=GetAcclByOneDDir(curBox, 'E');
			break;
		case 'SE':
			curBox.scrollTop+=GetAcclByOneDDir(curBox, 'S');
			curBox.scrollLeft+=GetAcclByOneDDir(curBox, 'E');
			break;
		case 'NW':			
			curBox.scrollTop-=GetAcclByOneDDir(curBox, 'N');
			curBox.scrollLeft-=GetAcclByOneDDir(curBox, 'W');
			break;
		case 'SW':
			curBox.scrollTop+=GetAcclByOneDDir(curBox, 'S');
			curBox.scrollLeft-=GetAcclByOneDDir(curBox, 'W');
			break;
		default:
			clearInterval(utimer);	
			break;
	}
}


function ScrollDown()
{
	if(curBox.scrollTop<curBox.scrollHeight)
	{
		curBox.scrollTop+=(yAccl);
	}
	else
	{
		clearInterval(utimer);
	}
}

function ScrollLeft()
{
	if(curBox.scrollLeft>0)
	{
		curBox.scrollLeft-=xAccl;
	}
	else
	{
		clearInterval(ttimer);
	}
}

function ScrollRight()
{
	if(curBox.scrollLeft<curBox.scrollWidth)
	{
		curBox.scrollLeft+=xAccl;
	}
	else
	{
		clearInterval(ttimer);
	}
}

