/*
 *Infimnite slider è un plugin per jquery
 *Author: marinobonetti at gmail dot com
 *Versione: 1.1
 *date: 07-05-2011
 *
 *changelog:
 *1.1
 *  correzione per infinite loop sia a destra che a sinistra
 *  non vengono clonati elementi ma spostati solo da un lato all'altro, quindi teoricamente si potrebbe usare anche gli id univoci per elementi
 *
 */

(function ($) {
    $.fn.infiniteSlider=function(d){
        var e = {
            prevId: 'prevBtn',
            prevText: '<<',
            nextId: 'nextBtn',
            nextText: '>>',
            movimento:210,//spostamento ad ogni animazone
            movimentoRapido:420,//spostamento al click dei tasti
            orientation: '',
            timer:0,//tempo d'aspetto fra un blocco e il sucessivo'
            numEleIniz:0,
            automazione:false,
            speed: 1800,
            timeAutoRestart:3000,//tempo che aspetta per ripartire lo slider
            timeRestart:null,
            contatore:0,//non modificare
            clonati:0//non modificare
        };
        var s = $.extend(e,d);
        return this.each(function () {
            obj = $(this);
            $(obj).addClass('infiniteSlider-pane');
            $(obj).html('<div class="infiniteSlider-content">'+$(obj).html()+'</div>');
            $('.infiniteSlider-content>div',obj).addClass('infiniteSlider-content-item');
            var scrollPane = $( ".infiniteSlider-pane" ),scrollContent = $( ".infiniteSlider-content");

            //aggiungo i contatori agli elementi
            s.numEleIniz=$('.infiniteSlider-content-item',scrollContent).length;
            $('.infiniteSlider-content-item',scrollContent).each(function(){
                s.contatore++;
                $(this).attr('rel',s.contatore);
            });
           
            $('.infiniteSlider-content',obj).css({
                'position':'relative',
                'left':'0px'
            });

            
            $(obj).after('<span id="' + s.prevId + '"><a href=\"javascript:void(0);\">' + s.prevText + '</a></span> <span id="' + s.nextId + '"><a href=\"javascript:void(0);\">' + s.nextText + '</a></span>');
          
            //correzione per problema di ie e ora i zindex dei bottoni sono sbagliati
            $('#'+s.prevId+',#'+s.nextId).css({
                'z-index':100000 
            });


            //calcolo larghezze slider
            function ricalcoloLarghezza(){
                var larghezza=0;

                $('.infiniteSlider-content>div',obj).each(function(){
                    larghezza+=$(this).outerWidth(true);
                });
                $('.infiniteSlider-content',obj).css('width',larghezza+'px');
            }

            ricalcoloLarghezza();
            
            //crea un euilibrio fra i vari elementi spostando alcuni che sono a destra alla mia sinistra
            //funzione chiamata solamente all'inizio
            function equilibrateElements(){
                //calcolo quanti elementi ho visibili
                larghezza=$('.infiniteSlider-content-item').outerWidth();
                visibili=Math.round($('.infiniteSlider-pane').width()/larghezza);
                daspostare=(s.numEleIniz-visibili)/2;
                if(daspostare>0){
                    //sposto da destra a sinistra
                    contatore=0;
                    spostamento=0;
                    while(contatore<daspostare){
                        ele=$('.infiniteSlider-content-item').last();
                        ele.insertBefore($('.infiniteSlider-content-item').first());
                        spostamento+=ele.outerWidth(true);
                        contatore++;
                    }
                    $(".infiniteSlider-content", obj).css('left','-'+spostamento+'px');
                    return true;
                }else{
                    return false;
                }
            }
            
            //la funzione può ricevere solo r o l in tutte le due variabili e non possono essere uguali
            
            function moveElement(initialPos,finalPos){
                if(initialPos==finalPos){
                    return false;
                }
                if(initialPos=='r'){
                    ele=$('.infiniteSlider-content-item').last();
                }else if(initialPos=='l'){
                    ele=$('.infiniteSlider-content-item').first();
                }
                
                posizioneIniziale=parseInt($(".infiniteSlider-content", obj).css('left').match(/[0-9\-]+/)[0]);
                
                if(finalPos=='r'){
                    ele.insertAfter($('.infiniteSlider-content-item').last());
                    $(".infiniteSlider-content", obj).css('left',(posizioneIniziale+ele.outerWidth(true))+'px');
                }else if(finalPos=='l'){
                    ele.insertBefore($('.infiniteSlider-content-item').first());
                    $(".infiniteSlider-content", obj).css('left',(posizioneIniziale-ele.outerWidth(true))+'px');
                }
                mantieniEquilibrio();
                return true;
            }
            
            //funzione che controlla che sia equilibrato il lato destro con il sinistro
            function mantieniEquilibrio(){
                sx=parseInt($(".infiniteSlider-content", obj).css('left').match(/[0-9]+/)[0]);
                centro=$('.infiniteSlider-pane').outerWidth(true);
                dx=($(".infiniteSlider-content", obj).width()-(centro+sx));
                //se la differenze fra la destra e la sinistra sono maggiori di uno dei blocchi interni
                //devo riequilibrare i due lati
                differenza=Math.abs(Math.abs(sx)-Math.abs(dx));
                //                console.log('differenza:',differenza,'sx:',sx,'dx:',dx,'centro',centro,'larghezza completa',$(".infiniteSlider-content", obj).width(),'larghezza item',$('.infiniteSlider-content-item').outerWidth(true));
                if(differenza>$('.infiniteSlider-content-item').outerWidth(true)){
                    if(sx>dx){
                        moveElement('l','r');
                    }else{
                        moveElement('r','l');
                    }
                }
            }

            function animate(a,movimento,animazione) {
                if(typeof animazione== "undefined"){
                    animazione=true;   
                }
                mantieniEquilibrio();
                switch(a){
                    case 'next':
                        spostamento=parseInt($(".infiniteSlider-content", obj).css('left').match(/[\-0-9]+/)[0])-movimento;
                        break;
                    case 'prev':
                        spostamento=parseInt($(".infiniteSlider-content", obj).css('left').match(/[\-0-9]+/)[0])+movimento;
                        break;
                }
                $(".infiniteSlider-content", obj).animate({
                    left: spostamento+'px'
                },(animazione?s.speed:0),'linear',startAutomation);
            }
            
            //change overflow to hidden now that slider handles the scrolling
            scrollPane.css( {
                "overflow":"hidden",
                "position":'relative'
            });
             

            //animazione automatizzata
            function automate(){
                animate('next',s.movimento);
            }

            //faccio partire lo slider automatico
            function startAutomation(){
                if(s.automazione){
                    setTimeout(automate,s.timer);
                }
            }
            function restartAutomation(){
                //solo se non riparte devo farlo ripartire da solo
                if(!s.automazione){
                    s.automazione=true;
                    startAutomation();
                }
            }
            function stopAutomation(){
                if(s.automazione){
                    $(".infiniteSlider-content", obj).stop();
                    s.automazione=false;
                }
            }
            
            function clearAutoRestart(){
                if(s.timeRestart!=null){
                    clearInterval(s.timeRestart);
                    s.timeRestart=null;
                }
            }
            function setautorestart(){
                clearAutoRestart();
                s.timeRestart=setTimeout(restartAutomation,s.timeAutoRestart);
            }
            $('#'+s.prevId).click(function(){
                stopAutomation();
                setautorestart();
                animate('prev',s.movimentoRapido,false);
            });
            $('#'+s.nextId).click(function(){
                stopAutomation();
                setautorestart();
                animate('next',s.movimentoRapido,false);
            });
            //se gli elementi sono pochi non devo ciclarli
            if(equilibrateElements()){
                s.automazione=true;
                startAutomation();
            }

            //stop dell'animazione all'hover del mouse
            $(obj).hover(stopAutomation,function(){
                s.automazione=true;
                startAutomation();
            });
        });
    }
})(jQuery);
