(function($) {
    $.fn.jDiaporama = function(settings) {
        settings = jQuery.extend({
            start               : 1,
            delai               : 4000,
            auto                : true,
            speed               : 'slow',
            controls            : false,
            div_control         : false,
            div_slider          : 'div_slider',
            transition          : 'move',
            direction           : 'left',
            controls_position   : 'bottom',
            controls_height     : 40,
            control_btn_space   : 10,
            control_btn         : 'control_diaporama_bouton',
            control_btn_on      : 'control_diaporama_bouton_on'
        },settings);

        var start = settings.start;
        var delai = settings.delai;
        var nbDiapos = this.children('div').length;
        var diapos = new Array();
        var boutons = new Array();
        var hauteur_max = 0;
        var pos = $(this).donne_position();
        var is_timeout = false;
        var conteneur = this;
        var width_conteneur = $(this).width();
        var last_diapo = '';

        $(this).hide();

        //si le settings.start est trop haut, on le repositionne
        if (start > nbDiapos) start = 1;
        var diapo_en_cours = start;

        this.children('div').each(function (i) {
            //on voit quelle div est la plus haute pour définir la hauteur max du diaporama
            if ($(this).height() > hauteur_max) hauteur_max = $(this).height();
            var controle_start = i + 1;
            if (i+1 == nbDiapos){
                last_diapo = $(this);
            }
            diapos[controle_start] = $(this);
            switch (settings.transition) {
            case 'move' :
                var new_margin = i * width_conteneur;
                $(this).css({width : width_conteneur + 'px', position : 'absolute', marginLeft: new_margin + 'px'});
                break;
            case 'fade' :
                $(this).hide();
                break;
            }
        });

        $(this).fadeIn('slow');
        $(this).wrapInner('<div id="' + settings.div_slider + '"></div>');
        $('#' + settings.div_slider).css({position : 'relative', background : '#ff0000'});

        function diapo_suivante() {
            if (nbDiapos <= 1) return false;
            var diapo_a_montrer = diapo_en_cours + 1
            if (diapo_a_montrer > nbDiapos) diapo_a_montrer = 1;
            active_diapo(diapo_a_montrer, true);
            timeout = setTimeout(function() { diapo_suivante(); }, delai);
        }

        function active_diapo(id_diapo, anim) {
            var cur_diapo = diapos[diapo_en_cours];
            var diapo = diapos[id_diapo];

            switch (settings.transition) {
            case 'move' :
                var pos_diap = diapo.donne_position();
                var pos_conteneur = $('#' + settings.div_slider).donne_position();
                var new_position = pos_conteneur.x - pos_diap.x;
                $('#' + settings.div_slider).animate({'left': new_position + 'px'}, 'slow', function(){
                    if (anim) {
                        var actuel_left = intval(cur_diapo.css('left'));
                        var new_left = ((nbDiapos) * width_conteneur) + actuel_left;
                        cur_diapo.css({'left' : new_left + 'px'});
                        last_diapo = cur_diapo;
                    }
                });
                break;
            case 'fade' :
                cur_diapo.hide();
                diapo.fadeIn(settings.speed);
                break;
            }

            if(settings.controls && settings.control_btn_on) {
                var cur_bouton = boutons[diapo_en_cours];
                var bouton = boutons[id_diapo];
                cur_bouton.removeClass(settings.control_btn_on);
                cur_bouton.addClass(settings.control_btn);
                bouton.removeClass(settings.control_btn);
                bouton.addClass(settings.control_btn_on);
            }
            diapo_en_cours = id_diapo;
        }

        function init_controls() {
            var div_conteneur = create_controls_div();
        }

        function create_controls_div() {
            var html = '';
            for (i = 1; i <= nbDiapos; i++) {
                html = html + '<div>' + i + '</div>';
            }

            if (settings.div_control) {
                $('#' + settings.div_control).html(html);
                var identifiant_control = '#' + settings.div_control;
            } else {
                var html = '<div class="control_diaporama"></div>';
                var identifiant_control = '.control_diaporama';
            }
            $(identifiant_control).children('div').each(function (i) {
                if (i) {
                    if (settings.control_btn_space) {
                        $(this).before('<div style="float:left; height:1px; width:' + settings.control_btn_space + 'px;"></div>');
                    }
                }
                $(this).css({ float: 'left'});
                $(this).addClass(settings.control_btn);
                $(this).click(function(){
                    if (diapo_en_cours == (i + 1)) return false;
                    if (is_timeout) {
                        clearTimeout(timeout);
                        is_timeout = false;
                    }
                    active_diapo(i + 1);
                });
                boutons[i+1] = $(this);
            });
        }

        if (settings.auto) {
            timeout = setTimeout(function() { diapo_suivante(); }, delai);
            is_timeout = true;
        }
        if (settings.controls)
            init_controls();
        active_diapo(diapo_en_cours, false);

    };
    jQuery.fn.extend({
        donne_position : function() {
            obj = $(this).get(0);
            var curleft = obj.offsetLeft || 0;
            var curtop = obj.offsetTop || 0;
            while (obj = obj.offsetParent) {
                     curleft += obj.offsetLeft
                     curtop += obj.offsetTop
            }
            return {x:curleft,y:curtop};
        }
    });
})(jQuery);

function intval (mixed_var, base) {
    var tmp;

    var type = typeof( mixed_var );

    if (type === 'boolean') {
        return (mixed_var) ? 1 : 0;
    } else if (type === 'string') {
        tmp = parseInt(mixed_var, base || 10);
        return (isNaN(tmp) || !isFinite(tmp)) ? 0 : tmp;
    } else if (type === 'number' && isFinite(mixed_var) ) {
        return Math.floor(mixed_var);
    } else {
        return 0;
    }
}

