
keyName = {
	38: "Up",
	40: "Down",
	37: "Left",
	39: "Right",
	36: "Home",
	35: "End",
	33: "Page Up",
	34: "Page Down",
	17: "Ctrl",
	18: "Alt",
	104: "Keypad 8",
	98: "Keypad 2",
	101: "Keypad 5",
	100: "Keypad 4",
	102: "Keypad 6"
}

function doArea(xOrder)
{
	var xObj = document.asObj[xOrder];
	var xTurn = xObj.xTurn;
	var toAct = arguments.length > 1 ? arguments[1] : true;

	if ( !toAct || xObj.isActing )
	{
		clearTimeout(xObj.timerId);
		xObj.miceStatus = "";
		xObj.isActing = false;
		return;
	}

	xObj.isActing = true;
	switch( xObj.miceStatus )
	{
		case "down":
		case "downonce":
		case "pgdn":
			if ( parseInt(xObj.scrollTop) < (xObj.scrollHeight-xObj.offsetHeight) )
			{
				xObj.scrollTop = Math.min( xObj.scrollHeight-xObj.offsetHeight, xObj.scrollTop+xObj.odeg[xObj.miceStatus] );
				xObj.isActing = false;
				if ( xObj.miceStatus=="down" )
					xObj.timerId = setTimeout( "doArea("+xOrder+")", 50 );
			}
			break;

		case "up":
		case "uponce":
		case "pgup":
			if ( parseInt(xObj.scrollTop)>0 )
			{
				xObj.scrollTop = Math.max( 0, xObj.scrollTop-xObj.odeg[xObj.miceStatus] );
				xObj.isActing = false;
				if ( xObj.miceStatus=="up" )
					xObj.timerId = setTimeout( "doArea("+xOrder+")", 50 );
			}
			break;

		case "left":
		case "leftonce":
			if ( parseInt(xObj.scrollLeft)>0 )
			{
				xObj.scrollLeft = Math.max( 0, xObj.scrollLeft-xObj.odeg[xObj.miceStatus] );
				xObj.isActing = false;
				if ( xObj.miceStatus=="left" )
					xObj.timerId = setTimeout( "doArea("+xOrder+")", 50 );
			}
			break;

		case "right":
		case "rightonce":
			if ( parseInt(xObj.scrollLeft) < (xObj.scrollWidth-xObj.offsetWidth) )
			{
				xObj.scrollLeft = Math.min( xObj.scrollWidth-xObj.offsetWidth, xObj.scrollLeft+xObj.odeg[xObj.miceStatus] );
				xObj.isActing = false;
				if ( xObj.miceStatus=="right" )
					xObj.timerId = setTimeout( "doArea("+xOrder+")", 50 );
			}
			break;

		case "top":
			xObj.scrollTop = xObj.scrollLeft = 0;
			xObj.isActing = false;
			break;

		case "bottom":
			xObj.scrollTop = xObj.scrollHeight-xObj.offsetHeight;
			xObj.scrollLeft = xObj.scrollWidth-xObj.offsetWidth;
			xObj.isActing = false;
			break;
	}
	
	xObj.focus();
	// return false;
}

function checkwheel(xOrder) {
	var e = window.event;
	var xObj = document.asObj[xOrder];
	xObj.miceStatus = xObj.xTurn ? ( e.wheelDelta > 0 ? "leftonce" : "rightonce" ) : ( e.wheelDelta > 0 ? "uponce" : "downonce" );
	doArea(xOrder);
	return false;
}

function doKey(e) {
	var xObj = document.asObj[document.active_xOrder];
	ascVal = (document.all) ? window.event.keyCode : e.which ;
	//keyVal = String.fromCharCode(ascVal).toLowerCase();

	switch (ascVal) {
		// key-set
		case 38: // cursor up
			xObj.miceStatus = "uponce";
			doArea(xObj.xOrder);
			break; 
		case 40: // cursor down
			xObj.miceStatus = "downonce";
			doArea(xObj.xOrder);
			break;
		case 37: // cursor left
			xObj.miceStatus = "leftonce";
			doArea(xObj.xOrder);
			break;
		case 39: // cursor right
			xObj.miceStatus = "rightonce";
			doArea(xObj.xOrder);
			break;
		case 36: // home
			xObj.miceStatus = "top";
			doArea(xObj.xOrder);
			break;
		case 35: // end
			xObj.miceStatus = "bottom";
			doArea(xObj.xOrder);
			break;
		case 33: // page up
			xObj.miceStatus = "pgup";
			doArea(xObj.xOrder);
			break;
		case 34: // page down
			xObj.miceStatus = "pgdn";
			return doArea(xObj.xOrder);
			break;
		case 17: // ctrl
			break;
		case 18: // alt
			break;
		case 104: // keypad up
			xObj.miceStatus = "uponce";
			doArea(xObj.xOrder);
			break;
		case 98: // keypad down
			xObj.miceStatus = "downonce";
			doArea(xObj.xOrder);
			break;
		case 101: // keypad middle
			break;
		case 100: // keypad left
			xObj.miceStatus = "leftonce";
			doArea(xObj.xOrder);
			break;
		case 102: // keypad right
			xObj.miceStatus = "rightonce";
			doArea(xObj.xOrder);
			break;
		default:
			return true;
			break;
	}
	// window.status = keyName[ascVal];
	// xObj.focus();
	return false;
}

