﻿/**
 * Rolling과 관련된 작업을 수행하는 클래스.
 *
 * 사용법
 * var items = new Array();
 * items.push(new RollingItem({'componentId':'componentId'
							, 'id':'itemId'
							, 'imgSrc':'<a href="#"><img src="url" width="154" height="112" alt=""></a>'
							, 'textSrc':'<a href="#">내용</a>'}));
 * var rolling = new Rolling({'rollingItems':items, 'showId':'ROLLING', 'rollingCount':1, 'interval':7});
 * rolling.start();
 */
var Rolling = Class.create();
Rolling.prototype = {
	/* 롤링아이디 */
	id : null,
	/* 롤링객체 배열  */
	items : new Array(),
	/* 롤링주기 (단위:초) */
	interval : 10,
	/* 롤링stop여부  */
	isStop : false,
	/* 한 번 에 보여주는 이미지 개수  */
	rollingCount: 2,
	/* 롤링실행 객체  */
	executor: null,
	/* 롤링시작인덱스  */
	startIndex: 1,
	/* 데이터 show아이디 */
	showId: 'ROLLING',
	/* effect appear 여부 */
	isEffectAppear : false,


	/**
	 * 롤링클래스 생성자 함수.
	 *
	 * @param initParams
	 */
	initialize: function(initParams) {
		rollingObj = this;
		if (initParams.rollingItems) {
			this.items = initParams.rollingItems;
		}
		if (initParams.id) this.id = initParams.id;
		if (initParams.interval) this.interval = initParams.interval;
		if (initParams.isStop) this.isStop = initParams.isStop;
		if (initParams.rollingCount) this.rollingCount = initParams.rollingCount;
		if (initParams.showId) this.showId = initParams.showId;
		if (initParams.isEffectAppear) this.isEffectAppear = initParams.isEffectAppear;
	},
	
	/* 롤링의 시작위치를 랜덤하게 설정한다. */
	setRandomStartIndex: function() {
		this.startIndex = Math.floor(Math.random() * 10) % this.items.size() + 1;
		for(var i = 1; i < this.startIndex; i++) {
			// 시작 위치만큼 아이템을 이동시킨다.
			this.items.push(this.items.shift());
		}
		// 랜덤으로 선택된 아이템을 div 영역에 추가한다.
		for(var i = 0; i < this.rollingCount; i++) {
			if(this.items[i].imgSrc != null) $(rollingObj.showId+'_IMG_'+this.items[i].componentId+'_'+i).innerHTML = this.items[i].imgSrc;
			if(this.items[i].textSrc != null) $(rollingObj.showId+'_TEXT_'+this.items[i].componentId+'_'+i).innerHTML = this.items[i].textSrc;
			if(this.items[i].textSrc1 != null) $(rollingObj.showId+'_TEXT1_'+this.items[i].componentId+'_'+i).innerHTML = this.items[i].textSrc1;
			if(this.items[i].textSrc2 != null) $(rollingObj.showId+'_TEXT2_'+this.items[i].componentId+'_'+i).innerHTML = this.items[i].textSrc2;
		}
	},
	
	addItem: function(rollingItems) {
		this.isStop = true;
		
		for (var i=0; i<rollingItems.size();i++) {
			this.items.push(rollingItems[i]);
		}
		this.items.sort();
		
		this.isStop = false;
	},
	
	
	removeItem: function(itemId) {
		
	},
	
	/**
	 * 롤링을 시작시키는 함수.
	 */
	start: function() {
		this.isStop = false;
		var rollingObj = this;
		this.executor = new PeriodicalExecuter(
						function() {
							rollingObj.rolling.call(rollingObj.rolling, rollingObj, true); 
						}, 
						this.interval
					);
	},
	
	stop: function() {
		this.isStop = true;
	},
	
	reStart: function() {
		this.isStop = false;
	},
	
	/**
	 * 롤링객체를 remove하는 함수.
	 */
	removeRolling: function() {
		this.isStop = true;
		// 초기화
		this.executor = null;
	},
	
	/**
	 * 롤링을 뒤로 진행시키는 함수.
	 * 
	 * @param rollingObj 롤링객체
	 * @param isAuto 자동여부
	 */
	backRolling: function(rollingObj, isAuto) {
		if (isAuto && rollingObj.isStop) return;
		var size = rollingObj.items.size();
		
		// 롤링개수만큼 앞으로  넣는다.
		for (var i=0; i<rollingObj.rollingCount; i++) {
			rollingObj.items.unshift(rollingObj.items.pop());
		}
		
		for (var i=rollingObj.rollingCount-1; i>=0; i--) {
			var obj = rollingObj.items[i];
			if (!obj) continue;
			
			if (obj.func != null && typeof(obj.func) == 'function') {
				obj.func.call(obj.func, obj.arg, true);
				continue;
			}
			
			if ($(rollingObj.showId+'_IMG_'+obj.componentId+'_'+i)) 
				$(rollingObj.showId+'_IMG_'+obj.componentId+'_'+i).innerHTML = obj.imgSrc;				
			
			if (rollingObj.isEffectAppear) {
				var imgs = $(rollingObj.showId+'_IMG_'+obj.componentId+'_'+i).getElementsByTagName("IMG");
				for (var j=0; j<imgs.length; j++) {
					if (j > 0) break;
					setTimeout("changeOpacity(\""+imgs[j].id+"\")", 50);					
				}	
			}
			
			if ($(rollingObj.showId+'_TEXT_'+obj.componentId+'_'+i)) 
				$(rollingObj.showId+'_TEXT_'+obj.componentId+'_'+i).innerHTML = obj.textSrc;
			
			if ($(rollingObj.showId+'_TEXT1_'+obj.componentId+'_'+i)) 
				$(rollingObj.showId+'_TEXT1_'+obj.componentId+'_'+i).innerHTML = obj.textSrc1;
			
			if ($(rollingObj.showId+'_TEXT2_'+obj.componentId+'_'+i)) 
				$(rollingObj.showId+'_TEXT2_'+obj.componentId+'_'+i).innerHTML = obj.textSrc2;
			
			if (i == 0) {
				if (rollingObj.startIndex <= 1) rollingObj.startIndex = size/rollingObj.rollingCount+1;
				rollingObj.startIndex --;
				if ($(rollingObj.showId+'_PAGING_'+obj.componentId)) 
					$(rollingObj.showId+'_PAGING_'+obj.componentId).innerHTML 
							= rollingObj.startIndex + ' / '+ (size/rollingObj.rollingCount);	
			}			
		}
	},
	
	/**
	 * 롤링을 진행시키는 함수.
	 *
	 * @param rollingObj 롤링객체
	 * @param isAuto 자동여부
	 */
	rolling: function(rollingObj, isAuto) {
		// button클릭이 아니거나 stop인 경우
		if (isAuto && rollingObj.isStop) return;
		var size = rollingObj.items.size();
		
		// 롤링개수만큼 뒤로 넣는다.
		for (var i=0; i<rollingObj.rollingCount; i++) {
			rollingObj.items.push(rollingObj.items.shift());
		}
		
		// 이후 롤링개수 만큼 show한다.
		for (var i=0; i<rollingObj.rollingCount; i++) {
			var obj = rollingObj.items[i];
			if (!obj) continue;
			if (obj.func != null && typeof(obj.func) == 'function') {
				obj.func.call(obj.func, obj.arg, true);
				continue;
			}
			
			if ($(rollingObj.showId+'_IMG_'+obj.componentId+'_'+i)) 
				$(rollingObj.showId+'_IMG_'+obj.componentId+'_'+i).innerHTML = obj.imgSrc;
			
			if (rollingObj.isEffectAppear) {
				var imgs = $(rollingObj.showId+'_IMG_'+obj.componentId+'_'+i).getElementsByTagName("IMG");
				for (var j=0; j<imgs.length; j++) {
					if (j > 0) break;
					setTimeout("changeOpacity(\""+imgs[j].id+"\")", 50);					
				}	
			}
			
			if ($(rollingObj.showId+'_TEXT_'+obj.componentId+'_'+i)) {
				$(rollingObj.showId+'_TEXT_'+obj.componentId+'_'+i).innerHTML = obj.textSrc;
			}
			
			if ($(rollingObj.showId+'_TEXT1_'+obj.componentId+'_'+i)) 
				$(rollingObj.showId+'_TEXT1_'+obj.componentId+'_'+i).innerHTML = obj.textSrc1;
			
			if ($(rollingObj.showId+'_TEXT2_'+obj.componentId+'_'+i)) 
				$(rollingObj.showId+'_TEXT2_'+obj.componentId+'_'+i).innerHTML = obj.textSrc2;
			
			if ((i+1) == rollingObj.rollingCount) {
				if (rollingObj.startIndex >= (size/rollingObj.rollingCount)) rollingObj.startIndex = 0;
				rollingObj.startIndex ++;
				if ($(rollingObj.showId+'_PAGING_'+obj.componentId)) 
					$(rollingObj.showId+'_PAGING_'+obj.componentId).innerHTML 
							= rollingObj.startIndex + ' / '+ (size/rollingObj.rollingCount);	
			}						
		}
	}
}

