function Ticker(params)
{
    var tickTime = params.tickTime || 24;
    var step = Math.abs(params.step || 1);
    var saveStep = step;
    var timeBetweenRepeat = typeof(params.timeBetweenRepeat) == "undefined" ? 0 : params.timeBetweenRepeat;
    var banners;
    type = typeof(params.banners);
    if (type == "undefined")
        banners = ["This is a sample banner"];
    else if (type == "object")
        banners = params.banners;
    else
        banners = [params.banners];

    var tickerDiv = document.createElement("div");
    if (!params.className) {
        tickerDiv.style.width = "100%";
        tickerDiv.style.paddingTop = tickerDiv.style.paddingBottom = "1px";
        tickerDiv.style.fontFamily = "arial,verdana,sans-serif";
        tickerDiv.style.fontSize = "12px";
        tickerDiv.style.backgroundColor = "silver";
        tickerDiv.style.color = "black";
    }
    else
        tickerDiv.className = params.className;
    tickerDiv.style.position = "relative";
    tickerDiv.style.textAlign = "left";
    tickerDiv.style.overflow = "hidden";
    if (typeof(params.stopOnMouseOver) == "undefined" || params.stopOnMouseOver) {
        tickerDiv.onmouseover = function() {step = 0;};
        tickerDiv.onmouseout = function() {step = saveStep;};
    }

    tickerDiv.style.left = tickerDiv.offsetWidth + "px";

    var ticker = document.createElement("nobr");
    ticker.style.position = "relative";
    for (var i = 0; i < banners.length; ++i) {
        var span = document.createElement("span");
        if (i != 0)
            span.style.paddingLeft = params.spaceBetweenBanners || "100px";
        ticker.appendChild(span);
        span.innerHTML = banners[i];
    }
    tickerDiv.appendChild(ticker);

    this._add = _add;
    this._remove = _remove;

    var tickTimer = null;
    var theContainer = null;

    function _add(container)
    {
        if (theContainer != null)
            return;
        theContainer = container;
        ticker.style.visibility = 'hidden';
        theContainer.appendChild(tickerDiv);
        ticker.style.left = tickerDiv.offsetWidth + "px";
        ticker.style.visibility = "visible";
        tick();


        function tick() {
            if (theContainer == null)
                return;
            var where = parseInt(ticker.style.left);
            if (where > -ticker.offsetWidth) {
                ticker.style.left = (where - step) + "px";
                window.setTimeout(tick, tickTime);
            }
            else {
                ticker.style.left = tickerDiv.offsetWidth + "px";
                if (timeBetweenRepeat == 0)
                    tick();
                else
                    tickTimer = window.setTimeout(tick, timeBetweenRepeat * 1000);
            }
        } // end of tick

    } // end of buildTicker


    function _remove()
    {
        if (theContainer == null)
            return;
        window.clearTimeout(tickTimer);
        theContainer.removeChild(tickerDiv);
        theContainer = null;
    }
}   // end of Ticker

Ticker.prototype.add = function(container)
{
    var type = typeof(container);
    if (type == "undefined")
        container = document.body;
    else if (type == "string")
        container = document.getElementById(container)
    if (!container)
        return;
    this._add(container);
};

Ticker.prototype.remove = function()
{
    this._remove();
};
