/*
 * LAMBERT.js
 * by Luglio7
 *
*/

function Loop(_index, _maxIndex)
{
    
    // public
    
    this.next = function(_set) // _set default true
    {
        if(this._isOk())
        {
            var _set = (_set == false)? false : true;
            var _nextIndex = null;
            
            if(this.direction == 1)
            {
                // incremental
                _nextIndex = ((this.index + 1) > this.maxIndex)? 0 : this.index + 1;
            }
            else
            {
                // decremental
                _nextIndex = ((this.index - 1) < 0)? this.maxIndex : this.index - 1;
            }
            
            if(_set)
            {
                this.index = _nextIndex;
            }
            return _nextIndex;
        }
        return false;
    }
    
    this.last = function()
    {
        if(this._isOk())
        {
            if(this.direction == 1)
            {
                // incremental
                _lastIndex = ((this.index - 1) < 0)? this.maxIndex : this.index - 1;
            }
            else
            {
                // decremental
                _lastIndex = ((this.index + 1) > this.maxIndex)? 0 : this.index + 1;
            }
            return _lastIndex;
        }
        return false;
    };
    
    // private
    
    this._isOk = function()
    {
        if((isFinite(this.index) && isFinite(this.maxIndex)) && (this.index <= this.maxIndex))
        {
            return true;
        }
        
        return false;
    }
    
    this._setInt = function(_value)
    {
        _value = parseInt(_value);
        if(isNaN(_value))
        {
            return undefined;
        }
        return _value;
    }
    
    // vars
    
    this.index = this._setInt(_index);
    this.maxIndex = this._setInt(_maxIndex);
    this.direction = 1; // 0: decremental, 1: incremental
    
}

var slideshow2 = {
	elements : {},
	vars : {
		delay : 7500,
		duration: 2000
	},
	init: function()
	{
		this.elements.images = $$("#slideshow_bar .slideshow_image");
		this.elements.descriptions = $$("#slideshow_description p");
		this.vars.loop = new Loop(0, this.elements.images.length-1);
		this.setupDescriptions();
		this.setupImages();
		setTimeout(function(){slideshow2.morphImages()}, slideshow2.vars.delay);
	},
	setupDescriptions: function()
	{
		for(var i = 0; i < this.elements.descriptions.length; i++)
		{
			switch(i)
			{
				case 0:
					this.elements.descriptions[i].setStyle('z-index', 10);
					break;
				case 1:
					this.elements.descriptions[i].setStyles({
						'z-index':	11,
						'visibility':	'hidden'
					});
					break;
				default:
					this.elements.descriptions[i].setStyle('visibility', 'hidden');
					break;
			}
		}
	},
	setupImages: function()
	{
		for(var i = 0; i < this.elements.images.length; i++)
		{
			switch(i)
			{
				case 0:
					this.elements.images[i].setStyle('z-index', 0);
					break;
				case 1:
					this.elements.images[i].setStyles({'z-index': 0, 'opacity' : 0});
					break;
				default:
					this.elements.images[i].setStyles({'opacity': 0});
					break;
			}
			this.elements.images[i].set('morph', {transition : Fx.Transitions.Expo.easeInOut, duration: this.vars.duration, onComplete: function(){
				setTimeout(function(){slideshow2.morphImages()}, slideshow2.vars.delay);
				slideshow2.elements.images[slideshow2.vars.loop.index].setStyles({'opacity' : 0});
				slideshow2.vars.loop.next();
			}});
		}
	},
	morphImages: function()
	{
		var currentIndex = this.vars.loop.index;
		var nextIndex = this.vars.loop.next(false);
		
		// images
		
		this.elements.images[nextIndex].setStyles({'visibility': 'visible', 'opacity' : 0, 'z-index' : 1});
		this.elements.images[currentIndex].setStyles({'z-index' : 0});
		this.elements.images[nextIndex].morph({'opacity' : [0,1]});
		
		// descriptions
		
		this.elements.descriptions[nextIndex].setStyles({'visibility' : 'visible', 'opacity' : 0, 'z-index' : 11});
		this.elements.descriptions[currentIndex].setStyles({'z-index' : 10});
		this.elements.descriptions[currentIndex].morph({'opacity' : [1,0]});
		this.elements.descriptions[nextIndex].morph({'opacity' : [0,1]});
		
	}
}

