/*
ARIAwork.com, Professional Script creating Group

ARIAlist3.js 2008/03/25

desc    : ARIAlists Class / UTF-8

history : 2008/03/25, squall
          2008/04/24, squall 퀵메뉴 버그 수정
          2008/04/24, squall getSelectObject 버그수정
          2008/08/08, squall setSelectIndex, setSelect 추가
          
Copyright (c) 2000-2008 NAMUsoft, Inc. All Rights Reserved.

This software is the proprietary information of NAMUsoft, Inc.
Use is subject to license terms.

===============================================================

Class Structure
# Common
  - initialize

# Event
  - onmouseover
  - onmousedown
  - onmouseup
  - onmousemove
  - onclick
  - ondblclick
  - oncontextmenu
  - resetHeaderPosition
  - setHeaderPosition
  - TRoverObject
  - TRoutObject

# Method
  - getIndexToObject
  - ProcessIng
  - selectObjClear
  - setContent
  - getSelectObject

# Header
  - makeHeader
  - alignResizer
  - alignHeader
  - resetHeader

# List
  - LoadingDisplay
  - setPars
  - listLoad
  - listLoadOK
  - sortList
  - listPrint
  - listPrintSpool
  - spoolCounter

# Etc
  - ajaxReportError

*/

var ARIAlist = Class.create({
  /* Common */
  initialize: function(oTG, oOPT){
    this.TG = oTG;
    this.OPT = oOPT;
    this.makeHeader(); // Header Define
    this.CntNum = this.OPT.rowConut; //한번에 출력되는 리스트 갯수
    this.DrawingCnt = 0;
    this.NowRowCnt = 0;
    
    this.OPT.bgColors = {over:"#f2f9fc",on:"#d9ecf6",off:"#ffffff"};
    
    this.resizeObserver = null;
    /* Mouse Stat */
    this.resized = false; //resize stat
    this.resizeIndex = 0;
    this.selectObj = []; //selectObject Pool
    this.selected = false; //selector stat
    this.selectSPos = {x:0,y:0};


    /* Event init */
    Event.observe(this.TG, "resize", this.onResize.bindAsEventListener(this));
    
    Event.observe(this.TG, 'scroll', this.resetHeaderPosition.bindAsEventListener(this));
    
    Event.observe(this.TG, 'mouseover', this.onmouseover.bindAsEventListener(this));
    Event.observe(this.TG, 'mouseout', this.onmouseout.bindAsEventListener(this));

    Event.observe(this.TG, 'mousedown', this.onmousedown.bindAsEventListener(this));
    Event.observe(this.TG, 'mouseup', this.onmouseup.bindAsEventListener(this));
    Event.observe(this.TG, 'mousemove', this.onmousemove.bindAsEventListener(this));

    Event.observe(this.TG, 'click', this.onclick.bindAsEventListener(this));
    Event.observe(this.TG, 'dblclick', this.ondblclick.bindAsEventListener(this));
    Event.observe(this.TG, 'contextmenu', this.oncontextmenu.bindAsEventListener(this));
    Event.observe(this.TG, 'keydown', this.onKeyPress.bindAsEventListener(this));
    /* Event init */
    
    this.tPos = Element.cumulativeOffset(this.TG);
  },
  /* Common */
  /* Event */
  onResize: function(){
    if(this.resizeObserver) clearTimeout(this.resizeObserver);
    this.resizeObserver = setTimeout(this.resetHeaderPosition.bind(this), 500);
  },
  onmouseover: function(event){
    var TGID = this.TG.id;
    var eventTD = Event.findElement(event, "TD");
    if(eventTD){
      var Rindex;
      Rindex = ARIA.findID(eventTD.id, "tr");
      if(Rindex != undefined){
        this.TRoverObject(Rindex);
      }
      var Hindex;
      Hindex = ARIA.findID(eventTD.id, "head");
    }

    if(!this.resized && Hindex != undefined){
      $(TGID+"#head{"+Hindex+"}").removeClassName("fbw_box_Down");
      $(TGID+"#head{"+Hindex+"}").addClassName("fbw_box_Over");
    }

  },
  onmouseout: function(event){
    var TGID = this.TG.id;
    var eventTD = Event.findElement(event, "TD");
    if(eventTD){
      var Rindex;
      Rindex = ARIA.findID(eventTD.id, "tr");
      if(Rindex != undefined){
        this.TRoutObject(Rindex);
      }
      var Hindex;
      Hindex = ARIA.findID(eventTD.id, "head");
    }
    if(!this.resized && Hindex != undefined){
      $(TGID+"#head{"+Hindex+"}").removeClassName("fbw_box_Over");
    }
  },
  onmousedown: function(event){
    var TGID = this.TG.id;
    var Rindex, Dindex, Hindex, ResizeNo;
    
    if(Event.isLeftClick(event)){
      var eventTD = Event.findElement(event, "TD");
      if(eventTD){
        Rindex = ARIA.findID(eventTD.id, "tr");
        Dindex = ARIA.findID(eventTD.id, "td");
        Hindex = ARIA.findID(eventTD.id, "head");
      }
      var eventDIV = Event.findElement(event, "DIV");
      if(eventDIV){
        ResizeNo = ARIA.findID(eventDIV.id, "resizer");
      }
      if(ResizeNo != undefined){
        this.resized = true;
        this.resizeNo = ResizeNo;
      }else{
        if(Rindex){
          this.selectSPos = {x:Event.pointerX(event),y:Event.pointerY(event)}
          $(TGID+"#selector").show();
          this.selected = true;
        }
      }
      if(!this.resized && Hindex != undefined){
        $(TGID+"#head{"+Hindex+"}").addClassName("fbw_box_Down");
      }
    }else{ //right click then
      var selectObject = this.getSelectObject();
      var bgColors = this.OPT.bgColors;
      
      var eventTD = Event.findElement(event, "TD");
      if(eventTD){
        Rindex = ARIA.findID(eventTD.id, "tr");
        Dindex = ARIA.findID(eventTD.id, "td");
        Hindex = ARIA.findID(eventTD.id, "head");
      }
      
      if(selectObject.length == 1)
      this.selectObjClear();
      
      if(Rindex){
        var selectHave = this.selectObj.include(parseInt(Rindex));
        if(!selectHave){
          this.selectObj.push(parseInt(Rindex));
          this.TRoverObject(Rindex);
        }
      }
      //alert("rdown");
    }
    
    //$("searchWord").value = ResizeNo+"/"+Rindex+"/"+Dindex;
    Position.prepare();
    this.tPos = Position.cumulativeOffset(this.TG);
  },
  onmouseup: function(event){
    var TGID = this.TG.id;
    if(this.resized){
      this.resized=false;
      this.alignResizer();
      this.alignHeader();
    }
    if(this.selected){ //select end
      //this.selected = false;
      $(TGID+"#selector").setStyle({
        left:0+"px", top:0+"px", width:0+"px", height:0+"px"
      });
      $(TGID+"#selector").hide();
    }
    //if(this.selected)
    /*  */
    var TGID = this.TG.id;
    var eventTD = Event.findElement(event, "TD");
    var Hindex;
    if(eventTD){
      Hindex = ARIA.findID(eventTD.id, "head");
    }
    if(!this.resized && Hindex != undefined){
      $(TGID+"#head{"+Hindex+"}").removeClassName("fbw_box_Down");
      $(TGID+"#head{"+Hindex+"}").addClassName("fbw_box_Over");
    }
  },
  onmousemove: function(event){
    var TGID = this.TG.id;
    var Rindex, Dindex, Hindex, ResizeNo;
    var bgColors = this.OPT.bgColors;
    if(this.resized){ //resizing
      Position.prepare();
      var tPos = this.tPos;
      var sPos = Position.cumulativeOffset($(TGID+"#head{"+this.resizeNo+"}"));
      var sBox = $($(TGID+"#head{"+this.resizeNo+"}")).getDimensions();
      var myWidth = ((Event.pointerX(event)+this.TG.scrollLeft) - sPos[0]);

      if(myWidth > 20){
        $(TGID+"#head{"+this.resizeNo+"}").setStyle({
          width:myWidth+"px"
        });
        $(TGID+"#body{"+this.resizeNo+"}").setStyle({
          width:myWidth+"px"
        });
        $(TGID+"#resizer{"+this.resizeNo+"}").style.left = ((Event.pointerX(event)+this.TG.scrollLeft)-3-tPos[0]);
      }
    }
    if(this.selected){ //select start
      var tPos = this.tPos;
      var tTop, tLeft, tWidth, tHeight, yDirection, xDirection;
      var nowX = Event.pointerX(event);
      var nowY = Event.pointerY(event);
      (nowX < this.selectSPos.x) ? tLeft = nowX+this.TG.scrollLeft : tLeft = this.selectSPos.x+this.TG.scrollLeft;
      (nowY < this.selectSPos.y) ? tTop = nowY : tTop = this.selectSPos.y;
      (nowX < this.selectSPos.x) ? xDirection = false : xDirection = true;
      (nowX < this.selectSPos.x) ? yDirection = false : yDirection = true;
      tLeft -= tPos[0];
      tTop -= tPos[1];
      
      tWidth = Math.abs(nowX - this.selectSPos.x);
      tHeight = Math.abs(nowY - this.selectSPos.y);
      $(TGID+"#selector").setStyle({
        left:tLeft-2+"px", top:tTop-2+"px", width:tWidth+4+"px", height:tHeight+4+"px"
      });
      
      var xRange = [tLeft+this.TG.scrollLeft, (tLeft+tWidth)+this.TG.scrollLeft], yRange = [tTop+this.TG.scrollTop, (tTop+tHeight+this.TG.scrollTop)];
      /*  */
      var minNo = parseInt(yRange[0]/(this.OPT.rowHeight+1))-1;
      var maxNo = parseInt(yRange[1]/(this.OPT.rowHeight+1))-1;
      this.selectObjClear();
      for(var n=minNo;n<maxNo+1;n++){
          try{
          this.selectObj.push(parseInt(n));
          $(TGID+"#tr{"+n+"}").setStyle({
          background:bgColors.on
          });
          }catch(e){
            //alert(n); 
          }
      }
    }
  },
  onclick: function(event){
    var TGID = this.TG.id;
    var Rindex, Dindex, Hindex, ResizeNo;
    var bgColors = this.OPT.bgColors;
    var eventTD = Event.findElement(event, "TD");
    if(eventTD){
      Rindex = ARIA.findID(eventTD.id, "tr");
      Dindex = ARIA.findID(eventTD.id, "td");
      Hindex = ARIA.findID(eventTD.id, "head");
    }
    if(Hindex != undefined){
      if(this.OPT.Sorted.index == Hindex){
        if(this.OPT.Sorted.order == "desc"){
          this.OPT.Sorted.order = "asc";
        }else{
          this.OPT.Sorted.order = "desc";
        }
      }else{
        $(TGID+"#head{"+this.OPT.Sorted.index+"}").removeClassName("fbw_box_ON");
        $(TGID+"#head{"+this.OPT.Sorted.index+"}").addClassName("fbw_box_DF");

        this.OPT.Sorted.index = Hindex;
        this.OPT.Sorted.order = "desc";
      }
      this.sortList();
    	this.listPrint();
    	this.alignHeader();
    }
    if(!isNaN(Dindex)){ //content click
      if(event.shiftKey){
        var lastNo = parseInt(this.selectObj.last());
        Rindex = parseInt(Rindex);
        
        if (Rindex < lastNo){
          minNo = Rindex;
          maxNo = lastNo;
        }else{
          minNo = lastNo;
          maxNo = Rindex;
        }
        
        this.selectObjClear();
        
        for(var n=minNo;n<maxNo+1;n++){
          if(n != Rindex){
            this.selectObj.push(parseInt(n));
            if($(TGID+"#tr{"+n+"}"))
            $(TGID+"#tr{"+n+"}").setStyle({
            background:bgColors.on
            });
          }
        }
        this.selectObj.push(parseInt(Rindex));
        $(TGID+"#tr{"+Rindex+"}").setStyle({
        background:bgColors.on
        });
      }else{
        if(!event.ctrlKey){
          this.selectObjClear();
          this.selectObj.push(parseInt(Rindex));
          $(TGID+"#tr{"+Rindex+"}").setStyle({
          background:bgColors.on
          });
        }else{
          var selectHave = this.selectObj.include(parseInt(Rindex));
          if(selectHave){
            this.selectObj = this.selectObj.without(parseInt(Rindex));
            this.TRoutObject(Rindex);
          }else{
            this.selectObj.push(parseInt(Rindex));
            $(TGID+"#tr{"+Rindex+"}").setStyle({
            background:bgColors.on
            });
          }
        }
      }
      
      var myObj = this.getIndexToObject(Dindex);
      if(myObj.onclick){
        myObj.onclick({Ri:Rindex, Di:Dindex, Datas:this.DataSet[Rindex]});
      }
      
    }else{
      if(this.selected){
        
      }else{
        //if(this.QuickMenuSeq != undefined){
        this.selectObjClear();
        //}
      }
    }
    this.selected = false;
  },
  ondblclick: function(event){
    var TGID = this.TG.id;
    var Rindex, Dindex, ResizeNo;
    var eventTD = Event.findElement(event, "TD");
    if(eventTD){
      Rindex = ARIA.findID(eventTD.id, "tr");
      Dindex = ARIA.findID(eventTD.id, "td");
    }

    var eventDIV = Event.findElement(event, "DIV");
    if(eventDIV){
      ResizeNo = ARIA.findID(eventDIV.id, "resizer");
    }

    if(ResizeNo != undefined){
      var myObj = this.getIndexToObject(ResizeNo);
      if(this.DataSet.length > 0){
        var nStrWidth = this.DataSet.max(ARIA.getMaxWidth(myObj.idx, myObj.type));
      }else{
        var nStrWidth = 60;
      }
      if(nStrWidth < 50){nStrWidth += 8;}
      if(nStrWidth < 20){nStrWidth = 20;}

      // position
      var myWidth = nStrWidth;
      $(TGID+"#head{"+this.resizeNo+"}").setStyle({
        width:myWidth+"px"
      });
      $(TGID+"#body{"+this.resizeNo+"}").setStyle({
        width:myWidth+"px"
      });

      this.alignResizer();
      this.alignHeader();
    }else{
      if(!isNaN(Dindex)){
        var myObj = this.getIndexToObject(Dindex);
        if(myObj.ondblclick){
          myObj.ondblclick({Ri:Rindex, Di:Dindex, Datas:this.DataSet[Rindex]});
        }
      }
    }

  },
  oncontextmenu: function(event){
    if(this.OPT.QuickMenus){
      // 선택개체가 있는 경우 event 뒤에 파라미터 전달
      //this.QuickMenus.mOpen(event, 1);
      var selectObject = this.getSelectObject();
      if(selectObject != ""){
        this.QuickMenus.mOpen(event, selectObject);
      }else{
        this.QuickMenus.mOpen(event);
      }
    }
    return false;
  },
  onchange: function(event){
    var TGID = this.TG.id;
    var eventSelect = Event.findElement(event, "SELECT");
    if(eventSelect){
      if(eventSelect.id == TGID+"#pageNo"){
        this.OPT.Paging.AbsolutePage = $(TGID+"#pageNo").value;
        this.listLoad();
      }
    }
  },
  onKeyPress: function(event){
    switch(event.keyCode){
      case Event.KEY_TAB:
      case Event.KEY_RETURN:
      case Event.KEY_ESC:
        Event.stop(event);
        break;
      case Event.KEY_LEFT:
      case Event.KEY_RIGHT:
      case Event.KEY_UP:
      case Event.KEY_DOWN:
      default:
      if(event.keyCode == 67 && event.ctrlKey){
        this.copyData();
      }
    }
  },
  onPageClick: function(event){
    var TGID = this.TG.id;
    var eventIMG = Event.findElement(event, "IMG");
    if(eventIMG){
      if(eventIMG.id == TGID+"#prevPage"){
        if(this.OPT.Paging.AbsolutePage-1 > 0){
        this.OPT.Paging.AbsolutePage = parseInt(this.OPT.Paging.AbsolutePage)-1;
        this.listLoad();
        }
      }
      if(eventIMG.id == TGID+"#nextPage"){
        if(this.OPT.Paging.pageCount > this.OPT.Paging.AbsolutePage){
        this.OPT.Paging.AbsolutePage = parseInt(this.OPT.Paging.AbsolutePage)+1;
        this.listLoad();
        }
      }
    }
  },
  resetHeaderPosition: function(){
    $(this.TG.id+"#container").style.top = this.TG.scrollTop;
    if(this.TG.scrollHeight <= eval(this.TG.scrollTop+this.TG.getHeight())){
			if(this.DataSet){
				if(this.NowRowCnt*this.CntNum < this.DataSet.length){
				var ncnt = this.NowRowCnt+1;
  		  if(ncnt > 0)
  			this.ProcessIng(true); //Processing Start
				this.listPrintSpool(ncnt);
				}
			}
		}
  },
  setHeaderPosition: function(){
    $(this.TG.id+"#container").style.top = this.TG.scrollTop;
  },
  setPagingPosition: function(){

  },
  TRoverObject: function(Ri){
    var TGID = this.TG.id;
    if(Ri != "end"){
    $(TGID+"#tr{"+Ri+"}").setStyle({
      background:this.OPT.bgColors.over
    });
    }
    //$(TGID+"#tr{"+Ri+"}#td{"+Di+"}")
  },
  TRoutObject: function(Ri){
    var TGID = this.TG.id;
    var selectHave = this.selectObj.include(parseInt(Ri));
    if(selectHave){
    $(TGID+"#tr{"+Ri+"}").setStyle({
      background:this.OPT.bgColors.on
    });
    }else{
    $(TGID+"#tr{"+Ri+"}").setStyle({
      background:this.OPT.bgColors.off
    });
    }
    //$(TGID+"#tr{"+Ri+"}#td{"+Di+"}")
  },
  /* Event */
  /* Method */
  getIndexToObject: function(index){
    return this.OPT.Columns.find(function(Col, ii){
      return ii == index;
    });
  },
  getIdxToIndex: function(idx, seq){
    var myIndex;
    this.DataSet.each(function(n, index){
      if(n[seq] == idx){
        myIndex = index;
      }
    });
    return myIndex;
  },
  ProcessIng: function(signal){
    var TGID = this.TG.id;
    if(signal){
      $(TGID+"#temploading").show();
      Position.prepare();
      var TGstartPos  = Position.cumulativeOffset(this.TG);
  	  var ContainBox  = this.TG.getDimensions();
  	  var MyBox       = $(TGID+"#temploading").getDimensions();
      $(TGID+"#temploading").setStyle({
  	    left:ContainBox.width/2-MyBox.width/2+"px", top:ContainBox.height/2-MyBox.height/2+"px"
  	  });
    }else{
      new PeriodicalExecuter(function(pe) {
        $(TGID+"#temploading").hide();
        pe.stop();
      }, 1);
    }
  },
  selectObjClear: function(){
    var TGID = this.TG.id;
    var offs = this.OPT.bgColors.off;
    try{ // if you can't find Object
      this.selectObj.each(function(n, index){
        $(TGID+"#tr{"+n+"}").setStyle({
          background:offs
        });
      });
    }catch(e){
      
    }
    this.selectObj.clear();
  },
  selectAll: function(){
    var TGID = this.TG.id;
    var bgColors = this.OPT.bgColors;
    
    this.selectObjClear();

    for(var n=0;n<this.DataSet.length;n++){
      this.selectObj.push(parseInt(n));
      $(TGID+"#tr{"+n+"}").setStyle({
        background:bgColors.on
      });
    }
  },
  setContent: function(Ri, Di, sText){
    var TGID = this.TG.id;
    $(TGID+"#tr{"+Ri+"}#td{"+Di+"}").update("<nobr style=\"cursor:pointer;\">"+sText+"</nobr>");
    this.DataSet[Ri][Di] = sText;
  },
  getSelectObject: function(){
    var collectObject = [];
    var DataSet = this.DataSet;
    this.selectObj.each(function(n){
      if(DataSet[n])
      collectObject.push(DataSet[n]);
    });
    return collectObject;
  },
  openQuickMenu: function(seq){
    this.QuickMenuSeq = seq;
    
  },
  closeQuickMenu: function(){
    var TGID = this.TG.id;
    this.QuickMenuSeq = undefined;
    if(this.selected){ //select end
      this.selected = false;
      $(TGID+"#selector").setStyle({
        left:0+"px", top:0+"px", width:0+"px", height:0+"px"
      });
      $(TGID+"#selector").hide();
    }
  },
  
  changeData: function(c_value, idx, no){
    var TGID = this.TG.id;
    try{
      var myRi = this.getIdxToIndex(no, 0);
      $(TGID+"#tr{"+myRi+"}#td{"+idx+"}").update("<nobr style=\"cursor:pointer;\">"+c_value+"</nobr>");
      this.DataSet[myRi][idx] = c_value.encode();
      //TGID+"#tr{"+index+"}#td{"+sIndex+"}
    }catch(E){
      alert(E.description);
    }
  },
  
  /* Method */
  /* Header */
  makeHeader: function(){
  	var TGID = this.TG.id;
    
    var rowHeight = this.OPT.rowHeight;
  	/* Header Define */
    var p_out = [];
    p_out.push("<div id=\""+TGID+"#container\" class=\"fbw_box_container\" unselectable=\"on\">");
    p_out.push("  <div id=\""+TGID+"#top\" class=\"fbw_box_top\" unselectable=\"on\">");
    p_out.push("  <table width=100% height=100% cellpadding=0 cellspacing=0 style=\"table-layout:fixed;\">");
    p_out.push("    <tr style=\"height:"+this.OPT.rowHeight+"px;\">");
    this.OPT.Columns.each(function(Col, index){
    p_out.push("      <td class=\"fbw_box_DF\" style=\"width:"+Col.width+"px;height:"+rowHeight+"px;\" id=\""+TGID+"#head{"+index+"}\" title=\""+Col.name+"\" unselectable=\"on\">");
    p_out.push("<nobr class=\"ColumnName\">"+Col.name+"</nobr></td>");
    });
    p_out.push("      <td class=\"fbw_box_DF\">&nbsp;</td>");
    p_out.push("    </tr>");
    p_out.push("  </table>");
    p_out.push("  </div>");
    
    p_out.push("  <div id=\""+TGID+"#sorter\" class=\"fbw_box_sorter\" unselectable=\"on\"></div>");
		this.OPT.Columns.each(function(Col, index){
    p_out.push("  <div id=\""+TGID+"#resizer{"+index+"}\" class=\"fbw_box_resizer\" unselectable=\"on\"></div>");
    });
    p_out.push("  <div id=\""+TGID+"#temploading\" class=\"AriaOPC\" style=\"display:none;width:30px;height:30px;\" unselectable=\"on\"></div>");
    p_out.push("  <div id=\""+TGID+"#selector\" class=\"AriaSelector\" style=\"display:none;\" unselectable=\"on\"></div>");
    
    p_out.push("</div>");
    
    p_out.push("<div id=\""+TGID+"#content\" class=\"fbw_box_content\" unselectable=\"on\"></div>");
    this.TG.update(p_out.join(""));

    if(this.OPT.Paging){
    var b_out = [];
    b_out.push("  <div id=\""+TGID+"#paging\" class=\"fbw_box_BT\">");
    b_out.push("  <table height=100% cellpadding=2 cellspacing=0>");
    b_out.push("    <tr>");
    b_out.push("      <td><img src=\""+this.OPT.Paging.prevPage+"\" align=absmiddle id=\""+TGID+"#prevPage\" style=\"cursor:pointer;\"></td>");
    b_out.push("      <td style=\"padding-left:5px;\">페이지</td>");
    b_out.push("      <td><select name=\""+TGID+"#pageNo\" id=\""+TGID+"#pageNo\"></select></td>");
    b_out.push("      <td>/</td>");
    b_out.push("      <td id=\""+TGID+"#totalPage\"></td>");
    b_out.push("      <td><img src=\""+this.OPT.Paging.nextPage+"\" align=absmiddle id=\""+TGID+"#nextPage\" style=\"cursor:pointer;\"></td>");
    b_out.push("      <td id=\""+TGID+"#totalCount\"></td>");
    b_out.push("      <td id=\""+TGID+"#totalEtc\"></td>");
    b_out.push("    </tr>");
    b_out.push("  </table>");
    b_out.push("  </div>");
    this.OPT.Paging.TG.update(b_out.join(""));
    
    this.OPT.Paging.pageCount = 0;
    this.PageChanges = this.onchange.bindAsEventListener(this);
    Event.observe($(TGID+"#pageNo"), 'change', this.PageChanges);
    this.PageChanges2 = this.onPageClick.bindAsEventListener(this);
    Event.observe($(TGID+"#paging"), 'click', this.PageChanges2);
    }


    /* Loading prepare */
    var l_out = [];
    l_out.push("<img src="+this.OPT.Loading.Img+" border=0>");
    $(TGID+"#temploading").update(l_out.join(""));

    this.alignResizer(); // initialize Colume size.
    this.alignHeader();
    if(this.OPT.Paging)
    this.setPagingPosition();
    
    
    if(this.OPT.AutoStart && this.OPT.URL)
    this.listLoad();

    if(this.OPT.QuickMenus){
    var openQuickMenus   = this.openQuickMenu.bind(this);
    var closeQuickMenus  = this.closeQuickMenu.bind(this);
    this.QuickMenus = new ARIAQuickMenu(
                          $(TGID+"#content"),
                          this.OPT.QuickMenus.List,
                          {openFn:openQuickMenus, closeFn:closeQuickMenus, setWidth:this.OPT.QuickMenus.width, scrollTG:this.OPT.QuickMenus.scrollTG}
                          );
    }

  },
  alignResizer: function(){
  	var TGID = this.TG.id;

    Position.prepare();
    var oTGstatPos, startPos, ContainBox;
    oTGstatPos = Position.cumulativeOffset($(TGID+"#top"));

    this.OPT.Columns.each(function(Col, index){
	    startPos = Position.cumulativeOffset($(TGID+"#head{"+index+"}"));
		  ContainBox = $($(TGID+"#head{"+index+"}")).getDimensions();

		  $(TGID+"#resizer{"+index+"}").setStyle({
		  left:(startPos[0]+ContainBox.width-3-oTGstatPos[0])+"px"
		  });

		  Col.width = ContainBox.width;
	  });
  },
  alignHeader: function(){
    var TGID = this.TG.id;
    var Sort = this.OPT.Sorted;
		this.setHeaderPosition();

    var TGstartPos = Element.cumulativeOffset(this.TG);
    var startPos = Element.cumulativeOffset($(TGID+"#head{"+Sort.index+"}"));
	  var ContainBox = $(TGID+"#head{"+Sort.index+"}").getDimensions();

	  $(TGID+"#sorter").setStyle({
	  left:(startPos[0]+(ContainBox.width/2)-4-TGstartPos[0])+"px"
	  });
	  
	  var MYstartPos = Element.cumulativeOffset($(TGID+"#sorter"));
	  //alert(MYstartPos.left+"/"+MYstartPos.top);

	  if(Sort.order == "desc"){
	    $(TGID+"#sorter").className = "fbw_box_sorterDesc";
	  }else{
	    $(TGID+"#sorter").className = "fbw_box_sorter";
	  }

	  /* header columns define */
    $(TGID+"#head{"+Sort.index+"}").removeClassName("fbw_box_DF");
    $(TGID+"#head{"+Sort.index+"}").addClassName("fbw_box_ON");
  },
  resetHeader: function(){
    var TGID = this.TG.id;
    var Sort = this.OPT.Sorted;

    $(TGID+"#head{"+Sort.index+"}").removeClassName("fbw_box_ON");
    $(TGID+"#head{"+Sort.index+"}").addClassName("fbw_box_DF");
  },
  /* Header */
  /* List */
  LoadingDisplay: function(){
    var TGID = this.TG.id;
    var p_out = [];
    p_out.push("<table cellpadding=0 cellspacing=0 width=100% height=100% class=\"listLoading\">");
    p_out.push("  <tr>");
    p_out.push("    <td align='center'>");
    p_out.push("    <table cellpadding=0 cellspacing=0 border=0><tr><td><img src="+this.OPT.Loading.Img+" border=0></td>");
    p_out.push("    <td id=LoadingText>데이터를 가져오는중</td></tr></table>");
    p_out.push("    </td>");
    p_out.push("  </tr>");
    p_out.push("</table>");
    $(TGID+"#content").update(p_out.join(''));
  },
  setPars: function(sPars){
    this.OPT.Pars = sPars;
    if(this.OPT.Paging)
    this.OPT.Paging.AbsolutePage = 1;
  },
  listLoad: function(){
    var TGID = this.TG.id;
    this.LoadingDisplay();
    this.TG.scrollTop = 0;

    var url = this.OPT.URL.Load;

    if(!url){
      alert("Not Found Url. Are you Crazy?"); 
      return;
    }
    
    if(this.OPT.Pars != "")
    var pars = this.OPT.Pars+"&dummy="+ARIA.nTime();
    else
    var pars = "dummy="+ARIA.nTime();
    
    if(this.OPT.Paging){
    pars+="&pageSize="+this.OPT.Paging.PageSize+"&absolutePage="+this.OPT.Paging.AbsolutePage;
    }
    if(this.OPT.urlTest){
      alert(url+"?"+pars);
    }
    
    var CompleateAC = this.listLoadOK.bind(this);
    var reportErrorAC = this.ajaxReportError.bind(this);
    var myAjax = new Ajax.Request(
    url,
    {
     method: 'post',
     parameters: pars,
     onComplete: CompleateAC,
     onFailure: reportErrorAC
    });
  },
  listLoadOK: function(request){
    var TGID = this.TG.id;
    try{
      if(this.OPT.Paging){
      eval("this.DataObj = "+request.responseText+"");
      this.DataSet = this.DataObj.Datas;
      
        // Paging Options ******************************************
        this.OPT.Paging.pageCount = this.DataObj.pageCount;
        for(var a=$(TGID+"#pageNo").length;a>-1;a--){
        $(TGID+"#pageNo").options[a] = null;
        }
        (parseInt(this.DataObj.pageCount)).times(function(n){
          var addNo = $(TGID+"#pageNo").length;
          optionS = new Option(n+1, n+1);
        	$(TGID+"#pageNo").options[addNo] = optionS;
      	});
      	
      	isNaN(this.DataObj.absolutePage) ? $(TGID+"#pageNo").value = 1 : $(TGID+"#pageNo").value = parseInt(this.DataObj.absolutePage);
        $(TGID+"#totalPage").update(this.DataObj.pageCount);
        
        if(this.DataObj.Total)
        $(TGID+"#totalCount").update("&nbsp; Total : <b><u>"+this.DataObj.Total+"</u></b> Count");
        else
        $(TGID+"#totalCount").update("&nbsp; Total : <b><u>"+this.DataSet.length+"</u></b> Count");
        
        if(this.DataObj.totalEtc)
        $(TGID+"#totalEtc").update("&nbsp; "+this.DataObj.totalEtc.decode());

        
        // Paging Options ******************************************
      
      }else{
      eval("this.DataSet = ["+request.responseText+"]");
      }
      this.sortList();
    	this.listPrint();
    	if(this.OPT.onLoad){
    	  this.OPT.onLoad(this.DataSet);
    	}
    }catch(e){
      alert("listLoadOK Fail : "+e.description+"\n\n"+request.responseText);
    }
  },
  _setListData: function(Obj){
    var TGID = this.TG.id;

      if(this.OPT.Paging){
      this.DataObj = Obj;
      this.DataSet = this.DataObj.Datas;
      
        // Paging Options ******************************************
        this.OPT.Paging.pageCount = this.DataObj.pageCount;
        for(var a=$(TGID+"#pageNo").length;a>-1;a--){
        $(TGID+"#pageNo").options[a] = null;
        }
        (parseInt(this.DataObj.pageCount)).times(function(n){
          var addNo = $(TGID+"#pageNo").length;
          optionS = new Option(n+1, n+1);
        	$(TGID+"#pageNo").options[addNo] = optionS;
      	});
      	
      	isNaN(this.DataObj.absolutePage) ? $(TGID+"#pageNo").value = 1 : $(TGID+"#pageNo").value = parseInt(this.DataObj.absolutePage);
        $(TGID+"#totalPage").update(this.DataObj.pageCount);
        
        if(this.DataObj.Total)
        $(TGID+"#totalCount").update("&nbsp; Total : <b><u>"+this.DataObj.Total+"</u></b> Count");
        else
        $(TGID+"#totalCount").update("&nbsp; Total : <b><u>"+this.DataSet.length+"</u></b> Count");
        
        if(this.DataObj.totalEtc)
        $(TGID+"#totalEtc").update("&nbsp; "+this.DataObj.totalEtc.decode());
        // Paging Options ******************************************
      }else{
        if(Object.isArray(Obj))
        this.DataSet = Obj;
        else
        this.DataSet = [];
      }
      this.sortList();
    	this.listPrint();
    	if(this.OPT.onLoad){
    	  this.OPT.onLoad(this.DataSet);
    	}
    	
    try{
    }catch(e){
      alert("listLoadOK Fail : "+e.description+"\n\n"+Obj);
    }
  },
  __pushList: function(nObj){
    try{
    this.DataSet.push(nObj);
    }catch(e){alert(e.print())}
  },
  _addListData: function(myObj, uniqNo){
    var TGID = this.TG.id;
    try{
      var pushList = this.__pushList.bind(this);      
      var tgData   = this.DataSet;
      myObj.each(function(n){
        if(uniqNo != undefined){
          var ck = tgData.find(function(k){
            return n[uniqNo] == k[uniqNo];
          });
          if(!ck) pushList(n);
        }else{
          pushList(n);
        }
      });
    }catch(e){
      alert("리스트 데이터 삽입에 실패하였습니다."+e.print()); 
    }
    
    try{
    this.sortList();
    }catch(e){alert("fail sort "+e.print())}
    try{
  	this.listPrint();
  	}catch(e){alert("fail print "+e.print())}
  	if(this.OPT.onLoad){
  	  this.OPT.onLoad(this.DataSet);
  	}
  },
  _delListData: function(removeList, cols){
    if(!cols) cols = 0;
    
    var collectData = this.DataSet.findAll(function(n){
      return !removeList.find(function(k){
        return n[cols] == k[cols];
      }); 
    });
    this.DataSet = collectData;

    this.sortList();
  	this.listPrint();
  },
  _getListData: function(){
    return this.DataSet;
  },
  sortList: function(){
    this.selectObjClear();
    this.ProcessIng(true); //Processing Start
    $(this.TG.id+"#container").style.top = 0;
    this.TG.scrollTop = 0;


    var TGID = this.TG.id;
    var Sort = this.OPT.Sorted;
    
    try{
    if(Sort.order=="asc"){ //asc
      this.DataSet.sort(ARIA.generateCompareObject(this.OPT.Columns[Sort.index].idx, this.OPT.Columns[Sort.index].type));
    }else{ //desc
      this.DataSet.sort(ARIA.generateCompareObjectDesc(this.OPT.Columns[Sort.index].idx, this.OPT.Columns[Sort.index].type));
    }
    }catch(e){}
  },
  listPrint: function(){
    var TGID = this.TG.id;
    var ffGap = -1;
    if(isSF) ffGap = 0;
  	var rowHeight = this.OPT.rowHeight;
  	var p_out = [];
  	// define start Line and end Line use Insertion Before
  	p_out.push("<table width=100% cellpadding=0 cellspacing=0 border=0 style=\"table-layout:fixed;\">");
    /* start Line */
    p_out.push("  <tr id=\""+TGID+":Start\">");
      this.OPT.Columns.each(function(n, index){
    p_out.push("    <td style=\"width:"+(n.width+ffGap)+"px;height:"+rowHeight+"px;\" id=\""+TGID+"#body{"+index+"}\">1&nbsp;</td>");
      });
    p_out.push("    <td>&nbsp;</td>");
    p_out.push("  </tr>");
    /* start Line */
    
    /* end line */
    p_out.push("  <tr id=\""+TGID+":end\" class=\"fbw_box_ContentTR\">");
      this.OPT.Columns.each(function(n, index){
    p_out.push("    <td style=\"line-height:1px;font-size:1px;\" id=\""+TGID+"#tr{end}\">&nbsp;</td>");
      });
    p_out.push("     <td style=\"line-height:1px;font-size:1px;\" id=\""+TGID+"#tr{end}\">&nbsp;</td>");
    p_out.push("  </tr>");
    /* end */
    p_out.push("   </table>");
    
    try{
    $(TGID+"#content").update(p_out.join(''));
    }catch(e){alert("fail update "+e.print())}
      
    try{
		this.listPrintSpool(0);
		}catch(e){alert("fail spool "+e.print())}
  },
  listPrintSpool: function(iCnt){
    var TGID = this.TG.id;
    this.NowRowCnt = iCnt;
  	var CntNum = this.CntNum;
  	var Columns = this.OPT.Columns;
  	var rowHeight = this.OPT.rowHeight;
  	var bgColors = this.OPT.bgColors;

    if(this.DataSet){
  	if(iCnt*CntNum < this.DataSet.length){
  		var DrawCounters = this.spoolCounter.bind(this);
  		var DrawActors = this.listPrintSpool.bind(this);
  		/*
  		0 : 0~99
  		1 : 100~199
  		2 : 200~299
  		3 : 300~399
  		*/
  		st_num = iCnt*CntNum;
  		ed_num = iCnt*CntNum+(CntNum-1);

  		var p_out = [];

  		this.DataSet.each(function(DS, index){
  			if(index >= st_num && index <= ed_num){
        p_out.push("<tr id=\""+TGID+"#tr{"+index+"}\" class=\"fbw_box_ContentTR\" style=\"height:"+rowHeight+"px;background:"+bgColors.off+";\">");

       	Columns.each(function(C, sIndex){
  	    p_out.push("  <td align=\""+C.align+"\" id=\""+TGID+"#tr{"+index+"}#td{"+sIndex+"}\" nowrap style=\"padding-left:3px;height:"+rowHeight+"px;\" unselectable=\"on\">");
  	    if(C.type == "String"){
  	      myStr = ARIA.ConvertName(DS[C.idx].decode(), C.pattern, TGID);
  	    p_out.push("  <nobr style=\"cursor:pointer;\" title=\""+myStr+"\" unselectable=\"on\">"+myStr+"</nobr></td>");
        }else{
        p_out.push("  <nobr style=\"cursor:pointer;\" unselectable=\"on\">"+ARIA.ConvertName(DS[C.idx], C.pattern, TGID)+"</nobr></td>");
        }
      	});
        p_out.push("  <td class=\"ColumnData\" id=\""+TGID+"#tr{"+index+"}#td{E}\" unselectable=\"on\">&nbsp;</td>");
        p_out.push("</tr>");
      	}
      });

      //new Insertion.Before(TGID+":end", p_out.join(''));
      try{
        if($(TGID+":end")) Element.insert($(TGID+":end"), {before : p_out.join('')});
      }catch(e){
        
      }
  		this.setHeaderPosition();
		}
		}

		this.ProcessIng(false); //Processing End
  },
  spoolCounter: function(vv){
   vv==1 ? this.DrawingCnt++ : this.DrawingCnt--;
  },
  /* List */
  /* Etc */
  copyData: function(){
    var TGID = this.TG.id;
    var copyDatas = this.getSelectObject();
    var copyOut = [];
    var Columns = this.OPT.Columns;
    
    copyDatas.each(function(n, index){
      Columns.each(function(C, sIndex){
        
        var myString;
        if(C.type.toLowerCase() == "string") myString = n[C.idx].decode();
        else myString = n[C.idx];
        
        var myStr = ARIA.ConvertName(myString, C.pattern, TGID);
        if(typeof(myStr) == "string")
        copyOut.push(myStr.stripTags()+"\t");
        else
        copyOut.push(myStr+"\t");
        
        //if(Object.isFunction(C.pattern)) copyOut.push(myString+"\t");
        //else copyOut.push(ARIA.ConvertName(myString, C.pattern, TGID).stripTags+"\t");
        
      });
      copyOut.push("\n");
    });
    
    //alert(copyOut.join(''));
    window.clipboardData.setData('Text', copyOut.join(''));
    alert("데이터가 복사되었습니다.");
  },
  setSelectIndex: function(Rindex){
    var TGID = this.TG.id;
    var bgColors = this.OPT.bgColors;
    if($(TGID+"#tr{"+Rindex+"}")){
      this.selectObj.push(parseInt(Rindex));
      $(TGID+"#tr{"+Rindex+"}").setStyle({
      background:bgColors.on
      });
    }
  },
  setSelect: function(idx){
    var TGID = this.TG.id;
    var bgColors = this.OPT.bgColors;
    var Rindex = this.getIdxToIndex(idx, 0);
    
    if($(TGID+"#tr{"+Rindex+"}")){
      $(TGID+"#tr{"+Rindex+"}").setStyle({
      background:bgColors.on
      });
      this.selectObj.push(Rindex);
    }
  },
  /* Etc */
  ajaxReportError: function(reqeust){
   alert(request.responseText);
  },
  
  changeInfo: function(c_value, idx, no){
    if(idx > 0){
    	try{
    	$("TD"+this.oTG.id+":"+idx+"("+no+")").update("&nbsp;"+c_value);
    	}catch(E){

    	}
    }
  },
  
  changeDatas: function(idx, value){

    for(var a=0;a<this.selectObj.length;a++){
      this.DataSet[this.selectObj[a]][idx] = value;
      
    }
    this.sortList();
  	this.listPrint();
  }
  
  
});