fb.widgets.Carousel = function (element, options){
	
	this.$element = $(element);
	this.options = $.extend({
		item: 'li', // elementy ktere se budou scrollovat
		start: 1, // element kterým se začíná
		scroll: 1, // počet scrollovaných elementů v jednom kroce
		visible: 6, // počet viditelných elementů
		animation: 200, // čas za který se provede animace kroku
		boxClass: 'carousel-box', 
		spcClass: 'carousel-spc',
		clipClass: 'carousel-clip',
		htmlPrev: '<a href="#">prev</a>',
		htmlNext: '<a href="#">next</a>'		
	}, options)
	this.$items = this.$element.find(this.options.item);
	this.length = this.$items.length;
	this.current = this.options.start - 1;
	this.past = this.current; 
	this.scroll = this.options.scroll;
	this.visible = this.options.visible;
	this.end = this.length - this.visible;

};

fb.widgets.Carousel.prototype = {
	
	constructor: fb.widgets.Carousel,
	
	// reference na jquery proxy
	proxy : $.proxy,
	
	// reference na globální objekt Math
	abs: Math.abs,
		
	init: function() {
		if(this.$element.data('carouselInit') || !this.$element.length)
		{
			return this;
		}
		
		var o = this.options,
			e = this.$element;
		
		// vypočítání pozic elementů - nemusí se pořád dokola zjišťovat
		this.offsets = [];
		for (var i=0, l=this.length; i < l; i++) {
			this.offsets[i] = this.$items.get(i).offsetLeft;
		};
	
		e
			.css({'overflow':'visible', 'position':'relative', 'left': -this.offsets[this.current]+'px'})
			.wrap('<div class="'+ o.boxClass +'"><div class="'+ o.spcClass +'"><div class="'+ o.clipClass +'"></div></div></div>')
			.before('<a href="#">')
			.width(e.attr('scrollWidth'))
			.scrollLeft(0)
			.data('carouselInit', true);
			
		this.$box = e.closest('.' + o.boxClass);
		this.$spc = e.closest('.' + o.spcClass);
		this.$clip = e.closest('.' + o.clipClass);
		
		if(o.htmlPrev && this.end > 0){
			this.$prev = $(o.htmlPrev);
			this.$prev
				.addClass('prev')
				.appendTo(this.$spc)
				.bind('click.carousel', this.proxy(this.prev, this));
			this.controlPrev();
		}
		if(o.htmlNext && this.end > 0){
			this.$next = $(o.htmlNext);
			this.$next
				.addClass('next')
				.appendTo(this.$spc)
				.bind('click.carousel', this.proxy(this.next, this));
			this.controlNext();	
		}
		
		return this;
	},
	// metoda pro zjištění zda je daný element plně vidět ve výřezu
	isVisible: function(i){
		var cW = this.$clip.width(),
			cOff = this.offsets[this.current],
			iW = this.$items.eq(i).outerWidth(),
			iOff = this.offsets[i];	
		
		return (cOff <= iOff && (cW+cOff) >= (iW + iOff));
	},
	next: function() {
		var i = this.current + this.scroll;	
		this.scrollTo(i, 'next');
		return false;
	},
	prev: function() {
		var i = this.current - this.scroll;	
		this.scrollTo(i, 'prev');
		return false;	
	},
	scrollTo: function(i, type) {	
		this.past = this.current;
		var i = i < 0 ? 0 : i;
			i = i > this.end ? this.end : i;
		this.current  =  i;
		// získání rozdílu mezi indexama - 3členkou pak vypočítám stejnou rychlost pro scrollování menšího počtu elementů
		var diff = this.abs( i - this.past )
		if(diff){
			this.$element.stop().animate({
				'left': -this.offsets[i]
			}, this.options.animation / this.scroll * diff, 'swing');
			this.controlPrev();
			this.controlNext();
		}
	},
	controlPrev: function() {
		this.$prev[(this.current == 0) ? 'addClass' : 'removeClass']('prev-disable');
	},
	controlNext: function() {
		this.$next[(this.current == this.end) ? 'addClass' : 'removeClass']('next-disable');
	}
	
};


