/**
 * テーブルの操作を行います。
 * 指定された行数列数のテーブルを用意し、
 * 各セルに、[tablename].rN.cN でIDをセットします。
 * 但し、セルの結合は、任意となります。
 */
function initTable(tableId, rowCount, columnCount) {

    /**
     * tableId をIDとして、エレメントを検索します。
     * 該当するエレメントが存在しなかったり、テーブルエレメント以外の
     * エレメントであった場合は、エラーとします。
     */
    var targetTable = document.getElementById(tableId);
    if (targetTable == null) {
        alert('ERROE:TableId Not Found. tableId(' + tableId + ')');
        return;
    }
    if (targetTable.tagName != 'TABLE') {
        alert('ERROE:Illegal tableId. tableId(' + tableId + ')\n'+
              'tagName('+targetTable.tagName+')');
        return;
    }

    var allCount = targetTable.rows.length;
    var headerCount = 0;
    var footerCount = 0;
    if (targetTable.tHead) {
        headerCount = targetTable.tHead.rows.length;
    }
    if (targetTable.tFoot) {
        footerCount = targetTable.tFoot.rows.length;
    }
//    alert('targetTable.rows.length(' + targetTable.rows.length + ')\n'+
//          'targetTable.headRows.length(' + headerCount + ')\n'+
//          'targetTable.footRows.length(' + footerCount + ')');

    removeRowAllTBody(targetTable);
//    removeRowAll(targetTable,
//                 allCount,
//                 headerCount,
//                 footerCount);

    for (var i = 0; i < rowCount; i ++) {
        var row = targetTable.insertRow(headerCount + i);
        for (var j = 0; j < columnCount; j ++) {
            var cell = row.insertCell(j);
            cell.setAttribute('id', tableId + '.r' + i + '.c' + j);
        }
    }
}


function setIdToText(tableId, rowCount, columnCount) {
    initTable(tableId, rowCount, columnCount);
    var targetTable = document.getElementById(tableId);

    for (var i = 0; i < rowCount; i ++) {
        var row = targetTable.insertRow(headerCount + i);
        for (var j = 0; j < columnCount; j ++) {
            var cell = row.insertCell(j);
            cell.setAttribute('id', tableId + '.r' + i + '.c' + j);
        }
    }
}


/**
 * ターゲットテーブルから、ボディ部分にあたる、
 * 全ての行を削除します。
 */
function removeRowAllTBody(targetTable) {

//    var bodyCunt = targetTable.tBodies.length;
//    alert('targetTable.tBodies.length(' + targetTable.tBodies.length + ')\n'+
//          'targetTable.tBodies.rowIndex(' + targetTable.tBodies.item(0) + ')');
//    for (var i = 0; i < bodyCunt; i ++) {
//        var rowItem = targetTable.tBodies.item(i);
//        targetTable.deleteRow(rowItem.rowIndex);
//    }
    var bodiesCount = targetTable.tBodies.length;
//    alert('targetTable.tBodies.length(' + targetTable.tBodies.length + ')\n'+
//          'targetTable.tBodies.rowIndex(' + targetTable.tBodies.item(0) + ')');
    for (var i = bodiesCount; i > 0; i --) {
        var bodyItem = targetTable.tBodies.item(i - 1);
        var rowCount = bodyItem.rows.length;
        for (var j = rowCount; j > 0; j --) {
            targetTable.deleteRow(bodyItem.rows.item(j - 1).rowIndex);
        }
    }
}


/**
 * ターゲットテーブルから、ボディ部分にあたる、
 * 全ての行を削除します。
 */
function removeRowAll(targetTable,
                      rowCount,
                      headerCount,
                      footerCount) {

    var bodyLast = rowCount - footerCount;
    for (var i = headerCount; i < bodyLast; i ++) {
        targetTable.deleteRow(headerCount);
    }
}


/**
 * テーブル中の、指定のセルに、指定のrowspan・colspanを、
 * セットします。
 * この時、はみ出してしまうセルを、削除します。
 * rowspan・colspanの指定を実行した結果が、テーブルのサイズを
 * 超えてしまうような場合は、超えないように調整します。
 */
