(function($){
    $.fn.slideImage = function(options){
        var defaults = {
            fadeTime: 2000,
            intervalTime: 10000,
            waitTime: 5000,
            window: true
        };
        options = $.extend(defaults, options);

        return this.each(function(){
            var current = 0;
            var interval = 0;
            var slides = new Array;
            var target = $(this).addClass('slideimage');
            var navi = $('<ul>').addClass('slidenavi');

            target.find('div').each(function(){
                var image = $(this).find('img').attr('src');
                if (!image) {
                    return;
                }
                
                (function(index){
                    navi.append(
                        $('<li>').addClass('navi')
                        .click(function(){
                            if (index == current && interval === 0){
                                return;
                            }
                            stopSlide();
                            showSlide(index);
                            startSlide(options.waitTime);
                        })
                    );
                })(slides.length);

                slides.push($('<div>').append($(this).html()).bind('fadeout', function(){
                                  $(this).stop()
                                         .fadeOut(options.fadeTime, function(){
                                             $(this).remove();
                                         });
                              })
                              .bind('fadein', function(){
                                  $(this).stop().fadeIn(options.fadeTime);
                              })
                    );
            });

            navi.find('li:first').addClass('current');
            var navidiv = $('<div>').addClass('slideNavWrapper').append(navi);
            target.html(slides[0].clone(true)).before(navidiv);
            startSlide();

            function startSlide(wait){
                wait = wait | 0;
                setTimeout(function(){
                    if (interval === 0){
                        interval = setInterval(function(){
                            showSlide(current + 1);
                        }, options.intervalTime);
                    }
                }, wait);
            }

            function stopSlide(){
                if (interval) {
                    clearInterval(interval);
                    interval = 0;
                }
            }

            function showSlide(index){
                if (index >= slides.length){
                    index = 0;
                }
                if (index == current){
                    return;
                }
                target.find('div').trigger('fadeout');
                target.prepend(slides[index].clone(true).trigger('fadein'));
                navi.find('li').removeClass('current');
                navi.find('li').eq(index).addClass('current');
                current = index;
            }
        });
    };
})(jQuery);
