

// scrollObj v1.0 (자바스크립트 스크롤러 오브젝트) 2007년 9월 16일
// 작성자: 위스턴(lordwystan@gmail.com)
// 라이센스: CCL(Creative Commons License)의 "저작자표시 3.0" 라이센스 적용
// (http://creativecommons.org/licenses/by/3.0/deed.ko)

var scrollObj = function(targetEle, isVertical, sumMargin, movePx, startNum, interval, isInverse, stopDuration) {
// 기본 오류 처리
	
	if (!document.getElementById) { return false; }
	if (!document.getElementsByTagName) { return false; }
	if (!document.getElementById(targetEle)) { return false; }
	
// Private 변수: 오브젝트 선언 후 변경할 수 없음 
	// 스크롤할 요소(ul, ol 등)
	var targetEle = document.getElementById(targetEle);
	// 스크롤 방향 설정: false->가로, true->세로
	var isVertical = (typeof isVertical != "undefined")? isVertical : false;
	// 리스트 요소(li)의 마진값
	var sumMargin = (typeof sumMargin != "undefined")? sumMargin : 0;
	// 이동할 거리(단위: px)
	var movePx = (typeof movePx != "undefined")? movePx : 1;
	// 
	var startNum = (typeof startNum != "undefined")? startNum : 2;

// Public 변수
	// 스크롤 시간 간격(단위: ms)
	this.interval = (typeof interval != "undefined")? interval : 25;
	// 스크롤 방향 설정: false->left or top, true->right or bottom
	this.isInverse = (typeof isInverse != "undefined")? isInverse : false;
	// 스크롤 도중 정지 시간(단위: ms)
	this.stopDuration = (typeof stopDuration != "undefined")? stopDuration : 0;
	// 스크롤 정지 여부: false->스크롤, true->정지
	this.isStop = false;
	
	if(!targetEle.getElementsByTagName("li")) { return false; }
	
	var liArray = targetEle.getElementsByTagName("li");
	// 리스트 항목(li)은 최소 2개 이상이어야 함
	if (liArray.length < startNum || startNum < 2) { return false; }

	// 첫 번째 리스트 항목이 startNum 번째 오도록 순서 변경
	for (var i = 0; i < startNum - 1; i++)
	{
		targetEle.insertBefore(liArray[liArray.length - 1], liArray[0]);
	}
	// startNum 번째 항목 왼쪽 거리 계산해서 현재 위치로 설정(absolue positioning)
	var currentPos = 0;
	for (var j = 0; j < startNum - 1; j++)
	{
		currentPos -= (isVertical)? (liArray[j].offsetHeight + sumMargin) : (liArray[j].offsetWidth + sumMargin);
	}
	// setTimeout을 호출하는 Private 함수(http://www.faqts.com/knowledge_base/view.phtml/aid/2311 참고)
	var scrollOn = function (sender, timerInterval) {
		var newThis = sender;
		window.setTimeout(function () { newThis.scrollStart() }, timerInterval);
	}
	
	// 이동 거리 초기화
	var stopDistance = 0;

	// 실제 스크롤시키는 Public method
	this.scrollStart = function () {
		if (!this.isStop) { 
			var moveDistance = (this.isInverse)? movePx : -movePx;
			// 현재 위치 변경
			currentPos = parseInt(currentPos) + moveDistance;
			// 이동 거리 변경
			stopDistance += moveDistance;
			// 기준 요소
			var indexEle = (this.isInverse)? liArray[startNum - 2] : liArray[startNum - 1];
			var stopEleDim = (isVertical)? indexEle.offsetHeight + sumMargin : indexEle.offsetWidth + sumMargin;
			// 다음 함수 호출 시간(stopDuration 적용 위함)
			var moveInterval = this.interval;
			// 이동한 거리가 기준 요소의 너비(또는 높이)와 일치할 경우
			if (Math.abs(stopDistance) >= stopEleDim)
			{
				var lastEleDim = (isVertical)? liArray[liArray.length - 1].offsetHeight + sumMargin : liArray[liArray.length - 1].offsetWidth + sumMargin;
				var firstEleDim = (isVertical)? liArray[0].offsetHeight + sumMargin : liArray[0].offsetWidth + sumMargin;
				// 반대 방향(right, bottom)이고 이동거리가 양수일 때(반대 방향 이동)
				if (this.isInverse && stopDistance > 0)
				{
					// 마지막 요소가 맨 앞으로 오므로 마지막 요소의 너비(또는 높이)를 빼줌
					currentPos  -= lastEleDim;
					// 이동 거리가 1보다 클 경우 오차 보정
					currentPos -= (stopDistance - stopEleDim)
					// 마지막 요소를 맨 앞으로 보냄
					targetEle.insertBefore(liArray[liArray.length - 1], liArray[0]);
					// 이동 거리 초기화
					stopDistance = 0;
					// 다음 실행 시간을 stopDuration으로 설정(잠시 정지시킴)
					moveInterval = this.stopDuration;
				// 반대의 경우
				} else if (!this.isInverse && stopDistance < 0) 
				{
					currentPos += firstEleDim;
					currentPos -= (stopDistance + stopEleDim)
					targetEle.appendChild(liArray[0]);
					stopDistance = 0;
					moveInterval = this.stopDuration;
				}
			}
			currentPos += "px";
			// 리스트의 절대 좌표 변경으로 스크롤 효과 발생
			if (isVertical)
			{
				targetEle.style.top = currentPos;
			} else {
				targetEle.style.left = currentPos;
			}
		}
		// setTimeout을 호출하는 scrollOn 함수 실행
		scrollOn(this, moveInterval);
	}
	// 오브젝스 선언과 함께 스크롤 자동 시작
	this.scrollStart();
	
	
}