﻿function SmartMarquee(srcElementId, direction){

	/*定义类全局变量*/
	var __direction = !direction ? 'left': direction; //滚动方向
	
	var __innerHTML = ''; //内容
	var __innerElementWidth = 0; //内部元素的宽度
	var __innerElementHeight = 0; //内部元素的宽度
	var __cloneCount = 0; //克隆的数量
	
	var _root = this; 
	var _srcElement = document.getElementById(srcElementId); //无缝滚动容器元素
	var _innerElement; //内部元素
	var _playHandle; //播放器句柄
	
	/*公有成员*/
	this.step = 1; //步长(px)
	this.delay = 20; //延时(ms)
	
	this.setDirection = function(d){
		if(d == 'left' || d == 'right' || d == 'up' || d == 'down'){
			var quickChange = (__direction == 'left' && d == 'right') ||
				(__direction == 'right' && d == 'left') || 
				(__direction == 'up' && d == 'down') || 
				(__direction == 'down' && d == 'up') ||
				(__direction == d);
				
			__direction = d;
			
			if( !quickChange )
				resetSrcElement(); //重置整个容器元素
		}
	}
	this.getDirection = function(){ return __direction; }
	
	this.toElement = function(){ return _srcElement; }
	
	this.play = function(){
		_playHandle = setInterval(function(){
				oneStep();
			}, _root.delay);
	}
	
	this.stop = function(){
		clearInterval(_playHandle);
	}
	
	
	//初始化
	init();
	
	/*私有方法*/
	function init(){
		__innerHTML = _srcElement.innerHTML;
		
		_innerElement = document.createElement('span');
		_innerElement.innerHTML = __innerHTML;
		
		_srcElement.innerHTML = '';
		_srcElement.style.overflow = 'hidden';
		_srcElement.style.whiteSpace = 'nowrap';
		_srcElement.appendChild(_innerElement);
		
		__innerElementWidth = _innerElement.offsetWidth;
		__innerElementHeight = _innerElement.offsetHeight;
		
		resetSrcElement(); //重置整个容器元素
		_root.play(); //开始播放
	}
	
	function cloneInnerElement(mode){
		if('block' == mode){
			var el = document.createElement('div');
			el.innerHTML = __innerHTML;
			_srcElement.appendChild(el);
			
		} else {
			_srcElement.innerHTML += __innerHTML;
			
		}
		__cloneCount ++;
	}
	
	function resetSrcElement(){
		_srcElement.innerHTML = __innerHTML;
		
		__cloneCount = 0;

		if(__direction == 'left' || __direction == 'right'){
			if(0 < __innerElementWidth)
				while(_srcElement.scrollWidth <= _srcElement.offsetWidth + __innerElementWidth + _root.step || __cloneCount < 1)
					cloneInnerElement('inner'); //左右滚动则创建内联元素
		}else{
			if(0 < __innerElementHeight)
				while(_srcElement.scrollHeight <= _srcElement.offsetHeight + __innerElementHeight + _root.step || __cloneCount < 1)
					cloneInnerElement('block'); //上下滚动则创建块级元素
		}
	}
	
	function oneStep(){
		switch(__direction){
			case 'left':
				if(__innerElementWidth <= _srcElement.scrollLeft)
					_srcElement.scrollLeft -= __innerElementWidth;
				_srcElement.scrollLeft += _root.step;
				break;
			case 'right':
				if(_root.step >= _srcElement.scrollLeft)
					_srcElement.scrollLeft += __innerElementWidth;
				_srcElement.scrollLeft -= _root.step;
				break;
			case 'up':
				if(__innerElementHeight <= _srcElement.scrollTop)
					_srcElement.scrollTop -= __innerElementHeight;
				_srcElement.scrollTop += _root.step;
				break;
			case 'down':
				if(_root.step >= _srcElement.scrollTop)
					_srcElement.scrollTop += __innerElementHeight;
				_srcElement.scrollTop -= _root.step;
				break;
		}
	}


}
