(function($)
{
    $.fn.sliderHoc = function(options)
    {
        // opzioni di default
        var defaults = {
            prevClass:		'slideNavPrev',	// classe css del controllo indietro
            nextClass:		'slideNavNext',	// classe css del controllo avanti
            controlsShow:   true,		// mostra o meno i controlli indietro e avanti
            controlsFade:   true,		// se i controlli alla fine della sequenza devono sparire
            speed:          500,		// velocità dell'animazione
            ease:           'swing',	// tipo di animazione
            auto:           false,		// se la sequenza deve andare avanti da sola
            pause:          5000,		// tempo di attesa (in ms) su ogni elemento
            continuous:     true,		// sequenza infinita
            labelManage:	2		// 0 non gestisce le Label, intero positivo per label da mostrare
        };

        var options = $.extend(defaults, options);

        this.each(function()
        {
            var obj = $(this);

			// oggetti che mi servono riguardo lo Slide
            var ulSlide = obj.children('ul');
            var liSlide = ulSlide.children('li');

            var numbSlide = liSlide.length;
            
            // oggetti che mi servono riguardo la Navigation
            var containerNavigation = obj.next('.navigationBox');
            var ulNavigation = containerNavigation.children('ul');
            var liNavigation = ulNavigation.children('li');

            var numbLabel = liNavigation.length;

			// Slide ed Label devono essere uguali in quantità
            if (numbSlide!=numbLabel) {
            //	alert('La quantità degli slide e delle etichette deve essere uguale');
            	return false;
            }
            
            var w = obj.width();
            var h = obj.height();

            var t = 0;
            var ts = numbSlide-1;
            var clickable = true;
            
            // imposto le proprietà css che servono
            
            obj.css('overflow','hidden');
			
            liSlide.each(function() {
            	$(this).width(w);
            });

            liSlide.css('float', 'left');

            ulSlide.width(numbSlide*w);

            if(options.continuous)
            {
            	ulSlide.prepend(liSlide.filter(":last-child").clone().css("margin-left","-"+ w +"px"));
                ulSlide.append(liSlide.filter(":nth-child(2)").clone());
                ulSlide.width((numbSlide+1)*w);
            }

            if(options.controlsShow)
            {
                $('a.'+options.nextClass,containerNavigation).click(function(){
                    animate('next',true); return false;
                });
                $('a.'+options.prevClass,containerNavigation).click(function(){
                    animate('prev',true); return false;
                });
            } else {
                $('a.'+options.nextClass,containerNavigation).hide();
                $('a.'+options.prevClass,containerNavigation).hide();
            }
            
            if(options.labelManage)
			{
				setLabel(t+parseInt(options.labelManage));
			}
            
            function setLabel(i)
            {	i--;
            	if(i>numbSlide){
            		i = i-numbSlide;
            	} else if (i==0) {
            		i = numbSlide;
            	}
				
				// $('li:nth-child(1)',ulNavigation).hide();
				$('li',ulNavigation).css('color','#DDD');
				$('li',ulNavigation).animate({ opacity: 1 }, "fast");

				// $('li:nth-child('+i+')',ulNavigation).css('color','#777');
				
				$('li:nth-child('+i+')',ulNavigation).animate({ opacity: 0.4 }, "fast");
				
            }

            function adjust()
            {
                if(t>ts) t=0;
                if(t<0) t=ts;
                ulSlide.css('margin-left',(t*w*-1));
                clickable = true;
            }

            function animate(dir,clicked)
            {
                if (clickable)
                {
                    clickable = false;
                    var ot = t;
                    switch(dir)
                    {
                        case "next":
                            t = (ot>=ts) ? (options.continuous ? t+1 : ts) : t+1;
                            break;
                        case "prev":
                            t = (t<=0) ? (options.continuous ? t-1 : 0) : t-1;
                            break;
                        default:
                            t = parseInt(dir);
                            break;
                    }

                    var diff = Math.abs(ot-t);
                    var speed = diff*options.speed;

                    p = (t*w*-1);
                    if (options.ease!='fade') {
                        ulSlide.animate(
                            { marginLeft: p },
                            {
                                queue:false,
                                duration:speed,
                                easing:options.ease,
                                complete:adjust
                            }
                        );
                        if(options.labelManage) setLabel(t+parseInt(options.labelManage));
                    } else {
                    	ulSlide.animate(
                    		{ opacity: 0 },
                    		speed,
                    		'swing',
                    	    function() {
                    	    	ulSlide.css({marginLeft:p});
                    	    	ulSlide.animate(
                    	    		{ opacity: 1 },
                    	    		speed,
                    	    		'swing'
                    	    	);
                    	    	adjust();
                    	    }
                    	);
                    	if(options.labelManage) setLabel(t+parseInt(options.labelManage));
                    }

                    if(!options.continuous && options.controlsFade)
                    {
                        if(t==0){
                            $('a.'+options.prevClass,containerNavigation).fadeOut('slow');
                        } else if(t==ts){
                            $('a.'+options.nextClass,containerNavigation).fadeOut('slow');
                        } else {
                            $('a.'+options.prevClass,containerNavigation).fadeIn('slow');
                            $('a.'+options.nextClass,containerNavigation).fadeIn('slow');
                        }
                    }

                    if(clicked) clearTimeout(timeout);
                    if(options.auto && dir=='next' && !clicked){
                        timeout = setTimeout(function(){
                            animate('next',false);
                        },diff*options.speed+options.pause);
                    }

                }
            }
            
            // init
            var timeout;
            if(options.auto){
                timeout = setTimeout(function(){
                    animate('next',false);
                },options.pause);
            }

            if(!options.continuous && options.controlsFade){
                $('a.'+options.prevClass,containerNavigation).hide();
            }

        });

    }
})(jQuery);

$(function(){
	$('.slideBox').sliderHoc();
	$('.slideBox').sliderHoc({auto: false,auto:true});
});