function init_as( objId, sensorUp, sensorDown )
{
	default_step = arguments.length > 3 ? parseInt(arguments[3]) : 10;
	xTurn = arguments.length > 4 ? true : false;

	if ( !document.asObj )
	{
		document.asObj = [];
		document.active_xOrder = 0;
	}

	// check if object exists, only 2 times
	if ( !document.tryAgain )
		document.tryAgain = 1;

	if ( !(document.getElementById(objId)) )
	{
		if ( document.tryAgain > 0 )
		{
			document.tryAgain--;
			setTimeout( function(){ init_as(objId,sensorUp,sensorDown,default_step,xTurn); }, 1000 );
		} else {
			return;
		}
	} else {
		xOrder = document.asObj.length;
		document.asObj[xOrder] = document.getElementById(objId);
	}

	var xObj = document.asObj[xOrder];
	xObj.xOrder = xOrder;
	xObj.xTurn = xTurn;

	xObj.scrollstep = default_step;
	xObj.odeg = {
			"down": xObj.scrollstep,
			"up": xObj.scrollstep,
			"right": xObj.scrollstep,
			"left": xObj.scrollstep,
			"downonce": xObj.scrollstep*2,
			"uponce": xObj.scrollstep*2,
			"rightonce": xObj.scrollstep*2,
			"leftonce": xObj.scrollstep*2,
			"pgdn": parseInt(xObj.offsetHeight)-30,
			"pgup": parseInt(xObj.offsetHeight)-30
	};

	if ( !xTurn )
	{
		xUps = document.getElementsByName(sensorUp);
		xUp = xUps[0];
		xUp.xOrder = xObj.xOrder;
		xUp.onmousedown = function(){ clickUp(this.xOrder); }
		xUp.onmouseup = function(){ doArea(this.xOrder,false); }
	
		xDowns = document.getElementsByName(sensorDown);
		xDown = xDowns[0];
		xDown.xOrder = xObj.xOrder;
		xDown.onmousedown = function(){ clickDown(this.xOrder); }
		xDown.onmouseup = function(){ doArea(this.xOrder,false); }
	} else {
		xLefts = document.getElementsByName(sensorUp);
		xLeft = xLefts[0];
		xLeft.xOrder = xObj.xOrder;
		xLeft.onmousedown = function(){ clickLeft(this.xOrder); }
		xLeft.onmouseup = function(){ doArea(this.xOrder,false); }
	
		xRights = document.getElementsByName(sensorDown);
		xRight = xRights[0];
		xRight.xOrder = xObj.xOrder;
		xRight.onmousedown = function(){ clickRight(this.xOrder); }
		xRight.onmouseup = function(){ doArea(this.xOrder,false); }
	}

	// xObj.onmouseover = doArea;
	// xObj.onmouseout = function(){ doArea(false); }
	document.onkeydown = doKey;

	xObj.onmouseover = function(){ document.active_xOrder = this.xOrder; }
	xObj.onmousewheel = function(){ checkwheel(this.xOrder); }
}

function clickUpOnce(xOrder)
{
	document.asObj[xOrder].miceStatus = "uponce";
	doArea(xOrder);
}

function clickUp(xOrder)
{
	document.asObj[xOrder].miceStatus = "up";
	doArea(xOrder);
}

function clickDownOnce(xOrder)
{
	document.asObj[xOrder].miceStatus = "downonce";
	doArea(xOrder);
}

function clickDown(xOrder)
{
	document.asObj[xOrder].miceStatus = "down";
	doArea(xOrder);
}

function clickLeftOnce(xOrder)
{
	document.asObj[xOrder].miceStatus = "leftonce";
	doArea(xOrder);
}

function clickLeft(xOrder)
{
	document.asObj[xOrder].miceStatus = "left";
	doArea(xOrder);
}

function clickRightOnce(xOrder)
{
	document.asObj[xOrder].miceStatus = "rightonce";
	doArea(xOrder);
}

function clickRight(xOrder)
{
	document.asObj[xOrder].miceStatus = "right";
	doArea(xOrder);
}
