
(function($) {

    var settings = {
        'interval': 5000,
        'autostart': true,
        'type': 'slide'
    };

    var $slider;
    var $slideElements;
    var $currentSlide;
    var $lastSlide;

    var timeout;
    var slideWidth;


    var methods = {
        init: function(options) {

            if (options) {
                $.extend(settings, options);
            }

            $slider = this.find('ul');
            $slideElements = $slider.children('li.slideblock');

            $smallestSlideHeight = null;

            $slideElements.each(function() {
                var slideHeight = $(this).outerHeight();
                if (slideHeight < $smallestSlideHeight || $smallestSlideHeight == null) {
                    $smallestSlideHeight = slideHeight;
                }
            });

            $slider.css({ height: $smallestSlideHeight - 4 });

            if ($slideElements.length > 1) {
                $currentSlide = $slideElements.first();

                if (settings.type == 'slide')
                    $currentSlide.clone().appendTo($slider);
                else {
                    $slideElements.css({ position: 'absolute', float: 'none' });
                    $slideElements.not(':first').css({ opacity: 0 });
                }

                $slideElements = $slider.find('li');

                $lastSlide = $slideElements.last();

                slideWidth = $currentSlide.width();

                if (settings.autostart && settings.interval > 0) {
                    timeout = setTimeout('$(this).slideshow(\'nextSlide\')', settings.interval);
                }
            }
        },

        nextSlide: function() {
            if (settings.type == 'slide') {
                $slider.animate({ left: '-=' + $currentSlide.width() }, function() {
                    $currentSlide = $currentSlide.next();
                    if ($currentSlide.next().length == 0) {
                        $slider.css('left', '0px');
                        $currentSlide = $slideElements.first();
                    }
                });
            }
            else if (settings.type == 'fade') {
                var $nextSlide = $currentSlide.next();
                if ($nextSlide.length == 0)
                    $nextSlide = $slideElements.first();

                $currentSlide.animate({ opacity: 0 }, 1000, function() {
                    $currentSlide.css('z-index', '1');
                });
                $nextSlide.animate({ opacity: 1 }, 1000, function() {
                    $nextSlide.css('z-index', '10');
                    $currentSlide = $nextSlide;
                });


            }

            if (settings.autostart && settings.interval > 0) {
                clearTimeout(timeout);
                timeout = setTimeout('$(this).slideshow(\'nextSlide\')', settings.interval);
            }
        },

        prevSlide: function() {
            if (settings.type == 'slide') {
                if ($currentSlide.prev().length == 0) { //FIRST ELEMTENT, JUMP TO LAST!
                    $slider.css('left', ((($slideElements.length - 1) * slideWidth) * -1) + 'px');
                    $currentSlide = $slideElements.last();
                }
                $slider.animate({ left: '+=' + $currentSlide.width() }, function() {
                    $currentSlide = $currentSlide.prev();
                });
            }
            else if (settings.type == 'fade') {
                var $nextSlide = $currentSlide.prev();
                if ($nextSlide.length == 0)
                    $nextSlide = $slideElements.last();

                $currentSlide.animate({ opacity: 0 }, 1000, function() {
                    $currentSlide.css('z-index', '1');
                });
                $nextSlide.animate({ opacity: 1 }, 1000, function() {
                    $nextSlide.css('z-index', '10');
                });

                $currentSlide = $nextSlide;
            }

            if (settings.autostart && settings.interval > 0) {
                clearTimeout(timeout);
                timeout = setTimeout('$(this).slideshow(\'nextSlide\')', settings.interval);
            }
        }
    };

    $.fn.slideshow = function(method) {

        if (methods[method]) {
            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
        } else if (typeof method === 'object' || !method) {
            return methods.init.apply(this, arguments);
        } else {
            $.error('Method ' + method + ' does not exist on jQuery.tooltip');
        }

    };

})(jQuery);
