/**
 * 作者:张旭光
 * 描述:用来对元素进行包装,从而产生滚动效果
 */
var Tom = new Object();
Tom.Widget = new Object();/// <summary>
/// 构造函数需要传入需要包装元素的ID
/// </summary>
Tom.Widget.Rotator = function(containerId)
{
this.rotatorContainer = document.getElementById(containerId);
if(!this.rotatorContainer)
{
alert("ID为\"" + containerId +"\"的容器不存在,所以无法继续应用左滚动效果!");
return null;
}

/* 外部参数 */
this.DirectionArray = {"up":0 , "down":1 , "left":2 , "right":3};
this.Direction = "left"; //转动方向
this.Step = 1; //每下向前滚动的距离
this.Timer = 20; //多长时间滚动一下
this.ScrollStep = 0; //如果是间歇性滚动,则滚多长的距离停一次
this.DelayTime = 0; //间歇性滚动,每次停止的时间
this.waitTime = 0; //开始滚动前的静止时间

if(this.rotatorContainer.attributes.getNamedItem("direction"))this.Direction = this.rotatorContainer.attributes.getNamedItem("direction").nodeValue;
this.Direction = this.DirectionArray[this.Direction.toLowerCase()];
if(this.rotatorContainer.attributes.getNamedItem("step"))this.Step = parseInt(this.rotatorContainer.attributes.getNamedItem("step").nodeValue);
if(this.rotatorContainer.attributes.getNamedItem("timer"))this.Timer = parseInt(this.rotatorContainer.attributes.getNamedItem("timer").nodeValue);
if(this.rotatorContainer.attributes.getNamedItem("scrollStep"))this.ScrollStep = parseInt(this.rotatorContainer.attributes.getNamedItem("scrollStep").nodeValue);
if(this.rotatorContainer.attributes.getNamedItem("delayTime"))this.DelayTime = parseInt(this.rotatorContainer.attributes.getNamedItem("delayTime").nodeValue);
if(this.rotatorContainer.attributes.getNamedItem("waitTime"))this.WaitTime = parseInt(this.rotatorContainer.attributes.getNamedItem("waitTime").nodeValue);


/* 内部参数 */
this.Correct = 0;
this.CTL = 0;
this.StartID = 0;
this.Stop = 0;
this.MouseOver = 0;

/* 对容器内容进行扩展 */
    this.Height = Tom.Common.getControlHeight(containerId);
    this.Width = Tom.Common.getControlWidth(containerId);
this.rotatorContainer.scrollHeight;//这是IE的一个bug,如果不首先出现一次,则不能得到scrollHeight的正确值
this.ClientScroll = this.Direction > 1 ? this.rotatorContainer.scrollWidth : this.rotatorContainer.scrollHeight;
if((this.Direction <= 1 && this.ClientScroll <= this.Height + this.Step) || (this.Direction > 1 && this.ClientScroll <= this.Width + this.Step)) return;
this.rotatorContainer.innerHTML += this.rotatorContainer.innerHTML;


this.rotatorContainer.style.overflow = "hidden";
this.rotatorContainer.noWrap = true;

this.startRote();


}/// <summary>
/// 处理数据然后开始滚动
/// </summary>
Tom.Widget.Rotator.prototype.startRote = function()
{
var thisRotaor = this;

//该函数的存在主要是为了规避下面定义的Scroll函数中的this
thisRotaor.middleScroll = function()
{
thisRotaor.Scroll();
}

//鼠标划入
thisRotaor.rotatorContainer.onmouseover = function()
{
thisRotaor.MouseOver = 1;
clearInterval(thisRotaor.TimerID);
}

//鼠标划出
thisRotaor.rotatorContainer.onmouseout = function()
{
thisRotaor.MouseOver = 0;
//当鼠标划出的时候,应该首先判断当前是否有未完成的
//延迟事件正在处理,如果有,则把控制权交给为延迟事
//件去处理,否则立即开始滚动
if(thisRotaor.Stop == 1)
{
return;
}
else
{
thisRotaor.TimerID = setInterval(thisRotaor.middleScroll, thisRotaor.Timer);
}
}

//函数-继续
thisRotaor.Continue = function()
{
//假如鼠标进入,则反复延迟调用自己,也就是过一段时间,判断一次鼠标是否移出
if(thisRotaor.MouseOver == 1)
{
setTimeout(thisRotaor.Continue, thisRotaor.Delaytime);
}
else
{
clearInterval(thisRotaor.TimerID);
thisRotaor.Stop = 0;
thisRotaor.CTL = 0;
thisRotaor.TimerID = setInterval(thisRotaor.middleScroll, thisRotaor.Timer);
}
}

//函数-暂停
thisRotaor.Pause = function()
{
thisRotaor.Stop = 1;
clearInterval(thisRotaor.TimerID);
setTimeout(thisRotaor.Continue, thisRotaor.DelayTime);
}

thisRotaor.TimerID = setInterval(thisRotaor.middleScroll, thisRotaor.Timer);
}
/// <summary>
/// 实际的滚动函数
/// </summary>
Tom.Widget.Rotator.prototype.Scroll = function()
{
switch(this.Direction)
{
case 0:
this.CTL += this.Step;
if(this.CTL >= this.ScrollStep && this.DelayTime > 0)
{
this.rotatorContainer.scrollTop += this.ScrollStep + this.Step - this.CTL;
this.Pause();
return;
}
else
{
if(this.rotatorContainer.scrollTop >= this.ClientScroll)
{
this.rotatorContainer.scrollTop -= this.ClientScroll;
}
this.rotatorContainer.scrollTop += this.Step;
}
break; case 1:
this.CTL += this.Step;
if(this.CTL >= this.ScrollStep && this.DelayTime > 0)
{
this.ID.scrollTop -= this.ScrollStep + this.Step - this.CTL;
this.Pause();
return;
}
else
{
if(this.ID.scrollTop <= 0)
{
this.ID.scrollTop += this.ClientScroll;
}
this.ID.scrollTop -= this.Step;
}
break; case 2:
this.CTL += this.Step;
//如果间歇滚动有效,当CTL(记录当前间歇滚动点)到达ScrollStep所描述的距离时,暂停下来
if(this.CTL >= this.ScrollStep && this.DelayTime > 0)
{
this.rotatorContainer.scrollTop += this.ScrollStep + this.Step - this.CTL;
this.Pause();
return;
}
else
{
//没有间歇滚动,普通滚动即可
if(this.rotatorContainer.scrollLeft >= this.ClientScroll)
{
//当滚动到一半的时候,马上返回,因为后半部分为前半部分的拷贝,所以跳回不觉闪烁
this.rotatorContainer.scrollLeft -= this.ClientScroll;
}
this.rotatorContainer.scrollLeft += this.Step;

}
break; case 3:
this.CTL += this.Step;
if(this.CTL >= this.ScrollStep && this.DelayTime > 0)
{
this.ID.scrollLeft -= this.ScrollStep + this.Step - this.CTL;
this.Pause();
return;
}
else
{
if(this.ID.scrollLeft <= 0)
{
this.ID.scrollLeft += this.ClientScroll;
}
this.ID.scrollLeft -= this.Step;
}
break;
}
}