﻿(function($) {
    $.fn.jDiaporama = function(options) {

        var defaults = {
            auto: true,
            delay: 3,
            animationSpeed: "normal",
            controls: true,
            keyboard: true,
            infos: true,
            currentimage: true,
            paused: false,
            boucles: 0,
            sens: "right",
            onrollover: true
        };

        var options = $.extend(defaults, options);

        this.each(function() {

            var diapo = $(this);
            var mouseover = false;
            var sens = options.sens;
            var pause = false;
            var width = 0;
            var height = 0;
            var current_slide = 0;

            diapo.wrap("<div class='jDiaporama'></div>");

            // mouseover detection
            diapo.parent().mouseenter(function() {
                mouseover = true;
                if (options.onrollover)
                    displayInfos($("li.active", diapo), "show");

                if (options.controls)
                    diapo.siblings(".jDiaporama_controls").fadeIn();

            }).mouseleave(function() {
                mouseover = false;
                if (options.onrollover)
                    displayInfos($("li.active", diapo), "hide");

                if (options.controls)
                    diapo.siblings(".jDiaporama_controls").hide();
            });

            function init() {
                // Adjustment with based on first li element width
                width = $("li:first-child img", diapo).width() + 380;
                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");

                $("#jDiaporama_bullet_" + (parseInt($("li", diapo).index($("li:first-child", diapo))) + 1), diapo.siblings()).addClass("active");
            }

            // this allows for the component to be paused
            if ($("li", diapo).length > 1) {
                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);

                    // Affichage de la description si renseign� et activ�
                    if (options.infos) {
                        var is_desc = ($("img", elt).attr("title") != "");
                        var is_title = ($("img", elt).attr("alt") != "");

                        if (is_desc)
                            elt.append("<p class='desc'>" + $("img", elt).attr("title") + "</p>");

                        if (is_title)
                            elt.append("<p class='title'>" + $("img", elt).attr("alt") + "</p>");

                        if (options.currentimage)
                            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", diapo.siblings()).trigger("click");
                                break;

                            case 39: // Fl�che droite
                                $(".next", diapo.siblings()).trigger("click");
                                break;
                        }
                    });


                // Controls
                if (options.controls) {
                    // Etat du diaporama
                    diapo.after("<div class='jDiaporama_status'></div>");
                    $("li", diapo).each(function() {
                        i = parseInt($("li", diapo).index($(this)) + 1);
                        $(this).attr("id", "jDiaporama_image_" + i);
                        $(".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() {
                        nextImage(options, $(this));
                        return false;
                    })

                    diapo.after("<div class='jDiaporama_controls'><a href='#' class='prev'>Prec.</a> " + ((options.auto) ? "<a href='#' class='pause'>Pause</a>" : "") + " <a href='#' class='next'>Suiv.</a></div>");

                    $(".prev", diapo.siblings()).click(function() {
                        if (!$("li.active", diapo).is(":first-child"))
                            elt = $("li.active", diapo).prev();
                        else
                            elt = $("li:last-child", diapo);

                        nextImage(options, elt);
                        sens = "left";

                        return false;
                    });

                    $(".next", diapo.siblings()).click(function() {
                        if (!$("li.active", diapo).is(":last-child"))
                            elt = $("li.active", diapo).next();
                        else
                            elt = $("li:first-child", diapo);

                        nextImage(options, elt);
                        sens = "right";

                        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;
                    });
                }

                // Affichage des infos sur l'image courante
                function displayInfos(elt, display) {
                    var is_desc = ($("img", elt).attr("title") != "");
                    var is_title = ($("img", elt).attr("alt") != "");

                    if (is_desc)
                        if (display == "show")
                        $(".desc", elt).slideDown("fast");
                    else
                        $(".desc", elt).slideUp("fast");
                    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
                function nextImage(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);
                    $("#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", diapo.siblings()).trigger("click");
                    else
                        $(".prev", diapo.siblings()).trigger("click");
                }

            }
        });

        return this;
    };
})(jQuery);

