﻿function RotatingBanner(bannerSelector, tabIDPreff, contentIDPref, contentIDSuff) {
    bannerSelector = bannerSelector || '.bannerRoot';
    return {
        images: $(bannerSelector + ' .content img'),
        links: $(bannerSelector + ' .links .tab a'),
        timer: false,
        timerInterval: 5000,
        fadeTime: 300,
        index: 0,
        eventsSet: false,
        hoverInterval: false,
        hoverTime: 150,
        tabIDPreffix: tabIDPreff || 'ani',
        contentIDPreffix: contentIDPref || 'ani',
        contentIDSuffix: contentIDSuff || '_content',
        getContentID: function (contentIndex) {
            var banner = this;
            return '#' + banner.contentIDPreffix + contentIndex + banner.contentIDSuffix;
        },
        getTabLinkID: function (tabIndex) {
            var banner = this;
            return '#' + banner.tabIDPreffix + tabIndex;
        },
        switchToImage: function (newIndex) {
            var banner = this;
            newIndex = parseInt(newIndex || 0);
            if (newIndex < 0) {
                newIndex = 0;
            }
            if (newIndex != banner.index) {
                if (newIndex < 0) {
                    banner.index = 0;
                }
                else {
                    if (newIndex >= banner.images.size()) {
                        banner.index = banner.images.size() - 1;
                    }
                    else {
                        banner.index = newIndex;
                    }
                }
            }
            banner.images.hide();
            $(banner.getContentID(banner.index)).fadeIn(banner.fadeTime);
            banner.links.removeClass('selected');
            $(banner.getTabLinkID(banner.index)).addClass('selected');
        },
        getRotateHandler: function () {
            var banner = this;
            return function () {
                if (banner.index == banner.images.size() - 1) {
                    banner.index = 0;
                }
                else {
                    banner.index++;
                }
                banner.switchToImage(banner.index);
            };
        },
        killHoverInterval: function () {
            var banner = this;
            if (banner.hoverInterval != false) {
                clearInterval(banner.hoverInterval);
                banner.hoverInterval = false;
            }
        },
        setHoverInterval: function (imageId) {
            var banner = this;
            banner.killHoverInterval();
            banner.hoverInterval = setInterval(function () {
                banner.switchToImage(imageId);
                banner.killHoverInterval();
                banner.stop();
                banner.start(parseInt(imageId));
            },
                banner.hoverTime);
        },
        getIndexFromTabEvent: function (evt) {
            var evtId = evt.target.id;
            return parseInt(evtId.substr(banner.tabIDPreffix.length));
        },
        getMouseEnterHandler: function () {
            var banner = this;
            return function (evt) {
                banner.killHoverInterval();
                banner.setHoverInterval(banner.getIndexFromTabEvent(evt));
            }
        },
        getMouseLeaveHandler: function () {
            var banner = this;
            return function (evt) {
                banner.killHoverInterval();
                banner.stop();
                if ($(evt.target).hasClass('selected')) {
                    banner.start(banner.getIndexFromTabEvent(evt));
                }
                else {
                    banner.resume();
                }
            }
        },
        getClickHandler: function () {
            var banner = this;
            return function (evt) {
                banner.stop();
                banner.index = banner.getIndexFromTabEvent(evt)
                banner.switchToImage(banner.index);
                banner.resume();
            };
        },
        stop: function () {
            var banner = this;
            if (banner.timer != false) {
                window.clearInterval(banner.timer);
                banner.killHoverInterval();
                banner.timer = false;
            }
        },
        start: function (startFrom) {
            var banner = this;
            banner.stop();
            if (banner.eventsSet === false) {
                banner.links.hover(banner.getMouseEnterHandler(), banner.getMouseLeaveHandler())
                        .click(banner.getClickHandler());
                banner.eventsSet = true;
            }
            banner.index = parseInt(startFrom || 0);
            banner.resume();
        },
        resume: function () {
            var banner = this;
            banner.stop();
            banner.timer = setInterval(banner.getRotateHandler(), banner.timerInterval);
        }
    };
}
