var smoothScrollX_Interval = null;
var smoothScroll_DivNode = null;
var smoothScroll_STEPS = 25;

var ALL_CScrollings = new Hashtable( );



function CScrolling( p_name, p_oContainerNode )
{
	this.name = p_name;
	this.oContainer	= p_oContainerNode;
	this.STEPS = 25;
	this.funcInterval = null;
	
	ALL_CScrollings.put( this.name, this );
}

CScrolling.prototype.name			= "";
CScrolling.prototype.oContainer		= null;
CScrolling.prototype.STEPS			= 25;
CScrolling.prototype.funcInterval	= null;

CScrolling.prototype.handleFunctionToExecEachTime	= null;
CScrolling.prototype.handleFunctionToExecAtEnd		= null;

CScrolling.prototype.scrollToNode = function( p_oNodeDest, p_steps )
{
	var x = DOM_getNodePosX( p_oNodeDest ) - DOM_getNodePosX( this.oContainer );
	var y = DOM_getNodePosY( p_oNodeDest ) - DOM_getNodePosY( this.oContainer );
	this.scrollTo( x, y, p_steps );
}
CScrolling.prototype.scrollToNodeX = function( p_oNodeDest, p_steps )
{
	var x = DOM_getNodePosX( p_oNodeDest ) - DOM_getNodePosX( this.oContainer );
	this.scrollTo( x, 0, p_steps );
}
CScrolling.prototype.scrollToNodeY = function( p_oNodeDest, p_steps )
{
	var y = DOM_getNodePosY( p_oNodeDest ) - DOM_getNodePosY( this.oContainer );
	this.scrollTo( 0, y, p_steps );
}

CScrolling.prototype.getWidth = function(  )
{
	return this.oContainer.scrollWidth;
}

CScrolling.prototype.getHeight = function(  )
{
	return this.oContainer.scrollHeight;
}

CScrolling.prototype.Stop = function(  )
{
	clearInterval( this.funcInterval );
	this.funcInterval = null;
}


CScrolling.prototype.scrollTo = function( p_x, p_y, p_steps )
{
    var cxpos = this.oContainer.scrollLeft;
    var cypos = this.oContainer.scrollTop;
    var ss_stepsizeX = parseInt( ( p_x - cxpos ) / p_steps );
    var ss_stepsizeY = parseInt( ( p_y - cypos ) / p_steps );
	
	this.scrollBy( p_x, p_y, ss_stepsizeX, ss_stepsizeY );
}

/*

	scrollToNextItemX, scrollToPrevItemX et Y, Y 
	Ont besoin de trouver le prochain ou le precedent TD ayant le param scrolling_step="1" (dans la balise HTML )
	
*/

CScrolling.prototype.scrollToNextItemX = function( p_steps )
{
	var aTds = this.oContainer.getElementsByTagName( "TD" );
	var currentXMax = this.oContainer.scrollLeft + this.oContainer.clientWidth + DOM_getNodePosX( this.oContainer );
	for ( var i = 0 ; i < aTds.length ; i++ )
	{
		if ( aTds[i].getAttribute( "scrolling_step" ) == 1 )
		{
			if ( DOM_getNodePosX( aTds[i] )+Math.round(DOM_getNodeWidth( aTds[i] )/2) >= currentXMax )
			{
				var newX = ( DOM_getNodePosX( aTds[i] ) + DOM_getNodeWidth( aTds[i] ) ) - currentXMax;
				this.scrollTo( this.oContainer.scrollLeft+newX, 0, p_steps );
				return;
			}
		}
	}
}
CScrolling.prototype.scrollToPrevItemX = function( p_steps )
{
	var aTds = this.oContainer.getElementsByTagName( "TD" );
	var currentXMax = this.oContainer.scrollLeft + DOM_getNodePosX( this.oContainer );
	for ( var i = aTds.length-1 ; i >= 0 ; i-- )
	{
		if ( aTds[i].getAttribute( "scrolling_step" ) == 1 )
		{
			if ( DOM_getNodePosX( aTds[i] )+Math.round(DOM_getNodeWidth( aTds[i] )/2) < currentXMax )
			{
				var newX = DOM_getNodePosX( aTds[i] ) - DOM_getNodePosX( this.oContainer );
				this.scrollTo( newX, 0, p_steps );
				return;
			}
		}
	}
	this.scrollTo( 0, 0, p_steps );
}

CScrolling.prototype.scrollToEndX = function( p_steps )
{
	this.scrollTo( this.oContainer.scrollHeight - this.oContainer.clientHeight, 0, p_steps );
}

CScrolling.prototype.scrollBy = function( p_x, p_y, p_ForceStepSizeX, p_ForceStepSizeY )
{
	var sensX = 1;
	var sensY = 1;
	
    clearInterval( this.funcInterval );
	
    var ss_stepsizeX = p_ForceStepSizeX;
    var ss_stepsizeY = p_ForceStepSizeY;
	
	if ( ss_stepsizeX < 0 )		sensX = -1;
	if ( ss_stepsizeY < 0 )		sensY = -1;
	
    this.funcInterval = setInterval( "ALL_CScrollings.get('" + this.name + "')._scroll("+ss_stepsizeX+","+p_x+","+ss_stepsizeY+","+p_y+"," + sensX + "," + sensY + ")", 10 );
}


CScrolling.prototype._scroll = function ( scramountX, destX, scramountY, destY, sensX, sensY ) 
{
    var wascxpos = this.oContainer.scrollLeft;
    var wascypos = this.oContainer.scrollTop;
	
	if ( sensX > 0 )	    var isAboveX = ( wascxpos < destX );
	else 					var isAboveX = ( wascxpos > destX );
    if ( sensY > 0 )	    var isAboveY = ( wascypos < destY );
	else 					var isAboveY = ( wascypos > destY );
	
    this.oContainer.scrollLeft = ( wascxpos + scramountX );
    this.oContainer.scrollTop = ( wascypos + scramountY );
	
    var iscxpos = this.oContainer.scrollLeft;
    var iscypos = this.oContainer.scrollTop;
	
    if ( sensX > 0 )	    var isAboveNowX = ( iscxpos < destX );
    else 					var isAboveNowX = ( iscxpos > destX );
    if ( sensY > 0 )	    var isAboveNowY = ( iscypos < destY );
    else 					var isAboveNowY = ( iscypos > destY );
	
	var okX = false;
	var okY = false;
	
    if ( ( isAboveX != isAboveNowX ) || ( wascxpos == iscxpos ) ) 
	{
      this.oContainer.scrollLeft = destX;
	  okX = true;
    }
    if ( ( isAboveY != isAboveNowY ) || ( wascypos == iscypos ) ) 
	{
      this.oContainer.scrollTop = destY;
	  okY = true;
	}
	
	if ( okX && okY )
	{
      this.Stop( );

	if ( this.handleFunctionToExecAtEnd != null )
			this.handleFunctionToExecAtEnd.call( this );
	}
	else
	{
		if ( this.handleFunctionToExecEachTime != null )
			this.handleFunctionToExecEachTime.call( this );
	}
	
}
