function llx3_slideShow(container, interval, startTimeout, waitImageLoad, effect, fadeInDuration, fadeOutDuration, autoStart, randomStart) {

    var SlideShow = this;
    var slides;
    this.currentSlide = -1;
    var imagesLoaded = 0;
    var slideShowStarted = false;
    this.OnShowEvents = new Array();
    var slideIntv = 0;
    var suspended = false;

    function slideSwitch(slideIndex) {
        if (init() == false) return;
        if ((suspended) && (slideIndex == undefined)) return;
        var oldSlide = SlideShow.currentSlide;
        SlideShow.currentSlide++;
        if (slideIndex != undefined) SlideShow.currentSlide = slideIndex;
        if (SlideShow.currentSlide >= slides.length) SlideShow.currentSlide = 0;
        var newSlide = SlideShow.currentSlide;
        if (SlideShow.OnShowEvents[newSlide]) SlideShow.OnShowEvents[newSlide]();
        switch (effect) {
            case "Fade":
                $(slides[oldSlide]).fadeOut(fadeOutDuration, function () {
                    $(slides[newSlide]).fadeIn(fadeInDuration);
                });
                break;
            case "MoveLeft":
                $(slides[newSlide]).css("display", "block");
                $(slides[newSlide]).css("left", -slides[oldSlide].offsetWidth + 'px');
                $(slides[oldSlide]).animate({ left: '0px' }, fadeOutDuration, "", function () {
                    $(slides[newSlide]).animate({ left: document.getElementById(container).offsetWidth + 'px' }, fadeInDuration);
                });
                break;
            case "MoveRight":
                $(slides[newSlide]).css("display", "block");
                $(slides[newSlide]).css("left", document.getElementById(container).offsetWidth + 'px');
                $(slides[oldSlide]).animate({ left: -(slides[oldSlide].offsetWidth) + 'px' }, fadeOutDuration, "", function () {
                    $(slides[newSlide]).animate({ left: '0px' }, fadeInDuration);
                });
                break;
            default:
                $(slides[oldSlide]).css("display", "none");
                $(slides[newSlide]).css("display", "block");
                break;
        }
        for (var i = 0; i < slides.length; i++) {
            if ((slides[i] != slides[oldSlide]) && (slides[i] != slides[newSlide])) $(slides[i]).css("display", "none");
        }
        for (var i = 0; i < SlideShow.onMoveEvents.length; i++) { SlideShow.onMoveEvents[i](); }
    }

    function init() {
        if (slides) return;
        var c = document.getElementById(container);
        if (c == undefined) return false;
        slides = new Array();
        var foundSlides = c.children;
        for (var i = 0; i < foundSlides.length; i++) {
            if (foundSlides[i].className.indexOf("llxSlide") >= 0) slides.push(foundSlides[i]);
        }
        SlideShow.currentSlide = slides.length - 1
        return true;
    }


    function startSlideShow() {
        if (slideShowStarted) return;
        slideShowStarted = true;
        if (slides.length < 2) { slideSwitch(undefined); return; }
        if (randomStart) {
            var r = Math.floor(Math.random() * slides.length);
            slideSwitch(r);
        } else {
            slideSwitch(undefined);
        }
        slideIntv = setInterval(function () { slideSwitch(undefined) }, interval);
    }

    this.moveTo = function (i) {
        if (slideIntv > 0) { clearInterval(slideIntv); slideIntv = setInterval(function () { slideSwitch(undefined) }, interval); }
        slideSwitch(i);

    }

    this.moveNext = function () {
        if (slideIntv > 0) { clearInterval(slideIntv); slideIntv = setInterval(function () { slideSwitch(undefined) }, interval); }
        slideSwitch(undefined);

    }
    this.movePrev = function () {
        if (slideIntv > 0) { clearInterval(slideIntv); slideIntv = setInterval(function () { slideSwitch(undefined) }, interval); }
        var cs = SlideShow.currentSlide - 1;
        if (cs < 0) cs = slides.length - 1;
        slideSwitch(cs);

    }

    this.suspend = function () { suspended = true; }
    this.resume = function () { suspended = false; }

    this.onMoveEvents = new Array();

    if (autoStart) {
        $(document).ready(function () {
            if (init() == false) return;
            if (waitImageLoad) {
                var images = document.getElementById(container).getElementsByTagName("IMG");
                for (var i = 0; i < images.length; i++) {
                    $(images[i]).load(function () {
                        imagesLoaded++;
                        if (imagesLoaded == images.length) { setTimeout(startSlideShow, startTimeout); }

                    });
                }

            } else {
                setTimeout(startSlideShow, startTimeout);
            }
        });
    }
}