function cellSpan(targetTable, targetRowIndex, targetColIndex, rowSpan, colSpan) {

    var targetRow = targetTable.rows.item(targetRowIndex);
    var targetCell = targetRow.cells.item(targetColIndex);

    var rowCount = targetTable.rows.length;
    var colCount = targetRow.cells.length;

    /**
     * 結合したセルのサイズが、テーブルをはみ出すような場合は、
     * 結合する幅や高さを調整する。
     */
    if ((targetRowIndex + rowSpan) > rowCount) {
        rowSpan = rowCount - targetRowIndex;
    }
    if ((targetColIndex + colSpan) > colCount) {
        colSpan = colCount - targetColIndex;
    }

    /**
     * targetCellのある行から、不要となるcellを削除。
     */
    for (var i = 1; i < colSpan; i ++) {
        targetRow.deleteCell(targetColIndex + 1);
    }
    /*
     * はみ出すセルの削除は、targetCellが存在する行は、rowspan-1個
     * それ以外の行では、targetCellの列を含み、rowspan個
     * それぞれ削除する。
     */
    for (var i = 1; i < rowSpan; i ++) {
        var row = targetTable.rows.item(targetRowIndex + i);
        for (var j = 0; j < colSpan; j ++) {
            row.deleteCell(targetColIndex);
        }
    }
    targetCell.colSpan = colSpan;
    targetCell.rowSpan = rowSpan;
}

/** テーブルの表示行数 */
var dispRow = 8;
/** 現在の表示先頭行インデックス */
var currentTopIndex = 0;
/** 現在の表示最終行インデックス */
var currentBottomIndex = dispRow - 1;
var backgroundColor;
var borderColor
/**
 * 初期化メソッド。
 * 必ずドキュメントロード時に、コールする必要がある。
 */
function init(targetId) {
    var tBodyRows = getTBodyRows(targetId);
//    alert('TBODY ROWS-->('+tBodyRows.length+')');
    for (var i = dispRow; i < tBodyRows.length; i ++) {
        tBodyRows.item(i).style.display = 'none';
    }
    backgroundColor = document.getElementById(targetId).style.backgroundColor;
    borderColor = document.getElementById(targetId).style.color;
    sellCheck(tBodyRows, 0);
    sellCheck(tBodyRows, 1);
    sellCheck(tBodyRows, 2);
}
function up(targetId) {
    var tBodyRows = getTBodyRows(targetId);
    if (currentBottomIndex == tBodyRows.length - 1) {
        return;
    }
    tBodyRows.item(currentTopIndex).style.display = 'none';
    currentTopIndex ++;
    currentBottomIndex ++;
    tBodyRows.item(currentBottomIndex).style.display = '';
    sellCheck(tBodyRows, 0);
    sellCheck(tBodyRows, 1);
    sellCheck(tBodyRows, 2);
}
function down(targetId) {
    var tBodyRows = getTBodyRows(targetId);
    if (currentTopIndex == 0) {
        return;
    }
    currentTopIndex --;
    tBodyRows.item(currentTopIndex).style.display = '';
    tBodyRows.item(currentBottomIndex).style.display = 'none';
    currentBottomIndex --;
    sellCheck(tBodyRows, 0);
    sellCheck(tBodyRows, 1);
    sellCheck(tBodyRows, 2);
}
function getTBodyRows(targetId) {
    var targetTbl = document.getElementById(targetId);
    var tBodies = targetTbl.tBodies;
    var tBody = tBodies.item(0);
    return tBody.rows;
}
function sellCheck(tBodyRows, column) {
    for (var i = 0; i < dispRow; i ++) {
        if (currentTopIndex + i == tBodyRows.length - 1) {
            return;
        }
        line = tBodyRows.item(currentTopIndex + i);
        var next = tBodyRows.item(currentTopIndex + i + 1);
        if (line.cells.item(column).firstChild.firstChild.nodeValue ==
            next.cells.item(column).firstChild.firstChild.nodeValue) {

            line.cells.item(column).style.borderBottomColor = '#efffef';
            next.cells.item(column).firstChild.style.color = '#efffef';
            line.cells.item(column).style.borderRightColor = borderColor;
        }
    }
    var line = tBodyRows.item(currentTopIndex);
    line.cells.item(column).firstChild.style.color = borderColor;
    line = tBodyRows.item(currentBottomIndex);
    line.cells.item(column).style.borderBottomColor = borderColor;
}
