﻿String.prototype.stringformat = function(){
var tmpStr = this;
var iLen = arguments.length;
for(var i=0;i<iLen;i++){
   tmpStr = tmpStr.replace(new RegExp("\\{" + i + "\\}", "g"), arguments[i]);
}
return tmpStr;
}
function $() {
   var elements = new Array();
   for (var i = 0; i < arguments.length; i++) {
     var element = arguments[i];
     if (typeof element == 'string')
       element = document.getElementById(element);

     if (arguments.length == 1)
       return element;

     elements.push(element);
   }
   return elements;
}
function IMarquee(){
function throwError(){alert("接口未实现：" + arguments[0]);}
this.Scroll = function(){throwError("Scroll");}
this.Clone = function(){throwError("Clone");}
}
function AbstractMarquee(){
IMarquee.apply(this);
var ref = this;
var timer = null;
var container = null;
var indexs = ["ContainerID", "Delay", "Amount", "Width", "Height"];
this.Amount = 1;
this.Delay = 30;
this.Width = 0;
this.Height = 0;
this.ContainerID = "";
this.Start = function(){
   clearTimer();
   timer = setInterval(ref.Scroll, ref.Delay);
}
this.Stop = function(){
   clearTimer();
}
this.Pause = function(){
   clearTimer();
}
this.Init = function(){
   container = $(this.ContainerID);
   if(container == null) {alert("无法找到id为{0}的对象,初始化失败。".stringformat(this.ContainerID));return;};
   container.style.overflow = "hidden";
   if(this.Width > 0) container.style.width = this.Width + "px";
   if(this.Height > 0) container.style.height = this.Height + "px";
   this.Clone();
   this.AttachEvent();
   this.Start();
}
this.AttachEvent = function(){
   container.onmouseover = ref.Pause;
   container.onmouseout = ref.Start;
}
function clearTimer(){
   if(timer != null)clearInterval(timer);
}
function _Marquee(){
	/*
   var max = Math.min(indexs.length, arguments.length);
   for(var i=0;i<max;i++)
    this[indexs[i]] = arguments[i];
  */
  this.ContainerID = arguments[0].ContainerID == null ? "" : arguments[0].ContainerID;
  this.Delay = arguments[0].Delay == null ? 30 : arguments[0].Delay;
  this.Amount = arguments[0].Amount == null ? 1 : arguments[0].Amount;
  this.Width = arguments[0].Width == null ? 0 : arguments[0].Width;
  this.Height = arguments[0].Height == null ? 0 : arguments[0].Height;
}
_Marquee.apply(this, arguments);
}
function MarqueeUp(){
AbstractMarquee.apply(this, arguments);

var ref = this;
var container = $(this.ContainerID);
this.Clone = function(){
   container.innerHTML = '<div style="height:100%;width:100%;">{0}</div><div style="height:100%;width:100%;">{0}</div>'.stringformat(container.innerHTML);
}
this.Scroll = function(){
   with(container){
    if(scrollTop >= lastChild.offsetTop) scrollTop -= firstChild.offsetHeight;
    else scrollTop += ref.Amount;
   }
}
}
function MarqueeDown(){
AbstractMarquee.apply(this, arguments);
var ref = this;
var container = $(this.ContainerID);
this.Clone = function(){
   container.innerHTML = '<div style="height:100%;width:100%;">{0}</div><div style="height:100%;width:100%;">{0}</div>'.stringformat(container.innerHTML);
   container.scrollTop = container.scrollHeight;
}
this.Scroll = function(){
   with(container){
    if(scrollTop <= firstChild.offsetTop) scrollTop += lastChild.offsetHeight;
    else scrollTop -= ref.Amount;
   }
}
}
function MarqueeLeft(){
AbstractMarquee.apply(this, arguments);
var ref = this;
var container = $(this.ContainerID);
this.Clone = function(){
   container.innerHTML = '<table cellspacing="0" cellpadding="0" border="0" style="height:100%;width:100%;"><tr><td valign=top>{0}</td><td valign=top>{0}</td></tr></table>'.stringformat(container.innerHTML);
}
this.Scroll = function(){
   with(container){
    //document.title=scrollLeft + new Date();
    //document.title=container.style.width;
    if(scrollLeft >= firstChild.rows[0].cells[1].offsetLeft) scrollLeft -= firstChild.rows[0].cells[0].offsetWidth;
    else scrollLeft += ref.Amount;
   }
}
}
function MarqueeRight(){
AbstractMarquee.apply(this, arguments);
var ref = this;
var container = $(this.ContainerID);
this.Clone = function(){
   container.innerHTML = '<table cellspacing="0" cellpadding="0" border="0" style="height:100%;width:100%;"><tr><td  valign=top>{0}</td><td>{0}</td valign=top></tr></table>'.stringformat(container.innerHTML);
   container.scrollLeft = container.scrollWidth;
}
this.Scroll = function(){
   with(container){
    if(scrollLeft <= firstChild.rows[0].cells[0].offsetLeft) scrollLeft += firstChild.rows[0].cells[1].offsetWidth;
    else scrollLeft -= ref.Amount;
   }
}
}
var MyMarquee = {
Type : {
   UP : function(){return new MarqueeUp(arguments[0]);},
   DOWN : function(){return new MarqueeDown(arguments[0]);},
   LEFT : function(){return new MarqueeLeft(arguments[0]);},
   RIGHT : function(){return new MarqueeRight(arguments[0]);}
},
newInstance : function(type,params){
   return this.Type[type.toUpperCase()].call(this,params);
}
}
