// 배너나 기타 뷰를 스크롤 애니메이션을 통해 이동하며 교체하는 효과로 전환하는 클래스.
// 제작자 : 함승목.
///////////////////////// hamt scroller
var HScroller = function (objname, parentid, width, height, type)//type left:왼쪽으로 right:오른쪽으로 top:위로 bottom:아래로
{
    this.tanspeed = 0.7;//탄성계수. 1미만 소수점으로. 클수록 부드럽게~
    this.speed = 10;//스크롤 스피드. X/1000초. 작을수록 빠름
    this.duration = 200;//스크롤 후 대기시간. 클수록 오래머뭄.speed값에따라 적절히~
    
    //height += 10;
    this.width = width+10;
    this.height = height;
    this.type = type;
    
    this.objname = objname;
    this.parentid = parentid;
    this.durationcount = 0;
    this.stopflag = 0;
    this.outbox = document.createElement('div');
    this.outbox.style.position = 'relative';
    this.outbox.style.overflow = 'hidden';
    this.outbox.style.width = width+'px';
    this.outbox.style.height = height+'px';
    
    this.items = [];
    this.direction = type;
    this.interrupt = 0;
    this.viewnode = 0;
    
    this.remain = 0;
	this.pageJump = null;

	this.move_finish_call = '';

	var onlyone = false;
    
    this.add = function(item) //UI html을 인자로 넣어 추가.
    {
        

		if(this.type != 'top' && this.type != 'bottom')
		{
			var itembox = document.createElement('span');

			this.outbox.appendChild(itembox);
			itembox.style.position = 'absolute';
			itembox.style.left = (this.width*this.items.length)+'px';
		}
		else
		{
			var itembox = document.createElement('div');

			this.outbox.appendChild(itembox);

			itembox.style.position = 'absolute';
			itembox.style.top = (this.height*this.items.length)+'px';
			itembox.style.left = '0px';

			itembox.style.width = this.width-10+'px';
			//itembox.style.height = this.height+'px';
			//itembox.style.backgroundColor = 'red';
			
		}

        itembox.innerHTML = item;
        
        
        this.items[this.items.length] = itembox;
    }
    this.moveTo = function(dir)
    {
        if(this.remain > 0)
            return;
        this.interrupt = 1;
        
        this.direction = dir;
        this.durationcount = this.duration;
    }
	this.movePage = function(page) { // page는 0부터 시작. index값

		if(this.remain > 0)
            return;
		page = page % this.items.length;

		if(this.viewnode < page) { // 순방향
			this.interrupt = 1;
			this.durationcount = this.duration;
			this.direction = this.type;
			this.pageJump = page - this.viewnode;
			switch(this.type) {
				case 'left' :
					this.goleft();
					break;
				case 'right' :
					this.goright();
					break;
				case 'top' :
					this.gotop();
					break;
				case 'bottom' :
					this.gobottom();
					break;
			}
		} else if(this.viewnode > page) { // 역방향
			this.interrupt = 1;
			this.durationcount = this.duration;
			this.pageJump =  this.viewnode - page;
			switch(this.type) {
				case 'left' :
					this.direction = 'right';
					this.goright();
					break;
				case 'right' :
					this.direction = 'left';
					this.goleft();
					break;
				case 'top' :
					this.direction = 'bottom';
					this.gobottom();
					break;
				case 'bottom' :
					this.direction = 'top';
					this.gotop();
					break;
			}
		}
	}


    this.print = function() // 모두 add 한 후 호출.
    {
		
		if(this.items.length < 2) {
			onlyone = true;
		} else {
			this.add(this.items[0].innerHTML);
		}
        
        var parent = document.getElementById(this.parentid);
		
        parent.appendChild(this.outbox);
		
		if(onlyone == false)
			this.run();
    }


    this.stop = function() //마우스가 올라가는 등 스크롤 멈출때 호출.
    {
        this.stopflag = 1;
    }
    this.endstop = function()//마우스가 나가는 등 멈춤 해제시 호출.
    {
        this.stopflag = 0;
    }
    
    
    
	
	/// private
    this.move = function()
    {
        if(this.remain == 0 && this.interrupt==0 && this.stopflag)
            return;
        
        if(!this.remain)
        {
            if(this.durationcount >= this.duration)
            {
                this.durationcount = 0;
            }
            else
            {   
                this.durationcount++;
                return;
            }
        }
        if(this.direction == 'left')
            this.goleft();
        else if(this.direction == 'right')
            this.goright();
		else if(this.direction == 'top')
            this.gotop();
		else if(this.direction == 'bottom')
            this.gobottom();

    }
    this.goleft = function()
    {
        if(this.viewnode == this.items.length-1)
        {
            for(var i = 0 ; i < this.items.length ; i++)
            {
                this.items[i].style.left = this.width*i+'px';
            }
            this.viewnode = 0;
        }
        var lastflag = 0;
        var itemlast = 0;
        var obj = this.items[this.items.length-1];

		var jump = 1;
		if(this.pageJump != null) {
			jump = this.pageJump;
		}
        
        if(!this.remain) {
            this.remain = this.width*jump;
		}
        var ori = this.remain;
        this.remain *= this.tanspeed;
        var minus = ori - this.remain;
        
        if(minus < 1)
        {   
            this.remain = 0;
            this.durationcount = 0;
            minus = 0;
            this.direction = this.type;
            this.interrupt = 0;
            itemlast = 1;
            if(this.viewnode == this.items.length-1)
            {
                lastflag = 1;
            }
            this.viewnode += jump;
        }
        
        for(var i = 0 ; i < this.items.length ; i++)
        {
            if(!lastflag)
            {
                if(!itemlast)
                    this.items[i].style.left = (this.items[i].style.left.split('px')[0]-minus)+'px';
                else
                    this.items[i].style.left = this.width*(i-this.viewnode)+'px';
            }
            else
            {   
                this.items[i].style.left = this.width*i+'px';
                this.viewnode = 0;
            }
        }
        if(minus < 1 ) {
			if(this.move_finish_call.length > 0) {
				eval(this.move_finish_call);
			}
			this.pageJump = null;
		}
    }
    this.goright = function()
    {
        if(this.viewnode == 0)
        {
            for(var i = 0 ; i < this.items.length ; i++)
            {
                this.items[i].style.left = -1*this.width*(this.items.length-1-i)+'px';
            }
            this.viewnode = this.items.length-1;
        }
        var lastflag = 0;
        var itemlast = 0;
		var jump = 1;
		if(this.pageJump != null) {
			jump = this.pageJump;
		}
        if(!this.remain) {
            this.remain = this.width*jump;
		}
        var ori = this.remain;
        this.remain *= this.tanspeed;
        var plus = ori - this.remain;
        
        if(plus < 1)
        {   
            this.remain = 0;
            this.durationcount = 0;
            plus = 0;
            this.direction = this.type;
            this.interrupt = 0;
            itemlast = 1;
            if(this.viewnode == 0)
                lastflag = 1;
            this.viewnode -= jump;
        }
        
        for(var i = 0 ; i < this.items.length ; i++)
        {
            if(!lastflag)
            {
                if(!itemlast)
                { 
                    this.items[i].style.left = (parseInt(this.items[i].style.left.split('px')[0])+plus)+'px';
                }
                else
                {   
                    this.items[i].style.left = this.width*(i-this.viewnode)+'px';
                }
            }
            else
            {   
                this.items[i].style.left = -1*this.width*(this.items.length-1-i)+'px';
                this.viewnode = this.items.length-1;
            }
        }

        if(plus < 1 ) {
			if(this.move_finish_call.length > 0) {
				eval(this.move_finish_call);
			}
			this.pageJump = null;
		}
    }
	this.gotop = function()
    {
        if(this.viewnode == this.items.length-1)
        {
            for(var i = 0 ; i < this.items.length ; i++)
            {
                this.items[i].style.top = this.height*i+'px';
            }
            this.viewnode = 0;
        }
        var lastflag = 0;
        var itemlast = 0;
        var obj = this.items[this.items.length-1];
		var jump = 1;
		if(this.pageJump != null) {
			jump = this.pageJump;
		}
        if(!this.remain) {
            this.remain = this.height*jump;
		}
        var ori = this.remain;
        this.remain *= this.tanspeed;
        var minus = ori - this.remain;
        
        if(minus < 1)
        {   
            this.remain = 0;
            this.durationcount = 0;
            minus = 0;
            this.direction = this.type;
            this.interrupt = 0;
            itemlast = 1;
            if(this.viewnode == this.items.length-1)
            {
                lastflag = 1;
            }
            this.viewnode += jump;
        }
        
        for(var i = 0 ; i < this.items.length ; i++)
        {
            if(!lastflag)
            {
                if(!itemlast)
                    this.items[i].style.top = (this.items[i].style.top.split('px')[0]-minus)+'px';
                else
                    this.items[i].style.top = this.height*(i-this.viewnode)+'px';
            }
            else
            {   
                this.items[i].style.top = this.height*i+'px';
                this.viewnode = 0;
            }
        }
        if(minus < 1 ) {
			if(this.move_finish_call.length > 0) {
				eval(this.move_finish_call);
			}
			this.pageJump = null;
		}
    }
	this.gobottom = function()
    {
        if(this.viewnode == 0)
        {
            for(var i = 0 ; i < this.items.length ; i++)
            {
                this.items[i].style.top = -1*this.height*(this.items.length-1-i)+'px';
            }
            this.viewnode = this.items.length-1;
        }
        var lastflag = 0;
        var itemlast = 0;
		var jump = 1;
		if(this.pageJump != null) {
			jump = this.pageJump;
		}
        if(!this.remain) {
            this.remain = this.height*jump;
		}
        var ori = this.remain;
        this.remain *= this.tanspeed;
        var plus = ori - this.remain;
        
        if(plus < 1)
        {   
            this.remain = 0;
            this.durationcount = 0;
            plus = 0;
            this.direction = this.type;
            this.interrupt = 0;
            itemlast = 1;
            if(this.viewnode == 0)
                lastflag = 1;
            this.viewnode -= jump;
        }
        
        for(var i = 0 ; i < this.items.length ; i++)
        {
            if(!lastflag)
            {
                if(!itemlast)
                { 
                    this.items[i].style.top = (parseInt(this.items[i].style.top.split('px')[0])+plus)+'px';
                }
                else
                {   
                    this.items[i].style.top = this.height*(i-this.viewnode)+'px';
                }
            }
            else
            {   
                this.items[i].style.top = -1*this.height*(this.items.length-1-i)+'px';
                this.viewnode = this.items.length-1;
            }
        }
        if(plus < 1 ) {
			if(this.move_finish_call.length > 0) {
				eval(this.move_finish_call);
			}
			this.pageJump = null;
		}
    }
    
    this.run = function()
    {
       this.move();
       setTimeout(this.objname+".run()", this.speed);
    }
    
}


