﻿/*****************************************************************************************
 COPYRIGHT (C) NTT DATA SANYO SYSTEM Co. 2006-
 ----------------------------------------------------------------------------------------
 PROJECT:	New TCV
 MODULE:	XML Loader, Data Parse
 FILE:		data.js
 CONTENT:
 ----------------------------------------------------------------------------------------
 NOTE:
 ----------------------------------------------------------------------------------------
 HISTORY:
 [2006.04.XX] Rev 1.0 S.Orita Create
 [2006.05.02] Rev 1.1 Y.O Modify
	(1)push_addition()で追加する項目の表示非表示フラグを1で設定するよう修正
 [2006.05.16] Rev 2.0 S.Orita Modify
	(1)カラーデータの"col", "price" 要素対応
 [2006.05.19] Rev 2.1 S.Orita Modify
	(1)重複していたカラー価格取得関数を削除
	(2)カラー配列にその他費用表示名、費用を追加
 [2006.05.22] Rev 2.2 S.Orita Modify
	(1)カラーデータの"col"仕様変更に対応
 [2006.06.02] Rev 3.0 S.Orita Modify
 	(1)販売型式マージ機能、付加費用マージ機能、MOPマージ機能追加
 [2006.06.26] Rev 4.0 S.Orita Modify
	(1)DOPに"tab"属性追加
	(2)シートアレンジ用配列に対応
	(3)Colorの"price"属性の仕様変更
	(4)Partsの"price"属性の仕様変更
	(5)Partsに"pkg","time","col","code"属性を追加
 [2006.06.27] Rev 4.1 S.Orita Modify
	(1)Gradeに"capacity"属性を追加
 [2006.06.29] Rev 4.2 S.Orita Modify
	(1)パーツセット対応
 [2006.07.04] Rev 4.3 S.Orita Modify
	(1)グレード価格変更
 [2006.07.05] Rev 4.4 S.Orita Modify
	(1)カラーの追行コード追加
 [2006.09.04] Rev 4.5 T.Okada Modify
	(1)Partsに"excol"属性を追加
	(2)全属性を記述しなくてもエラーにならないよう修正（今のところexcol属性のみ）
 [2006.09.07] Rev 4.6 T.Okada Modify
	(1)Partsに"popup"属性を追加
 [2006.09.13] Rev 4.7 T.Okada Modify
	(1)Partsの"pkg"、"time"、"col"、"code"属性、contentsの"csize"属性を省略化に
 [2006.09.24] Rev 4.8 K.Okano Modify
	(1)margeDealerModelData()関数内の上書き時の価格を"|"接続に。
 [2009.11.12] Rev 4.9 T.Okada Modify
	(1)Contentsに"n"要素を追加

*****************************************************************************************/

//---------------------------------------------------------------------------------------
// 【注意】セールス版の場合、あらかじめ "salesext.js" がロードされている必要があります。
//---------------------------------------------------------------------------------------

// 定数

var car_name = "";		// 車種名
var contents_type = 0;	// コンテンツタイプ（0:Web 1:Sales 2:Hi-P 3:WideHi-P）
var combi_type = 0;		// 連携タイプ（0:連携なし 1:iCrop 2:ai21）



//---------------------------------------------------------------------------------------
// XMLファイルの階層構造
//   xml_tree[親タグ][子タグ]
//   親タグ内に子タグが複数存在する。孫タグは存在しない。
//---------------------------------------------------------------------------------------
var xml_tree = new Array();
xml_tree.push( new Array("header",   new Array("h")));
xml_tree.push( new Array("grade",    new Array("g")));
xml_tree.push( new Array("color",    new Array("c")));
xml_tree.push( new Array("parts",    new Array("p")));
xml_tree.push( new Array("addition", new Array("a")));
xml_tree.push( new Array("contents", new Array("s", "f","n"))); // 20091112

//---------------------------------------------------------------------------------------
// タグの属性情報
//   xml_attributes[子タグ][属性]
//---------------------------------------------------------------------------------------
var xml_attributes = new Array();
xml_attributes.push( new Array("h", new Array("ver")));
xml_attributes.push( new Array("g", new Array("key", "body", "drive", "engine", "mission", "img",  "isize", "car", "price",  "model", "sort", "fuel", "capacity")));
xml_attributes.push( new Array("c", new Array("key", "part", "code",  "node",   "img",     "isize", "div",  "grd", "col", "price")));
xml_attributes.push( new Array("p", new Array("key", "node", "img",   "isize",  "type",    "div",   "grp",  "grd", "camera", "world", "price", "pay", "tab", "pkg", "time", "col", "code", "excol", "popup" )));
xml_attributes.push( new Array("a", new Array("key", "gkey", "value", "type")));
xml_attributes.push( new Array("s", new Array("key", "part", "img",   "isize",  "cont",    "grd",   "func", "tab")));
xml_attributes.push( new Array("f", new Array("key", "part", "cont",  "csize",  "sound")));
xml_attributes.push( new Array("n", new Array("key")));			// 20091112

// 変数
var xmldoc = null;			// XMLファイルオブジェクト
var xml_data = null			// XMLファイルから抽出したデータを一時的に格納（タグ名をキーとした連想配列）

// Sales版専用変数
var sort_model = null;
var sort_dop = null;
var sort_addition = null;

//---------------------------------------------------------------------------------------
// 【XMLファイルロード関数】
//   引数：車種名、XMLファイル名（相対パス）
//   返値：ロード結果（true:成功 false:失敗）
//---------------------------------------------------------------------------------------
function loadXML(car, filename){
	car_name = car;
	xmldoc = new ActiveXObject("Microsoft.XMLDOM")
	xmldoc.async = false;			// 読み込むまで待つ
	xmldoc.validateOnParse = true;	// XMLドキュメントのチェック
	xmldoc.load(filename);			// ロード
	
	// エラーチェック
	if(xmldoc.parseError!=0){
		return false;
	}
	
	return true;
}

//---------------------------------------------------------------------------------------
// 【属性取得関数】
//   引数：子タグ名
//   返値：属性の配列。属性がなければ null。
//---------------------------------------------------------------------------------------
function _getAttribute(name){
	for(i=0; i<xml_attributes.length; i++){
		if(name == xml_attributes[i][0]){
			return xml_attributes[i][1];
		}
	}
	
	return null;
}

