//
//  DBリザルトXMLをレコード配列とフィードプロパティを持った
//  オブジェクトに変換するクラス
//
//  07/10/24 (c) Ohsako, Junichi


// コンストラクタ
var Xml2Obj =
function(xml) {

  // インスタンス変数の初期化
  this.xmlList = xml.documentElement.childNodes;  // xmlに含まれるレコードリスト
  this.records = Array();                         // 出力オブジェクト用配列

  // 出力オブジェクトへのアクセサメソッド
  this.getRecords =
  function() {
    return this.records;
  }

  // 出力オブジェクト生成メソッド
  this.buildRecords =
  function() {
    // レコード単位で反復
    for(var i = 0; i < this.xmlList.length; i++) {
       this.records[i] = new Object();                      // レコード用オブジェクトを生成
       this.diggingNode(this.records[i], this.xmlList[i]);  // 子ノードのオブジェクト／プロパティを再帰的に生成
    }
  }

  // オブジェクト／プロパティ生成の再帰処理メソッド
  this.diggingNode =
  function(obj, node) {                                     // obj = レコードオブジェクト, node = xmlのノードリスト
    // 子ノードが存在しないならノード名でプロパティを生成し、null値を代入
    if(!node.firstChild) {
      obj[node.nodeName] = '';
    } else
    // 子ノードがTextならノード名でプロパティを生成し、値を代入
    if(node.firstChild.nodeType == 3) {
      obj[node.nodeName] = node.firstChild.nodeValue;
    } else
    // 子ノードがElementなら再帰処理
    if(node.firstChild.nodeType == 1) {
      var subNodes = node.childNodes;                       // 子ノードのノードリストを取得
      // 子ノードの数だけ再帰処理
      for(var i = 0; i < subNodes.length; i++) {
        // Elementな孫ノードがあるなら子ノード名のオブジェクトを生成
        if(subNodes[i].firstChild && subNodes[i].firstChild.nodeType == 1) {
          obj[subNodes[i].nodeName] = new Object();
          obj = obj[subNodes[i].nodeName];
        }
        this.diggingNode(obj, subNodes[i]);                 // 再帰呼出し
      }
    }
  }
}
