(function($){
    $.fn.jDiaporama = function(options) {
        var defaults = {
                auto: false,
                delay: 3,
                animationSpeed: "normal",
                controls: true,
                status_controls: true,
                keyboard: true,
                infos: false,
                currentimage: true,
                paused: true,
                boucles: 0,
                sens: "right",
                onrollover: false
                };
        var options = $.extend(defaults, options);
        this.each(function(){
        // Si le diaporama comporte plus qu'une image
        if($("li", diapo).length > 1){
                var diapo = $(this);
                var mouseover = false;
                var sens = options.sens;
                var pause = false;
                var width = 0;
                var height = 0;
                var current_slide = 0;
                var nb_slides = $("li", diapo).length;
                diapo.wrap("<div class='jDiaporama'></div>");
            
                diapo.parent().mouseenter(function(){
                    mouseover = true;
                    if(options.onrollover)
                        displayInfos($("li.active", diapo), "show");
                    
                    if(options.controls)
                        diapo.siblings(".navigation").fadeIn();
                        
                }).mouseleave(function(){
                    mouseover = false;
                    if(options.onrollover)
                        displayInfos($("li.active", diapo), "hide");
                    
                    if(options.controls)
                         diapo.siblings(".navigation").hide();
                });
                
                function init()
                {
                    diapo.parent().width(451);
                    diapo.parent().height(287);
                    
                    if(options.controls)
                        diapo.siblings(".footer").show();
                        
                    if(options.auto && options.paused)
                        $(".pause", diapo.siblings()).trigger("click");

                    if(options.controls && options.status_controls)
                        $("#jDiaporama_bullet_"+(parseInt($("li", diapo).index($("li:first-child", diapo)))+1), diapo.siblings()).addClass("active");
                }
            
                var inter = "";
                if(options.auto && !options.paused){
                    inter = setInterval(function(){displayDiaporama(options)}, (options.delay*1000));
                }
                $("li", diapo).hide();
                $("li:first-child", diapo).addClass("active").show(options.animationSpeed, init);
                // Pour chaque élément
                $("li", diapo).each(function(){
                    elt = $(this);
                    i = parseInt($("li", diapo).index($(this))+1);
                    $(this).attr("id", "jDiaporama_image_"+i);
                    
                    /*******/
                    $("li#jDiaporama_image_"+i+' img', diapo).width(451);
                    $("li#jDiaporama_image_"+i+' img', diapo).height(287);
                    /********/
                })
                // Navigation au clavier
                if(options.keyboard)
                    $(document).keydown(function(event) {
                        switch(event.keyCode){
                            case 37 : // Flèche gauche
                                prev();
                            break;
                            
                            case 39 : // Flèche droite
                                next();
                            break;
                        }
                    });
                    
                // Controls
                if(options.controls)
                {
                    if(options.status_controls)
                    {
                        // Etat du diaporama
                        diapo.after("<div class='footer'><ul class='puce_diapo'></ul></div>");
                        $("li", diapo).each(function(){
                            i = parseInt($("li", diapo).index($(this))+1);
                            $(".puce_diapo", diapo.parent()).append("<li><a id='jDiaporama_bullet_"+i+"' href='#'>&nbsp;&nbsp;</a></li>");
                        })

                        $(".footer a", diapo.parent()).click(function(){
                            if($("li.active", diapo).attr("id").split("_")[2] != $(this).attr("id").split("_")[2]){
                                nextImage(options, $(this));
                             }
                            return false;
                        })
                    }
                    
                    diapo.after("<div class='navigation'><a href='#' class='nav_prev'>&nbsp;&nbsp;</a> " + ((options.auto)?"<a href='#' class='pause'>Pause</a>":"") + " <a href='#' class='nav_next'>&nbsp;&nbsp;</a></div>");
                    
                    $(".nav_prev", diapo.siblings()).click(function(){
                        prev();
                        return false;
                    });
                    
                    $(".nav_next", diapo.siblings()).click(function(){
                        next();
                        return false;
                    });
                                                    
                    $(".pause", diapo.siblings()).click(function(){
                        if($(this).hasClass("pause"))
                        {
                            $(this).removeClass("pause").addClass("play");
                            clearInterval(inter);
                            pause = true;
                        }
                        else
                        {
                            $(this).removeClass("play").addClass("pause");
                            inter = setInterval(function(){displayDiaporama(options)}, (options.delay*1000));
                            pause = false;
                        }
                        
                        return false;
                    });
                }
                
                function next()
                {
                    if(!$("li.active", diapo).is(":last-child")){
                        elt =  $("li.active", diapo).next();
                    }else{
                        elt =  $("li:first-child", diapo);
                    }
                    nextImage(options, elt);
                    sens = "right";
                }
                
                function prev()
                {
                    if(!$("li.active", diapo).is(":first-child"))
                        elt =  $("li.active", diapo).prev();
                    else
                        elt =  $("li:last-child", diapo);
                        
                    nextImage(options, elt);
                    sens = "left";
                }
                // Affiche l'élément suivant
                function nextImage(options, elt)
                {
                    clearInterval(inter);
                    
                    $(".footer a", diapo.parent()).removeClass("active");
                    $("li.active", diapo).removeClass("active").hide();
                    
                    id = elt.attr("id").split("_")[2];

                    $("li#jDiaporama_image_"+id, diapo).addClass("active").fadeIn(options.animationSpeed);
                    
                    if(options.controls && options.status_controls)
                        $("#jDiaporama_bullet_"+id, diapo.siblings()).addClass("active");

                    if(!pause && options.auto)
                    {
                        if(options.boucles == 0 || (options.boucles > 0 && (diapo.data("current_slide")/diapo.children().length) < options.boucles ))
                            inter = setInterval(function(){displayDiaporama(options)}, (options.delay*1000));
                        else
                            $(".pause", diapo.siblings()).remove();
                    }
                }
                
                function displayDiaporama(options)
                {
                    current_slide++;
                    diapo.data("current_slide", current_slide);
                    
                    if(sens == "right")
                        next();
                    else
                        prev();
                }
                
            }
        });
        
        return this;
    };
})(jQuery);

