jQuery(function($) {

    /**
    // Plugin carousel
    // Auteur: Brice CARBONNIERES
    // Version: 1.2
    // Dernière modif: 20/10/2011
    **/

    $.fn.carouselSlide = function(params) {

        // Fusionner les paramètres par défaut et ceux de l'utilisateur
        params = $.extend({
            manual: true,
            auto: false,
            speed: 500,
            frequency: 3000,
            item_deplace: 1,
            vertical: false,
            pagination: false,
            title: false,
            startItem: 0,
            apercu: false
        }, params);
        
        // Traverser tous les noeuds.
        this.each(function() {
        
            var $t            = $(this);
            var $item         = $t.find('.item');
            var $slider       = $item.closest('.slider');
            var $item_length  = $item.length;
            var $anim_active  = false;
            var $pageCurrent   = 1;
            var $itemDeplace; // Variable locale déclarée
            var $o;

            // on fixe la taille du slider
            if(params.vertical === true) {
                var $direction = 'top';
                var $item_size   = $item.outerHeight(true);
                $slider.css("height",($item_length + params.item_deplace) * $item_size+"px");
            }
            else {
                var $direction = 'left';
                var $item_size   = $item.outerWidth(true);
                $slider.css("width",($item_length + params.item_deplace + 1) * $item_size+"px");
            }
            
            
            if ( $item_length > 1 )
            {
                // Autorise le déplacement manuel
                if(params.manual === true) {
                    // Ajoute et gère le bouton précédent
                    jQuery('<a>', {
                        'class': 'prev',
                        href: '#',
                        title: 'Précédent',
                        html: '<span>Précédent</span>',
                        click: function() {
                            carouselPrev(false);
                            return false;
                        }
                    }).prependTo($t);
                    
                    // Ajoute et gère le bouton suivant
                    jQuery('<a>', {
                        'class': 'next',
                        href: '#',
                        title: 'Suivant',
                        html: '<span>Suivant</span>',
                        click: function() {
                            carouselNext(false);
                            return false;
                        }
                    }).appendTo($t);
                }
                
                // Autorise le déplacement automatique
                if(params.auto === true) {
                
                    var interval;
                    
                    function autoSlide() {
                        interval = setInterval(function() {
                            carouselNext(false);
                        }, params.frequency);
                    }
                    autoSlide();
                    
                    $t.mouseenter(function(){ 
                        clearInterval(interval);
                    });
                    $t.mouseleave(function(){ 
                        autoSlide(); 
                    });
                }
                
                // Autorise la pagination
                if(params.pagination === true) {
                
                    // Ajoute un p.pagination
                    jQuery('<p>', {
                        'class': 'pagination'
                    }).appendTo($t);
                    
                    for( i = 1 ; i <= $item_length ; i++ )
                    {
                        if ( i == 1 ) {
                            $class = 'page current';
                        } else {
                            $class = 'page';
                        }
                        jQuery('<a>', {
                            href: '#',
                            'class': $class,
                            title: 'Aller à la page '+i,
                            text: i,
                            rel: i
                        }).appendTo($t.find('p.pagination'));
                    }
                    
                    $(this).delegate('a.page','click', function() {
                        
                        goPage = $(this).attr('rel');
                        
                        if ( goPage > $pageCurrent ) {
                            carouselNext(goPage);
                        } else if ( goPage < $pageCurrent ) {
                            carouselPrev(goPage);
                        }
                        
                        this.blur();
                        return false;
                    });
                }
            }

            // Gestion du startItem
            if(params.startItem > 0) {
                $slider.find(".item:lt("+params.startItem+")").clone(true).insertAfter($slider.find(".item:last"));
                $slider.find(".item:lt("+params.startItem+")").remove();
            }
            
            // Affichage du titre de l'item en position params.title
            if(params.title !== false) {
                if (params.title >= $item_length) {
                    params.title = $item_length - 1;
                }
                addTitle();
            }
            

            // Item Précédent
            function carouselPrev(numPage) {
                if (!$anim_active) {
                
                    $anim_active = true;
                    if (numPage !== false) {
                        $itemDeplace = $pageCurrent - numPage;
                        $pageCurrent = numPage;
                    } else {
                        $itemDeplace = params.item_deplace;
                        $pageCurrent = $pageCurrent - $itemDeplace;
                        if ($pageCurrent < 1) { $pageCurrent = parseInt($pageCurrent) + $item_length; }
                    }
                    
                    if ( params.pagination === true ) {
                        $t.find('.pagination').fadeOut();
                        $t.find('.pagination a.current').removeClass('current').parent().find('a:eq('+($pageCurrent-1)+')').addClass('current');
                    }
                    
                    if(params.title !== false) {
                            $t.find('.globalCaption').fadeOut();
                    }
                    
                    $slider.find(".item:gt("+($item_length-$itemDeplace-1)+")").clone(true).insertBefore($slider.find(".item:first"));
                    $o = {};
                    $o[$direction] = "+="+($item_size*$itemDeplace)+"px";
                    $slider.css($direction, "-"+($item_size*$itemDeplace)+"px");
                    $slider.animate($o, params.speed, "swing", function() {
                        
                        $slider.find(".item:gt("+($item_length-1)+")").remove();
                                                
                        if(params.title !== false) {
                            addTitle();
                        }
                        if ( params.pagination === true ) {
                            $t.find('.pagination').fadeIn();
                        }
                        $anim_active = false;
                        
                    });
                    
                }
            }
            
            // Item Suivant
            function carouselNext(numPage) {
                if (!$anim_active) {
                
                    $anim_active = true;
                    if (numPage !== false) {
                        $itemDeplace = numPage - $pageCurrent;
                        $pageCurrent = numPage;
                    } else {
                        $itemDeplace = params.item_deplace;
                        $pageCurrent = parseInt($pageCurrent) + $itemDeplace;
                        if ($pageCurrent > $item_length) { $pageCurrent = $pageCurrent - $item_length; }
                    }
                    
                    if ( params.pagination === true ) {
                        $t.find('.pagination').fadeOut();
                        $t.find('.pagination a.current').removeClass('current').parent().find('a:eq('+($pageCurrent-1)+')').addClass('current');
                    }
                    
                    if(params.title !== false) {
                            $t.find('.globalCaption').fadeOut();
                    }
                    
                    $slider.find(".item:lt("+$itemDeplace+")").clone(true).insertAfter($slider.find(".item:last"));
                    $o = {};
                    $o[$direction] = "-="+($item_size*$itemDeplace)+"px";
                    $slider.animate($o, params.speed, "swing", function() {
                        $slider
                            .find(".item:lt("+$itemDeplace+")").remove().end()
                            .css($direction, "0px");
                        
                        if(params.title !== false) {
                            addTitle();
                        }
                        if ( params.pagination === true ) {
                            $t.find('.pagination').fadeIn();
                        }
                        $anim_active = false;
                    });
                }
            }
            
            // Ajout titre
            function addTitle() {
            
                current = $slider.find(".item:eq("+params.title+")");

                $slider.find('.activeTitle').removeClass('activeTitle');

                titleCurrent = current.addClass('activeTitle').find('img').attr('title');

                if (titleCurrent != '') {
                    $t.find('.globalCaption').text(titleCurrent).fadeIn();
                }

                if(params.apercu == true) {
                    $t.find('.apercuCarousel a').attr('href',current.find('a').attr('href')).find('img').attr('src',current.find('a span').text()).attr('alt',current.find('a').attr('title'));
                }
            }
            
        });
        
        // Permettre le chaînage par jQuery
        return this;
        
    };

}); /* jQuery end */
