﻿// JavaScript Document

//无缝循环滚动对象 scroller：滚动对象的容器对象；execute：一个Json对象 要执行当前对象属性或方法
function SeamlessScrolling(scroller, execute){
	
	switch (typeof scroller){
		case "string" :
			scroller = document.getElementById(scroller);
			break;
		case "object" :
			break;
		default :
			return;
	}

	var othis = this;								//保存当前对象的局部变量
	var speed = 20;									//保存setInterval函数调用方法的间隔时间
	var smoothness = 1;							//对象每次滚动的像素
	var direction = "up";						//对象滚动方向 up向上滚动 down向下滚动 left向左滚动 right向右滚动
	var html = scroller.innerHTML;	//scroller对象起始和结束标签内的 HTML
	var lrOrUd = false;							//当前滚动的方位是左右还是上下 true左右滚动 false上下滚动
	var lastScrollFn = null;				//最后一次滚动的方位 左右 上下 空 三个值
	var side = 1;										//滚动向量 1左上 -1右下  用于计算滚动后的值
	var initialvalue = 0;						//要滚动的对象的高度或宽度
	var timer = 0;									//setInterval方法返回值
	
	//设置scroller内容超过边缘时隐藏内容
	scroller.style.overflow = "hidden";
	
	this.getSpeed = function(){
		return speed;
	};
	
	//设置滚动速度
	this.setSpeed = function(value){
		if("number" != (typeof value) && value < 0 || isNaN(value)){
			return;
		}
		speed = value;
	};
	
	this.getSmoothness = function(){
		return smoothness;
	};
	
	//设置对象每次滚动的像素
	this.setSmoothness = function(value){
		if("number" != (typeof value) && value < 0 || isNaN(value)){
			return;
		}
		smoothness = value;
	};
	
	this.getDirection = function(){
		return direction;
	};
	
	//设置对象滚动方向
	this.setDirection = function(d){
		switch (d.toLowerCase()) {
			case "right" :
				direction = "right";
				lrOrUd = true;
				side = -1;
				break;
			case "left" :
				direction = "left";
				lrOrUd = true;
				side = 1;
				break;
			case "down" :
				direction = "down";
				lrOrUd = false;
				side = -1;
				break;
			default :
				direction = "up";
				lrOrUd = false;
				side = 1;
				break;
		}
	};
	
	//设置属性 pJson为json对象 如设置速度为30,平滑度为2{setSpeed:30,setSmoothness:2};
	this.execute = function(pJson){
		if(typeof pJson != "object") return;
		for(var p in pJson){
			switch (typeof othis[p]){
				case "undefined" : 
					break;
				case "function" :
					othis[p](pJson[p]);
					break;
				default :
					othis[p] = pJson[p];
			}
		}
	}
	
	//开始
	this.start = function(){
		othis.stop();
		if(lastScrollFn != lrOrUd)
			createTable(lrOrUd);
		var onScroll = lrOrUd ? LeftRight : UpDown;
		timer = window.setInterval(function(){ onScroll.call(); }, speed);
		lastScrollFn = lrOrUd
	};
	
	//逆向滚动
	this.converseStart = function(){
		switch (direction) {
			case "right" :
				othis.setDirection("left");
				break;
			case "left" :
				othis.setDirection("right");
				break;
			case "down" :
				othis.setDirection("up");
				break;
			default :
				othis.setDirection("down");
				break;
		}
		othis.start();
	}
	
	//停止
	this.stop = function() {
  	clearInterval(timer);
	};
	
	//当对象滚动时要调用的方法 默认为null
	this.scrollFn = null;
	
	//获取鼠标进入对象时要调用的方法
	this.getMouseEnter = function(){
		return scroller.onmouseenter;
	}
	
	//设置鼠标进入对象时要调用的方法
	this.setMouseEnter = function(fn){
		scroller.onmouseenter = fn;
	}
	
	//获取鼠标离开对象时要调用的方法
	this.getMouseLeave = function(){
		return scroller.onmouseleave;
	}
	
	//设置鼠标离开对象时要调用的方法
	this.setMouseLeave = function(fn){
		scroller.onmouseleave = fn;
	}
	
	//私有方法 在右滚动
	function LeftRight(){
		scroller.scrollLeft = getScroll(scroller.scrollLeft);
		if(this.scrollFn)this.scrollFn.call(this);
	}
	
	//私有方法 上下滚动
	function UpDown(){
		scroller.scrollTop = getScroll(scroller.scrollTop);
		if(this.scrollFn)this.scrollFn.call(this);
	}
	
	//创建表格 参数d：true创建一个包含正文html的一行二列的表格 false创建一个包含正文html的二行一列的表格
	function createTable(d){
		var tr = "";
		if(d){
			var td = "<td>" + html + "</td>";
			tr = "<tr>" + td + td + "</tr>";
		}else{
			var td = "<td>" + html + "</td>";
			tr = "<tr>" + td + "</tr><tr>" + td + "</tr>";
		}
		var table = "<table border='0' cellpadding='0' cellspacing='0'>" + tr + "</table>";
		scroller.innerHTML = table;
		var obj = scroller.children[0];
		with(obj){
			initialvalue = (d ? (parseInt(style.width) || offsetWidth):(parseInt(style.height) || offsetHeight)) / 2;
		}
		return obj;
	}
	
	function getScroll(scrollNum){
		//side大于0 表示向左 或向上 滚动
		if(side > 0){
			if(scrollNum >= initialvalue){
				scrollNum = 0;
			}else{
				scrollNum += side * smoothness;
				if(scrollNum > initialvalue)
					scrollNum = initialvalue;
			}
		}else{
			if(scrollNum <= 0){
				scrollNum = initialvalue;
			}else{
				scrollNum += side * smoothness;
				if(scrollNum < 0)
					scrollNum = 0;
			}
		}
		return scrollNum;
	}
	
	//捕获scroller鼠标进入事件
	scroller.onmouseenter = this.stop;
	
	//捕获scroller鼠标离开事件
	scroller.onmouseleave = this.start; 
		
	this.execute(execute);
}
