function Gallery()
{
	var istance;
	
	var container;
	var stage;
	var slider;
	var thumbwrap;
	var images;
	var thumbs;
	var width;
	
	var timeout;

	this.init = function init(container, stage, thumbwrap)
	{
		istance = this;
	
		this.container = $(container);
		this.stage     = $(stage);
		this.thumbwrap = $(thumbwrap);
		this.slider    = $(thumbwrap).find('.slider');
		this.images    = this.stage.find('img');
		this.thumbs    = this.slider.find('img');
		
		//ora organizzo le immagini...
		this.organize();
		this.handleEvents();
	}
	
	this.organize = function organize() {
		this.container.addClass('scripted');
		this.images.not(':first').hide();
		this.images.filter(':first').show();
		this.slider.width(this.calcWidth());
		this.centerImage(0);
		this.startSlideshow();
	}
	
	this.handleEvents = function handleEvents() {
		this.thumbs.click(function() {
			//fermo lo slideshow...
			istance.stopSlideshow();
			index = istance.thumbs.index(this);
			prev = istance.images.filter(':visible');
			next = istance.images.eq(index);
			istance.swapImages(prev, next);
			istance.centerImage(index);
		});
	}

	this.calcWidth = function calcWidth() {
		istance.width = 0;
		this.thumbs.each(function() {
			istance.width += $(this).width() + 10;
		});
		return istance.width;
	}

	this.swapImages = function(prev, next) {
		prev.fadeOut('fast', function() {
			next.fadeIn('fast');
		});
	}
	
	this.startSlideshow = function() {
		istance.timeout = setInterval(function() {
			
			//trovo l'immagine corrente e la successiva
			prevThumb = istance.thumbs.filter('.currentImage');
			nextThumb = prevThumb.next('img');
			
			//se sono alla fine la prossima sarà la prima
			if (nextThumb.length == 0) {
				nextThumb = istance.thumbs.eq(0);
			}
			
			//trovo gli indici
			indexPrev = istance.thumbs.index(prevThumb);
			indexNext = istance.thumbs.index(nextThumb);
			
			//sposto la classe currentImage
			prevThumb.removeClass('currentImage');
			nextThumb.addClass('currentImage');
			
			//centro l'immagine sulla prossima
			istance.centerImage(indexNext);
			
			//trovo le immagini grandi da scambiare
			prev = istance.images.eq(indexPrev);
			next = istance.images.eq(indexNext);
			
			//scambio le immagini
			istance.swapImages(prev, next);
		}, 3000);
	}
	
	this.stopSlideshow = function() {
		clearInterval(istance.timeout);
	}
	
	this.centerImage = function centerImage(index) {
		var offset = 0;
		if (index >= 0) {
			//conto la larghezza di tutte le immagini precedenti...
			for (i = 0; i < index; i++) {
				offset += istance.thumbs.eq(i).width() + 10;
			}
			//aggiungo anche la metà dell'immagine corrente e tolgo i 10px di margine destro...
			offset += istance.thumbs.eq(index).width() / 2 - 10;
			
			//calcolo lo spazio disponibile...
			available = istance.thumbwrap.width();
			
			//calcolo la dimensione dello slider...
			size = istance.width;
			
			//calcolo il margine teorico...
			margin = available / 2 - offset;
			
			//calcolo i limiti inferiori e superiori (per non far sforare il layout)...
			var limiteSup = 0;
			var limiteInf = available - size;
			
			//se le immagini superano lo spazio disponibile
			if (size > available) {
				//controllo se sto violando i margini...
				if( margin > limiteSup) {
					margin = limiteSup;
				}
				if (margin < limiteInf) {
					margin = limiteInf;
				}
			} else {
				margin = Math.floor((available - size) / 2);
			}
			
			istance.slider.animate({left: margin+'px'}, 'fast');
			istance.thumbs.removeClass('currentImage');
			istance.thumbs.eq(index).addClass('currentImage');
		}
	}
}