$.fn.kSlideBox = function(params) {

    var kobj = new Object();
    
    kobj['ksb_max_left'] = 0;
    kobj['ksb_marge'] = 0;
    kobj['ksb_pause'] = false;
    kobj['ksb_pause_hover'] = false;
    kobj['ksb_dialog_element'] = false;
    kobj['ksb_to'] = null;
    kobj['ksb_effet'] = 'scale';
    kobj['ksb_url_lightbox'] = '';
    kobj['ksb_html_origine'] = '';
    kobj['ksb_prem_ref'] = '';
    kobj['ksb_avec_lightbox'] = true;
    kobj['ksb_nom_element'] = 'ksb_element';
    kobj['ksb_id_dialog'] = '#dialog-modal';
    kobj['ksb_delai'] = 1000;
    kobj['ksb_duree'] = 1000;
    kobj['ksb_oninit'] = null;
    kobj['ksb_conteneur'] = $(this);

    if (params['duree'])
        kobj['ksb_duree'] = params['duree'];

    if (params['nom_element'])
        kobj['ksb_nom_element'] = params['nom_element'];

    if (params['id_dialog'])
        kobj['ksb_id_dialog'] = params['id_dialog'];

    if (params['lightbox'] === false)
        kobj['ksb_avec_lightbox'] = false;

    if (params['delai'])
        kobj['ksb_delai'] = params['delai'];

    if (params['effet'])
        kobj['ksb_effet'] = params['effet'];

    if (params['url_lightbox'])
        kobj['ksb_url_lightbox'] = params['url_lightbox'];

    if (params['oninit'])
        kobj['ksb_oninit'] = params['oninit'];
        
    $(document).ready(function() {
    
        var w = 0;
        var w_prec = 0;
        var left = 0;
        var idx = 0;
        
        var div_tmp = $('<div>');
        div_tmp.css('position', 'absolute');
        div_tmp.css('left', '-3000px');
        div_tmp.css('top', '-3000px');
        $('body').append(div_tmp);
        
        $('.' + kobj['ksb_nom_element']).each(function() {

            idx++;
            var img_src_tmp = $(this).find('img').attr('src');
            div_tmp.html("<img id='ksb_img_tmp' src='" + img_src_tmp + "'>");
            
            w = $('#ksb_img_tmp').outerWidth();
            if (w < 100)
            {
                if (w_prec > 0)
                    w = w_prec;
                else
                    w = 160;
            }
            w_prec = w;
            
            $(this).css('position', 'absolute');
            $(this).css('left', left + 'px');
            $(this).css('top', '0px');

            left += w + ksbMargeElement(kobj);
        });
        
        div_tmp.html('');
        div_tmp = null;
        
        $('.' + kobj['ksb_nom_element']).find('img').css('width', '');
        $('.' + kobj['ksb_nom_element']).find('img').css('height', '');
        
        kobj['ksb_max_left'] = left;
        kobj['ksb_html_origine'] = kobj['ksb_conteneur'].html();
        
        clearTimeout(kobj['ksb_to']);
        kobj['ksb_to'] = setTimeout(function() { ksbDecaleListeElements(kobj, true, true) }, 2000); 
        
        ksbAffecteEvtElement(kobj, '.' + kobj['ksb_nom_element']);
    });
    
    $('#ksb_bouton').click(function() {
    
        if (kobj['ksb_pause'])
        {
            kobj['ksb_pause'] = false;
            $(this).removeClass('pause');

            clearTimeout(kobj['ksb_to']);
            kobj['ksb_to'] = setTimeout(function() { ksbDecaleListeElements(kobj, true, false) }, 500);             
        }
        else
        {
            kobj['ksb_pause'] = true;
            $(this).addClass('pause');
        }
    });
};

// ---------------------------------------------------------------------------

function ksbClicElement(kobj, ref)
{
    kobj['ksb_dialog_element'] = true;
    
    $(kobj['ksb_id_dialog']).html('');
    $(kobj['ksb_id_dialog']).dialog({

        width: 700,    
        height: 550,
        modal: true,
        show: kobj['ksb_effet'],
        hide: kobj['ksb_effet'],
        open: function() {
        
            ksbDialogElement(kobj, ref);            
        },
        close: function() {
         
            kobj['ksb_dialog_element'] = false; 
            clearTimeout(kobj['ksb_to']);
            kobj['ksb_to'] = setTimeout(function() { ksbDecaleListeElements(kobj, true, false) }, 500); 
        }
    });
}

// ---------------------------------------------------------------------------

function ksbDialogElement(kobj, ref)
{
    $.ajax({
    
        url: kobj['ksb_url_lightbox'],
        data: "Etape=fiche_lb&ajax=1&ref=" + ref,
        success: function(data) {
        
            $(kobj['ksb_id_dialog']).html(data);
            $('#fiche-bien').fadeIn(500);
        }
    });
}

