﻿/**  pour que cela fonctionne, il faut que les div soient au moins en position relative**/
$(document).ready(function () {
    $.widget('ui._Turnover', {
        options: {
            delai: 3000,            //Délai avant la mise en route
            classe: 'hover',        //Classe css à appliquer
            survolActif: false,     //Le survol est actif
            selecteur: 'div'        //Selecteur des enfants
        },
        //Plugin de base du turnover dont héritent les différents turnover.
        _init: function () {
            //Fonction d'initialisation
            this.Initialiser();
            //Démarrage du turnover
            this.Tourner();
            //Démarrage des actions au survol
            this.ActiverSurvol();
            return;
        },
        //Index de l'élément de liste actuellement actif.
        currentIndex: 0,
        //Fonction d'initialisation
        Initialiser: function () {
            //A implémenter
        },
        //Place la classe css sur l'élément suivant.
        AfficherSuivant: function () {
            //Ajout de style à l'élément courant.
            this.SortieNoeudActif();
            //Activation du suivant
            this.Activer();
            //Retrait de style à l'élément courant.
            this.ArriveeNoeudActif();
            return;
        },
        //Traitement du noeud actif.
        ArriveeNoeudActif: function () {
            //A implémenter
        },
        //Retire le style à l'élément passé en paramètre.
        //Si aucun paramètre, c'est sur l'élément actif.
        SortieNoeudActif: function () {
            //A implémenter
        },
        //Retourne l'élement actif.
        Actif: function () {
            //console.log(t.currentIndex, t, t.element, t.element.parent().children()[t.currentIndex]);
            return this.element.children()[this.currentIndex];
        },
        //Active l'élément passé en paramètre.
        //Si aucun param, c'est le suivant de l'actif qui est activé.
        Activer: function (i) {
            if (i != null) {
                this.currentIndex = i;
            } else {
                this.currentIndex += 1;
                if (this.currentIndex == this.element.children().length) {
                    //On était sur le dernier élément, retour au premier.
                    this.currentIndex = 0;
                }
            }
        },
        //La rotation est-elle en cours.
        EnCours: true,
        //Effectue la rotation.
        Tourner: function () {
            var t = this;
            if (t.options.delai > 0) {
                setTimeout(function () {
                    if (t.EnCours) {
                        t.AfficherSuivant();
                    }
                    t.Tourner();
                }, t.options.delai);
            }
        },
        //Active la fonctionnalité de survol.
        ActiverSurvol: function () {
            var t = this;
            if (t.options.survolActif) {
                $(t.element.children()).each(function (i) {
                    $(t.element.children()[i]).hover(function (e) {
                        t.DebutSurvol(e, i);
                    }, function (e) {
                        t.FinSurvol(e, i);
                    });
                });
            }
        },
        //Début du survol.
        DebutSurvol: function (evt, i) {
            var t = this;
            t.EnCours = false;
            //Ajout de style à l'élément courant.
            t.SortieNoeudActif();
            //Changement de l'élément courant.
            t.Activer(i);
            //Retrait de style à l'élément courant.
            t.ArriveeNoeudActif();
        },
        //Début du survol.
        FinSurvol: function (evt, i) {
            var t = this;
            t.EnCours = true;
        }
    });

    $.widget('ui.TurnoverActualite', $.ui._Turnover, {
        options: {
            delai: 3000,            //Délai avant la mise en route
            animateDelai: 1000,            //Délai avant la mise en route
            classe: 'hover',        //Classe css à appliquer
            survolActif: false      //Le survol est actif
        },
        //Index de l'élément de liste actuellement actif.
        currentIndex: 0,
        //Fonction d'initialisation
        Initialiser: function () {
            //Initialisation des positino des 3 premiers éléments.
            var t = this;
            t.element.children().css('position', 'absolute');
            var premier = $(t.element.children()[0]);
            var second = $(t.element.children()[1]);
            var troisieme = $(t.element.children()[2]);
            premier.css('top', 0);
            second.css('position', 'absolute').css('top', premier.height());
            troisieme.css('position', 'absolute').css('top', second.height());
        },
        //Traitement du noeud actif.
        ArriveeNoeudActif: function () {
            var t = this;
            var elementDevenantInactif = $(t.element.children()[0]);
            var elementDevenantActif = $(t.element.children()[1]);
            var prochainElementActif = $(t.element.children()[2]);
            elementDevenantActif.css('position', 'absolute').css('top', elementDevenantInactif.height());
            var top = -(elementDevenantInactif.height() + 0) + 'px';
            var an = t.options.animateDelai;
            elementDevenantInactif.animate({ top: top }, t.options.animateDelai, function () {
                //l'enlever.
                elementDevenantInactif.appendTo(t.element);
            });
            elementDevenantActif.animate({ top: '0px' }, an);
            prochainElementActif.css('position', 'absolute').css('top', elementDevenantActif.height());
        },
        //Traitement du noeud qui devient inactif.
        SortieNoeudActif: function () {
        }
    });

    $.widget('ui.TurnoverSurvol', $.ui._Turnover, {
        options: {
            delai: 3000,            //Délai avant la mise en route
            classe: 'hover',        //Classe css à appliquer
            survolActif: true      //Le survol est actif
        },
        //Index de l'élément de liste actuellement actif.
        currentIndex: 0,
        //Traitement du noeud actif.
        ArriveeNoeudActif: function () {
            var t = this;
            elt = $(this.Actif());
            elt.addClass(t.options.classe);
        },
        //Traitement du noeud qui devient inactif.
        SortieNoeudActif: function () {
            var t = this;
            elt = $(this.Actif());
            elt.removeClass(t.options.classe);
        }
    });

    $.widget('ui.TurnoverPhoto', $.ui._Turnover, {
        options: {
            delai: 0,            //Délai avant la mise en route
            classe: 'hover',        //Classe css à appliquer
            survolActif: true,      //Le survol est actif
            btnPrecedent: null,     //Le bouton precedent
            btnSuivant: null        //Le bouton suivant
        },
        //Index de l'élément de liste actuellement actif.
        currentIndex: 0,
        enCours: true,
        largeur: 150,
        marge: 0,
        gauche: 0,
        droite: 0,
        //Fonction d'initialisation
        Initialiser: function () {
            var t = this;
            this.element.children().css('position', 'absolute');
            this.element.children().last().clone().prependTo(this.element);

            t.largeur = 150;
            t.marge = parseInt(t.element.children().css('margin-right'));
            t.gauche = -t.largeur;
            t.droite = t.largeur;

            this.element.children().each(function () {
                $(this).css('left', t.gauche + 'px');
                t.gauche += t.largeur;
            });
            this.element.children().last().remove();

            this.options.btnSuivant.click(function () {
                t.ArriveeNoeudActif();
            });
            this.options.btnPrecedent.click(function () {
                t.SortieNoeudActif();
            });
        },
        //Traitement du noeud actif.
        ArriveeNoeudActif: function () {
            var t = this;
            if (t.enCours) {
                t.enCours = false;
                var elt = t.element.children().first().clone();
                t.DeplacerElement(elt, -t.largeur);
                elt.appendTo(t.element)
                t.element.children().first().remove();
                elt.css('left', t.gauche + (-t.largeur * 2) + 'px');
            }
        },
        //Retire le style à l'élément passé en paramètre.
        //Si aucun paramètre, c'est sur l'élément actif.
        SortieNoeudActif: function () {
            var t = this;
            if (t.enCours) {
                t.enCours = false;
                var elt = t.element.children().last().clone();
                elt.css('left', -t.largeur + 'px');
                t.DeplacerElement(t.element.children().last().clone(), t.largeur);
                elt.prependTo(t.element)
                t.element.children().last().remove();
            }
        },
        //Déplace l'élément elt du déplacement.
        DeplacerElement: function (elt, deplacement) {
            var t = this;
            t.element.children().each(function () {
                var left = parseInt($(this).css('left')) + deplacement;
                $(this).stop(true, true).animate({ left: left + 'px' }, 'fast', function () {
                    t.enCours = true;
                });
            });
        }
    });


});
