﻿///////////////////////////////////////////////////////////////////////////////////////////
function Y_texLoadCheck(rTime){
	if(Y_isTextureLoadInProgress()) setTimeout("Y_texLoadCheck("+rTime+")",10);
	else {
		//
		if(flg_firstLoad){
			Y_3DLoadFinished();
			///////////////////////////////////////////
			if(Y_systemP){
				if(Y_systemPerformanceCheck()){
					Y_setAntiAliasMode(1);
				}else{
					Y_setAntiAliasMode(0);
				}
			}else{
				Y_setAntiAliasMode(1);
			}
			///////////////////////////////////////////
			flg_firstLoad = false;
		}
		//setTimeout("Y_redrawSetOn("+rTime+")",100);
		if(!K_onoff_flg){//alert("1__"+rTime)
			setTimeout("Y_redrawSetOn("+rTime+")",100);
			setTimeout("Y_enableUI(true)",rTime+300);
			setTimeout("flg_3d_check = true",rTime+300);
		}else{//alert("2__"+rTime)
			setTimeout("Y_redrawSetOn(500)",100);
			setTimeout("Y_enableUI(true)",rTime+1500);
			setTimeout("flg_3d_check = true",rTime+1500);
		}
	}
}
///////////////////////////////////////////////////////////////////////////////////////////
// ---------------------------------------------------------------------------------
// 同じ装備でグレード別に3Dの設定があるかをチェックし、ある場合はそのグレードを返す
// ---------------------------------------------------------------------------------
function Y_ygroupArCheck(uid,cat,gid){
	// グレードのチェックのとき、グレード名をuidに代入
	if(typeof(Y_groupCategoryAr[uid])!="undefined") uid=Y_groupCategoryAr[uid];
	for(var i in Y_group[uid][cat]){
		if(Y_strMatchFunc(0,1,"/",i)==false) return false;//グレード別設定のないもの
		if(i.indexOf("/"+gid+"/")!=(-1)) return i; //グレード別設定があるとき
	}
}

// ------------------------------------------------------------------
// y_groupの配列の有無をチェックし、3Dに反映するものかを判定
// ------------------------------------------------------------------
function Y_ygroupArCheckA(uid){//Y_groupの3D反映有無
	if(typeof(Y_group[uid])=="undefined") return false;
	return true;
}

// ---------------------------
// 各カテゴリの有無のチェック
// ---------------------------
function Y_ygroupArCheckB(uid,cat){//Y_groupのカテゴリー有無
	// グレードのチェックのとき、グレード名をuidに代入
	if(typeof(Y_groupCategoryAr[uid])!="undefined") uid=Y_groupCategoryAr[uid];
	if(typeof(Y_group[uid][cat])=="undefined") return false;
	return true;
}

// ---------------------------
// 文字列の一致をチェック
// ---------------------------
function Y_strMatchFunc(val,val1,val2,val3){//val---何文字目から val1---何文字目まで val2---判別文字 val3---判別元
	if(val3.substring(val,val1)==val2) return true;
	else return false;
}
///////////////////////////////////////////////////////////////////////////////////////////
var Y_currentEquipInfo = "&&&";//current/
///////////////////////////////////////////////////////////////////////////////////////////
var dummyBaseImport = false; // dummyのbaseの読込フラグ true:済 false:未


// ---------------------------
// 3Dの表示
// ---------------------------
function Y_3dMain(str) {
	
	//flg_3d_check = false;
	
	// オプションの配列を作成
	Y_optionMakeStr(str);
	
	// 外れるオプションにカーカバーがあるときcover_flg=true;
	if(ex_in_flg == "exterior"){
		var cover_flg=false;
		for(i=0;i<off_o.length;i++){
			if(off_o[i] == carCverId){//
				cover_flg=true;
			}
		}
	}
	
	// オプションを外すor付ける前の、animConsistentのアニメーションの状態 //
	// 同じアニメーションをするオプションの、アニメーションが
	var old_boolflg=false;
	for(h in animConsistent){
		var Y_data = new Array();
		Y_data = animConsistent[h][3].split("/");
		for(i=0;i<Y_data.length;i++){
			// 実行されていれば、
			if(animConsistent[Y_data[i]][0]){
				old_boolflg=true; // trueにする
			}
		}
	}
	/* 不要？？？
	// 外れるオプションの、animConsistentのアニメーションの状態をfalseに //
	// 外れるオプションのなかに
	for(i=0;i<off_o.length;i++){
		// 同じアニメーションをもつオプションがあるとき
		for(j in animConsistent){
			if(off_o[i]==j){
				animConsistent[j][0]=false; // そのオプションをfalseにする
			}
		}
	}
	
	// オプションを外すor付けた後の、animConsistentのアニメーションの状態 //
	// 同じアニメーションをするオプションの、アニメーションが
	var boolflg=false;
	for(h in animConsistent){
		var Y_data = new Array();
		Y_data = animConsistent[h][3].split("/");
		for(i=0;i<Y_data.length;i++){
			// 実行されていれば、
			if(animConsistent[Y_data[i]][0]){
				boolflg=true; // trueにする
			}
		}
	}
	*/
	
	// exterior
	if(ex_in_flg == "exterior") {
		// 外れるオプションにカーカバーがあるとき
		if(cover_flg==true) {
			// カーカバーを非表示にする
			Y_redrawSetOff();
			Y_setShVisible( EntityGroup, 'car_cover', false );
			Y_redrawSetOn(500)
			setTimeout( function() {
				if((on_o != null)&&(Y_optionOnOffFlg=="on"))Y_GoToAnimationFront();
				else Y_3dMain2();
			}, 1000);
		
		// 外れるオプションにカーカバーがなく
		} else {
			
			// 装着するオプションがカーカバーで
			if(on_o == carCverId) {
				
				if(old_boolflg) { // トランクがopenのとき
					Y_redrawSetOff();
					Y_playAnimation( "close" ); // close を実行
					Y_redrawSetOn(500);
					var time = 1000;
				
				} else var time = 500; // トランクがcloseのとき
				
				// オプションのアニメーションのフラグをfalseにする
				for(j in animConsistent) {
					animConsistent[j][0] = false;
				}
				
				setTimeout( function() {
					if((on_o != null)&&(Y_optionOnOffFlg=="on"))Y_GoToAnimationFront();
					else Y_3dMain2();
				}, time);
			/*
			// カーカバー装着するとき以外で、トランクがcloseになるときに
			}else if(boolflg==false){
				// オプションを外すor付ける前、トランクがopenだったとき
				if(old_boolflg==true){
					if((on_o != null)&&(Y_optionOnOffFlg=="on"))Y_GoToAnimationFront();
					else Y_3dMain2();
				// オプションを外すor付ける前、トランクがcloseだったとき
				}else{
					/*
					Y_redrawSetOff();
					Y_playAnimation( "close" );
					Y_redrawSetOn(500);
					*
				//	setTimeout( function() {
						if((on_o != null)&&(Y_optionOnOffFlg=="on"))Y_GoToAnimationFront();
						else Y_3dMain2();
				//	}, 1000);
				}
			*/	
			// カーカバーを装着するとき以外
			}else{
				if((on_o != null)&&(Y_optionOnOffFlg=="on"))Y_GoToAnimationFront();
				else Y_3dMain2();
			}
		}
	// interior
	} else if(ex_in_flg == "interior") {
		if((on_o != null)&&(Y_optionOnOffFlg=="on")) Y_GoToAnimationFront(); // オプションをつけるとき
		else if((off_o != "")&&(Y_optionOnOffFlg=="off")) Y_GoToAnimationFront(); //オプションを外すとき
		else Y_3dMain2(); // オプション以外のとき
	}
	
}

