(function($){
    $.fn.jDiaporama = function(options) {

        var defaults = {
            auto: true,
            delay: 3,
            animationSpeed: "normal",
            controls: true,
            status_controls: true,
            keyboard: true,
            infos: true,
            currentimage: true,
            paused: false,
            boucles: 0,
            sens: "right",
            onrollover: true,
            random: 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>");

                // Detection et actions des mouseover
                diapo.parent().mouseenter(function(){
                    $(".count").fadeIn();
                    mouseover = true;
                    if(options.onrollover) {
                        displayInfos($("li.active", diapo), "show");
                    }

                    if(options.controls) {
                        diapo.siblings(".jDiaporama_controls").fadeIn();
                    }

                }).mouseleave(function(){
                    $(".count").hide();
                    mouseover = false;
                    if(options.onrollover) {
                        displayInfos($("li.active", diapo), "hide");
                    }

                    if(options.controls) {
                        diapo.siblings(".jDiaporama_controls").hide();
                    }
                    
                });

                function init()
                {
                    // Ajustement de la taille du container
                    width = $("li:first-child img", diapo).width();
                    height = $("li:first-child img", diapo).height();

                    diapo.width(width);
                    diapo.height(height);
                    diapo.parent().width(width);
                    diapo.parent().height(height);

                    if(options.controls)
                        diapo.siblings(".jDiaporama_status").show();

                    if(options.auto && options.paused)
                        $(".pause", diapo.siblings()).trigger("click");

                    if(!options.onrollover)
                        displayInfos($("li", diapo), "show");

                    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").fadeIn(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);

                    // Affichage de la description si renseignÈ et activÈ
                    if(options.infos)
                    {
                        var is_desc = ($("img", elt).attr("alt") != "");
                        var is_title = ($("img", elt).attr("title") != "");

                        if(is_desc)
                            elt.append("<div class='desc' style='text-align:justify;'>"+$("img", elt).attr("alt")+"</div>");

                        /*if(is_title)
                            elt.append("<p class='title'>"+$("img", elt).attr("title")+"</p>");*/
                    }
                    if(options.currentimage && options.controls)
                        elt.append("<p class='count'>"+parseInt($("li", diapo).index(elt)+1)+"/"+diapo.children().length+"</p>");
                })

                // 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='jDiaporama_status'></div>");
                        $("li", diapo).each(function(){
                            i = parseInt($("li", diapo).index($(this))+1);
                            $(".jDiaporama_status", diapo.parent()).append("<a id='jDiaporama_bullet_"+i+"' href='#'>Image "+i+"</a>");
                        })

                        $(".jDiaporama_status", diapo.parent()).css("margin-left", -($(".jDiaporama_status", diapo.parent()).width()/2));

                        $(".jDiaporama_status 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='jDiaporama_controls'><a href='#' class='prev'>Prec.</a> <a href='#' class='play'>Play</a><a href='#' class='pause'>Pause</a><a href='#' class='next'>Suiv.</a></div>");

                    $(".prev", diapo.siblings()).click(function(){
                        prev();
                        return false;
                    });

                    $(".next", diapo.siblings()).click(function(){
                        next();
                        return false;
                    });

                    $(".pause", diapo.siblings()).click(function(){

                        clearInterval(inter);
                        pause = true;
                        /* 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;
                    });

                    $(".play", diapo.siblings()).click(function(){
                        inter = setInterval(function(){
                            displayDiaporama(options)
                        }, (options.delay*1000));
                        pause = false;
                        return false;
                    });
                }

                function next()
                {
                    if(options.random)
                        randomImage();
                    else
                    {
                        if(!$("li.active", diapo).is(":last-child"))
                            elt =  $("li.active", diapo).next();
                        else
                            elt =  $("li:first-child", diapo);

                        $(this).nextImage(options, elt);
                        sens = "right";
                    }
                }

                function prev()
                {
                    if(options.random)
                        randomImage();
                    else
                    {
                        if(!$("li.active", diapo).is(":first-child"))
                            elt =  $("li.active", diapo).prev();
                        else
                            elt =  $("li:last-child", diapo);

                        $(this).nextImage(options, elt);
                        sens = "left";
                    }
                }

                function randomImage()
                {
                    rand = Math.floor(Math.random() * nb_slides)+1;
                    id = $("li.active", diapo).attr("id").split("_")[2];

                    while(rand == id)
                    {
                        rand = Math.floor(Math.random() * nb_slides)+1;
                    }

                    $(this).nextImage(options, $("li#jDiaporama_image_"+rand, diapo));
                }

                // Affichage des infos sur l'image courante
                function displayInfos(elt, display)
                {
                    var is_desc = ($("img", elt).attr("alt") != "");
                    var is_title = ($("img", elt).attr("title") != "");

                    if(is_desc)
                        if(display == "show")
                            //$(".desc", elt).slideDown("fast");
                            $(".desc", elt).css("display", "block")
                        else
                            //$(".desc", elt).slideUp("fast");
                            $(".desc", elt).css("display", "none")
                    /*if(is_title)
                        if(display == "show")
                            $(".title", elt).slideDown("fast");
                        else
                            $(".title", elt).slideUp("fast");*/
                /*if(options.currentimage)
                        if(display == "show")
                            $(".count", elt).slideDown("fast");
                        else
                            $(".count", elt).slideUp("fast");*/
                }

                // Affiche l'ÈlÈment suivant
                $.fn.nextImage = function(options, elt)
                {
                    clearInterval(inter);

                    $("li.active", diapo).fadeOut(options.animationSpeed).removeClass("active");
                    $(".jDiaporama_status a", diapo.parent()).removeClass("active");

                    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(options.infos && mouseover && options.onrollover)
                        displayInfos($("li.active", diapo), "show");
                    else if(!mouseover && options.onrollover)
                        displayInfos($("li.active", diapo), "hide");

                    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);