var slideshow = {

	element_slideshow : 	null,
	element_bar : 		null,
	elements_images : 	null,
	element_info : 		null,
	elements_texts : 	null,
	element_btn_next : 	null,
	element_btn_prev : 	null,
	
	width : 		950,
	images_margin : 	1,
	outside_opacity : 	.5,
	transition : 		Fx.Transitions.Expo.easeInOut,
	duration : 		1000,
	
	interval : 		true,
	intervalInstance : 	null,
	intervalDuration : 	8000,
	
	currentIndex : 		0,
	nextIndexValue :	null,
	stopAnimation : 	false,
	direction :		1,
	
	miniButtons :		true,
	elements_mini_buttons : null,

	init : function()
	{
		slideshow.element_slideshow = $('slideshow');
		slideshow.element_bar = $('slideshow_bar');
		slideshow.elements_images = $$('.slideshow_image');
		slideshow.elements_texts = $$('.slideshow_text');
		
		if(slideshow.miniButtons)
		{
			slideshow.addMiniButtons();
		}
		
		
		var nextIndex = slideshow.nextIndex();
		var left = ((slideshow.width + slideshow.images_margin) * nextIndex) * -1;
		var slideshow_bar_width = slideshow.elements_images.length * (slideshow.width + slideshow.images_margin);
		
		slideshow.element_bar.setStyles({'width': slideshow_bar_width, 'left' : left});
		slideshow.currentIndex++;
		
		
		for(var i = 0; i < slideshow.elements_images.length; i++)
		{
			// set styles images
			var image_styles = (i != 1)? {'margin-right' : slideshow.images_margin, 'opacity' : slideshow.outside_opacity} : {'margin-right' : slideshow.images_margin};
			slideshow.elements_images[i].setStyles(image_styles);
			slideshow.elements_images[i].set('tween', {transition: slideshow.transition, duration : slideshow.duration});
		}
		
		slideshow.element_bar.set('tween', {transition: slideshow.transition, duration : slideshow.duration});
		
		if(slideshow.interval)
		{
			slideshow.intervalInstance = setInterval("slideshow.tween()", slideshow.intervalDuration);
		}	
	},
	
	tween : function()
	{
		if(!slideshow.stopAnimation)
		{
			//slideshow.stopAnimation = true;
			slideshow.tweenBar();
		}
	},
	
	tweenInfo : function(opacity)
	{
		//slideshow.element_info.morph({'opacity' : opacity});
	},
	
	tweenBar : function()
	{
		var nextIndex = slideshow.nextIndex();
		var left = ((slideshow.width + slideshow.images_margin) * nextIndex) * -1;
		slideshow.element_bar.tween('left', left);
		
		slideshow.elements_images[nextIndex].tween('opacity', 1);
		
		slideshow.elements_images[slideshow.currentIndex].tween('opacity', slideshow.outside_opacity);
		
		if(slideshow.miniButtons)
		{
			slideshow.elements_mini_buttons[slideshow.currentIndex].highlight('#EEE');
			//slideshow.elements_mini_buttons[nextIndex].highlight('#EEE');
			slideshow.elements_mini_buttons[slideshow.currentIndex].toggleClass('slideshow_mini_button_sel');
			slideshow.elements_mini_buttons[nextIndex].toggleClass('slideshow_mini_button_sel');
		}
					
		slideshow.currentIndex = slideshow.nextIndex();
		
	},
	
	nextIndex : function()
	{
		var nextIndex;
		if(slideshow.direction == 1)
		{
			nextIndex = (slideshow.currentIndex + 1 == slideshow.elements_images.length)? 0 : slideshow.currentIndex + 1;
		}
		else
		{
			nextIndex = (slideshow.currentIndex - 1 < 0)? slideshow.elements_images.length - 1 : slideshow.currentIndex - 1;
		}
		
		if(slideshow.nextIndexValue)
		{
			nextIndex = slideshow.nextIndexValue;
		}
		
		return nextIndex;
	},
	
	addMiniButtons: function()
	{
		var miniButton;
		var left;
		var the_class;
		slideshow.elements_mini_buttons = new Array();
		for(var i=0; i<slideshow.elements_images.length; i++)
		{
			left = (i + .5) + (i * .5);
			the_class = (i == 0)? 'slideshow_mini_button slideshow_mini_button_sel' : 'slideshow_mini_button';
			miniButton = new Element('a', {
				'href'	: '#',
				'class' : the_class,
				'style' : 'left:'+left+'em',
				'id'	: 'slideshow_mini_button_' + i
			});
			miniButton.addEvent('click', function(){
				var index = parseInt(this.id.replace("slideshow_mini_button_", ""));
				slideshow.goTo(index)
				});
			slideshow.elements_mini_buttons.push(miniButton);
			slideshow.elements_mini_buttons[i].inject(slideshow.element_slideshow);
		}
	},
	
	goTo: function(index)
	{
		if(!slideshow.stopAnimation)
		{
			slideshow.nextIndexValue = index;
			slideshow.resetTimer();
			slideshow.tween();
		}
	},
	
	resetTimer: function()
	{
		clearTimeout(slideshow.intervalInstance);
		slideshow.intervalInstance = setInterval("slideshow.tween()", slideshow.intervalDuration);
	}

};

window.addEvent('domready', function(){

	if(document.getElementById("slideshow"))
	{
		//slideshow.init();
		slideshow2.init();
	}
	
});