// ----------------------------------------------------------------------------
// 3Dの表示やアニメーションの実行
// ----------------------------------------------------------------------------
function Y_3dMain2() { // arg[0]:"interval",arg[1]:time
	
	Y_redrawSetOff();
	
	// 初期3D読込時、dummyのbaseを表示
	if(!dummyBaseImport && ex_in_flg == "exterior"){
		// *** ベース
		Y_setShVisible( EntityGroup, "base", true ); // 2008.01 ver6.0
		// *** タイヤ
		//Y_setShVisible( EntityGroup, "tire", true ); // 2008.01 ver6.0
		// *** ホイールコピー
		
		K_wheel_transforms_entry();
		dummyBaseImport=true;
	} else if(!dummyBaseImport && ex_in_flg == "interior") {
		Y_setShVisible( EntityGroup, "base", true );
		Y_SelectableTr.change(selectableTr["angle1"]);
		dummyBaseImport=true;
	}
	
	// 各3Dの表示・非表示
	if(Y_optionSplitStr["option"]["off"].length!=0)	Y_3dselectOption("off","option");
	if(Y_optionSplitStr["interior"]["off"]!="")	Y_3dselectOption("off","interior");
	if((Y_optionSplitStr["grade"]["off"]!="")&&(Y_optionSplitStr["grade"]["on"]!=Y_optionSplitStr["grade"]["off"]))	Y_3dselectGrade("off");
	if(Y_optionSplitStr["grade"]["on"]!=Y_optionSplitStr["grade"]["off"]) Y_3dselectGrade("on");
	if(Y_optionSplitStr["color"]["on"]!="")	Y_3dselectColor();
	if(Y_optionSplitStr["interior"]["on"]!="") Y_3dselectOption("on","interior");
	if(Y_optionSplitStr["option"]["on"].length!=0) Y_3dselectOption("on","option");
	
	// アニメーションからアニメーションの間の3Dの表示等のとき、次のアニメーションの実行
	if(arguments[0] == "interval"){
		setTimeout(function(){ Y_AnimationFrame();}, arguments[1]+300);
	};
	
	
	
	// 同じアニメーションのオプションを外すときの、アニメ実行フラグと、元に戻すアニメーションの制御
	if((on_o != null)&&(Y_optionOnOffFlg=="off")&&(typeof(animConsistent)!="undefined")&&typeof(animConsistent[on_o])!="undefined"){
		
		// 選択したオプションの同時装着不可オプションのアニメ実行フラグをfalseにする
		animConsistent[on_o][0]=false;
		for(i=0;i<oData[on_o]["compOID"][0].length;i++){
			for(j in animConsistent){
				if(oData[on_o]["compOID"][0][i]==j){
					animConsistent[j][0]=false;
				}
			}
		}
		
		// 同じアニメーションをするオプションが装着中の場合、元に戻すアニメーションを実行しない
		var boolflg=false;
		var Y_data = new Array();
		Y_data = animConsistent[on_o][3].split("/"); // 
		for(i=0;i<Y_data.length;i++){
			if(animConsistent[Y_data[i]][0]==true) boolflg=true;
		}
		if(boolflg==false) Y_playAnimation( animConsistent[on_o][2] );
	}
	
	
	// オプションを外したときの位置リセット
	if((off_o.length > 0) && (Y_optionOnOffFlg == "off") && ex_in_flg == "exterior") {
		///special program
		var ck = false;
		for(var i=0;i<off_o.length;i++){
			if(off_o[i]=="D10") ck=true;
		}
		if(!ck) setTimeout(function(){Y_playAnimation("default")}, 500);
		///special program
	}
	
	// ui制御
	if(arguments[0] == "interval") setTimeout(function(){ Y_redrawSetOn(500) }, 100);
	else Y_texLoadCheck(500);
}
///////////////////////////////////////////////////////////////////////////////////////////

var Y_optionSplitStr = new Array();
Y_optionSplitStr["grade"] = new Array();
Y_optionSplitStr["color"] = new Array();
Y_optionSplitStr["interior"] = new Array();
Y_optionSplitStr["option"] = new Array();