//---------------------------------------------------------------------------------------
// 【XMLデータパース関数】
//   GUI側の配列にXMLデータを格納します。
//---------------------------------------------------------------------------------------
function parseXML(){
	var str = "";
	var xml_root = xmldoc.documentElement;
	var _node, _subnode;	// 親タグ、子タグに相当
	var n,s,z;
	
	xml_data = new Array();
	
	for (n=0; n<xml_tree.length; n++) {
		var _nodename = xml_tree[n][0];
		_node = xml_root.selectSingleNode(_nodename);
		xml_data[_nodename] = new Array();
		
		for (k=0; k<xml_tree[n][1].length; k++) {
			var _subnodename = xml_tree[n][1][k];
			_subnode = _node.selectNodes(_subnodename);
			xml_data[_nodename][_subnodename] = new Array();
			
			for (s=0; s<_subnode.length; s++) {
				// 属性
				var attr = _getAttribute(_subnodename);
				xml_data[_nodename][_subnodename][s] = new Array();
				for (z=0; z<attr.length; z++) {
                    if ( _subnode[s].attributes.getNamedItem(attr[z])!=null ) {		// 2006/09/04
					  xml_data[_nodename][_subnodename][s][attr[z]] = _subnode[s].attributes.getNamedItem(attr[z]).nodeValue;	
					}
				}
				xml_data[_nodename][_subnodename][s][""] = _subnode[s].nodeTypedValue;
			}
		}
	}
	
	if(combi_type == 1) customize();	// カスタマイズデータ（☆ Sales版のみ）
	
	push_jsfile();						// データをGUI側へ
}

//---------------------------------------------------------------------------------------
// 【カスタマイズ関数】
//  型式マスタ、ディーラオプションマスタ、付加費用マスタのデータとXMLデータをマージする。
//---------------------------------------------------------------------------------------
function customize(){
	margeDealerModelData();		// 5/12
	margeDealerDOPData();		// 5/8
	margeDealerMOPData();		// 6/21
	margeDealerAdditionData();	// 6/21
}

//---------------------------------------------------------------------------------------
// 【型式マスターデータ取得関数】
//   c_model.txt のデータとXMLのデータをマージする
//---------------------------------------------------------------------------------------
function margeDealerModelData(){
	// オリジナル名の保持(全モデル) i-CROP ●
	for(var i=0; i<xml_data["grade"]["g"].length; i++){
		xml_data["grade"]["g"][i]["orgmodel"] = xml_data["grade"]["g"][i]["model"];
		xml_data["grade"]["g"][i]["orgprice"] = xml_data["grade"]["g"][i]["price"];
	}
	
	// マスターデータ取得
	var d_model = new Array();
	var tmp = top.readModel(car_name).split('\n');
	var i;
	var j=0;
	
	sort_model = new Array();
	
	//空白対応
	for(i=0; i<tmp.length; i++){
		if(tmp[i]=="") continue;
		/*if((tmp[i].replace(/\r/g,"").split('\t'))[5] == 1)*/ 
		var line = tmp[i].split('\t');
		if (line != ""){
			d_model[j++] = line;
		}
	}
	
	if(d_model.length == 0) return;
	if(d_model[0].length < 5) return;
	
	// c_model.txt
	//[0]キー [1]型式 [2](表示名) [3](価格) [4]表示非表示（0:非表示 1:表示）
	var txt_len = d_model.length;					// TXTのデータ数
	var xml_len = xml_data["grade"]["g"].length;	// XMLのデータ数
	
	for(j=0; j<txt_len; j++){
		// キー比較
		var id = -1;
		for(i=0; i<xml_len; i++){
			if(d_model[j][0] == xml_data["grade"]["g"][i]["key"]){
				id = i;
				break;
			}
		}
		
		if(id != -1){
			// すでにXMLファイルにキー在り（上書き）
			
			// 販売型式
			if(d_model[j][2] != "") xml_data["grade"]["g"][id]["model"] = d_model[j][2];
			// 価格
			if(d_model[j][3] != "") xml_data["grade"]["g"][id]["price"] = d_model[j][3] + "|" + d_model[j][3];	// 2006/09/24
			// 表示非表示
			if(d_model[j][4] != "") xml_data["grade"]["g"][id]["disp"]  = d_model[j][4];
			
			sort_model[j] = xml_data["grade"]["g"][id];
		}else{
			// まだXMLファイルにキー無し（新規追加）
			
			// 一括初期化
			var att;
			
			att = _getAttribute("g");
			var z;
			sort_model[j] = new Array();
			for(z=0; z<att.length; z++){
				sort_model[j][att[z]] = "0";
			}
			
			// キー
			sort_model[j]["key"] = d_model[j][0];
			// 販売型式
			if(d_model[j][1]=="") sort_model[j]["model"] = d_model[j][1];	// 項目名称が付加費用名
			else				  sort_model[j]["model"] = d_model[j][2];	// 表示名称が付加費用名
			// 価格
			sort_model[j]["price"] = d_model[j][3];
			// 表示非表示
			if(d_model[j][4] == 1) {
				sort_model[j]["disp"] = 2;							// ☆ Sales版のみ
			}else{
				sort_model[j]["disp"] = d_model[j][4];
			}
			// オリジナル
			sort_model[j]["orgmodel"] = d_model[j][1];
			sort_model[j]["orgprice"] = d_model[j][3];
		}
	}
	
	// gradeデータを追加
	xml_data["grade"]["g"] = new Array();
	for(i=0; i<sort_model.length; i++){
		 xml_data["grade"]["g"][i] = sort_model[i];
	}
}