var _OPACITY_PREFIX = "alpha(opacity=";
var _OPACITY_SURFIX = ")";
function changeOpacity(id) {
	try {
		if ($(id) && $(id).style.filter) {
			var v = $(id).style.filter;
			var opacity = Number(v.substring(v.indexOf(_OPACITY_PREFIX)+14, v.indexOf(_OPACITY_SURFIX)));
			if (opacity < 100) {
				$(id).style.filter = _OPACITY_PREFIX + (opacity+5) + _OPACITY_SURFIX;
				setTimeout("changeOpacity(\""+id+"\")", 50);
			}
		}
	} catch (e) {
		// skip
	}
}

/**
 * Rolling을 수행하는 아이템.
 */
var RollingItem = Class.create();
RollingItem.prototype = {
	componentId: null,
	id: null,
	imgSrc: null,
	textSrc: null,
	textSrc1: null,
	textSrc2: null,	
	func: null,
	arg: null,
	
	initialize: function(initParams) {
		if (initParams.componentId) this.componentId = initParams.componentId;
		if (initParams.id) this.id = initParams.id;
		if (initParams.imgSrc) this.imgSrc = initParams.imgSrc;
		if (initParams.textSrc) this.textSrc = initParams.textSrc;
		if (initParams.textSrc1) this.textSrc1 = initParams.textSrc1;
		if (initParams.textSrc2) this.textSrc2 = initParams.textSrc2;	
		if (initParams.func) this.func = initParams.func;
		if (initParams.arg) this.arg = initParams.arg;
	}
}
