Computer/JavaScript

Rowspantable

알찬돌삐 2012. 8. 10. 16:33

/*
 * Create by nhosw at i-swear.com
 *         Last Modify 2007.05.19
 * 이 주석은 삭제하지마시길 바랍니다.
 */

  /*
   * rowspantable
   * @param string tbl 테이블이름
   * @param int sortnode 정렬기준점 , 0이면 기준점 없음
   * @param int sortdirect 정렬방향, 0이면 무지향, 1이면 왼쪽으로 나가면서 rowspan, 2면 우측으로 가면서 rowspan
   * @param boolean sorttype 정렬타입, false 이면 무조건 정렬, true이면 기준점이 rowspan 되어야 rowspan 됨
   * @param boolean thfind 테이블의 최상위 td 검사 여부 true 면 검사, false 면 검사 안함 디폴트 false
   */
  var tblArr;
  function rowspantable(tbl, sortnode, sortdirect, sorttype, thfind) {
    tblArr = null;
    tblArr = Array();
    var tmpArr = Array();
    var tr = null;
    var td = null;
    var tmp = null;
    if (typeof(tbl) != "object") tbl = document.getElementById(tbl);
    // 인자가 올바른지 확인
    if (!tbl) return;
    if (sortdirect != 0 && sortdirect != 1 && sortdirect != 2) return;
    if (sorttype != true && sorttype != false) return;
    if (!thfind) thfind = 1;
    else thfind = 0;
    // 인자가 올바른지 확인 end

    nodeFind(tbl , 0, 0);

    // 1차원 배열
    var trcnt = tblArr.length;
    for (var i=0; i<tblArr.length; i++) {
        if (!tblArr[i]) continue;
        // 2차원 배열
        for (var j=0; j<tblArr[i].length; j++) {
            if (!tblArr[i][j]) continue;
                // tdnode 가 sortnode 보다 크다면 continue

                if (sortdirect == 1 && j > sortnode) continue;
                if (sortdirect == 2 && j < sortnode) continue;

                // Rowspan 하기 위해 검사합니다.
                if (i < trcnt - 1 && tblArr[i][j] == tblArr[i+1][j]) {
                    // sorttype 이 true 이면 기준점 확인할것.
                    if (sorttype == true) {

                        if (tblArr[i][sortnode] != tblArr[i+1][sortnode]) continue;
                    }
                        // tmpArr 에 넣는다
                    tmpArr[tmpArr.length] = i+","+j;
                }
        }
        // 2차원 배열 End
    }
    // 1차원 배열 end

    // tblArr 초기화
    tblArr = null;

    // rowspan
    for (var i=tmpArr.length-1; i>=0; i--) {
        tmp = tmpArr[i].split(",");
        tr = tmp[0];
        td = tmp[1];
        if (tr <= thfind) continue;
        tbl.childNodes[0].childNodes[tr-1].childNodes[td-1].rowSpan = tbl.childNodes[0].childNodes[tr].childNodes[td-1].rowSpan + 1;
        tbl.childNodes[0].childNodes[tr].childNodes[td-1].removeNode(true);
    }

  }

  function nodeFind(el, trnode, tdnode) {
  var cnt = el.childNodes.length;
  var tmp = new Array();
  try {
    for (var i=0; i<cnt; i++) {
        // tr 일 경우 trnode++
        if (el.childNodes[i].nodeName == "TR") { trnode++; tdnode = 0; }
        else if (el.childNodes[i].nodeName == "TD" || el.childNodes[i].nodeName == "TH") { tdnode++; }
        if (el.childNodes[i].nodeValue) {
            if (!tblArr[trnode]) tblArr[trnode] = Array();
            tblArr[trnode][tdnode] = el.childNodes[i].nodeValue;
        }
        if (el.childNodes.length > 0) nodeFind(el.childNodes[i], trnode, tdnode);
    }
  }
  catch (e) { return; }

  }

이 글은 스프링노트에서 작성되었습니다.

.