var targetIdValue = 'data';
/**
 * データのセットを行う。
 * param targetDoc : データセットの、ターゲットとなるドキュメント。
 */
function setData(targetFrame) {
    var targetDoc = targetFrame.document;
    var dataCount = 1;
    /**
     * 永久ループ
     * 抜けるタイミングは、datanがIDのタグが見つからなかった場合。
     */
    while(1) {
        var dataNId = targetIdValue + dataCount;
        var dataTag = document.getElementById(dataNId);
        if (dataTag == null) {
            break;
        }
        var dataTypeTag = document.getElementById(dataNId+'.type');
        if (dataTypeTag == null) {
            /**
             * 'datan.type' IDの設定されたタグが無い場合は、エラー
             */
            alert('ERROR:DataType Not Found. ID('+dataNId+'.type'+')');
            return;
        }
        var dataTypeTextTag = dataTypeTag.firstChild;
        if (dataTypeTextTag.nodeValue == 'nomal') {
            setDataForNomalDataType(dataTag, dataNId, targetDoc);
        }
        else if (dataTypeTextTag.nodeValue == 'table') {
            if (targetFrame.initTable) {
                var rowCountEle = document.getElementById(dataNId+'.rowcount');
                if (rowCountEle == null || rowCountEle.firstChild.nodeType != 3) {
                    alert('ERROR:RowCount Element Illegal.'+
                          '('+dataNId+'.rowcount'+')');
                    return;
                }
                var columnCountEle = document.getElementById(dataNId+'.columncount');
                if (columnCountEle == null || columnCountEle.firstChild.nodeType != 3) {
                    alert('ERROR:ColumnCountEle Element Illegal.'+
                          '('+dataNId+'.columncount'+')');
                    return;
                }
                targetFrame.initTable(dataNId,
                                      rowCountEle.firstChild.nodeValue,
                                      columnCountEle.firstChild.nodeValue);
            }
            else {
//                alert('ERROR:InitTable Not Support.');
                return;
            }
            setDataForNomalDataType(dataTag, dataNId, targetDoc);
        }
        else {
            /**
             * 'nomal' 'table' 以外のdataTypeが設定された場合は、エラー
             */
            alert('ERROR:Illegal DataType. ID('+dataTypeTextTag.nodeValue+')');
            return;
        }
        dataCount ++;
    }
    if (dataCount == 1) {
        alert('ERROR:Data Not Found.');
    }
}


/**
 * ターゲットとなるタグの子供の中から、'dataN.'で始まるIDが設定されている
 * タグを全てリストし、指定のドキュメントの、同一IDのタグに、データを設定する。
 */
function setDataForNomalDataType(dataTag, dataNId, targetDoc) {

    var tagList = getValueTags(dataTag, dataNId);
    for (var i = 0; i < tagList.length; i ++) {
        setValue(targetDoc, tagList[i]);
    }
}


/**
 */
function getValueTags(dataTag, dataNId) {

    var childs = dataTag.childNodes;
    var tagList = new Array();
    var listCount = 0;
    for (var i = 0; i < childs.length; i ++) {
        var child = childs.item(i);
        if (child.nodeType == 1) {
            var nodeId = child.getAttribute('id');
            if (nodeId.substring(0, dataNId.length + 1) == dataNId + '.') {
                tagList[listCount] = child;
                listCount ++;
            }
        }
        else {
            /**
             * dataTagの子供が、ELEMENT_NODE以外の場合は、エラー
             */
//            alert('ERROR:Illegal NodeType. NodeType(' + child.nodeType + ')');
//            return;
        }
    }
    return tagList;
}


function setValue(targetDoc, valueTag) {
    var valueId = valueTag.getAttribute('id');
    var targetTag = targetDoc.getElementById(valueId);
    if (targetTag) {
        if (targetTag.tagName == 'input') {
            /**
             * ターゲットが、インプット要素の場合は、
             * valueタグの最初の子供の内容を、そのままセットする。
             * 最初の子供は、必ずテキストノードとであることを、
             * 想定する。そうでない場合、通常は内容がnullとなる。
             */
            targetTag.value = valueTag.firstChild.nodeValue;
        }
        else {
            changeText(targetTag, valueTag, targetDoc);
        }
    }
}


function changeText(targetTag, valueTag, targetDoc) {
    if (valueTag.hasChildNodes() == false) {
        return;
    }
    /**
     * ターゲットに子供がある場合、全て削除する。
     */
    if (targetTag.hasChildNodes() == true) {
        var childs = targetTag.childNodes;
        for (var i = 0; i < childs.length; i ++) {
            var childEle = childs.item(i);
            targetTag.removeChild(childEle);
        }
    }
//    if (valueTag.firstChild.nodeType == 1) {
        /**
         * ターゲットの最初の子供が、エレメントノードの場合は、
         * そのままセットする。
         */
//        targetTag.appendChild(valueTag.firstChild);
        deepClone(targetTag, valueTag, targetDoc);
//    }
//    else if (valueTag.firstChild.nodeType == 3) {
        /**
         * ターゲットの最初の子供が、テキストノードの場合は、
         * その内容を、そのままセットする。
         */
//        alert('targetTag(' + targetTag.nodeName + ')\n' +
//              'valueTag(' +valueTag.nodeName+ ')');
//        var textNode =
//            targetDoc.createTextNode(valueTag.firstChild.nodeValue);
//        targetTag.appendChild(textNode);
//    }
//    else {
//    }
}


function deepClone(targetTag, valueTag, targetDoc) {
    if (valueTag.hasChildNodes() == true) {
        for (var i = 0; i < valueTag.childNodes.length; i ++) {
            var valueChild = valueTag.childNodes.item(i);
            if (valueChild.nodeType == 1) {
                /**
                 * エレメントノードの場合は、タグ名でノードを作成し、
                 * アトリビュートをコピーする。
                 * その後、まだ子が有る場合は、リカーシブ。
                 */
                var targetEleNode = targetDoc.createElement(valueChild.tagName);
//                var targetAtts = targetEleNode.attributes;
                var valueAtts = valueChild.attributes;
                for (var j = 0; j < valueAtts.length; j ++) {
                    var attNode = valueAtts.item(j);
                    /**
                     * 本来のDOMの仕様であれば、下のコメントとなっているコードで、
                     * 正しく動作するはずだが、IE5.5がサポートしていないので、
                     * やむなく、変更する。
                     */
                    targetEleNode.setAttribute(attNode.name, attNode.value);
//                    targetAtts.setNamedItem(attNode);
                }
                targetTag.appendChild(targetEleNode);
                deepClone(targetEleNode, valueChild, targetDoc);
            }
            else if (valueChild.nodeType == 3) {
//            else if (valueChild.nodeType == Node.TEXT_NODE) {
                /**
                 * テキストノードの場合は、テキストでノードを作成し、
                 * 子として追加する。
                 */
                var textNode =
                    targetDoc.createTextNode(valueChild.nodeValue);
                targetTag.appendChild(textNode);
            }
        }
    }
}

/*
var teams = document.getElementsByTagName('teamname');
    if (teams.length != 0) {
        var team = teams.item(0);
        var teamName = team.firstChild.nodeValue;
        top.application.changeText('teamname', teamName);
    }
*/