//---------------------------------------------------------------------------------------
// 【ディーラーオプションマスタデータ取得関数】
//   c_dop.txt のデータとXMLのデータをマージする
//---------------------------------------------------------------------------------------
function margeDealerDOPData(){

	// オリジナル名の保持(全DOP) i-CROP ●
	for(var i=0; i<xml_data["parts"]["p"].length; i++){
		if(xml_data["parts"]["p"][i]["div"] == 3){
			xml_data["parts"]["p"][i]["orgname"] = xml_data["parts"]["p"][i][""];
			xml_data["parts"]["p"][i]["orgprice"] = xml_data["parts"]["p"][i]["price"];
			xml_data["parts"]["p"][i]["orgpay"] = xml_data["parts"]["p"][i]["pay"];
		}
	}

	// マスターデータ取得
	var d_dop = new Array();
	var tmp = top.readDOP(car_name).split('\n');
	var i;
	var j=0;
	
	sort_dop = new Array();
	
	for(i=0; i<tmp.length; i++){
		if(tmp[i]=="") continue;
		/*if((tmp[i].replace(/\r/g,"").split('\t'))[5] == 1)*/ 
		var line = tmp[i].split('\t');
		if (line != ""){
			d_dop[j++] = line;
		}
	}
	
	if(d_dop.length == 0) return;
	if(d_dop[0].length < 5) return;

	
	// [0]キー [1]名前 [2](表示名) [3](価格) [4](工賃) [5]表示非表示（0:非表示 1:表示）
	var txt_len = d_dop.length;						// TXTのデータ数
	var xml_len = xml_data["parts"]["p"].length;	// XMLのデータ数
	
	for(j=0; j<txt_len; j++){
		// キー比較
		var id = -1;
		for(i=0; i<xml_len; i++){
			if(xml_data["parts"]["p"][i] == null) continue;
			if(d_dop[j][0] == xml_data["parts"]["p"][i]["key"] && xml_data["parts"]["p"][i]["div"] == 3){
				id = i;
				break;
			}
		}
		
		if(id != -1){
			// すでにXMLファイルにキー在り（上書き）
			
			// 表示名
			if(d_dop[j][2] != "") xml_data["parts"]["p"][id][""] = d_dop[j][2];
			// 価格
			if(d_dop[j][3] != "") xml_data["parts"]["p"][id]["price"] = d_dop[j][3];
			// 工賃
			if(d_dop[j][4] != "") xml_data["parts"]["p"][id]["pay"] = d_dop[j][4];
			// 表示非表示
			if(d_dop[j][5] != "") xml_data["parts"]["p"][id]["disp"] = d_dop[j][5];	// ☆ Sales版のみ
			
			sort_dop[j] = xml_data["parts"]["p"][id];
		}else{
			// まだXMLファイルにキー無し（新規追加）
			
			// 一括初期化
			var att;
			
			att = _getAttribute("p");
			var z;
			sort_dop[j] = new Array();
			for(z=0; z<att.length; z++){
				sort_dop[j][att[z]] = "0";
			}
			
			// キー
			sort_dop[j]["key"] = d_dop[j][0];
			// 名前(表示用)
			if(d_dop[j][2]=="") sort_dop[j][""] = d_dop[j][1];
			else sort_dop[j][""] = d_dop[j][2];
			// 価格
			sort_dop[j]["price"] = d_dop[j][3];
			// 工賃
			sort_dop[j]["pay"] = d_dop[j][4];
			// 表示非表示
			if(d_dop[j][5] == 1) {
				sort_dop[j]["disp"] = 2;							// ☆ Sales版のみ
			}else{
				sort_dop[j]["disp"] = d_dop[j][5];
			}
			// オリジナル
			sort_dop[j]["orgname"] = d_dop[j][1];
			sort_dop[j]["orgprice"] = "";
			sort_dop[j]["orgpay"]= "";
			sort_dop[j]["type"] = 2;	// パーツ
			sort_dop[j]["div"] = 3;		// DOP
		}
	}
	
	// XMLファイル上のDOPデータを削除
	for(i=0; i<xml_len; i++){
		if(xml_data["parts"]["p"][i]["div"] == 3) xml_data["parts"]["p"][i] = null;
	}
	
	// DOPデータを末尾に追加
	for(i=0; i<sort_dop.length; i++){
		 xml_data["parts"]["p"][i+xml_len] = sort_dop[i];
	}
}

//---------------------------------------------------------------------------------------
// 【メーカーオプションマスタデータ取得関数】
//   c_mop.txt のデータとXMLのデータをマージする
//---------------------------------------------------------------------------------------
function margeDealerMOPData(){

	// オリジナル名の保持(全MOP) i-CROP ●
	for(var i=0; i<xml_data["parts"]["p"].length; i++){
		if(xml_data["parts"]["p"][i] == null) continue;
		if(xml_data["parts"]["p"][i]["div"] == 2){
			xml_data["parts"]["p"][i]["orgname"] = xml_data["parts"]["p"][i][""];
			xml_data["parts"]["p"][i]["orgprice"] = xml_data["parts"]["p"][i]["price"];
		}
	}

	// マスターデータ取得
	var d_mop = new Array();
	var tmp = top.readMOP(car_name).split('\n');
	var i;
	var j=0;
	
	sort_mop = new Array();
	
	for(i=0; i<tmp.length; i++){
		if(tmp[i]=="") continue;
		/*if((tmp[i].replace(/\r/g,"").split('\t'))[5] == 1)*/ 
		var line = tmp[i].split('\t');
		if (line != ""){
			d_mop[j++] = line;
		}
	}
	
	if(d_mop.length == 0) return;
	if(d_mop[0].length < 4) return;
	
	// [0]キー [1]名前 [2](表示名) [3](価格) [4]表示非表示（0:非表示 1:表示）
	var txt_len = d_mop.length;						// TXTのデータ数
	var xml_len = xml_data["parts"]["p"].length;	// XMLのデータ数
	
	for(j=0; j<txt_len; j++){
		// キー比較
		var id = -1;
		for(i=0; i<xml_len; i++){
			if(xml_data["parts"]["p"][i] == null) continue;
			if(d_mop[j][0] == xml_data["parts"]["p"][i]["key"] && xml_data["parts"]["p"][i]["div"] == 2){
				id = i;
				break;
			}
		}
		
		if(id != -1){
			// すでにXMLファイルにキー在り（上書き）
			
			// 表示名
			if(d_mop[j][2] != "") xml_data["parts"]["p"][id][""] = d_mop[j][2];
			// 価格
			if(d_mop[j][3] != "") xml_data["parts"]["p"][id]["price"] = d_mop[j][3];
			// 工賃(未使用)
			xml_data["parts"]["p"][id]["pay"] = 0;
			// 表示非表示
			if(d_mop[j][4] != "") xml_data["parts"]["p"][id]["disp"] = d_mop[j][4];		// ☆ Sales版のみ
			
			sort_mop[j] = xml_data["parts"]["p"][id];
		}else{
			// まだXMLファイルにキー無し（新規追加）
			
			// 一括初期化
			var att;
			
			att = _getAttribute("p");
			var z;
			sort_mop[j] = new Array();
			for(z=0; z<att.length; z++){
				sort_mop[j][att[z]] = "0";
			}
			
			// キー
			sort_mop[j]["key"] = d_mop[j][0];
			// 名前(表示用)
			if(d_mop[j][2]=="") sort_mop[j][""] = d_mop[j][1];
			else sort_mop[j][""] = d_mop[j][2];
			// 価格
			sort_mop[j]["price"] = d_mop[j][3];
			// 工賃(未使用)
			sort_mop[j]["pay"] = 0;
			// 表示非表示
			if(d_mop[j][4] == 1) {
				sort_mop[j]["disp"] = 2;							// ☆ Sales版のみ
			}else{
				sort_mop[j]["disp"] = d_mop[j][4];
			}
			// オリジナル
			sort_mop[j]["orgname"] = d_mop[j][1];
			sort_mop[j]["orgprice"] = "";
			sort_mop[j]["type"] = 2;	// パーツ
			sort_mop[j]["div"] = 2;		// MOP
		}
	}
	
	// XMLファイル上のMOPデータを削除
	for(i=0; i<xml_len; i++){
		if(xml_data["parts"]["p"][i] == null) continue;
		if(xml_data["parts"]["p"][i]["div"] == 2) xml_data["parts"]["p"][i] = null;
	}
	
	// MOPデータを末尾に追加
	for(i=0; i<sort_mop.length; i++){
		 xml_data["parts"]["p"][i+xml_len] = sort_mop[i];
	}
}

