// ------------------------------------------------------------------------------------------------
// Animation
//
// Options :
// - diapo : durée d'une diapo en millisecondes (4000 par défaut)
// - transition : durée d'une transition en secondes (1000 par défaut)
// - effect : effet de la transition (fade par défaut). Choix possibles : fade, slide, lateral
// - panel_height : hauteur du bandeau de texte qui reprend le text du ALT de l'image (0 par défaut)
// - panel_position : position du bandeau (bottom par défaut). Choix possibles : bottom et top
// - panel_opactity : opacité du bandeau (0.5 par défaut)

(function($) {

    var ka_zindex = 100;
    var ka_timeout = null;
    var ka_inner_html = [];
    var ka_pause = false;

    $.fn.kAnim = function(params) {

        if (!params)
            params = [];

        // Options - valeurs par défaut
        if (!params.diapo)
            params.diapo = 4000;
        if (!params.transition)
            params.transition = 1000;
        if (!params.effect)
            params.effect = 'fade';
        if (typeof(params.panel_height) == "undefined")
            params.panel_height = 0;
        if (!params.panel_position)
            params.panel_position = 'bottom';
        if (!params.panel_opactity)
            params.panel_opactity = 0.5;

        // On n'autorise pas les animations trop rapides
        if (parseInt(params.diapo) < 1000)
            params.diapo = 1000;
        if (parseInt(params.transition) < 200)
            params.transition = 200;

        // La durée de la diapo doit être plus longue que la transition
        if (params.diapo < params.transition)
            params.diapo = params.transition * 2;

        $conteneur = $(this);
        animInit($conteneur);

        // Quand la fenêtre n'a plus le focus, on met l'animation en pause
        $(window).blur(function() { ka_pause = true; });

        // Quand la fenêtre reprend le focus, on réinitialise l'animation
        $(window).focus(function() {

            if (ka_pause)
            {
                ka_pause = false;
                animInit($conteneur);
            }
        });

        // ----------------------------------------------------------------------------------------------------
        // Initialisation de l'animation
        function animInit(conteneur)
        {
            // Il n'y a aucun objet sur lequel appliquer l'animation
            if (conteneur.length == 0)
                return;

            // On lance l'animation sur chaque objet (généralement il n'y en aura qu'un)
            conteneur.each(function() {

                var obj = $(this);

                if (!ka_inner_html[obj])
                    ka_inner_html[obj] = obj.html();
                else
                    obj.html(ka_inner_html[obj]);

                // On met le conteneur en relatif
                obj.css('position', 'relative');
                obj.children().each(function(i) {

                    // On cache toutes les images sauf la première
                    if (i > 0)
                        $(this).css('display', 'none');
                    else
                    {
                        var txt = ($(this).find('img').attr('label'));
                        if (txt)
                        {
                            var div_txt = animPanelInit(obj, txt);
                            if (div_txt)
                                div_txt.fadeIn(200);
                        }
                    }
                });

                // Lancement de l'animation
                ka_timeout = setTimeout(function() { animExec(obj); }, params.diapo);
            });
        }

        // ----------------------------------------------------------------------------------------------------
        // Lancement de l'animation avec appel récursif retardé
        function animExec(obj_conteneur)
        {
            if (ka_pause)
                return;

            // On cherche la première image visible pour la cacher
            var vis = obj_conteneur.not('.kanim_texte').children(":visible");

            // On cherche l'image suivante
            // S'il n'y en a pas, on revient à la première image
            var nxt = vis.next("[class!='kanim_texte']");
            if (nxt.length == 0)
            {
                obj_conteneur.append(obj_conteneur.not('.kanim_texte').children().eq(0));
                nxt = vis.next("[class!='kanim_texte']");
            }

            if (nxt.length == 0)
                return;

            vis.css('position', 'absolute').css('left', '0px').css('top', '0px');
            nxt.css('position', 'absolute').css('left', '0px').css('top', '0px');

            var txt = (nxt.find('img').attr('label'));
            if (txt)
            {
                $('.kanim_texte').addClass('kanim_texte_old');
                $('.kanim_texte').css('top', '');

                animPanelInit(obj_conteneur, txt);
            }

            if (vis.find('img').length > 0)
                vis.find('img').css('display', 'inline');

            switch (params.effect)
            {
                case 'lateral' :
                    nxt.css('z-index', ka_zindex);
                    ka_zindex++;
                    $('.kanim_texte').not('.kanim_texte_old').css('z-index', ka_zindex);
                    ka_zindex++;
                    vis.css('z-index', ka_zindex);
                    ka_zindex++;

                    $('.kanim_texte_old').fadeOut(params.transition, function() { $('.kanim_texte_old').remove(); });

                    nxt.show();
                    $('.kanim_texte').not('.kanim_texte_old').css('display', 'block');
                    vis.animate({ width:'0px' }, params.transition, function() { vis.hide(); vis.css('width', ''); });
                    break;

                case 'slide' :
                    vis.css('position', 'relative').css('display', 'block');
                    nxt.css('position', 'relative').css('display', 'block');
                    $('.kanim_texte_old').css('position', 'absolute');

                    vis.slideUp(params.transition);
                    $('.kanim_texte').not('.kanim_texte_old').slideDown(params.transition);
                    $('.kanim_texte_old').slideUp(params.transition, function() { $('.kanim_texte_old').remove(); });
                    break;

                default :
                    vis.fadeOut(params.transition);
                    $('.kanim_texte_old').fadeOut(params.transition, function() { $('.kanim_texte_old').remove(); });

                    nxt.fadeIn(params.transition);
                    $('.kanim_texte').not('.kanim_texte_old').fadeIn(params.transition);
                    break;
            }

            // Appel récursif retardé
            clearTimeout(ka_timeout);
            ka_timeout = setTimeout(function() { animExec(obj_conteneur); }, params.diapo);
        }

        // ----------------------------------------------------------------------------------------------------
        // Initialisation du bandeau de texte
        function animPanelInit(obj, txt)
        {
            if (!params.panel_height)
                return null;

            var div_txt = $('<div>');
            div_txt.html(txt);
            div_txt
                .css('width', obj.outerWidth() + 'px')
                .css('height', params.panel_height + 'px')
                .css('position', 'absolute')
                .css('left', '0px')
                .css(params.panel_position, '0px')
                .css('display', 'none')
                .css('opacity', params.panel_opactity)
                .css('overflow', 'hidden')
                .addClass('kanim_texte');

            obj.append(div_txt);

            return div_txt;
        }
    };

})(jQuery);

