var slideshows = {};
function init_slideshow(sid, options)
{
    var slideshow = {
        container: $(sid),
        index: 0,
        start_index: 0,
        timeout_id: null,
        container_next: null,
        container_prev: null,
        auto_scroll: true,
        container_stats: null,
        n_items: $(sid).children().size(),
        transition: true,
        callback: function( item ){},
        skip_next: false
    };
    $.extend( slideshow, options );

    if( slideshow['container_next'] )
        slideshow['container_next'].bind('click', function(){ next(sid); });

    if( slideshow['container_prev'] )
        slideshow['container_prev'].bind('click', function(){ previous(sid); });

    slideshows[sid] = slideshow;

    start(sid);
    if( slideshow.auto_scroll && slideshow.n_items > 1 )
    {
        slideshow.timeout_id = setInterval(function() {
            if( slideshow.skip_next )
            {
                slideshow.skip_next = false;
                return;
            }
            if( !slideshow.pause )
                next(sid);
        }, slideshow.n_timer);
    }
    slideshow.container.bind('slideshow:update', { 'slideshow':slideshow }, function(event){
        event.data.slideshow.callback( slideshow.container.children().eq(slideshow.container.index) );
        if( event.data.slideshow.container_stats )
            event.data.slideshow.container_stats.text(
                (event.data.slideshow.index+1)+ '/' + event.data.slideshow.n_items
            );
    });
    return slideshow.container;
}
function get_slideshow(container)
{
    return slideshows[container];
}
function start(sid)
{
    var slideshow = get_slideshow(sid);
    slideshow['pause'] = false;
    slideshow.container.children().eq( slideshow.index ).show();
}

function pause(sid)
{
    var slideshow = get_slideshow(sid);
    slideshow['pause'] = true;
}

function next(sid)
{
    var slideshow = get_slideshow(sid);

    slideshow.container.children().eq(slideshow.index).hide();
    slideshow.container.children().eq( (slideshow.index + 1) % slideshow.n_items).fadeIn("slow");

    slideshow.index = (slideshow.index + 1) % slideshow.n_items;
    slideshow.container.trigger( 'slideshow:update' );
}

function jump_to(sid, n)
{
    var slideshow = get_slideshow(sid);
    slideshow['pause'] = true;
    slideshow['skip_next'] = true;

    slideshow.container.children().eq(slideshow.index).hide();
    slideshow.container.children().eq(n).fadeIn( 'slow' );

    slideshow.index = n;
    slideshow.container.trigger('slideshow:update');
    slideshow['pause'] = false;
}

function previous(sid)
{
    var slideshow = get_slideshow(sid);

    slideshow.container.children().eq(slideshow.index).hide();
    slideshow.container.children().eq( slideshow_index ? slideshow.index - 1: 0 ).fadeIn("slow");

    slideshow.index--;
    if( slideshow.index < 0 )
        slideshow.index = slideshow.n_items-1;
    slideshow.container.trigger('slideshow:update');
}