var pngOpacityBug = ($.browser.msie && parseInt($.browser.version, 10) <= 8);

$(document).ready(function enhanceSlideshow () {

    var INTERVAL_TIME = 5 * 1000;
    if ($('.spotlight').attr('data-interval') != undefined) {
        INTERVAL_TIME = $('.spotlight').attr('data-interval');
    }

    var MANUAL_FADE_DURATION = 500;
    var AUTO_FADE_DURATION = 1000;
    var NAV_LOOP = true;
    var PAUSE_ON_HOVER = true;
    var AUTO_HIDE_CONTROLS = true;

    var init = function (el) {
        el.slides = $('li', el);
        el.activeSlideNum = 0;
        for (var i = 0; i < el.slides.length; i++) {
            if (i === el.activeSlideNum) {
                el.style.position = 'relative';
                el.slides[i].style.position = 'relative';
                el.slides[i].style.zIndex = 2;
            }
            else {
                el.slides[i].style.position = 'absolute';
                el.slides[i].style.top = 0;
                el.slides[i].style.left = 0;
            }
            el.slides[i].style.display = 'block';
        }
        var ctrl = document.createElement('div');
        ctrl.className = 'ctrl';
        ctrl.style.zIndex = 4;
        if (AUTO_HIDE_CONTROLS) {
            ctrl.style.display = 'none';
        }
        var playPauseButton = ctrl.appendChild(document.createElement('div'));
        playPauseButton.className = 'play-pause';
        var prevButton = ctrl.appendChild(document.createElement('div'));
        prevButton.className = 'prev';
        var nextButton = ctrl.appendChild(document.createElement('div'));
        nextButton.className = 'next';
        var numbering = ctrl.appendChild(document.createElement('div'));
        numbering.className = 'numbering';
        var activeNumber = numbering.appendChild(document.createElement('span'));
        activeNumber.innerHTML = '1';
        numbering.appendChild(document.createTextNode('/' + el.slides.length));
        var pagination = ctrl.appendChild(document.createElement('div'));
        pagination.className = 'triggers';
        var triggers = []
        for (var i = 0; i < el.slides.length; i++) {
            var trigger = pagination.appendChild(document.createElement('div'));
            trigger.className = 'trigger' + (i === 0 ? ' active' : '');
            trigger.innerHTML = '<div class="text">' + (i + 1) + '</div>';
            triggers.push(trigger);
        }
        el.appendChild(ctrl);

        el.showSlide = function (i, duration) {
            if (typeof duration === 'undefined') {
                duration = MANUAL_FADE_DURATION;
            }
            var active = el.activeSlideNum;
            el.activeSlideNum = i;
            var next = el.slides[el.activeSlideNum];
            el.slides[active].style.zIndex = 3;
            next.style.opacity = 1;
            if (pngOpacityBug) {
                next.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity=100)';
            }
            next.style.zIndex = 2;
            emile(el.slides[active], 'opacity:0', {
                duration: duration,
                after: function () {
                    el.slides[active].style.zIndex = 1;
                }
            });
            triggers[active].className = triggers[active].className.replace('active', '');
            triggers[el.activeSlideNum].className += ' active';
            setTimeout(function () {
                activeNumber.innerHTML = el.activeSlideNum + 1;
                if (!NAV_LOOP) {
                    nextButton.style.display = (el.activeSlideNum === el.slides.length - 1) ? 'none' : '';
                    prevButton.style.display = (el.activeSlideNum === 0) ? 'none' : '';
                }
            }, duration / 2);
        };

        el.nextSlide = function (duration) {
           el.showSlide((el.activeSlideNum === el.slides.length - 1) ? 0 : el.activeSlideNum + 1, duration);
        };

        el.prevSlide = function (duration) {
            el.showSlide((el.activeSlideNum === 0) ? el.slides.length - 1 : el.activeSlideNum - 1, duration);
        };

        el.playSlideshow = function () {
            el.playingSlideshow = true;
            el.className = el.className.replace('paused', '');
            el.slideshowInterval = setInterval(function () {
                el.nextSlide(AUTO_FADE_DURATION);
            }, INTERVAL_TIME);
        };

        el.pauseSlideshow = function () {
            if (el.playingSlideshow) {
                el.playingSlideshow = false;
                el.className += ' paused';
            }
            clearInterval(el.slideshowInterval);
        }

        playPauseButton.onclick = function () {
            if (!el.playingSlideshow) {
                el.nextSlide();
                el.playSlideshow();
            }
            else {
                el.pauseSlideshow();
            }
        };

        nextButton.onclick = function () {
            if (el.playingSlideshow) {
                clearInterval(el.slideshowInterval);
                el.playSlideshow();
            }
            el.nextSlide();
        };

        prevButton.onclick = function () {
            if (el.playingSlideshow) {
                clearInterval(el.slideshowInterval);
                el.playSlideshow();
            }
            el.prevSlide();
        };

        for (var i = 0; i < triggers.length; i++) {
            (function (i) {
                triggers[i].onclick = function () {
                    el.showSlide(i);
                }
            })(i);
        }

        var timer;
        var hovering;
        var ctrlVisible = false;
        el.onmouseover = function () {
            clearTimeout(timer);
            if (!hovering) {
                hovering = true;
                if (AUTO_HIDE_CONTROLS && !ctrlVisible) {
                    ctrl.style.opacity = 0;
                    ctrl.style.display = '';
                    if (!pngOpacityBug) {
                        emile(ctrl, 'opacity:1', {
                            duration: 400,
                            after: function () {
                                ctrlVisible = true;
                            }
                        });
                    }
                }
                if (PAUSE_ON_HOVER) {
                    el.pauseSlideshow();
                }
            }
        };

        el.onmouseout = function () {
            hovering = false;
            timer = setTimeout(function () {
                if (AUTO_HIDE_CONTROLS) {
                    var after = function () {
                        if (hovering) {
                            ctrl.style.opacity = 1;
                            ctrlVisible = true;
                        }
                        else {
                            ctrl.style.display = 'none';
                            ctrlVisible = false;
                        }
                    };
                    if (!pngOpacityBug) {
                        emile(ctrl, 'opacity:0', {
                            duration: 400,
                            after: after
                        });
                    }
                    else {
                        after();
                    }
                }
                if (PAUSE_ON_HOVER) {
                    el.playSlideshow();
                }
            }, 100);
        };

        el.playSlideshow();
    };

    $('.carousel ul', document.body).each(function() {
        if ($('li', this).length > 1) {
            init(this);
        }
    });
});