// ----------------------------------------------------------------------------
// オプションにグループ設定があるとき、オプションIDの文字列を変更
// ----------------------------------------------------------------------------
function Y_optionGroupStr(str){//
	
	var strNew = str.split("&");
	// strNew[0]:grade,strNew[1]:bodycolor,strNew[2]:intcolor,strNew[3]:option
	var strRet = ""+strNew[0]+"&"+strNew[1]+"&"+strNew[2]+"&";
	var strNew2 = strNew[3].split(",");
	var strOutOP = new Array();
	var strInpOP = new Array();
	var cutOut = 0;
	var cutInp = 0;
	
	for(var i=0;i<strNew2.length;i++){
		// 3Dに反映しないOP。y_groupの配列の有無をチェック
		if(!Y_ygroupArCheckA(strNew2[i])) continue;
		// グループが設定されているとき
		if(Y_ygroupArCheckB(strNew2[i],"group")){
			var ck = Y_ygroupArCheck(strNew2[i],"group",strNew[0]);
			if(!ck){//グレード別設定がない
					var aa = true;
					if(typeof(Y_group[strNew2[i]]["group"][0][0])=="undefined"){//
						for(var j=0;j<Y_group[strNew2[i]]["group"].length;j++){
							if(j==0) continue;
							var bb = false;
							for(var k=0;k<strNew2.length;k++){
								if(strNew2[k]==Y_group[strNew2[i]]["group"][j]){ bb=true;break;}
							}
							if(bb==true) break;
							if(j==Y_group[strNew2[i]]["group"].length-1&&bb==false) aa=false;
						}
						if(aa==true){
							strOutOP[cutOut] = strNew2[i];cutOut++;
							strInpOP[cutInp] = Y_group[strNew2[i]]["group"][0];cutInp++;
						}
					}else if(typeof(Y_group[strNew2[i]]["group"][0][0])=="string"){//
						var ct = 0;
						for(var j=0;j<Y_group[strNew2[i]]["group"].length;j++){
							var cc=false;
							for(var jj=0;jj<Y_group[strNew2[i]]["group"][j].length;jj++){
								if(jj==0) continue;
								var bb = false;
								for(var k=0;k<strNew2.length;k++){
									if(strNew2[k]==Y_group[strNew2[i]]["group"][j][jj]){ bb=true;cc=true;ct=j;break;}
								}
								if(bb==true) break;
								if(j==Y_group[strNew2[i]]["group"].length-1&&jj==Y_group[strNew2[i]]["group"][j].length-1&&bb==false) aa=false;
							}
							if(cc==true) break;
						}
						if(aa==true){
							strOutOP[cutOut] = strNew2[i];cutOut++;
							strInpOP[cutInp] = Y_group[strNew2[i]]["group"][ct][0];cutInp++;
						}
					}
					
			}else{
				var aa = true;
				for(var j=0;j<Y_group[strNew2[i]]["group"][ck].length;j++){//
					if(j==0) continue;
					
					var bb = false;
					for(var k=0;k<strNew2.length;k++){
						if(strNew2[k]==Y_group[strNew2[i]]["group"][ck][j]){bb=true;break;}
					}
					if(bb==false) aa=false;
					if(bb==true) break;
					if(j==Y_group[strNew2[i]]["group"][ck].length-1&&bb==false) aa=false;
				}
				if(aa==true){
					strOutOP[cutOut] = strNew2[i];cutOut++;
					strInpOP[cutInp] = Y_group[strNew2[i]]["group"][ck][0];cutInp++;
				}
			}
		}
	}
	// optionの文字列を再作成
	if(strNew[3]!=""){
		for(var i=0;i<strNew2.length;i++){
			for(var j=0;j<strOutOP.length;j++){
				if(strNew2[i]==strOutOP[j]){ strNew2[i] = "";break;}
			}
		}
		var ss = "";
		for(var i=0;i<strNew2.length;i++){
			if(strNew2[i]=="") continue;
			if(ss=="") ss+=strNew2[i];
			else ss+=","+strNew2[i];
		}
		for(var i=0;i<strInpOP.length;i++){
			if(ss=="") ss+=strInpOP[i];
			else ss+=","+strInpOP[i];
		}
		strRet += ss;
	}
	return strRet;
}
function Y_oprionGroupIDGet(val){
	if(Y_ygroupArCheckB(val,"g")) return Y_group[val]["g"][0];
	else return val;

}