//---------------------------------------------------------------------------------------
// 【付加費用マスターデータ取得関数】
//   c_addition.txt のデータとXMLのデータをマージする
//---------------------------------------------------------------------------------------
function margeDealerAdditionData(){
	// オリジナル名の保持(全付加費用) i-CROP ●
	for(var i=0; i<xml_data["addition"]["a"].length; i++){
		xml_data["addition"]["a"][i]["orgname"]  = xml_data["addition"]["a"][i][""];
		xml_data["addition"]["a"][i]["orgvalue"] = xml_data["addition"]["a"][i]["value"];
		xml_data["addition"]["a"][i]["orgtype"]  = xml_data["addition"]["a"][i]["type"];
		xml_data["addition"]["a"][i]["del"]      = 0;		// 削除可能フラグ
	}
	
	// マスターデータ取得
	var d_addition = new Array();
	var tmp = top.readAddition(car_name).split('\n');
	var i;
	var j=0;
	
	sort_addition = new Array();
	
	//空白対応
	for(i=0; i<tmp.length; i++){
		if(tmp[i]=="") continue;
		/*if((tmp[i].replace(/\r/g,"").split('\t'))[5] == 1)*/ 
		var line = tmp[i].split('\t');
		if (line != ""){
			d_addition[j++] = line;
		}
	}
	
	if(d_addition.length == 0) return;
	if(d_addition[0].length < 5) return;
	
	// c_addition.txt
	// [0]キー [1]グレードキー(未使用) [2]項目名称 [3](表示名称) [4](値) [5]タイプ(0:価格,1:税金分母) [6]表示非表示（0:非表示,1:表示）
	var txt_len = d_addition.length;					// TXTのデータ数
	var xml_len = xml_data["addition"]["a"].length;		// XMLのデータ数
	
	for(j=0; j<txt_len; j++){
		// キー比較
		var id = -1;
		for(i=0; i<xml_len; i++){
			if(d_addition[j][0] == xml_data["addition"]["a"][i]["key"]){
				id = i;
				break;
			}
		}
		
		if(id != -1){
			// すでにXMLファイルにキー在り（上書き）
			
			// 表示名称
			if(d_addition[j][3] != "") xml_data["addition"]["a"][id][""]      = d_addition[j][3];
			// 値
			if(d_addition[j][4] != "") xml_data["addition"]["a"][id]["value"] = d_addition[j][4];
			// タイプ
			if(d_addition[j][5] != "") xml_data["addition"]["a"][id]["type"]  = d_addition[j][5];
			// 表示非表示
			if(d_addition[j][6] != "") xml_data["addition"]["a"][id]["disp"]  = d_addition[j][6];
			
			sort_addition[j] = xml_data["addition"]["a"][id];
		}else{
			// まだXMLファイルにキー無し（新規追加）
			
			// 一括初期化
			var att;
			
			att = _getAttribute("a");
			var z;
			sort_addition[j] = new Array();
			for(z=0; z<att.length; z++){
				sort_addition[j][att[z]] = "0";
			}
			
			// キー
			sort_addition[j]["key"] = d_addition[j][0];
			// (表示名称)
			if(d_addition[j][3]=="") sort_addition[j][""] = d_addition[j][2];	// 項目名称が付加費用名
			else					 sort_addition[j][""] = d_addition[j][3];	// 表示名称が付加費用名
			// 値
			sort_addition[j]["value"] = d_addition[j][4];
			// タイプ
			sort_addition[j]["type"] = d_addition[j][5];
			// 表示非表示
			if(d_addition[j][6] == 1) {
				sort_addition[j]["disp"] = 2;							// ☆ Sales版のみ
			}else{
				sort_addition[j]["disp"] = d_addition[j][6];
			}
			// オリジナル
			sort_addition[j]["orgname"]  = d_addition[j][2];
			sort_addition[j]["orgvalue"] = d_addition[j][4];
			sort_addition[j]["orgtype"]  = d_addition[j][5];
			sort_addition[j]["del"]  = 1;								// 削除可能フラグ
		}
	}
	
	// additionデータを追加
	xml_data["addition"]["a"] = new Array();
	for(i=0; i<sort_addition.length; i++){
		 xml_data["addition"]["a"][i] = sort_addition[i];
	}
}

