var __slides = [];

// Initialize ------------------------------------------------------------------
function initSlidesModule ( slide )
{
	if ( slide )
	{
		if ( slide.initialized ) return;
		slide.initialized = true;
		slide.index = __slides.length;
		slide.current = 0;
		slide.direction = '';
		slide.slides = new Array();
		slide.thumbsNextAr = new Array ();
		slide.thumbsPrevAr = new Array ();
		slide.thumbsNext = false;
		slide.thumbsPrev = false;
		slide.slidePages = false;
		__slides[ slide.index ] = slide;
		// Position slides
		var slides = slide.getElementsByTagName ( 'div' );
		for ( var a = 0, i = 0; a < slides.length; a++ )
		{
			if ( slides[ a ].className.substr ( 0, 6 ) != 'Slide ' && slides[a].className != 'Slide' ) continue;
			slides[a].style.left = ( slide.offsetWidth * i++ ) + 'px';
			slide.slides.push ( slides[a] );
			if ( !slides[a].id )
				slides[a].id = 'slide_' + slide.index + '_' + i;
		}
		// Register thumbnails
		var sg = slide.parentNode.getElementsByTagName ( 'div' );
		var sgui = false;
		for ( var a = 0; a < sg.length; a++ )
		{
			if ( sg[a].className == 'SlideGui' )
				sgui = sg[a];
			else if ( sg[a].className == 'ThumbsPrev' && !slide.thumbsPrev )
				slide.thumbsPrev = sg[a];
			else if ( sg[a].className == 'ThumbsNext' && !slide.thumbsNext )
				slide.thumbsNext = sg[a];
			if ( slide.thumbsPrev && sg[a].parentNode == slide.thumbsPrev )
				slide.thumbsPrevAr.push ( sg[a] );
			if ( slide.thumbsNext && sg[a].parentNode == slide.thumbsNext )
				slide.thumbsNextAr.push ( sg[a] );
		}
		// Position navigation buttons
		var btns = slide.parentNode.getElementsByTagName ( 'div' );
		for ( var a = 0; a < btns.length; a++ )
		{
			if ( btns[ a ].className == 'SlidePages' )
				slide.slidePages = btns[a];
			if ( btns[ a ].className == 'SlideNext' )
			{
				btns[a].slide = slide;
				btns[a].onclick = function ()
				{
					this.slide.current++;
					if ( this.slide.current >= this.slide.slides.length ) this.slide.current = 0;
					this.slide.direction = 'next';
					__repositionSlides ( this.slide.index );
				}
				slide.thumbsNext.slide = slide;
				slide.thumbsNext.onclick = btns[a].onclick;
			}
			if ( btns[ a ].className == 'SlidePrev' )
			{
				btns[a].slide = slide;
				btns[a].onclick = function ()
				{
					this.slide.current--;
					if ( this.slide.current < 0 ) 
						this.slide.current = this.slide.slides.length - 1;
					this.slide.direction = 'prev';
					__repositionSlides ( this.slide.index );
				}
				slide.thumbsPrev.slide = slide;
				slide.thumbsPrev.onclick = btns[a].onclick;
			}
		}
		// Make pagination
		for ( var a = 0; a < slide.thumbsPrevAr.length; a++ )
		{
			var d = document.createElement ( 'div' );
			var thumb = slide.thumbsPrevAr[a];
			d.className = 'SlidePage';
			d.slide = slide;
			d.c = a;
			d.innerHTML = '<div><span>' + (a+1) + '</span>'+thumb.innerHTML+'</div>';
			d.onclick = function ()
			{
				if ( this.c < this.slide.current )
					this.slide.direction = 'prev';
				else this.slide.direction = 'next';
				this.slide.current = this.c;
				var sp = this.slide.slidePages.childNodes;
				__repositionSlides ( this.slide.index );
			}
			slide.slidePages.appendChild ( d );
		}
		__repositionSlides ( slide.index );
	}
	// Fetch all slides divs and initialize
	else
	{
		var eles = document.getElementsByTagName ( 'div' );
		var slides = [];
		for ( var a = 0; a < eles.length; a++ )
			if ( eles[a].className == 'Slides' )
				slides.push ( eles[a] );
		for ( var a = 0; a < slides.length; a++ )
		{
			if ( slides[a].initialized ) continue;
			initSlidesModule ( slides[a] );
		}
	}
}

// Reposition slides for new sort index ----------------------------------------
function __repositionSlides ( ind )
{
	// Check call
	var s = __slides[ ind ];
	if ( !s ) return; 
	
	// Initialize animation
	var next = ( s.current + 1 ) >= s.slides.length ? 0 : ( s.current + 1 );
	var prev = ( s.current - 1 ) < 0 ? s.slides.length - 1 : ( s.current - 1 );
	for ( var a = 0; a < s.slides.length; a++ )
	{
		s.slides[a].fx 		= parseInt ( s.slides[a].style.left );
		s.slides[a].stime 	= ( new Date () ).getTime ();
		s.slides[a].tx 		= Math.floor ( (a-s.current) * (3200) ) + __igOffsetX;
		if ( s.slides[a].intr )
			clearInterval ( s.slides[a].intr );
		s.slides[a].intr 	= setInterval ( '__animateSlide( \'' + 
								s.slides[a].id + '\' )', 5 );
		if ( a == s.current )
		{
			s.slides[ a ].className = 'Slide Current';
		}
		else
		{
			s.slides[ a ].className = 'Slide';
		}
	}
	if ( s.direction == 'next' )
		s.slides[ next ].style.left = s.slides[next].offsetWidth + 'px';
	else if ( s.direction == 'prev' )
		s.slides[ prev ].style.left = 0 - s.slides[prev].offsetWidth + 'px';
	
	// Activate button
	var sp = s.slidePages.childNodes;
	for ( var z = 0; z < sp.length; z++ )
	{
		if ( z == s.current ) sp[z].firstChild.className = 'current';
		else sp[ z ].firstChild.className = '';
	}
	
	// Reposition slide thumbs 
	for ( var a = 0; a < s.thumbsNextAr.length; a++ )
	{
		var t = s.thumbsNextAr[ a ];
		if ( a == next )
			__setSlideElementVis ( t, 1 );
		else __setSlideElementVis ( t, 0 );
	}
	for ( var a = 0; a < s.thumbsPrevAr.length; a++ )
	{
		var t = s.thumbsPrevAr[ a ];
		if ( a == prev )
			__setSlideElementVis ( t, 1 );
		else __setSlideElementVis ( t, 0 );
	}
}

// Animate slides to new target coordinate -------------------------------------
function __animateSlide( id )
{
	var o = ge ( id );
	var phase = ( ( new Date () ).getTime () - o.stime ) / 800;
	if ( phase > 1 ) phase = 1;
	var ph = Math.pow ( Math.sin ( phase * 0.5 * Math.PI ), 2 );
	// When first moving them, move without animation
	if ( o.firstMove != 1 )
	{
		ph = 1;
		o.firstMove = 1;
		phase = 1;
	}
	var lpos = Math.floor ( o.fx - ( ( o.fx - o.tx ) * ph ) );
	o.style.left = lpos + 'px';
	if ( phase == 1 )
		clearInterval ( o.intr );
}

// Hide a slide element
function __setSlideElementVis ( t, val )
{
	setOpacity ( t, val );
	t.style.zIndex = val == 1 ? 1 : 0;
}



