var Ticker = function (container, messages) {
    container = document.getElementById(container);
    var run = true;
    var index = 1;
    var animTime = 750;
    var animFps = 80;
    var animFrames = (animTime / 1000) * animFps;
    var animFrameDelay = animTime / animFps;
    var xAxisOffset = 42;
    var cur = container.getElementsByTagName("span")[0];
    var next = null;
    var running = false;
    var isIE = false;
    try {
        isIE = navigator.userAgent.match(/MSIE/) !== null;
    } catch (e) {}

    var nextMessage = function () {
        var el = document.createElement("span");
        el.className = "ticker-item";
        el.innerHTML = messages[index];
        index = (index + 1) % messages.length;
        return el;
    };

    var setOpacity = function (el, o) {
        el.style.opacity = o;
        el.style.MozOpacity = o;
        el.style.filter = "alpha(opacity=" + (o * 100) + ")";
    };
    var clearOpacity = function (el, o) {
        el.style.opacity = "";
        el.style.MozOpacity = "";
        el.style.filter = "";
    };

    var animate = function (f, c) {
/*        if (isIE) {
            if (c) {
                c();
            }
            return;
        }*/
        var x = 0;
        var i = setInterval(function () {
            var z = Math.sin((x / (animFrames * 2)) * Math.PI);
            f(z);
            x += 1;
            if (x > animFrames) {
                clearInterval(i);
                if (c) {
                    c();
                }
            }
        }, animFrameDelay);
    };

    var flyIn = function (el) {
        if (isIE) {
            el.style.left = xAxisOffset + "px";
            el.style.top = (-3 * xAxisOffset) + "px";
        } else {
            setOpacity(el, 0);
        }
        container.insertBefore(el, container.firstChild);
        animate(isIE ? function (z) {
            var o = ((-3 * xAxisOffset) + (3.3 * xAxisOffset * z));
            el.style.top = o + "px";
        } : function (z) {
            setOpacity(el, z);
            el.style.left = (xAxisOffset * z) + "px";
        }, function () {
            running = false;
        });
    };
    var flyOut = function (el) {
        animate(isIE ? function (z) {
            var o = (0.3 * xAxisOffset) + (3 * xAxisOffset * z);
            el.style.top = o + "px";
        } : function (z) {
            setOpacity(el, (1 - z));
            el.style.left = xAxisOffset  + (2 * xAxisOffset * z) + "px";
        }, function () {
            container.removeChild(el);
        });
    };
    var swap = function (f) {
        if ((!f && !run) || running) {
            return;
        }
        running = true;
        flyOut(cur);
        setTimeout(function () {
            cur = (next === null) ? nextMessage() : next;
            next = null;
            flyIn(cur);
        }, 100);
    };

    setInterval(swap, 8192);
    
    // Fade in the left/right buttons - avoids it looking interactive if the js is turned off
    setTimeout(function () {
        var buttons = [document.getElementById("ticker-button-left"), document.getElementById("ticker-button-right")];
        if (buttons[0] === null) {
            buttons =[document.getElementById("ie-ticker-button-left"), document.getElementById("ie-ticker-button-right")];
        }
        if (!isIE) {
            setOpacity(buttons[0], 0);
            setOpacity(buttons[1], 0);
        }
        buttons[0].style.display="";
        buttons[1].style.display="";
        if (!isIE) {
            animate(function (z) {
                setOpacity(buttons[0], z);
                setOpacity(buttons[1], z);
            }, function () {
                clearOpacity(buttons[0]);
                clearOpacity(buttons[1]);
            });
        }
    }, 1000);


    return {
        pause: function () {
            run = false;
        },
        resume: function () {
            run = true;
        },
        next: function () {
            next = nextMessage();
            swap(true);
        },
        previous: function () {
            index -= 2;
            if (index < 0) {
                index = messages.length + index;
            }
            next = nextMessage();
            swap(true);
        }
    };
};