//---------------------------------------------------------------------------------------
// 【XMLデータデバッグ用関数１】
//   ロードしたXMLデータをアラートにリストアップ
//---------------------------------------------------------------------------------------
function debug_xml(){
	var tmp = "";
	var n,s,z;
	
	for (n=0; n<xml_tree.length; n++) {
		var _nodename = xml_tree[n][0];
		tmp += _nodename + "\n";
		
		for (k=0; k<xml_tree[n][1].length; k++) {
			var _subnodename = xml_tree[n][1][k];
			
			for (s=0; s<xml_data[_nodename][_subnodename].length; s++) {
				tmp += "  \<" + _subnodename + " ";
				// 属性
				var attr = _getAttribute(_subnodename);
				for (z=0; z<attr.length; z++) {
					tmp += attr[z] + "=" + xml_data[_nodename][_subnodename][s][attr[z]] + " ";
				}
				
				tmp += xml_data[_nodename][_subnodename][s][""] + "\>\n";
			}
		}
	}
	
	alert(tmp);
}

//---------------------------------------------------------------------------------------
// 【XMLデータデバッグ用関数２】
//   最終形態のデータをアラートにリストアップ
//---------------------------------------------------------------------------------------
function debug_data(){
	var str = "";
	str += check_grade() + "\n";
	str += check_color() + "\n";
	str += check_parts() + "\n";
	str += check_addition() + "\n";
	str += check_contents();
	
	alert(str);
}

//---------------------------------------------------------------------------------------
// 【データプッシュ関数】
//    ロードしたXML情報を"*.jp"へ反映させる
//---------------------------------------------------------------------------------------
function push_jsfile(){
	push_grade();		// グレード
	push_color();		// カラー
	push_parts();		// パーツ
	push_addition();	// 付加費用情報
	push_contents();	// コンテンツ情報
}

//---------------------------------------------------------------------------------------
// 【グレード処理関数】
//---------------------------------------------------------------------------------------
function push_grade(){
	//グレード  ※配列内容は資料参考
	//    0:Key(0～49) 1:グレード名 2:(駆動 排気量 ミッション) 3:画像 4:画像サイズ[幅][高さ] 5:デフォルトカラーKey
	//    6:車両本体価格[税込][税抜] 7:諸費用(資料参考)
	//    ☆8:ソート ☆9:ボディタイプ ☆10:型式 ☆11:車種適用(0:表示しない 1:表示する 2:デフォルトグレード)
	//    12:オリジナル販売型式 13:オリジナル価格 14:表示非表示 15:燃料 16:乗車定員
	Btn_Gra = new Array();
	var id;
	for(id=0; id<xml_data["grade"]["g"].length; id++){
		if(xml_data["grade"]["g"][id] == null) continue;
		
		Btn_Gra.push(new Array(_getGrdKey(id), _getGrdName(id), new Array(_getGrdDrive(id),_getGrdEngine(id),_getGrdMission(id)), _getGrdImg(id), _getGrdIsize2(id), _getDefGrdCol(id),
					 _getGrdPrice2(id), null, _getGrdSort(id), _getGrdBody(id), _getGrdModel(id), _getGrdCar(id),
					 _getGrdOrgModel(id), _getGrdOrgPrice(id), _getGrdDisp(id),  _getGrdFuel(id), _getGrdCapacity(id) ));
		if(_getGrdCar(id) == 2){
			defGrade = id;
		}
	}
}

//---------------------------------------------------------------------------------------
// 【グレードチェック関数】
//---------------------------------------------------------------------------------------
function check_grade(){
	var i;
	var str = "";
	for(i=0; i<Btn_Gra.length; i++){
		str += "[" + i + "]" + Btn_Gra[i] + "\n";
	}
	return str;
}

//---------------------------------------------------------------------------------------
// 【カラー処理関数】
//---------------------------------------------------------------------------------------
function push_color(){
	//  カラー  ※配列内容は資料参考
	//    0:Key(50～99) 1:カラー名 2:Node 3:画像 4:画像サイズ[幅][高さ]
	//    5:区分（-1=無効 0=標準品（リスト非表示） 1=標準品（リスト表示） 2=MOP 3=DOP 4=TRD 5=モデリスタ）
	//    6:グレード適合(0=適合なし 1=オプション 2=標準装備) 7:価格[税込][税抜]
	//    8:カラー適合(Interior Color only)
	//    9:その他費用で表示されるのカラー名(MOPのみ)
	//    10:その他費用で表示されるの費用(MOPのみ)
	var id;
	
	Btn_Col = new Array();
	Btn_Col_in = new Array();
	for(id=0; id<xml_data["color"]["c"].length; id++){
		if(xml_data["color"]["c"][id] == null) continue;
		
		if(_getColPart(id) == "ext"){
			Btn_Col.push(new Array(_getColKey(id), _getColName(id), _getColNode(id), _getColImg(id), _getColIsize2(id), _getColDiv(id), _getColGrd2(id), _getColPrice2(id),
								   null, _getColName(id), _getColPrice2(id), _getColCode(id) ));
		}
		if(_getColPart(id) == "int"){
			Btn_Col_in.push(new Array(_getColKey(id), _getColName(id), _getColNode(id), _getColImg(id), _getColIsize2(id), _getColDiv(id), _getColGrd2(id), _getColPrice2(id),
									  _getColCol2(id), _getColName(id), _getColPrice2(id), _getColCode(id) ));
		}
	}
}

//---------------------------------------------------------------------------------------
// 【カラーチェック関数】
//---------------------------------------------------------------------------------------
function check_color(){
	var i;
	var str = "";
	for(i=0; i<Btn_Col.length; i++){
		str += "[" + i + "]" + Btn_Col[i] + "\n";
	}
	str += "\n";
	for(i=0; i<Btn_Col_in.length; i++){
		str += "[" + i + "]" + Btn_Col_in[i] + "\n";
	}
	return str;
}

