/**************************************
 *	Create ListSliders
 **************************************/
window.addEvent('domready', function(){
	$$('div.slider').each(function(slider){
		var slider = new ListSlider({
			slider:			slider,
			previousButton:	slider.getElement('a.previous'),
			nextButton:		slider.getElement('a.next'),
			pagination:		slider.getElement('ul.dots')
		});	
	})
});


/**************************************
 *	ListSlider
 **************************************/
ListSlider = new Class({
	
	options:	{
		slider:			false,
		previousButton:	false,
		nextButton:		false,
		transition:		Fx.Transitions.Linear,
		duration:		500
	},
	
	inTransition:	false,
	slideList:		false,
	sliderWidth:	false,
	itemWidth:		false,
	itemCount:		false,
	visibleItems:	false,
	slideEffect:	false,
	currentItem:	0,
	queuedImages:	false,
	
	/**
	 *	Initialize
	 */
	initialize: function(options){
		
		// Fetch options
		this.setOptions(options);
		
		if(!this.options.slider) return false;
		
		this.slideList		= this.options.slider.getElement('div.slider_content');
		if (this.slideList)
		{
			
			this.items = this.slideList.getElements('ul.slider_item');

			listItem 			= this.items[0];
			this.itemWidth		= listItem.getSize().x + parseInt(listItem.getStyle('margin-left')) + parseInt(listItem.getStyle('margin-right'));			
			this.itemCount		= this.items.length;
			this.visibleItems	= Math.ceil(this.sliderWidth / this.itemWidth);
			
			this.tabIndex = (parseInt(this.slideList.lang) > 0 ? parseInt(this.slideList.lang) : 1);			
			
			this.sliderWidth	= this.itemCount * this.itemWidth;
			
			this.slideList.setStyle('width', this.sliderWidth);
			
			// Create slide effect			
			this.slideEffect	= new Fx.Tween(this.slideList, {duration: this.options.duration, transition: this.options.transition});

			// Add handlers
			this.addHandlers();
		}
		else
			this.disableAll();
	},
	
	/**
	 *	Add eventhandlers
	 */
	addHandlers: function(){
		
		// Disable following of link
		this.options.previousButton.onclick = function(){ return false; }
		this.options.nextButton.onclick = function(){ return false; }		
		
		// Slide events
		this.options.previousButton.addEvent('click', this.slidePrevious.bind(this));
		this.options.nextButton.addEvent('click', this.slideNext.bind(this));
		this.slideEffect.addEvent('onComplete', function(){
			this.inTransition = false;												 
		}.bind(this));
		
		if (this.options.pagination) {
			this.options.pagination.getElements('li').each(function(el, index){
				el.getElement('a').addEvent('click', function(e){
					new Event(e).stop();
					this.slidePagination(index);
				}.bind(this));
			}.bind(this));
		}
	},
	
	/**
	 *	Slide to previous item
	 */
	slidePrevious: function(e){
		if(!this.options.previousButton.disabled){
			this.slide((this.itemWidth * this.tabIndex), 'prev');
		}
	},
	
	slideNext: function(e){
		if(!this.options.nextButton.disabled){
			this.slide(0 - (this.itemWidth * this.tabIndex), 'next');
		}
	},
	
	slidePagination: function(i){		
		var newMargin = 0 - (i * (this.itemWidth * this.tabIndex));
		this.currentItem = i;
		
		if(!this.inTransition){
						
			this.inTransition = true;

			this.slideEffect.start('margin-left', newMargin);					
		}
		
		var pages = this.options.pagination.getElements('li');
			pages.removeClass('active');
			pages[i].addClass('active');
		
	},
	
	/**
	 *	Perform slide
	 */
	slide: function(direction, button){	
		// Perform slide
		if(!this.inTransition){
			newMargin = parseInt(this.slideList.getStyle('margin-left')) + direction;
						
			this.inTransition = true;
			
			var toStart = true;
			
			var totalPages = Math.ceil(this.itemCount / this.tabIndex);
			
			//spacer			
			var spacer = (this.itemCount %this.tabIndex);
			if(spacer < 1) spacer = 1;
			
			if (newMargin > 0) {
				newMargin = -(this.itemWidth * (this.itemCount - spacer));
				this.currentItem = totalPages;
				toStart = false;
			}									
			
			if (button == 'next' && toStart && this.currentItem == (totalPages - 1)) {
				this.slideEffect.start('margin-left', 0);
				this.currentItem = 0;
			}
			else{
				this.slideEffect.start('margin-left', newMargin);
				// Determine current item (on left side)
				this.currentItem += (direction > 0)? -1 : 1;
			}
			
			if (this.options.pagination) {
				var pages = this.options.pagination.getElements('li');
				pages.removeClass('active');
				pages[this.currentItem].addClass('active');
			}			
		}
	},

	disableAll: function() {
		this.options.nextButton.addClass('disabled');
		this.options.nextButton.disabled = true;

		this.options.previousButton.addClass('disabled');
		this.options.previousButton.disabled = true;
	}
});
ListSlider.implement(new Options);