// ----------------------------------------------------------------------------
// 現在装備状況と選択装備状況を比較し、変更必要なものを選別し配列に格納
// ----------------------------------------------------------------------------
function Y_optionMakeStr(str){
	
	for(var i in Y_optionSplitStr){ //配列の中身を初期化する
		if(i=="option"){
			Y_optionSplitStr[i]["on"] = new Array(); // 取り付けるオプション
			Y_optionSplitStr[i]["off"] = new Array(); // 取外すオプション
		}else{
			Y_optionSplitStr[i]["on"] = ""; // 変更するID
			Y_optionSplitStr[i]["off"] = ""; // 変更前のID
		}
	}
	var strA=Y_optionGroupStr(str); // オプションにグループがあるとき、オプションの文字列を変更
	var strNew = strA.split("&"); // 取付けるオプション
	var strCur = Y_currentEquipInfo.split("&"); // 現在の装着中のオプション
	Y_currentEquipInfo = strA;
	var ic = 0; // count
	for(var i in Y_optionSplitStr){
		// オプション
		if(i=="option"){
			var spN = strNew[ic].split(","); // 取付けるオプションを配列に格納
			var strNewC = "/"+strNew[ic].replace(/,/g,"/")+"/"; // /D01/D02/の形式に置き換える
			var spC = strCur[ic].split(","); // 現在のオプションを配列に格納
			var strCurC = "/"+strCur[ic].replace(/,/g,"/")+"/"; // /D01/D02/の形式に置き換える
			
			// 取外すオプション Y_optionSplitStr[i]["off"] の作成
			var jc = 0; // count
			for(var j=0;j<spC.length;j++){
				if(spC[j]=="") continue;
				if(!Y_ygroupArCheckA(spC[j])) continue;//3Dに反映しないOP。y_groupの配列の有無をチェック
				if(strNewC.indexOf("/"+spC[j]+"/")==(-1)){
					Y_optionSplitStr[i]["off"][jc]=spC[j];
					jc++;
				}
			}
			
			// 取付けるオプション Y_optionSplitStr[i]["on"] の配列の作成
			jc=0; // count
			for(var j=0;j<spN.length;j++){
				if(spN[j]=="") continue;
				if(!Y_ygroupArCheckA(spN[j])) continue;//3Dに反映しないOP
				// gradeが違うとき
				if(Y_optionSplitStr["grade"]["on"]!=Y_optionSplitStr["grade"]["off"]){
					var sta = false;
					// 各カテゴリが設定がされていて、かつ各カテゴリでグレード別設定がされていて、かつ変更するグレードと変更前のグレードが異なるとき sta=true;
					if(Y_ygroupArCheckB(spN[j],"parts") && (Y_ygroupArCheck(spN[j],"parts",Y_optionSplitStr["grade"]["on"]) != Y_ygroupArCheck(spN[j],"parts",Y_optionSplitStr["grade"]["off"]))) sta=true;
					if(Y_ygroupArCheckB(spN[j],"mat")   && (Y_ygroupArCheck(spN[j],"mat",Y_optionSplitStr["grade"]["on"])   != Y_ygroupArCheck(spN[j],"mat",Y_optionSplitStr["grade"]["off"]))) sta=true;
					if(Y_ygroupArCheckB(spN[j],"tex")   && (Y_ygroupArCheck(spN[j],"tex",Y_optionSplitStr["grade"]["on"])   != Y_ygroupArCheck(spN[j],"tex",Y_optionSplitStr["grade"]["off"]))) sta=true;
					// grade別optionであった場合
					if(sta){
						Y_optionSplitStr[i]["on"][jc]=spN[j];
						//以下はグレード別オプションであり、かつ、選択グレードが現在のものと異なっている場合、
						//一度現在のものをoffにする。
						var che = false;
						for(var k=0;k<Y_optionSplitStr[i]["off"].length;k++){//offにspN[j]と同じものがないか確認
							if(Y_optionSplitStr[i]["off"][k]==spN[j]){che=true;break;}//同じものがあればなにもしない
						}
						if(!che) Y_optionSplitStr[i]["off"][Y_optionSplitStr[i]["off"].length] = spN[j];//offになければ追加
						
						jc++;
					// grade別optionでない場合
					}else{
						Y_optionSplitStr[i]["on"][jc]=spN[j];
						jc++;
					}
				// gradeが同じとき
				}else{
					if(strCurC.indexOf("/"+spN[j]+"/")==(-1)){
						Y_optionSplitStr[i]["on"][jc]=spN[j];
						jc++;
					}
				}
			}
		
		// インテリア
		// インテリアのonoffの配列を作成する。グレード別の設定
		} else if(i=="interior") {
			// インテリアのy_groupの配列がないとき
			if(!Y_ygroupArCheckA(strNew[ic])){
				Y_optionSplitStr[i]["on"] ="";
				Y_optionSplitStr[i]["off"] ="";
			// インテリアのy_groupの配列があるとき
			} else {
				var sta = false;
				// 各カテゴリが設定されていて、かつ各カテゴリでグレード別設定がされていて、かつ変更するグレードと変更前のグレードが異なるとき sta=true;
				if(Y_ygroupArCheckB(strNew[ic],"parts")&&(Y_ygroupArCheck(strNew[ic],"parts",Y_optionSplitStr["grade"]["on"])!=Y_ygroupArCheck(strNew[ic],"parts",Y_optionSplitStr["grade"]["off"]))) sta=true;
				if(Y_ygroupArCheckB(strNew[ic],"mat")&&(Y_ygroupArCheck(strNew[ic],"mat",Y_optionSplitStr["grade"]["on"])!=Y_ygroupArCheck(strNew[ic],"mat",Y_optionSplitStr["grade"]["off"]))) sta=true;
				if(Y_ygroupArCheckB(strNew[ic],"tex")&&(Y_ygroupArCheck(strNew[ic],"tex",Y_optionSplitStr["grade"]["on"])!=Y_ygroupArCheck(strNew[ic],"tex",Y_optionSplitStr["grade"]["off"]))) sta=true;
				// grade別interiorであった場合
				if(sta) Y_optionSplitStr[i]["on"]=strNew[ic];
				// grade別interiorでない場合
				else Y_optionSplitStr[i]["on"] = (strCur[ic]==strNew[ic])?"":strNew[ic];
				Y_optionSplitStr[i]["off"] = (strCur[ic]==strNew[ic])?"":strCur[ic];
			}
		
		// グレード
		} else if(i=="grade") {
			Y_optionSplitStr[i]["on"] =strNew[ic];
			Y_optionSplitStr[i]["off"] =(strCur[ic]=="")?"":strCur[ic];
		// ボディカラー
		} else if(i=="color") {
			Y_optionSplitStr[i]["on"] = strNew[ic];
			Y_optionSplitStr[i]["off"] =(strCur[ic]==strNew[ic])?"":strCur[ic];
		}
		ic++;
	}
}

// ------------------------------------
// ボディカラーの変更
// ------------------------------------
var mat_body = "body";
function Y_3dselectColor() {
	
	if(mat_body == "") return;
	var bodyID = Y_optionSplitStr["color"]["on"];
	Y_setTexture(mat_body,2,Y_IMG[Y_optionSplitStr["color"]["on"]]);
	
	// ボディカラーによりテクスチャの変更があるとき
	if(typeof(Y_IMGBodyFlg)!="undefined"&&Y_IMGBodyFlg){
		if(Y_IMGBodyArCheckB(bodyID,"tex")){//
			var ck = IMGBodyArCheck(bodyID,"tex",Y_optionSplitStr["grade"]["on"]);
			if(!ck){//グレード別設定がない
				for(var j in Y_IMGBody[bodyID]["tex"]){
					var texNA = Y_IMGBody[bodyID]["tex"][j][1];
					Y_setTexture(j,Y_IMGBody[bodyID]["tex"][j][0],texNA);
				}
			}else{
				for(var j in Y_IMGBody[bodyID]["tex"][ck]){
					var texNA = Y_IMGBody[bodyID]["tex"][ck][j][1];
					
					Y_setTexture(j,Y_IMGBody[bodyID]["tex"][ck][j][0],texNA);
				}
			}
		}
	}
}

function IMGBodyArCheck(uid,cat,gid){
	if(!Y_IMGBodyArCheckA(uid)) return false;
	for(var i in Y_IMGBody[uid][cat]){
		if(Y_strMatchFunc(0,1,"/",i)==false) return false;//グレード別設定のないもの
		if(i.indexOf("/"+gid+"/")!=(-1)) return i;
	}
}
function Y_IMGBodyArCheckA(uid){//Y_groupの3D反映有無
	if(typeof(Y_IMGBody[uid])=="undefined") return false;
	return true;
}
function Y_IMGBodyArCheckB(uid,cat){//Y_groupのカテゴリー有無
	if(!Y_IMGBodyArCheckA(uid)) return false;
	if(typeof(Y_IMGBody[uid][cat])=="undefined") return false;
	return true;
}
function Y_3dselectInterior(color){
	Y_redrawSetOff();
	setSelect(5,mat_body);
	Y_setTexture(mat_body,2,Y_IMG[color])
	color_flg = color;
}

