/* Gallery Plugin - Stefano Magrassi */
/*
	VISUALIZZAZIONE FINALE:	
	
	<a class="[PREV CLASS] gallery-btn gallery-btn-sx">&#160;</a>
	<div class="gallery-scrollable" id="[CONTAINER ID]">
		<div class="[SLIDER CLASS]">
			<a href="[BIG IMAGE]" title="[INFO TEXT]" class="single-item">
				<img src="[IMAGE SRC]" alt="[IMAGE ALT]"/>
			</a>
		</div>
	</div>
	<a class="[NEXT CLASS] gallery-btn gallery-btn-dx">&#160;</a>
	<div class="clear">&nbsp;</div>
*/

(function($) {
	/* OGGETTO PER CACHARE NUMERO IMMAGINI ED INDICE DELLE VARIE GALLERY */
	galleries = {};
	
	/* CONFIGURAZIONI DI DEFAULT DELLA GALLERY */
	$.slideGallery = {
		defaults: {
			items: '.gallery-items', //Classe contenitore degli elementi che si muove
			prev: '.prevPage', //Classe del bottone prev
			next: '.nextPage', //Classe del bottone next
			speed: 'slow', //Velocità dell'animazione (può anche essere Int)
			n_slide: 5, //Numero elementi visualizzati
			prefix: '' //Prefisso per le classi per il css
		}
	};
	
	$.fn.extend({
		/* INIZIALIZZAZIONE DEL PLUGIN */
		slideGallery: function(config) {
			var config = $.extend({}, $.slideGallery.defaults, config);
			
			/* INIZIALIZZAZIONE: costruzione dell'html necessario */
			function init() {
				/* COSTRUZIONE DELL'HTML */
				var hasClear = slideContainer.next('div.clear').length;
				slideContainer.addClass(config.prefix+'gallery-scrollable');
				slideContainer.before('<a class="'+config.prev.substr(1)+' '+config.prefix+'gallery-btn '+config.prefix+'gallery-btn-sx">&#160;</a>');
				slideContainer.after('<a class="'+config.next.substr(1)+' '+config.prefix+'gallery-btn '+config.prefix+'gallery-btn-dx">&#160;</a>');
				slideContainer.children().wrapAll( (config.items.substr(0,1) == '#')? '<div id="'+config.items.substr(1)+'">' : '<div class="'+config.items.substr(1)+'">');
				
				/* RECUPERO DEI BUTTON */
				itemContainer = slideContainer.children(config.items);
				var prevBtn = slideContainer.prev(config.prev);
				var nextBtn = slideContainer.next(config.next);
				if(!hasClear) nextBtn.after('<div class="clear">&nbsp;</div>');
				
				/* AGGIORNAMENTO DEI VALORI CACHATI*/
				galleries[slideContainerId].totImg = itemContainer.children().size();
				galleries[slideContainerId].imgIndex = 0;
				
				/* AGGANCIAMENTO DELLE FUNZIONI */
				nextBtn.click(function(){ slideNext(this); });
				prevBtn.click(function(){ slidePrev(this); });

				/* MOSTRA/NASCONDE BUTTON IN FASE DI INIZIALIZZAZIONE */
				itemContainer.children().addClass(config.prefix+'single-item');
				prevBtn.addClass(config.prefix+'gallery-disabled');
				if(itemContainer.children().size() <= config.n_slide) nextBtn.addClass(config.prefix+'gallery-disabled');
				
				/* HACK PER IE */
				if( isNaN(parseInt(itemContainer.css('left'),10)) ) itemContainer.css('left',0);
			}
			
			/* DIMENSIONE SPAZIO VISUALIZZATO: restituisce la dimensione dello spostamento in base al numero di elementi da visualizzare */
			function setWidth(is_next, itemContainer, index) { 
				/* is_next: booleano, controlla se calcolare gli elementi successivi o precedenti */
				var totW = 0,
					start = (is_next)? index : (index - config.n_slide),
					end = (is_next)? (index + config.n_slide) : index;
				
				/* RECUPERA GLI OGGETTI DELLA GALLERY TRA I DUE INDICI INDICATI E NE CALCOLA LA LARGHEZZA TOTALE */
				itemContainer.children().slice(start, end).each(function(){
					totW += parseInt($(this).outerWidth(true), 10);
				})
				
				return totW;
			}

			/* SPOSTAMENTO IN AVANTI: al click sposta indietro il contenitore fino al numero max di elementi */
			function slideNext(obj) {
				/* RECUPERO DEGLI OGGETTI E DEI VALORI CACHATI */
				var nextBtn = $(obj),
					prevBtn = nextBtn.prevAll(config.prev),
					slideContainer = nextBtn.prev(),
					slideContainerId = slideContainer.attr('id'),
					itemContainer = slideContainer.find(config.items),
					gallery = galleries[slideContainerId];
				
				/* ANIMAZIONE DEL CONTENITORE: SI SPOSTA A SINISTRA DELLA LARGHEZZA CALCOLATA ALLA VELOCITA' DEFINITA IN CONFIG. */
				itemContainer.animate({
					'left': (parseInt(itemContainer.css('left'),10) - setWidth(true, itemContainer, gallery.imgIndex)) + 'px'
				}, config.speed, function(){
					/* AGGIORNA VALORI CACHATI */
					gallery.imgIndex += config.n_slide;
					
					/* VISUALIZZAZIOEN DEI PULSANTI ALLA FINE DELLO SPOSTAMENTO */
					if((gallery.imgIndex + config.n_slide) >= gallery.totImg) nextBtn.addClass(config.prefix+'gallery-disabled');
					prevBtn.removeClass(config.prefix+'gallery-disabled');
				});
			}
			
			/* SPOSTAMENTO INDIETRO: al click sposta avanti il contenitore fino allo zero */
			function slidePrev(obj) {
				/* RECUPERO DEGLI OGGETTI E DEI VALORI CACHATI */
				var prevBtn = $(obj),
					nextBtn = prevBtn.nextAll(config.next),
					slideContainer = prevBtn.next(),
					slideContainerId = slideContainer.attr('id'),
					itemContainer = slideContainer.find(config.items),
					gallery = galleries[slideContainerId];
				
				/* ANIMAZIONE DEL CONTENITORE: SI SPOSTA A DESTRA DELLA LARGHEZZA CALCOLATA ALLA VELOCITA' DEFINITA IN CONFIG. */
				itemContainer.animate({
					'left': (parseInt(itemContainer.css('left'),10) + setWidth(false, itemContainer, gallery.imgIndex)) + 'px'
				}, config.speed, function(){
					/* AGGIORNA VALORI CACHATI */
					gallery.imgIndex -= config.n_slide;
					
					/* VISUALIZZAZIOEN DEI PULSANTI ALLA FINE DELLO SPOSTAMENTO */
					if(gallery.imgIndex <= 0) prevBtn.addClass(config.prefix+'gallery-disabled');
					nextBtn.removeClass(config.prefix+'gallery-disabled');
				});
			}

			return this.each(function(i){
				/* VARIABILE GLOBALE PER LA GALLERY CORRENTE */
				slideContainer = $(this);
				slideContainerId = slideContainer.attr('id');
				
				/* CACHE DEL NUMERO TOT IMG E DELL'INDICE IMMAGINE X OGNI GALLERY */
				galleries[slideContainerId] = {totImg: 0, imgIndex: 0};
				
				/* CHIAMATA ALL'INIZIALIZZAZIONE */
				init();
			});
		}
	});
	
})(jQuery);
