/*
	===================================================
	jquery.liScroller	v0.1.2
	Script by Davide Marcucci
	===================================================
*/
(function($){

// Funzione LISCROLLER per i menu con tag HTML <UL> e <LI>, verticali o orizzontali.
$.fn.liScroller = function(options){
	// === SETTINGS LATO UTENTE DEL PLUGIN ===
	// maxItems 			> il numero massimo di <LI> da visualizzare
	// navigationHtmlUp 	> il contenuto HTML (accetta quindi qualsiasi tag o struttura) del <LI> che si occupa di scrollare verso l'alto gli elementi
	// navigationHtmlDown	> il contenuto HTML (accetta quindi qualsiasi tag o struttura) del <LI> che si occupa di scrollare verso il basso gli elementi
	// navigationClass 		> la classe da applicare ai due <LI> che scrollano verso l'alto e il basso gli elementi
	// navigationStyle		> style in-line da applicare ai due <LI> che scrollano verso l'alto e il basso gli elementi
	// =======================================
	var defaults = {
		maxItems: 10,
		navigationHtmlUp: '&laquo;',
		navigationHtmlDown: '&raquo;',
		navigationClass: '',
		navigationStyle: '',
		navigationPrefix: '',
		fx: false,
		hideArrows: false,
		index: null
	};
	defaults = jQuery.extend(defaults,options);
	
	
	return this.each(function(index, val){
		var $this = $(this); // salvo l'elemento principale agganciato al plugin (in questo caso sarà un <UL>)
		var liList = $this.find('li'); // lista di tutti i <LI> presenti nel <UL> principale
		
		// Imposto l'index in modo manuale se il defaults.index è settato
		if(defaults.index != null)
			index = defaults.index;
		
		// Il plugin funziona solo con gli elementi <UL> e <LI> e se il numero di quest'ultimi è maggiore di quello impostato dal utente
		if(liList.length > defaults.maxItems){
			
			var firstVisibleIndex = 1; // indice che parte da 1 perchè tengo conto anche del <LI> di navigation per scorrere verso l'alto il menu
			var lastVisibleIndex = defaults.maxItems;
			
			// Nascondo tutti i <LI> e visualizzo solo il numero massimo impostato dal utente (default: 10)
			liList.hide();
			$.each(liList,function(i,li){ if(i < defaults.maxItems) { $(li).show(); } });
			
			// Creo i <LI> utilizzati come navigation (per scorrere il menu verso l'alto e il basso)
			if(defaults.hideArrows)
				$this.prepend('<li eventClick="false" id="'+ defaults.navigationPrefix +'navigation_up_scroll_'+ index +'" class="'+ defaults.navigationClass +'" style="display:none;'+ defaults.navigationStyle +'">'+ defaults.navigationHtmlUp +'</li>');
			else
				$this.prepend('<li eventClick="false" id="'+ defaults.navigationPrefix +'navigation_up_scroll_'+ index +'" class="'+ defaults.navigationClass +'" style="'+ defaults.navigationStyle +'">'+ defaults.navigationHtmlUp +'</li>');
			$this.append('<li eventClick="true" id="'+ defaults.navigationPrefix +'navigation_down_scroll_'+ index +'" class="'+ defaults.navigationClass +'" style="'+ defaults.navigationStyle +'">'+ defaults.navigationHtmlDown +'</li>');
			
			
			// ONCLICK SUI <LI> UTILIZZATI COME NAVIGATION
			// Questa parte (per l'id che dev'essere diverso per ciascun <LI> generato) dovrò sistemarla nelle future versioni del plugin
			// ===========================================
			$('#'+ defaults.navigationPrefix +'navigation_up_scroll_'+index).live('click',function(){
				if($(this).attr('eventClick') == 'true') {
					$('#'+ defaults.navigationPrefix +'navigation_down_scroll_'+ index).attr('eventClick', 'true'); // abilito l'evento per lo scroll down
					if(defaults.hideArrows)
						$('#'+ defaults.navigationPrefix +'navigation_down_scroll_'+ index).show(); // visualizzo la freccia per lo scroll down se è stata impostata la proprietà
					
					// Visualizzo l'elemento precedente al primo attuale della lista
					firstVisibleIndex -= 1;
					if(defaults.fx)
						$this.find('li:eq('+ firstVisibleIndex +')').slideDown('slow');
					else
						$this.find('li:eq('+ firstVisibleIndex +')').show();
				
					// Nascondo l'ultimo elemento attuale della lista
					if(defaults.fx)
						$this.find('li:eq('+ lastVisibleIndex +')').slideUp('slow');
					else
						$this.find('li:eq('+ lastVisibleIndex +')').hide();
					lastVisibleIndex -= 1;
				
					// Controllo se ho finito gli elementi da scorrere
					if(firstVisibleIndex == 1) { 
						$(this).attr('eventClick', 'false'); 
						// Controllo se è stato scelto di nascondere le frecce
						if(defaults.hideArrows)
							$(this).hide();
					}
					else { 
						$(this).attr('eventClick', 'true');
						// Controllo se è stato scelto di nascondere le frecce
						if(defaults.hideArrows)
							$(this).show();						
					}
				}
			});
			$('#'+ defaults.navigationPrefix +'navigation_down_scroll_'+index).live('click',function(){
				if($(this).attr('eventClick') == 'true') {
					$('#'+ defaults.navigationPrefix +'navigation_up_scroll_'+index).attr('eventClick', 'true'); // abilito l'evento per lo scroll up
					if(defaults.hideArrows)
						$('#'+ defaults.navigationPrefix +'navigation_up_scroll_'+index).show();
						
					// Visualizzo l'elemento successivo al ultimo attuale della lista
					lastVisibleIndex += 1;
					if(defaults.fx)
						$this.find('li:eq('+ lastVisibleIndex +')').slideDown('slow');
					else
						$this.find('li:eq('+ lastVisibleIndex +')').show();
				
					// Nascondo il primo elemento attuale della lista
					if(defaults.fx)
						$this.find('li:eq('+ firstVisibleIndex +')').slideUp('slow');
					else
						$this.find('li:eq('+ firstVisibleIndex +')').hide();
					firstVisibleIndex += 1;
				
					// Controllo se ho finito gli elementi da scorrere
					if(lastVisibleIndex == liList.length) { 
						$(this).attr('eventClick', 'false'); 
						// Controllo se è stato scelto di nascondere le frecce
						if(defaults.hideArrows)
							$(this).hide();
					}
					else { 
						$(this).attr('eventClick', 'true');
						// Controllo se è stato scelto di nascondere le frecce
						if(defaults.hideArrows)
							$(this).show();	
					}
				}
			});
			// ===========================================
		}
	});
};

})(jQuery);