//---------------------------------------------------------------------------------------
// 【パーツ処理関数】
//---------------------------------------------------------------------------------------
function push_parts(){
	//  パーツ　※配列内容は資料参考
	//    0:Key(100～999) 1:パーツ名 2:Node 3:画像 4:画像サイズ[幅][高さ] 5:種別（0=パッケージ 1=セット(キット) 2=パーツ 3=ホイール） 
	//    6:区分（-1=無効 0=標準品（リスト非表示） 1=標準品（リスト表示） 2=MOP 3=DOP 4=TRD 5=モデリスタ）
	//    7:排他種別（0=排他無し 10～各種別 No）
	//    8:グレード適合（0:適合なし 1:オプション 2:標準装備）
	//    9:装着時カメラ位置（0:フロント　1:リア） 
	//    10:worldFlg 11:パッケージ配列(null) 12:見積(素地)[価格(税込)][価格(税抜)][取付時間][塗装時間] 13:見積(塗装済) 14:特殊カラー配列
	//    ☆15:工賃 ☆16:表示非表示 17:オリジナルパーツ名 18:オリジナル価格 19:オリジナル工賃 20:タブ 21:追行コード
	//      ※ 16:表示非表示項目について
	//              0:このパーツをＴＣＶと商談メモで非表示にする
	//              1:このパーツをＴＣＶと商談メモで表示する
	//              2:このパーツをＴＣＶで非表示し、商談メモで表示する
	//              （商談メモで非表示のパーツはＴＣＶでは必ず非表示にする）
	var id;
	Btn_Par = new Array();
	for(id=0; id<xml_data["parts"]["p"].length; id++){
		if(xml_data["parts"]["p"][id] == null) continue;
		
		Btn_Par.push(new Array(_getPartsKey(id), _getPartsName(id), _getPartsNode(id), _getPartsImg(id), _getPartsIsize2(id), _getPartsType(id),
					 _getPartsDiv(id), _getPartsGrp(id), _getPartsGrd2(id), _getPartsCamera(id),
					 _getPartsWorld(id), _getPartsPkg2(id), _getPartsQuote(id), _getPartsQuotePaint(id), _getPartsSpecCol2(id), _getPartsPay(id), _getPartsDisp(id), 
					_getPartsOrgName(id),_getPartsOrgPrice(id),_getPartsOrgPay(id), _getPartsTab(id), _getPartsCode2(id), _getPartsExCol2(id), _getPartsPopup(id)  ));	// ☆ Sales版対応
	}
}

//---------------------------------------------------------------------------------------
// 【パーツチェック関数】
//---------------------------------------------------------------------------------------
function check_parts(){
	var i;
	var str = "";
	for(i=0; i<Btn_Par.length; i++){
		str += "[" + i + "]" + Btn_Par[i] + "\n";
	}
	return str;
}

//---------------------------------------------------------------------------------------
// 【付加費用情報処理関数】
//---------------------------------------------------------------------------------------
function push_addition(){
	// 0:key 1:付加費用名 2:グレードキー 3:値 4:値のタイプ(0:価格 1:分母)
	// ☆5:表示非表示 6:オリジナル名 7:オリジナル値 8:オリジナルタイプ
	Mst_Add = new Array();
	for(id=0; id<xml_data["addition"]["a"].length; id++){
		if(xml_data["addition"]["a"][id] == null) continue;
		
		Mst_Add.push(new Array(_getAddKey(id), _getAddName(id), _getAddGkey(id), _getAddValue(id), _getAddType(id),
		_getAddDisp(id), _getAddOrgName(id), _getAddOrgValue(id), _getAddOrgType(id), _getAddDel(id)));
	}
}

//---------------------------------------------------------------------------------------
// 【付加費用情報チェック関数】
//---------------------------------------------------------------------------------------
function check_addition(){
	var i;
	var str = "";
	for(i=0; i<Mst_Add.length; i++){
		str += "[" + i + "]" + Mst_Add[i] + "\n";
	}
	return str;
}

//---------------------------------------------------------------------------------------
// 【コンテンツ情報処理関数】
//---------------------------------------------------------------------------------------
function push_contents(){
	//   インテリアＳ　0:Key(3000～) 1:画像 2:画像サイズ[幅][高さ] 3:CO 4:Flash 5:グレード適合(0=適合なし 1=オプション 2=標準装備)
	//				   6:機能解説適合 7:区分(Btn_Seat only)
	var id;
	Btn_Inte = new Array();
	Btn_Seat = new Array();
	for(id=0; id<xml_data["contents"]["s"].length; id++){
		if(xml_data["contents"]["s"][id] == null) continue;
		
		if(_getContSPart(id) == "int_pano"){
			// Co
			Btn_Inte.push(new Array(_getContSKey(id), _getContSImg(id), _getContSIsize2(id), _getContSCont(id), ""				 , _getContSGrd2(id), _getContSFunc2(id), ""				));
		}
		if(_getContSPart(id) == "int_phot"){
			// Flash
			Btn_Inte.push(new Array(_getContSKey(id), _getContSImg(id), _getContSIsize2(id), ""				  , _getContSCont(id), _getContSGrd2(id), _getContSFunc2(id), ""				));
		}
		if(_getContSPart(id) == "seat"){
			// SeatArange
			Btn_Seat.push(new Array(_getContSKey(id), _getContSImg(id), _getContSIsize2(id), ""				  , _getContSCont(id), _getContSGrd2(id), ""				, _getContSTab(id)));
		}
	}
	
	//   インテリアＦ　0:Key(3200～) 1:FlashFile 2:Flashサイズ[幅][高さ] 3:音声File
	InPano_Flash = new Array();
	for(id=0; id<xml_data["contents"]["f"].length; id++){
		if(xml_data["contents"]["f"][id] == null) continue;
		
		if(_getContFPart(id) == "ext"){
			InPano_Flash.push(new Array(_getContFKey(id), _getContFCont(id), _getContFCsize2(id), _getContFSound(id)));
		}
		if(_getContFPart(id) == "int"){
			InPano_Flash.push(new Array(_getContFKey(id), _getContFCont(id), _getContFCsize2(id), _getContFSound(id)));
		}
	}

	// 価格注釈 0:Key 20091112
	Dat_Note = new Array();
	for(id=0; id<xml_data["contents"]["n"].length; id++){
		if(xml_data["contents"]["n"][id] == null) continue;
		Dat_Note.push(new Array( _getContNKey(id), _getContNName(id) ));
	}
}