// ---------------------------------------------------------------------------

function ksbMargeElement(kobj)
{
    if (kobj['ksb_marge'] > 0.1)
        return kobj['ksb_marge'];
        
    kobj['ksb_marge'] = $('.' + kobj['ksb_nom_element']).css('margin-right');
    if (!kobj['ksb_marge'])
        return 5;

    kobj['ksb_marge'] = kobj['ksb_marge'].replace('px', '');
    kobj['ksb_marge'] = parseInt(kobj['ksb_marge']);
    
    if (kobj['ksb_marge'] < 0.1)
        return 5;
    
    return kobj['ksb_marge'];
}

// ---------------------------------------------------------------------------

function ksbAffecteEvtElement(kobj, selector)
{
    $(selector).mouseenter(function() {
    
        $('.' + kobj['ksb_nom_element']).stop(true, false);
        kobj['ksb_pause_hover'] = true;
    });
    
    $(selector).mouseleave(function() {

        kobj['ksb_pause_hover'] = false;
        clearTimeout(kobj['ksb_to']);
        kobj['ksb_to'] = setTimeout(function() { ksbDecaleListeElements(kobj, false, false) }, 500); 
    });
    
    if (kobj['ksb_avec_lightbox'])
    {
        $(selector).click(function() {

            var ref_dialog = $(this).attr('rel');
            ksbClicElement(kobj, ref_dialog);
        });
    }
        
    if (kobj['ksb_oninit'])
    {
        var fn = kobj['ksb_oninit'];
        fn(selector);
    }
}

// ---------------------------------------------------------------------------

function ksbDecaleListeElements(kobj, inc_idx, init)
{
    if (init)
    {
        kobj['ksb_pause'] = false;
        kobj['ksb_pause_hover'] = false;
        kobj['ksb_dialog_element'] = false;
    }
    
    if (kobj['ksb_max_left'] - 30 < kobj['ksb_conteneur'].width())
        return;

    if (kobj['ksb_pause'] || kobj['ksb_pause_hover'] || kobj['ksb_dialog_element'])
        return;
        
    
    var w = 100000;
    var left_dern = 0;
    var width_dern = 0;
    var bien_courant = null;

    // Auto-réparation de l'animation en cas de bug
    var sortir = false;
    $('.' + kobj['ksb_nom_element']).each(function() {
    
        if (sortir)
            return;
            
        if (!kobj['ksb_prem_ref'])
        {
            kobj['ksb_prem_ref'] = $(this).attr('rel');
        }
        else if (kobj['ksb_prem_ref'] == $(this).attr('rel'))
        {
            var left = $(this).css('left').replace('px', '');
            left = parseInt(left);
            if (left > -1)
            {
                kobj['ksb_conteneur'].html(kobj['ksb_html_origine']);
                ksbAffecteEvtElement(kobj, '.' + kobj['ksb_nom_element']);
            }
        }
        sortir = true;      
    });
    
    $('.' + kobj['ksb_nom_element']).each(function() {
    
        if (!bien_courant)
            bien_courant = $(this);
            
        if (!kobj['ksb_prem_ref'])
            kobj['ksb_prem_ref'] = bien_courant.attr('rel');

        var left = $(this).css('left').replace('px', '');
        left = parseInt(left);
        
        if (left > left_dern)
        {
            left_dern = left;
            width_dern = $(this).outerWidth();
        }
        
        if ((left > 0) && (left < w))
            w = left;
    });
    
    if (!bien_courant)
        return;
      
    left_dern += width_dern + ksbMargeElement(kobj);      

    var elem_decale = false;

    var rel = bien_courant.attr('rel');
    kobj['ksb_conteneur'].append("<div class='" + kobj['ksb_nom_element'] + "' rel='" + rel + "'style='position:absolute; left:" + left_dern + "px; top:0px;'>" + bien_courant.html() + "</div>");

    $('.' + kobj['ksb_nom_element']).animate({
    
        left: '-=' + w
        
    }, kobj['ksb_duree'], function() {

        if (elem_decale)
            return;
        elem_decale = true;
        
        bien_courant.remove();

        ksbAffecteEvtElement(kobj, "." + kobj['ksb_nom_element'] + "[rel='" + rel + "']");
    
        if (kobj['ksb_pause'] || kobj['ksb_pause_hover'] || kobj['ksb_dialog_element'])
            return;

        clearTimeout(kobj['ksb_to']);
        kobj['ksb_to'] = setTimeout(function() { ksbDecaleListeElements(kobj, true, false) }, kobj['ksb_delai']);        
    });
}

// ---------------------------------------------------------------------------