// ------------------------------------
// グレードの表示非表示
// ------------------------------------
function Y_3dselectGrade(onoff) {
	
	var type = (onoff=="on")?Y_optionSplitStr["grade"]["on"]:Y_optionSplitStr["grade"]["off"];
	// シェイプの表示・非表示 /////////////////////////////////////
	if(typeof(Y_groupCategoryAr[type])!="undefined") type=Y_groupCategoryAr[type];
		
	for(var i=0;i<Y_group[type]["parts"].length;i++) {
		
		Y_setShVisible( EntityGroup, Y_group[type]["parts"][i], (onoff=="on")?true:false ); // 2008.01 ver6.0
	}
	
	if(Y_ygroupArCheckB(type,"partsTire")){
		for(var i=0;i<Y_group[type]["partsTire"].length;i++) {
			
			Y_setShVisible( EntityGroup, Y_group[type]["partsTire"][i], (onoff=="on")?true:false ); // 2008.01 ver6.0
		}
	}
	// マテリアル変更 /////////////////////////////////////////////
	if(typeof(Y_group[type]["mat"])!="undefined"){
		for(var i in Y_group[type]["mat"])
		{
			Y_setMaterial(i,Y_group[type]["mat"][i][0])
		}
	}
	// テクスチャ変更 /////////////////////////////////////////////
	if(typeof(Y_group[type]["tex"])!="undefined"){
		for(var i in Y_group[type]["tex"]) {
			for(var j in Y_group[type]["tex"][i]) {
				Y_setTexture(i, j, Y_group[type]["tex"][i][j][0]);
			}
		}
	}
	// アニメーション変更 /////////////////////////////////////////////
	if(typeof(Y_group[type]["anim"])!="undefined") Y_playAnimation(Y_group[type]["anim"]);
}

