jQuery.fn.dynamicTeaser = function (pOption) {
    var option = { "direction": "h",
        "distance": "310",
        "height": "200"
    };
    var i; for (i in pOption) option[i] = pOption[i];
    if (jQuery(this).length == 0) return;
    var dynamicTeaserCurrentElements = Array(3);
    var dynamicTeaserNextElements;
    var dynamicTeaserTimeInterval = 6000;
    var dynamicTeaserTimeStep = 200;
    var dynamicTeaserInterval = null;
    var baseElement = jQuery(this);
    var baseObject = this;
    var teaser = baseElement.children();
    var styleType = (option.direction == 'h') ? 'left' : 'top';
    this.currentIndex = 0;
    this.dynamicTeaserSwitchElements = function () {
        if (this.currentIndex == 3) {
            this.currentIndex = 0;
        }
        if (dynamicTeaserCurrentElements[this.currentIndex] != null)
            dynamicTeaserCurrentElements[this.currentIndex].fadeOut();

        if (dynamicTeaserNextElements[this.currentIndex] != null) {
            dynamicTeaserNextElements[this.currentIndex].css(styleType, this.currentIndex * (option.distance) + 'px');
            dynamicTeaserNextElements[this.currentIndex].fadeIn('slow');
        }
        this.currentIndex++;
    }
    this.dynamicTeaserGetActivedynamicTeaser = function () {
        var ret = new Array();
        teaser.each(function () {
            ret.push(jQuery(this));
        });
        return ret;
    }
    this.dynamicTeaserPrepare = function () {
        teaser.each(function () {
            jQuery(this).parent().append(jQuery(this).clone());
        });
        teaser = baseElement.children();
        teaser.hide();
    }
    this.dynamicTeaserInit = function () {
        var dynamicTeaserElements = this.dynamicTeaserGetActivedynamicTeaser();
        var dynamicTeaserIndex = 3;
        var dynamicTeaserCount = dynamicTeaserElements.length;
        if (dynamicTeaserInterval != null) {
            window.clearInterval(dynamicTeaserInterval);
            dynamicTeaserInterval = null;
        }
        teaser = baseElement.children();
        teaser.hide();
        function getNextElements() {
            var ids = new Array(3);
            var e = new Array(3);
            for (i = 0; i < 3; i++) {
                ids[i] = (dynamicTeaserIndex + i) % dynamicTeaserCount;
            }
            //ids.sort();
            for (i = 0; i < 3; i++) {
                e[i] = dynamicTeaserElements[ids[i]];
            }
            dynamicTeaserIndex += 3;
            return e;
        }
        function stepTeaser() {
            dynamicTeaserNextElements = getNextElements();
            var currentElementsJq = teaser.filter(":visible");
            currentElementsJq = currentElementsJq.slice(currentElementsJq.length - 3);
            var i = 0;
            currentElementsJq.each(function () {
                dynamicTeaserCurrentElements[i] = jQuery(this);
                i++;
            });
            // switch with small delay
            for (var i = 0; i < 3; i++) {
                var realId = dynamicTeaserNextElements[i].index() % dynamicTeaserCount;
                setTimeout(function (j) {
                    self.dynamicTeaserSwitchElements();
                }, dynamicTeaserTimeStep * i, i); //"dynamicTeaserSwitchElements(" + i + ")"
            }
        }
        if ((dynamicTeaserCount / 2) > 3) {
            var i = 0;
            var self = this;
            baseElement.css('position', 'relative');
            baseElement.css('height', (option.direction == "h") ? option.height + 'px' : (option.height * (dynamicTeaserCount / 2)) + 'px');
            teaser.each(function () {
                jQuery(this).css('position', 'absolute');
                jQuery(this).css(option.direction == 'h' ? 'top' : 'left', '0');
                jQuery(this).css(option.direction == 'h' ? 'left' : 'top', (jQuery(this).index() % 3) * option.distance + 'px');
                if (jQuery(this).index() >= 3) {
                    jQuery(this).hide();
                }
            });
            stepTeaser(); // initial step
            dynamicTeaserInterval = window.setInterval(function () {
                stepTeaser();
            }, dynamicTeaserTimeInterval);
        }
        else {
            for (var i = 0; i < (dynamicTeaserCount / 2); i++) {
                dynamicTeaserElements[i].css('left', i * 310 + 'px');
                dynamicTeaserElements[i].fadeIn();
            }
        }
    }
    this.dynamicTeaserPrepare();
    this.dynamicTeaserInit();
    /*addPersonaListener(function () {
    baseObject.dynamicTeaserInit();
    });*/
};
