/**
* Author    : MC 심새 (ganer9r@naver.com)
* Make Date : 2008-07-15
* comment    : 1줄 텍스트 롤링 스크립트
 **/
 var ScrollControl    = function(objId,options){
   this.init(objId,options);
 }
 ScrollControl.prototype    = {
   stage : {
   }
   ,
   options : {
   }
   ,
   isover : false,
   freeze : false,
   course : 'top',
   itimes : 0,
   top : 0,

   init : function(objId,options){
     this.setOptions(options);
     this.setStage(objId);
     this.setTrueData();

     this.move();
   }
   ,
   setOptions : function(options){
     options.inteval    = options.inteval    || 50;
     options.freeze    = options.freeze    || 1000;
     options.height    = parseInt(options.height, 10)    || 20;
     options.style    = options.style || 'scroll';
     options.line    = options.line || 1;
     options.stopline    = options.stopline || options.line;
     options.reverse    = options.reverse || '';
     options.debug    = options.debug || false;

     options.blockHeight    = options.height * options.line;
     options.stopHeight    = options.height * (options.stopline || options.line);


     //        options.cMarginTop    = options.cMarginTop    || (options.height/2) * 0.3;
     options.cMarginTop    = 0;
     options.cHeight        = options.height - options.cMarginTop;
     options.freeze        = (options.style == 'no-freeze') ? options.inteval : options.freeze;

     switch(options.style){
       case 'jump' :        options.style = options.style;
       break;
       default :            options.style = 'scroll';
       break;
     }


     this.course        = options.start || 'top';
     this.options    = options;
   }
   ,
   setTrueData : function(){
     var cObjs        = this.stage.childNodes;
     var cObjLen        = cObjs.length;
     var removes        = [];

     for(var i=0;i<cObjs.length;i++){
       if(!cObjs[i].tagName){
         removes.push(cObjs[i]);    //바로 삭제 시 데이터 꼬이는듯 하여 일단 킵함.
       }
       else{
         cObjs[i].style.margin        = "0";

         cObjs[i].style.marginTop    = this.options.cMarginTop;
         cObjs[i].style.height        = this.options.cHeight+'px';
       }
     }

     // 찾은 데이터를 삭제함.(FF의 경우 text 노드가 첨부됨.)
     for(var i=0;i<removes.length;i++){
       this.stage.removeChild(removes[i]);
     }

     if(!this.options.debug && cObjLen <= this.options.line ){
       var attachLen    = parseInt(this.options.line/cObjLen, 10);

       for(var i=0; i<attachLen; i++){
         for(var j=0; j<cObjLen; j++){
           this.stage.appendChild( cObjs[j].cloneNode(true) );
         }
       }
     }

   }
   ,
   setStage : function(objId){
     var This    = this;
     this.stage        = document.getElementById(objId);

     this.stage.style.height        = this.options.blockHeight+'px';
     this.stage.style.padding    = "0px";
     this.stage.style.margin        = "0px";

     if(!this.options.debug)
       this.stage.style.overflow    = "hidden";


     this.stage.onmouseover    = function(){
       This.isover=true;
     }
     this.stage.onmouseout    = function(){
       This.isover=false;
     }

     this.stage.scrollTop        = 0;    //파폭에서 리프래시 문제
   }
   ,
   setCourse : function(course){
     if(this.course != 'down' && course == 'down' && this.stage.scrollTop <= 0){
       this.changeChild();
       this.stage.scrollTop = this.options.height;
     }
     else if(course == 'top' && this.stage.scrollTop >= this.options.height){
       if(this.options.reverse != 'all'){
         this.changeChild(this.options.line);
         this.stage.scrollTop = this.stage.scrollTop - this.options.stopHeight;
       }
     }

     this.course    = course;
     if(this.itimes > 0){
       window.clearTimeout(this.itimes);
       this.move();
     }
   }
   ,
   changeChild : function(count){
     if(count == undefined){
       count    = this.stage.childNodes.length - 1;
     }

     for(var i=0; i<count;i++ ){
       this.stage.appendChild( this.stage.childNodes[0] );    // 항상 첫번째것을 뒤로 이동
     }
   }
   ,
   actionTop : function(){
     if(this.options.style == 'jump'){
       this.changeChild(this.options.stopline);
       this.stage.scrollTop = 0;
       this.freeze            = true;
     }
     else{
       this.top++;
       this.stage.scrollTop++;

       if( this.stage.scrollTop >= this.options.height ){
         this.changeChild(1);
         this.stage.scrollTop = this.stage.scrollTop - this.options.height;

         //if문 안에 있는게 효율
         if( this.top >= this.options.stopHeight ){
           this.top            = 0;
           this.freeze            = true;
           if(this.options.reverse == 'top' || this.options.reverse == 'all')    this.setCourse("down");
         }
       }
     }
   }
   ,
   actionDown : function(){
     if(this.options.style == 'jump'){
       this.freeze                = true;
       for(var i=0; i<this.options.stopline;i++){
         this.changeChild();
       }
     }
     else{
       this.top--;
       this.stage.scrollTop--;

       if( this.stage.scrollTop <= 0 ){
         this.changeChild();
         this.stage.scrollTop = this.stage.scrollTop + this.options.height;

         //Math.abs 로 구할 수 있지만, Math함수가 무거운 관계로 음수 처리함.(if문 안에 있는게 효율)
         if( -(this.top) >= this.options.stopHeight ){
           for(var i=1; i<this.options.stopline;i++){
             this.changeChild();
           }

           this.top            = this.top + this.options.stopHeight;
           this.freeze            = true;
         }
       }
     }

     if(this.freeze){
       this.stage.scrollTop    = this.options.stopHeight;
       if(this.options.reverse == 'down' || this.options.reverse == 'all')    this.setCourse("top");
     }

   }
   ,
   move : function(){
     this.itimes    = 0;
     if(!this.isover){
       if(this.course == 'top')    this.actionTop();
       else                        this.actionDown();
     }

     var This    = this;
     if(this.freeze){
       this.itimes    =        window.setTimeout(function(){This.move()}, this.options.freeze);
     }
     else{
       window.setTimeout(function(){This.move()}, this.options.inteval);
     }
     this.freeze    = false;
   }

 }


 /* 사용법 Start*/
 //    var scroll    = new ScrollControl('html element id',options);
 //
 //    options 항목
 //    inteval : 재귀호출 시간 간격 1/1000초(기본값 50)
 //    freeze : 잠시 멈춰 있는 시간 간격 1/1000 초(기본값 1000)
 //    height : 객체 높이(기본값 20)
 //    cMarginTop : 자동으로 구해주나, 글자 크기와 객체 높이 등으로 인해, 의도한 높이가 나오지 않을 수 있기 때문에 사용자가 강제 입력함.
 //    line : 스크롤 line를 구함.(해당 객체의 높이는 line * height)가 됨.
 //    stopline : 기본값(line와 같음), stopline 정보에 따라 line와는 독립적으로 스크롤을 freeze 시킴.
 //    start : 기본값 'top', top,down 두 값이 있음.
 //    reverse : [ | all | top | down ]
 //            none    - none가 아닌, 값이 없다는 뜻임. 실제값 string ''값
 //            all        - 위, 아래에 모두 reverse를 시킴. 이 설정을 하는 경우 위아래로 왔다갔다 함.
 //            top        - course가 top인 경우, setCourse('down')을 호출함
 //            down    - course가 down인 경우, setCourse('top')을 호출함
 //    style : [ scroll | jump | s-jump | jump-s ]
 //            scroll    - 기본 스크롤 및 setCourse 호출 시에도 스크롤 이동. [기본형]
 //            jump    - 기본으로 다음 항목으로 점프 및 setCourse 호출 시에도 점프 이동.
 //
 /* 사용법 End */