// ------------------------------------
// オプション、インテリアの表示非表示
// ------------------------------------
var su = 10;
var K_onoff_flg=false;
function Y_3dselectOption(onoff,cat) {
	
	var type0 = (onoff=="on")?Y_optionSplitStr["grade"]["on"]:Y_optionSplitStr["grade"]["off"];
	type = (typeof(Y_groupCategoryAr[type0])!="undefined")?Y_groupCategoryAr[type0]:type0;
	var len = (cat=="interior")?1:Y_optionSplitStr[cat][onoff].length;
	for(var i=0;i<len;i++) {
		
		var uidNA = (cat=="interior")?Y_optionSplitStr[cat][onoff]:Y_optionSplitStr[cat][onoff][i];
		
		if(onoff=="on") {
			// シェイプ変更 /////////////////////////////////////////////	
			if(Y_ygroupArCheckB(uidNA,"partsN")){//partsNがある
				var ck = Y_ygroupArCheck(uidNA,"partsN",type0);
				if(!ck){//グレード別設定がない
					for(var j=0;j<Y_group[uidNA]["partsN"].length;j++){
						Y_setShVisible( EntityGroup, Y_group[uidNA]["partsN"][j], false ); // 2008.01 ver6.0
					}
				}else{
					for(var j=0;j<Y_group[uidNA]["partsN"][ck].length;j++){
						Y_setShVisible( EntityGroup, Y_group[uidNA]["partsN"][ck][j], false ); // 2008.01 ver6.0
					}
				}
			}
			if(Y_ygroupArCheckB(uidNA,"parts")||Y_ygroupArCheckB(uidNA,"partsTire")){
				var ck = Y_ygroupArCheck(uidNA,"parts",type0);
				var tireCk = false;
				if(!ck){//グレード別設定がない
					for(var j=0;j<Y_group[uidNA]["parts"].length;j++){
						if(!tireCk&&Y_strMatchFunc(0,2,"t_",Y_group[uidNA]["parts"][j])) tireCk=true;
					}
					if(tireCk){
						for(var j=0;j<Y_group[type]["partsTire"].length;j++){
							Y_setShVisible( EntityGroup, Y_group[type]["partsTire"][j], false ); // 2008.01 ver6.0
						}
					}
					for(var j=0;j<Y_group[uidNA]["parts"].length;j++){
						if(Y_strMatchFunc(0,5,"bill_",Y_group[uidNA]["parts"][j])) continue;
						Y_setShVisible( EntityGroup, Y_group[uidNA]["parts"][j], true ); // 2008.01 ver6.0
					}
				}else{
					for(var j=0;j<Y_group[uidNA]["parts"][ck].length;j++){
						if(Y_strMatchFunc(0,5,"bill_",Y_group[uidNA]["parts"][ck][j])) continue;
						Y_setShVisible( EntityGroup, Y_group[uidNA]["parts"][ck][j], true ); // 2008.01 ver6.0
					}
				}
			}
		}else{
			if(Y_ygroupArCheckB(uidNA,"parts")){//partsがある
				var ck = Y_ygroupArCheck(uidNA,"parts",type0);
				var tireCk = false;
				if(!ck){//グレード別設定がない
					for(var j=0;j<Y_group[uidNA]["parts"].length;j++){
						Y_setShVisible( EntityGroup, Y_group[uidNA]["parts"][j], false ); // 2008.01 ver6.0
						if(!tireCk&&Y_strMatchFunc(0,2,"t_",Y_group[uidNA]["parts"][j])) tireCk=true;
					}
					if(tireCk){
						for(var j=0;j<Y_group[type]["partsTire"].length;j++){
							Y_setShVisible( EntityGroup, Y_group[type]["partsTire"][j], true ); // 2008.01 ver6.0
						}
					}
				}else{
					for(var j=0;j<Y_group[uidNA]["parts"][ck].length;j++){
						if(Y_strMatchFunc(0,5,"bill_",Y_group[uidNA]["parts"][ck][j])) continue;
						Y_setShVisible( EntityGroup, Y_group[uidNA]["parts"][ck][j], false ); // 2008.01 ver6.0
					}
				}
			}
			if(Y_ygroupArCheckB(uidNA,"partsN")){//partsNがある
				var ck = Y_ygroupArCheck(uidNA,"partsN",type0);
				if(!ck){//グレード別設定がない
				for(var j=0;j<Y_group[uidNA]["partsN"].length;j++){
						Y_setShVisible( EntityGroup, Y_group[uidNA]["partsN"][j], true ); // 2008.01 ver6.0
					}
				}else{
					for(var j=0;j<Y_group[uidNA]["partsN"][ck].length;j++){
						Y_setShVisible( EntityGroup, Y_group[uidNA]["partsN"][ck][j], true ); // 2008.01 ver6.0
					}
				}
			}
		}
		
		// マテリアル変更 /////////////////////////////////////////////
		if(Y_ygroupArCheckB(uidNA,"mat")){//matがある
			
			if(!(cat=="interior"&&onoff=="off")){
				var ck = Y_ygroupArCheck(uidNA,"mat",type0);
				if(!ck){//グレード別設定がない
					for(var j in Y_group[uidNA]["mat"]){
						var matNA = (onoff=="on")?Y_group[uidNA]["mat"][j][0]:(Y_group[uidNA]["mat"][j][1]!="")?Y_group[uidNA]["mat"][j][1]:Y_group[type]["mat"][j][0];
						Y_setMaterial(j,matNA);
					}
				}else{
					for(var j in Y_group[uidNA]["mat"][ck]){
						var matNA = (onoff=="on")?Y_group[uidNA]["mat"][ck][j][0]:(Y_group[uidNA]["mat"][ck][j][1]!="")?Y_group[uidNA]["mat"][ck][j][1]:Y_group[type]["mat"][ck][j][0];
						Y_setMaterial(j,matNA);
					}
				}
			}
		}
		// テクスチャ変更 /////////////////////////////////////////////
		if(Y_ygroupArCheckB(uidNA,"tex")){//texがある
			if(!(cat=="interior"&&onoff=="off")){
				var ck = Y_ygroupArCheck(uidNA,"tex",type0);
				if(!ck){//グレード別設定がない
					for(var j in Y_group[uidNA]["tex"]) {
						for(var k in Y_group[uidNA]["tex"][j]) {
							var texNA = (onoff=="on")?Y_group[uidNA]["tex"][j][k][0]:(Y_group[uidNA]["tex"][j][k][1]!="")?Y_group[uidNA]["tex"][j][k][1]:Y_group[type]["tex"][j][k][0];
							Y_setTexture(j, k, texNA);
						}
					}
				}else{
					for(var j in Y_group[uidNA]["tex"][ck]) {
						for(var k in Y_group[uidNA]["tex"][ck][j]) {
							var texNA = (onoff=="on")?Y_group[uidNA]["tex"][ck][j][k][0]:(Y_group[uidNA]["tex"][ck][j][k][1]!="")?Y_group[uidNA]["tex"][ck][j][k][0]:Y_group[type]["tex"][j][k][0];
							Y_setTexture(j, k, texNA);
						}
					}
				}
			}
		}
		// アニメーション変更 /////////////////////////////////////////////
		if(Y_ygroupArCheckB(uidNA,"anim")){//animがある
			if(!(cat=="interior"&&onoff=="off")){
				if(onoff=="on") var ck = Y_ygroupArCheck(uidNA,"anim",type0);
				else{
					var offAnim = Y_ygroupArCheckB(uidNA,"animN");
					var ck = Y_ygroupArCheck(uidNA,"animN",type0);
				}
				if(!ck){//グレード別設定がない
					var animNA = (onoff=="on")?Y_group[uidNA]["anim"][0]:(offAnim)?Y_group[uidNA]["animN"][0]:Y_group[type]["anim"][0];
					Y_playAnimation(animNA);
				}else{
					var animNA = (onoff=="on")?Y_group[uidNA]["anim"][ck][0]:(offAnim)?Y_group[uidNA]["animN"][ck][0]:Y_group[type]["anim"][0];
					Y_playAnimation(animNA);
				}
			}
		}
		// トランスペアレンシー変更 /////////////////////////////////////////////
		// script_editorには対応していない為、手書きでy3d_data2.jsに追加すること
		if(Y_ygroupArCheckB(uidNA,"transparent")){ // transparentがある
			if(!(cat=="interior"&&onoff=="off")){
				var ck = Y_ygroupArCheck(uidNA,"transparent",type0);
				if(!ck){//グレード別設定がない
					for(var j in Y_group[uidNA]["transparent"]){
						var trparentNA = (onoff=="on")?Y_group[uidNA]["transparent"][j][0]:(Y_group[uidNA]["transparent"][j][1]!="")?Y_group[uidNA]["transparent"][j][1]:Y_group[type]["transparent"][j][0];
						Y_setMatTransparency(j,trparentNA);
					}
				}else{
					for(var j in Y_group[uidNA]["transparent"][ck]){
						var trparentNA = (onoff=="on")?Y_group[uidNA]["transparent"][ck][j][0]:(Y_group[uidNA]["transparent"][ck][j][1]!="")?Y_group[uidNA]["transparent"][ck][j][1]:Y_group[type]["transparent"][ck][j][0];
						Y_setMatTransparency(j,trparentNA);
					}
				}
			}
		}
	}
}

/*
function Y_menuAction(sName,pOpmode){
	switch(sName){
		case "btn_reset":
			Y_setMouseAction(0);
			Y_playAnimation("reset");
			setTimeout("Y_3dMain('"+str3d+"')",600);
			Y_zoom_count=0;
			break;
		case "print":
			Y_setMouseAction(0);
			Y_playAnimation("print");
			setTimeout("Y_redrawSetOn(0)",100);
			break;
	}
	
}
*/
//////////////////////////////////////////////////////////////
function Y_redrawSetOff()
{

	if(!getAppletCheck()) return;
	var v=Yappa3D.getRedrawEnabled();
	if(v!=(-1)) Yappa3D.setRedrawEnabled( -1 );

}
function Y_redrawSetOn(val)
{

	if(!getAppletCheck()) return;
	var v=Yappa3D.getRedrawEnabled();
	if(v!=0) Yappa3D.setRedrawEnabled( val );

}
function Y_getRedrawEnabled()
{

	if(!getAppletCheck()) return;
	return Yappa3D.getRedrawEnabled();

}


function Y_setShVisible( selN, selC, tf )
{

	if(!getAppletCheck()) return;
	if(selC=="") return;
	var item = Yappa3D.findEntity( selN, selC );
	item.setShVisible( tf );

}

