//千一网络 www.cftea.com
//CTypeExhibition v1.0

//objStr 当前对象的名称，字符串类型
//targetStr 要显示消息的 HTML 元素标签的 id，字符串类型
//fadeInDelay 渐显（打字效果）时的延迟时间，单位毫秒
//fadeOutDelay 渐隐（滚动效果）时的延迟时间，单位毫秒
//msgDelay 消息显示延迟时间，单位毫秒
function CTypeExhibition(objStr, targetStr, fadeInDelay, fadeOutDelay, msgDelay)
{
    this.objStr = objStr;
    this.target = document.getElementById(targetStr);
    this.target.style.overflow = "hidden";
    this.fadeInDelay = fadeInDelay;
    this.fadeOutDelay = fadeOutDelay;
    this.msgDelay = msgDelay;
    
    //与消息存储、切换相关的五个变量
    //一般不应该直接为其设置值，而通过 PrepareMsgData 为其设置值
    this.msgIndex = -1; //正在显示的的消息索引，-1 表示当前还没有开始显示消息
    this.curMsgData = ""; //msgIndex 对应的消息内容
    this.msgFrom = 1; //消息来源，0 来自 JavaScript 数组，>0 来自 HTML 标签，1 来自 HTML 标签的下一级元素，2 来自 HTML 标签的下两级元素……
    this.msgArr = null; //存储消息的 JavaScript 数组
    this.msgBlock = null; //存储消息的 HTML 元素对象
    
    this.FadeIn = CTypeExhibition_FadeIn; //渐显函数
    this.FadeOut =  CTypeExhibition_FadeOut; //渐隐函数
    
    this.timer = null;
        
    this.PrepareMsgData = CTypeExhibition_PrepareMsgData;
    this.GetMsgData = CTypeExhibition_GetMsgData;
    this.ShowMsg = CTypeExhibition_ShowMsg;
}


//准备消息数据
//msgIndex 正在显示的的消息索引，-1 表示当前还没有开始显示消息
//msgFrom 消息来源，0 来自 JavaScript 数组，>0 来自 HTML 标签，1 来自 HTML 标签的下一级元素，2 来自 HTML 标签的下两级元素……
//msgArr 存储消息的 JavaScript 数组，消息不是来自数组，则赋值为 null
//msgBlockStr 存储消息的 HTML 元素标签的 id，字符串类型，消息不是来自 HTML 标签，则赋值为 null
function CTypeExhibition_PrepareMsgData(msgIndex, msgFrom, msgArr, msgBlockStr)
{
    this.msgIndex = msgIndex;
    this.msgFrom = msgFrom;
    this.msgArr = msgArr;
    this.msgBlock = document.getElementById(msgBlockStr);
    
    //由于 Netscape、FireFox 之类浏览器会把空格换行也当作一种节点
    //而我们在写 HTML 时往往为了格式的考虑都会有空格换行
    //为了使这类浏览器能够正常解析，使用以下这段代码除去这类节点
    var i = 0;
    var j = 0;
    var k = 0;
    for (i=0; i<this.msgFrom; i++)
    {
        var str = "";
        var strp = "";
        for (j=0; j<i; j++)
        {
            str += ".childNodes[0]";
            strp += ".childNodes[0]";
        }
        str += ".childNodes";

        for (k=0; k<eval("this.msgBlock" + str + ".length"); k++)
        {
            if (eval("this.msgBlock" + str + "[k].nodeType") == 3)
            {
                var objp = eval("this.msgBlock" + strp);
                objp.removeChild(eval("this.msgBlock" + str + "[k]"));
            }
        }
    }
}

//获得当前要显示的消息
//并赋值给 this.curMsgData
//被 ShowMsg 调用
function CTypeExhibition_GetMsgData()
{
    if (this.msgFrom == 0)
    {
        this.msgIndex = ((++this.msgIndex)<this.msgArr.length)?this.msgIndex:0;
        this.curMsgData = this.msgArr[this.msgIndex];
    }
    else if (this.msgFrom > 0)
    {
        var i = 0;
        var str = "";
        for (i=0; i<(this.msgFrom-1); i++)
        {
            str += ".childNodes[0]";
        }
        str += ".childNodes";
        
        this.msgIndex = ((++this.msgIndex)<eval("this.msgBlock" + str + ".length"))?this.msgIndex:0;
        this.curMsgData = eval("this.msgBlock" + str + "[this.msgIndex].innerHTML");
    }
    else
    {
        this.curMsgData = "";
    }
    
    return this.curMsgData;
}

//渐显函数
//如果渐显还没有结束，返回 true，否则返回 false
function CTypeExhibition_FadeIn()
{
    this.target.innerHTML = this.curMsgData.substr(0, this.target.innerHTML.length+1);
    if (this.target.innerHTML.length < this.curMsgData.length)
    {
        return true;
    }
    else
    {
        return false;
    } 
}

//渐隐函数
//如果渐隐还没有结束，返回 true，否则返回 false
function CTypeExhibition_FadeOut()
{
    //NS 浏览器中，如果没有滚动条 scrollTop 就总为零
    //FF 浏览器中，使用 scrollTop 时不一定需要滚动条
    //所以以下判断中，加上 this.target.scrollTop 判断
    this.target.scrollTop++;
    if (this.target.scrollTop<parseInt(this.target.offsetHeight) &&
        this.target.scrollTop>0)
    {
        return true;
    }
    else
    {
        return false;
    }
}


//显示消息
function CTypeExhibition_ShowMsg()
{
    var state = "ready";
    if (arguments.length > 0)
    {
        state = arguments[0];
    }
    
    if (state == "fadeIn")
    {
        if (this.FadeIn())
        {
            //还没有渐显完
            this.timer = setTimeout(this.objStr+".ShowMsg('fadeIn')", this.fadeInDelay);
        }
        else
        {
            //this.target.innerHTML += "<div style='clear:both;height:" + parseInt(this.target.offsetHeight)*2 + "px;'>　</div>";
            this.target.scrollTop = 0;
            this.timer = setTimeout(this.objStr+".ShowMsg('fadeOut')", this.msgDelay);
        }
    }
    else if (state == "fadeOut")
    {
        if (this.FadeOut())
        {
            //还没有渐隐完
            this.timer = setTimeout(this.objStr+".ShowMsg('fadeOut')", this.fadeOutDelay);
        }
        else
        {
            //不传入参数，进行下一条消息
            this.ShowMsg();
        }
    }
    else
    {
        this.target.innerHTML = "";
        this.target.scrollTop = 0;
        this.GetMsgData();
        this.ShowMsg("fadeIn");
    }
}
//-----------------------------------------------------------------------------
var obj=document.getElementById("onlineUserBlock");
//childNodes的下标的含义在IE和MF中不同，MF使用DOM规范，childNodes中会插入空白文本节点。
//var xx=obj.parentNode.parentNode.getElementsByTagName("TD");
obj.innerHTML='在线：<span id="onlineUser""></span>';

//--调用上面的类
var typeExhibition = new CTypeExhibition("typeExhibition", "onlineUser", 100, 20, 1000);
typeExhibition.PrepareMsgData(-1, 0, marqueeContent, null);
typeExhibition.ShowMsg();