//---------------------------------------------------------------------------------------
// 【コンテンツ情報チェック関数】
//---------------------------------------------------------------------------------------
function check_contents(){
	var i;
	var str = "";
	for(i=0; i<Btn_Inte.length; i++){
		str += "[" + i + "]" + Btn_Inte[i] + "\n";
	}
	str += "\n";
	for(i=0; i<InPano_Flash.length; i++){
		str += "[" + i + "]" + InPano_Flash[i] + "\n";
	}
	// 20091112
	str += "\n";
	for(i=0; i<Dat_Note.length; i++){
		str += "[" + i + "]" + Dat_Note[i] + "\n";
	}
	return str;
}

//----------------------------------------------------------------------------

// Header
function _getHeadVer(){		return xml_data["header"]["h"][0]["ver"];}

// Grade
function _getGrdKey(id){	return parseInt(xml_data["grade"]["g"][id]["key"], 10);}
function _getGrdBody(id){	return xml_data["grade"]["g"][id]["body"];}
function _getGrdDrive(id){	return xml_data["grade"]["g"][id]["drive"];}
function _getGrdEngine(id){	return xml_data["grade"]["g"][id]["engine"];}
function _getGrdMission(id)	{return xml_data["grade"]["g"][id]["mission"];}
function _getGrdImg(id){	return xml_data["grade"]["g"][id]["img"];}
function _getGrdIsize(id){	return xml_data["grade"]["g"][id]["isize"];}
function _getGrdCar(id){	return parseInt(xml_data["grade"]["g"][id]["car"], 10);}
function _getGrdPrice(id){	return xml_data["grade"]["g"][id]["price"];}
function _getGrdModel(id){	return xml_data["grade"]["g"][id]["model"];}
function _getGrdSort(id){	return parseInt(xml_data["grade"]["g"][id]["sort"], 10);}
function _getGrdName(id){	return xml_data["grade"]["g"][id][""];}
function _getGrdOrgModel(id){	return xml_data["grade"]["g"][id]["orgmodel"];}
function _getGrdOrgPrice(id){	return xml_data["grade"]["g"][id]["orgprice"];}
function _getGrdDisp(id){		return xml_data["grade"]["g"][id]["disp"];}
function _getGrdFuel(id){	return xml_data["grade"]["g"][id]["fuel"];}
function _getGrdCapacity(id){return xml_data["grade"]["g"][id]["capacity"];}

function _getGrdIsize2(id){
	return _getGrdIsize(id).split('|');
}
function _getGrdPrice2(id){
	return _getGrdPrice(id).split('|');
}

// Color
function _getColKey(id){	return parseInt(xml_data["color"]["c"][id]["key"], 10);}
function _getColPart(id){	return xml_data["color"]["c"][id]["part"];}
function _getColCode(id){	return xml_data["color"]["c"][id]["code"];}
function _getColNode(id){	return xml_data["color"]["c"][id]["node"];}
function _getColImg(id){	return xml_data["color"]["c"][id]["img"];}
function _getColIsize(id){	return xml_data["color"]["c"][id]["isize"];}
function _getColDiv(id){	return parseInt(xml_data["color"]["c"][id]["div"], 10);}
function _getColGrd(id){	return xml_data["color"]["c"][id]["grd"];}
function _getColName(id){	return xml_data["color"]["c"][id][""];}
function _getColCol(id){	return xml_data["color"]["c"][id]["col"];}
function _getColPrice(id){	return xml_data["color"]["c"][id]["price"];}
function _getColPrice2(id){
	var c = _getColPrice(id).split('|');
	return new Array(c[0], c[1]);
}
function _getColIsize2(id){
	return _getColIsize(id).split('|');
}
function _getColGrd2(id){
	var c = changeStringToInt(_getColGrd(id).split('|'));
	var i;
	for(i=0; i<c.length; i++){
		if(c[i] == 2) c[i] = 1;
	}
	return c;
}
function _getDefGrdCol(id){
	var i;
	var ext=0;
	var pan=0;
	
	for(i=0; i<xml_data["color"]["c"].length; i++){
		if(_getColPart(i) == "ext" && _getColGrd(i).split('|')[id] == 2) ext = _getColKey(i);
		if(_getColPart(i) == "int" && _getColGrd(i).split('|')[id] == 2) pan = _getColKey(i);
	}
	
	return new Array(ext, pan);
}
function _getColCol2(id){
	var i;
	var tmp = new Array();
	var c = _getColCol(id).split('|');
	for(i=0; i<c.length; i++){
		tmp[i] = changeStringToInt(c[i].split(','));
	}
	
	// Interior Color
	if(_getColPart(id) == "int"){
		for(i=0; i<tmp.length; i++){
			if(_getColGrd2(id)[i] == 0) continue;
			if(tmp[i].length != 0) continue;
			
			var j;
			var ary = new Array();
			for(j=0; j<xml_data["color"]["c"].length; j++){
				if(_getColPart(j) == "ext") ary.push( parseInt(_getColKey(j), 10) );
			}
			tmp[i] = ary;
		}
	}
	return tmp;
}

