/*
 * negetics.GRIR.01.js
 *
 * Javascript Class - where the magic happens ;)
 *
 * @package      negetics "GoldenRatio Image Rotator"
 * @version      0.1.0_RC1
 *
 * @description  A nice horizontal Image Rotator
 *
 * @author       Jan Jost <support@negetics.de>
 * @link         http://www.negetics.de
 * @linkProject  http://extensions.negetics.de
 * @copyright    Copyright (C) 2010 Jan Jost! All Rights Reserved
 * @license      GNU/GPL see GPL.txt / license.txt
*/

function negeticsGRIR(containerID,widths,fSpeedMaxV,fSpeedMinV,fSpeedEaseV,fEaseInV,aniSpeedV,aniDelayV,innerBorderV,divImagesV)
{

	var f,t,s,sf,minSP,fFpFH,fDebug,fBorderW,fSpeedMax,fSpeedEase,fSpeedMin,fEaseIn,fSlides,fFull,fDebugOut,fsWidths,fsEnds,fsSpeed,fsRatio,fsLefts,fSlidesIs,fSpeed,slEase,fStep,fSteps,flastSpeed,widthMax,fSpeedT,toGo,divImages;
		
// KONSTRUKTOR _________________________________________________________________________

	this.build = function(containerID,widths)
	{
		t									= aniSpeedV;
		s									= aniDelayV;
		sf								= 100;
		minSP							= 4;

		f								 	= document.getElementById(containerID);
		f.ie 							= /*@cc_on!@*/false;
		fFpFH							= this;
		fDebug 						= document.getElementById("debug");		
		fBorderW					= innerBorderV;

		fSpeedMax					= fSpeedMaxV;
		fSpeedEase				= fSpeedEaseV;
		fSpeedMin					= fSpeedMinV;
		fEaseIn						= fEaseInV;
		fSlides						= new Array();
		fFull							= 0;
		
		fDebugOut 				= "";
		
		fsWidths					= new Array();
		fsEnds						= new Array();
		fsSpeed						= new Array();
		fsRatio						= new Array();
		fsLefts						= new Array();
		
		divImages					= divImagesV;
		
		widthMax			= 0;
		
		for(var i=0;i<widths.length;i++)
		{
			var elWidth		= widths[i] + fBorderW;
			if(elWidth>widthMax){widthMax=elWidth;}
			fsWidths[i] 	= elWidth;
			fsEnds[i]			= fFull;
			fFull 				= fFull + widths[i] + fBorderW;
		}

		fFull 					= fFull - fBorderW;
		fSteps 					= ( fFull / ( ( fSpeedMax + fSpeedMin ) / (2*1) ) );
		slEase					= ( ( ( fSpeedMax ) ) / fSteps ) * ( 1 / fSpeedEase ) ;
//		fDebug.innerHTML = fFull + " : " + widthMax + " : " + slEase + " : "+fSteps;
		for(var i=0;i<fsWidths.length;i++)
		{
			fsRatio[i] = fsWidths[i] / fFull;			
		}

		if(divImages == 1)
		{
			var slides 					= f.getElementsByTagName('div');	
		}
		else
		{
			var slides 					= f.getElementsByTagName('img');	
		}
		f.style.width				= fFull+"px";
		
		for(var i=0, len = slides.length; i<len;i++)
		{
			if(i==0)
			{
				slides[i].style.left=(0-fBorderW)+"px";
			}
			else
			{
				if(i<=(fsWidths.length-1))
				{
					slides[i].style.left=fsEnds[i]-fBorderW+"px";
				}
				else
				{
					slides[i].style.left=fFull+"px";
				}
			}
		}
		this.sleep();
	}
		

// FADE _________________________________________________________________________

		this.fade = function(num)
		{

			fDebugOut 					= "";

			this.setSpeed();
			this.getSlideWidths();

			f.finished 				= true;
			
			this.doSlide();

			if(f.finished)
			{
				fSlidesIs[0].style.left = fFull + "px";
				var Klon = fSlidesIs[0].cloneNode(true);
				f.appendChild(Klon);
				f.removeChild(fSlidesIs[0]);				
				clearInterval(f.fadeInterval);
				fFpFH.sleep();				
			}
		}


// DOSLIDE _________________________________________________________________________

		this.doSlide=function()
		{
			for(var i=0;i<fsWidths.length;i++)
			{
				if( fsLefts[i] > ( fsEnds[i] - fBorderW ) )
				{
					f.lefts[i+1] = fsLefts[i];
					fSlidesIs[i+1].style.left = f.lefts[i+1] + "px";
					if(i==0)
					{
						f.lefts[i] = ( fsLefts[i] - fsEnds[i+1] );
						fSlidesIs[i].style.left = f.lefts[i] + "px";
					}
					f.finished = false;
				}
				else
				{
					f.lefts[i+1] = fsEnds[i] - fBorderW;
					fSlidesIs[i+1].style.left = f.lefts[i+1] + "px";
					fDebugOut += "&nbsp; &nbsp; &nbsp; Left: "+fsEnds[i]+" - "+fBorderW+"<br />";
					fDebugOut += "&nbsp; &nbsp; &nbsp; Finished: true"+"<br />";
					if(i==0)
					{
						f.lefts[0] = fFull;
						fSlidesIs[0].style.left = f.lefts[0] + "px";
					}
				}
			}
		}
		
// GETSLIDEWIDTHS _________________________________________________________________________

		this.getSlideWidths=function()
		{
			for(var i=0;i<fsWidths.length;i++)
			{
				fsLefts[i]  = f.lefts[i+1] - ( fSpeed * fsRatio[i] );
				fsSpeed[i]	= fSpeed * fsRatio[i];
			}
		}
		
// GETLEFTS _________________________________________________________________________

		this.getLefts=function()
		{
			f.lefts						= new Array();

			for(var i=0;i<fSlidesIs.length;i++)
			{
				f.lefts[i] = parseInt(fSlidesIs[i].style.left);
			}
		}

// SETSPEED _________________________________________________________________________

		this.setSpeed=function()
		{
			if(fStep==0)
			{
				if( fEaseIn == 1 )
				{
					fSpeedT = fSpeedMax;
				}
				else
				{
					fSpeedT = fSpeedMin;
				}
			}
			
			if( fEaseIn == 1 )
			{
				fSpeedT 	= fSpeedT - ( ( ( fSpeedT - fSpeedMin ) / ( toGo / fSpeedT ) ) * Math.pow( fSpeedEase, ( fSpeedT / toGo ) ) );			
			}
			else
			{
				fSpeedT 	= fSpeedT + ( ( ( fSpeedMax - fSpeedT ) / ( toGo / fSpeedT ) ) * Math.pow( fSpeedEase, ( fSpeedT / toGo ) ) );			
			}
			
			var Diff = ( ( ( fSpeedMax - fSpeedT ) / ( toGo / fSpeedT ) ) * Math.pow( fSpeedEase, ( fSpeedT / toGo ) ) );

			if( fEaseIn == 0 )
			{
				fSpeedT = ( fSpeedMax );
			}
			
			if( fSpeedT > fSpeedMax){fSpeedT = fSpeedMax;}
			if( fSpeedT < fSpeedMin){fSpeedT = fSpeedMin;}

			fSpeed 	= fSpeedT;
			fStep++;
			
			toGo		= toGo - fSpeedT;
			flastSpeed = fSpeed;
		}



// SLEEP _________________________________________________________________________

		this.sleep=function()
		{
			fStep								= 0;
			toGo								= fFull;
			if(divImages == 1)
			{
				fSlidesIs 					= f.getElementsByTagName('div');
			}
			else
			{
				fSlidesIs 					= f.getElementsByTagName('img');
			}
			
			flastSpeed					= 0;
			fSpeedT							= fSpeedMin + ( fSpeedMax - fSpeedMin );
			fFpFH.getLefts();
			if(f.sleep)	{ clearTimeout(f.sleep); }
			f.sleep=setTimeout(
				function()
				{
					fFpFH.fadeInterval()
				},s
			)
		}

// FADEINTERVAL _________________________________________________________________________

		this.fadeInterval=function()
		{
			if(f.sleep)	{ clearTimeout(f.sleep); }
			if(f.fadeInterval)	{ clearInterval(f.fadeInterval); }
			f.fadeInterval=setInterval(
				function()
				{
					fFpFH.fade()
				},t
			)
		}

	this.build(containerID,widths);
	
}

