/*
 * SlideBox Library: smoothly show objects...
 *
 * (c) 2006 by 3Kon Informationstechnologien GmbH
 *
 * Author:	Tilmann Fruntke <tfruntke@buschjena.de>
 * Date:		01.12.2006
 */

var slideJobs = new Array();
var sliderTaskActive = false;
var sliderTimerUpdate = 25; /* time, object position is updated */
var smoothOutSteps = 10; /* steps, the pxPerStep number will be decreased */
var beginToSmooth = 1.8; /* range / X , where smooth algorythm will start up */

function slideL2R ( slObj, StartX, EndX, TimeNeedl )
{
 if ( !slObj )
 		return false;
		
 if ( parseInt( EndX ) == parseInt( slObj.style.left ) )
 		return false;
		
 if ( StartX == null )
 		StartX = parseInt( slObj.style.left ? slObj.style.left :slObj.offsetLeft );

 var steps = parseInt( TimeNeedl ) / sliderTimerUpdate;
// alert( 'starting timer: ' + slObj + ", " + StartX + ", " + EndX);
 slObj.curSlide = true;
 slObj.slideType = "L2R";
 slObj.startPos = parseInt( StartX );
 slObj.endPos = parseInt( EndX );
 slObj.curPos = slObj.startPos;
 slObj.pxPerStep = (slObj.endPos - slObj.startPos) / steps;
 slObj.pxStepCur = slObj.pxPerStep
 slObj.pxDiff = (slObj.endPos - slObj.startPos);
 slObj.lowerStep = 0;
 
 slideJobs.push( slObj );
 
 
 
 if ( !sliderTaskActive )
 {
 		sliderTaskActive = true;
 		slideTask();
 }
}

function slideR2L ( slObj, StartX, EndX, TimeNeedl )
{
 if ( !slObj )
 		return false;
		
 if ( parseInt( EndX ) == parseInt( slObj.style.left ) )
 		return false;
		
 if ( StartX == null )
 		StartX = parseInt( slObj.style.left ? slObj.style.left :slObj.offsetLeft );

 var steps = parseInt( TimeNeedl ) / sliderTimerUpdate;
// alert( 'starting timer: ' + slObj + ", " + StartX + ", " + EndX);
 slObj.curSlide = true;
 slObj.slideType = "R2L";
 slObj.startPos = parseInt( StartX );
 slObj.endPos = parseInt( EndX );
 slObj.curPos = slObj.startPos;
 slObj.pxPerStep = (slObj.endPos - slObj.startPos) / steps;
 slObj.pxStepCur = slObj.pxPerStep
 slObj.pxDiff = (slObj.endPos - slObj.startPos);
 slObj.lowerStep = 0;
 
 slideJobs.push( slObj );
 
 
 
 if ( !sliderTaskActive )
 {
 		sliderTaskActive = true;
 		slideTask();
 }
}

/*
 * @TODO: cleanup & simplify code 
 */

function slideTask ()
{
 var newSlideJobs = new Array();
 
 for ( var j = 0; j < slideJobs.length; j++ )
 {
 	var curObj = slideJobs[ j ];
	
	
	if ( curObj.slideType == "L2R" )
	{
	 	 var lowBarrier = (curObj.pxDiff / beginToSmooth);
	 	 var lowBarrierX = lowBarrier + curObj.startPos;
		 
	  /* smooth slide algorythm, by tilmann fruntke */
	  if ( curObj.curPos > lowBarrierX )
		{
		 var lowBarrierRest = curObj.pxDiff - lowBarrier;
		 var step_next = curObj.startPos + lowBarrier + ((lowBarrierRest / smoothOutSteps) * (curObj.lowerStep + 1));

		 if ( curObj.curPos > step_next)
		 {
		 	curObj.pxStepCur = curObj.pxPerStep - (curObj.pxPerStep / smoothOutSteps * (curObj.lowerStep)+1);
		  curObj.lowerStep = curObj.lowerStep + 1;
			}
		}
		
		curObj.curPos = curObj.curPos + curObj.pxStepCur;
	}
	else if ( curObj.slideType == "R2L" )
	{
	  var lowBarrier = (curObj.pxDiff / beginToSmooth);
	 	var lowBarrierX = lowBarrier + curObj.startPos;
	 
	 /* smooth slide algorythm, by tilmann fruntke */
	  if ( curObj.curPos < lowBarrierX )
		{
		 var lowBarrierRest = curObj.pxDiff - lowBarrier;
		 var step_next = curObj.startPos + lowBarrier + ((lowBarrierRest / smoothOutSteps) * (curObj.lowerStep + 1));

		 if ( curObj.curPos > step_next)
		 {
		 	curObj.pxStepCur = curObj.pxPerStep + (curObj.pxPerStep / smoothOutSteps * (curObj.lowerStep)+1);
		  curObj.lowerStep = curObj.lowerStep + 1;
			}
		}
		
		curObj.curPos = curObj.curPos + curObj.pxStepCur;
	}
	
	if ( curObj.curPos > curObj.endPos && curObj.slideType == "L2R" ||
		 	 curObj.curPos < curObj.endPos && curObj.slideType == "R2L" )
	{
	 curObj.curPos = curObj.endPos;
	}
	else
	 newSlideJobs.push( curObj );
 }
 
 if ( curObj.slideType == "L2R" || curObj.slideType == "R2L")
 {
 		curObj.style.left = parseInt( curObj.curPos ) + "px";
 }

 slideJobs = newSlideJobs;

 if ( newSlideJobs.length == 0 )
 	sliderTaskActive = false;
 else
 	window.setTimeout( "slideTask()", sliderTimerUpdate );
}