function Y_getTransformNumber( val )
{

	if(!getAppletCheck()) return;
	var parent = Yappa3D.findEntity( EntityTransform, val );
	var children = parent.getTransChildren();
	var group = Yappa3D.addGroup();
	group.addGroupMembers( children );
	return group;

}

function Y_playAnimation( val )
{
	if(!getAppletCheck()) return;
	var anim = Yappa3D.findEntity( EntityAnimation, val );
	anim.playAnimation();
}

function Y_setAntiAliasMode( val )
{

	if(!getAppletCheck()) return;
	Yappa3D.setAntiAliasOnStill( val );

}

function Y_setTexture( val1, val2, val3 ){

	if(!getAppletCheck()) return;
	var mat = Yappa3D.findEntity( EntityMaterial, val1 );
	var v3 = (val3.charAt(0)=="<")?val3:('maps/'+ val3);
	mat.setMatTexture( val2,v3);
}

function Y_setMaterial( val1, val2 )
{

	if(!getAppletCheck()) return;
	var shape = Yappa3D.findEntity( EntityShape, val1 );
	var mat = Yappa3D.findEntity( EntityMaterial, val2 );
	shape.setShMaterial( mat );
}

function Y_setBillVisible( val1, val2 )
{

	if(!getAppletCheck()) return;
	var bill = Yappa3D.findEntity( EntityBillboard, val1 );
	bill.setBillVisible( val2 );

}

function Y_setMouseDisable( val )
{

	if(!getAppletCheck()) return;
	Yappa3D.setMouseDisable( val );
}

function Y_setMouseAction( val )
{

	if(!getAppletCheck()) return;
	Yappa3D.setMouseAction( val );

}

function Y_enableUI( val )
{

	if(!getAppletCheck()) return;
	Yappa3D.enableUI( val );

}
function Y_getShapeName(val1)
{
	if(!getAppletCheck()) return;
	return Yappa3D.getShapeName(val1);
}

function Y_getShapeNumber(val1)
{
	if(!getAppletCheck()) return;
	return Yappa3D.getShapeNumber(val1);
}

function Y_selGetCount()
{

	if(!getAppletCheck()) return;
	var arr = Yappa3D.getEntitiesOfType( EntityShape );
	var num = arr.getCount();
	return num;

}
function Y_selGetObject(val1,val2)
{

	if(!getAppletCheck()) return;
	var obj = Yappa3D.findEntity( val1, val2 );
	return obj;

}
function Y_getNumberOfMaterials()
{

	var arr = Yappa3D.getEntitiesOfType( EntityMaterial );
	var num = arr.getCount();

}
function Y_getMaterialName( val )
{

	if(!getAppletCheck()) return;
	var shape = Yappa3D.findEntity( EntityShape, val );
	var mat = shape.getMaterial();
	return mat.getName();

}
function Y_isTextureLoadInProgress()
{

	if(!getAppletCheck()) return;
	return Yappa3D.isTextureLoadInProgress();

}
function Y_getMaterial()
{

	if(!getAppletCheck()) return;
	return Yappa3D.getMaterial();

}
function Y_getPerformance()
{

	if(!getAppletCheck()) return;
	return Yappa3D.getPerformance();

}
function Y_getLoadingProgress( val )
{

	if(!getAppletCheck()) return;
	return Yappa3D.getLoadingProgress( val );

}
function Y_loadScene(val)
{

	if(!getAppletCheck()) return;
	Yappa3D.loadScene(val);

}
function Y_setTooltipsAndCursorsEnabled( val )
{

	if(!getAppletCheck()) return;
	Yappa3D.setMouseOverEventEnabled( val );

}
function Y_flushTextureCache()
{

	if(!getAppletCheck()) return;
	Yappa3D.flushTextureCache();

}

function Y_setTrSelectable(trans, bool){
	
	if(!getAppletCheck()) return;
	var trans = Yappa3D.findEntity(EntityTransform, trans);
	trans.setTrSelectable(bool);
}

function Y_setMatTransparency(mat, val){
	
	if(!getAppletCheck()) return;
	var mat = Yappa3D.findEntity(EntityMaterial, mat);
	mat.setMatTransparency(val);
}


/////////////////////////////////////////////////////////////////////////////////////////////
// ----------------
// アングルの変更
// ----------------
function y3d_position(n) {
	
	if(!flg_3d_check) return;
	flg_3d_check = false;
	// 位置及びオプションリセット
	if(n=='reset'){
		Y_getData(); // デフォルトデータをstr3dに代入
		Y_optionMakeStr(str3d); // str3dからonoffの配列を作成
		// オプションのアニメーションのフラグをfalseにする
		for(j in animConsistent) {
			animConsistent[j][0] = false;
		}
		Y_3dMain2(); // 3Dの表示とアニメーションの制御
		Y_playAnimation(n); // 位置変更のアニメーション
		Y_SelectableTr.change(selectableTr[n]); // トランスフォームのselectable
		Y_zoom_count=0;
		//特別処理
		try{
			sp_colorStyleChange(current_g);
		}catch(e){}
	}else{
		Y_playAnimation(n);
		Y_SelectableTr.change(selectableTr[n]);
		setTimeout(function (){flg_3d_check = true;}, 1000);
	}
}

// ツールバーの回転移動
function y3d_mouse_action(n)
{
	if(n=='rotato'){
		Y_setMouseAction(0);
	}else if('move'){
		Y_setMouseAction(1);
	}
}

// ツールバーの拡大縮小
var Y_zoom_count=0;
function y3d_zoom(n)
{
	if(Y_zoom_count<=2&&n=='up'){
		var trans = Yappa3D.findEntity(EntityTransform, Y_trRoot);
		trans.setSlideTime(1);
		trans.addTrPosition(0,0,+zoom_val);
		trans.setSlideTime(0);
		Y_zoom_count++;
	}else if(Y_zoom_count>=-2&&n=='down'){
		var trans = Yappa3D.findEntity(EntityTransform, Y_trRoot);
		trans.setSlideTime(1);
		trans.addTrPosition(0,0,-zoom_val);
		trans.setSlideTime(0);
		
		Y_zoom_count--;
	}
}