// Parts
function _getPartsKey(id){	return parseInt(xml_data["parts"]["p"][id]["key"], 10);}
function _getPartsNode(id){	return xml_data["parts"]["p"][id]["node"];}
function _getPartsImg(id){	return xml_data["parts"]["p"][id]["img"];}
function _getPartsIsize(id){return xml_data["parts"]["p"][id]["isize"];}
function _getPartsType(id){	return parseInt(xml_data["parts"]["p"][id]["type"], 10);}
function _getPartsDiv(id){	return parseInt(xml_data["parts"]["p"][id]["div"], 10);}
function _getPartsGrp(id){	return parseInt(xml_data["parts"]["p"][id]["grp"], 10);}
function _getPartsGrd(id){	return xml_data["parts"]["p"][id]["grd"];}
function _getPartsCamera(id){return parseInt(xml_data["parts"]["p"][id]["camera"], 10);}
function _getPartsWorld(id){return parseInt(xml_data["parts"]["p"][id]["world"], 10);}
function _getPartsPrice(id){return xml_data["parts"]["p"][id]["price"];}
function _getPartsPay(id){	return xml_data["parts"]["p"][id]["pay"];}
function _getPartsName(id){	return xml_data["parts"]["p"][id][""];}
function _getPartsDisp(id){	return xml_data["parts"]["p"][id]["disp"];}	// ☆Sales版のみ
function _getPartsOrgName(id){return xml_data["parts"]["p"][id]["orgname"];}
function _getPartsOrgPrice(id){return xml_data["parts"]["p"][id]["orgprice"];}
function _getPartsOrgPay(id){return xml_data["parts"]["p"][id]["orgpay"];}
function _getPartsTab(id){	return parseInt(xml_data["parts"]["p"][id]["tab"], 10);}
function _getPartsPkg(id){	return xml_data["parts"]["p"][id]["pkg"];}
function _getPartsTime(id){	return xml_data["parts"]["p"][id]["time"];}
function _getPartsSpecCol(id){	return xml_data["parts"]["p"][id]["col"];}
function _getPartsExCol(id){	return xml_data["parts"]["p"][id]["excol"];}
function _getPartsCode(id){	return xml_data["parts"]["p"][id]["code"];}
function _getPartsPopup(id){	return xml_data["parts"]["p"][id]["popup"];}


function _getPartsExCol2(id){
	return safeSplit(_getPartsExCol(id),',');
}

function _getPartsCode2(id){
	var c = safeSplit(_getPartsCode(id),'|');
	return ( c=="" ) ? c : new Array(c[0], c[1]);
}
function _getPartsSpecCol2(id){
	return safeSplit(_getPartsSpecCol(id),'|');
}
function _getPartsPkg2(id){
	if( (parseInt(_getPartsType(id), 10)==0) || (parseInt(_getPartsType(id), 10)==1) ){	// 0:package, 1:set
		return changeStringToInt(safeSplit(_getPartsPkg(id),','));
	}
	return "";
}
function _getPartsIsize2(id){
	return _getPartsIsize(id).split('|');
}
function _getPartsGrd2(id){
	return changeStringToInt(_getPartsGrd(id).split('|'));
}

function _getPartsQuote(id){
	var p = _getPartsPrice(id).split('|');		// 価格
    var t = safeSplit(_getPartsTime(id),'|');	// 時間
    if ( t=="" ) t = new Array(0,0,0);		 
	return new Array(p[0], p[1], t[0], t[1]);
}
function _getPartsQuotePaint(id){
	var p = _getPartsPrice(id).split('|');		// 価格
    var t = safeSplit(_getPartsTime(id),'|');	// 時間
    if ( t=="" ) t = new Array(0,0,0);		 
	return new Array(p[2], p[3], t[2]);
}

// Addition
function _getAddKey(id){	return parseInt(xml_data["addition"]["a"][id]["key"], 10);}
function _getAddGkey(id){	return xml_data["addition"]["a"][id]["gkey"];}
function _getAddValue(id){	return xml_data["addition"]["a"][id]["value"];}
function _getAddType(id){	return xml_data["addition"]["a"][id]["type"];}
function _getAddName(id){	return xml_data["addition"]["a"][id][""];}
function _getAddDisp(id){		return xml_data["addition"]["a"][id]["disp"];}
function _getAddOrgName(id){	return xml_data["addition"]["a"][id]["orgname"];}
function _getAddOrgValue(id){	return xml_data["addition"]["a"][id]["orgvalue"];}
function _getAddOrgType(id){	return xml_data["addition"]["a"][id]["orgtype"];}
function _getAddDel(id){		return parseInt(xml_data["addition"]["a"][id]["del"], 10);}

// Contents
function _getContSKey(id){	return parseInt(xml_data["contents"]["s"][id]["key"], 10);}
function _getContSPart(id){	return xml_data["contents"]["s"][id]["part"];}
function _getContSImg(id){	return xml_data["contents"]["s"][id]["img"];}
function _getContSIsize(id){return xml_data["contents"]["s"][id]["isize"];}
function _getContSCont(id){	return xml_data["contents"]["s"][id]["cont"];}
function _getContSGrd(id){	return xml_data["contents"]["s"][id]["grd"];}
function _getContSFunc(id){	return xml_data["contents"]["s"][id]["func"];}
function _getContSName(id){	return xml_data["contents"]["s"][id][""];}
function _getContSIsize2(id){
	return _getContSIsize(id).split('|');
}
function _getContSGrd2(id){
	return changeStringToInt(_getContSGrd(id).split('|'));
}
function _getContSFunc2(id){
	return _getContSFunc(id).split('|');
}

function _getContFKey(id){	return xml_data["contents"]["f"][id]["key"];}
function _getContFPart(id){	return xml_data["contents"]["f"][id]["part"];}
function _getContFCont(id){	return xml_data["contents"]["f"][id]["cont"];}
function _getContFCsize(id){return xml_data["contents"]["f"][id]["csize"];}
function _getContFSound(id){return xml_data["contents"]["f"][id]["sound"];}
function _getContFName(id){	return xml_data["contents"]["f"][id][""];}
function _getContSTab(id){	return parseInt(xml_data["contents"]["s"][id]["tab"], 10);}
function _getContFCsize2(id){
	return safeSplit(_getContFCsize(id),'|');
}

function _getContNKey(id){	return xml_data["contents"]["n"][id]["key"];}       // 20091112
function _getContNName(id){	return xml_data["contents"]["n"][id][""];}          // 20091112


function changeStringToInt(ary){
	var i;
	var tmp = new Array();
	for(i=0; i<ary.length; i++){
		if(ary[i] == "") continue;
		if(ary[i] == null) continue;
		
		tmp[i] = parseInt(ary[i], 10);
	}
	
	return tmp;
}

function safeSplit(ary,c) {
  if ( ary=="" || ary==undefined )
    return "";
  else
    return ary.split(c);
}