// アニメーションの実行の判定
var Y_GoToAnimationFrontNum=0;
var Y_AnimationFrameNum=0;
function Y_GoToAnimationFront() {
	
	if(Y_optionOnOffFlg == "on") var opID = on_o;
	else if(Y_optionOnOffFlg == "off") var opID = off_o;
	
	// 実行するアニメーションがあるとき
	if(typeof(animData)!="undefined" && typeof(animData[opID][Y_optionOnOffFlg])!="undefined"){
		Y_GoToAnimationFrontNum = animData[opID][Y_optionOnOffFlg].length;
		Y_AnimationFrameNum = 0;
		Y_AnimationFrame();
		if(typeof(selectableTr[opID]) != "undefined") Y_SelectableTr.change(selectableTr[opID]);
	// 実行するアニメーションがないとき
	}else{
		// 3Dの表示非表示
		Y_3dMain2();
	}

}

// アニメーションの実行
var Y_animConsistentNum;
function Y_AnimationFrame() {
	
	var time;
	
	if(Y_optionOnOffFlg == "on") var opID = on_o;
	else if(Y_optionOnOffFlg == "off") var opID = off_o;
	var onoff = Y_optionOnOffFlg;
	
	// 実行するアニメーションが無くなるまで繰り返す
	if(Y_AnimationFrameNum<Y_GoToAnimationFrontNum){
		// NormalAnimationのとき、
		if(animData[opID][onoff][Y_AnimationFrameNum][0]=="NormalAnimation"){
			// 現在の位置が実行するアニメーションと同じ位置ではないとき、
			if(!Y_MergeTrPos(animData[opID][onoff][Y_AnimationFrameNum][1], animData[opID][onoff][Y_AnimationFrameNum][1]+"_rot", selectableTr[opID])) {
				// アニメーションを実行
				Y_playAnimation( animData[opID][onoff][Y_AnimationFrameNum][1] );
				time = animData[opID][onoff][Y_AnimationFrameNum][2];
			} else time = -300; // 同じ位置のとき
			
			// 再帰呼出
			setTimeout( function() {
				Y_AnimationFrameNum++;
				Y_AnimationFrame();
			}, time + 300);
			
		// 同じアニメーションをするオプションがあるとき、
		}else if(animData[opID][onoff][Y_AnimationFrameNum][0]=="ConsistentAnimation"){
			
			// そのアニメーションが実行されていない場合、
			if(animConsistent[animData[opID][onoff][Y_AnimationFrameNum][1]][0]==false){
				var boolflg=false;
				var Y_data = new Array();
				// 同じアニメーションをするオプションの配列を取得し、
				Y_data = animConsistent[animData[opID][onoff][Y_AnimationFrameNum][1]][3].split("/");
				for(i=0;i<Y_data.length;i++){
					// それらのオプションのどれかがアニメーションを実行済みかチェック
					if(animConsistent[Y_data[i]][0]==true){
						boolflg=true;
					}
				}
				// そのアニメーションを実行していない場合、アニメーションを実行
				if(boolflg==false) {
					Y_playAnimation( animConsistent[animData[opID][onoff][Y_AnimationFrameNum][1]][1] );
					time = animData[opID][onoff][Y_AnimationFrameNum][2];
				} else  time = -300;
				
				// アニメーションの実行フラグをtrueにする
				animConsistent[animData[opID][onoff][Y_AnimationFrameNum][1]][0]=true;
			}
			
			// 再帰呼出
			setTimeout( function() {
				Y_AnimationFrameNum++;
				Y_AnimationFrame();
			}, time + 300);
		
		// アニメーションからアニメーションの間に3Dの表示等があるとき
		}else if(animData[opID][onoff][Y_AnimationFrameNum][0]=="interval"){
			time = animData[opID][onoff][Y_AnimationFrameNum][2];
			Y_AnimationFrameNum++;
			Y_3dMain2("interval", time);
			
		}
		
	// 実行するアニメーションが無くなったとき	
	} else {
		// 3Dの表示非表示
		Y_3dMain2();
		
	}
	

}




// ----------------------------------------------
// トランスフォームの位置・回転プロパティを取得
// ----------------------------------------------
var Y_getTrPos = function(tr) {
	
	var trans = Yappa3D.findEntity(EntityTransform, tr);
	var pos = toNativeArray(trans.getTrPosition());
	return pos;
}

var Y_getTrRot = function(tr) {
	
	var trans = Yappa3D.findEntity(EntityTransform, tr);
	var rot = toNativeArray(trans.getTrRotation());
	return rot;
}

// -------------------------------------------------------------------
// Interpolatorと現在のトランスフォームの、位置・回転プロパティの比較
// -------------------------------------------------------------------
var Y_MergeTrPos = function(interpPosName, interpRotName, selTr) {
	
	var bool = true;
	
	if(ex_in_flg == "exterior") var tr =  Y_trRoot;
	if(ex_in_flg == "interior") var tr = selTr;
	
	// 比較する位置・回転プロパティ
	var obj = Yappa3D.findEntity(EntityInterpolator, interpPosName);
	if(obj == null) return false;
	var interpPos = obj.getInterpKeyValues(0);
	var obj = Yappa3D.findEntity(EntityInterpolator, interpRotName);
	if(obj == null) return false;
	var interpRot = obj.getInterpKeyValues(0);
	
	// 現在の位置・回転プロパティ
	var pos = Y_getTrPos(tr);
	var rot = Y_getTrRot(tr);

	// 位置・回転プロパティの比較
	for(var i=0;i<interpPos.getCount();i++){
		if(Math.round(interpPos.getItemAt(i)) != Math.round(pos[i])) bool = false;
	}	
	for(var i=0;i<interpRot.getCount();i++){
		if(Math.round(interpRot.getItemAt(i)) != Math.round(rot[i])) bool = false;
	}	
	
	return bool;
}

// ------------------------------------
// トランスフォームのselectable切替
// ------------------------------------
var Y_SelectableTr = (function() {
	
	// private val & method
	var currentTrans = Y_trRoot;
	function setCurrentTr(trans) {
		return currentTrans = trans;
	}
	function getCurrentTr() {
		return currentTrans;
	}
	
	// public method
	return {
		change: function(trans) {
			Y_setTrSelectable(getCurrentTr(), false); // 現在のTrのselectableをoff
			Y_setTrSelectable(trans, true); // 選択したTrのselectableをon
			setCurrentTr(trans); // currentTransに選択したTrを代入
		}
	}
})();







