//事前確認（オプション）*******************************************************
var current_o2;//現状データ保存
var current_o3;//シミュレーション後データ保存
var off_o3;
var Y_optionOnOffFlg="on";
function Y_confirmOption(ID) {
	
	Y_initLists();
	//装着時判別---------------------------------------
	if(!checkList(current_o,ID)){
		//fixed系で判別-----------------------
		if(typeof(fixed_g)!="undefined"){
			var rslt = tryOn(ID,fixed_g,fixed_bc,fixed_ic);
			if(rslt!=true) return rslt;
		}
		//current系で判別---------------------
		if(fixed_g!=current_g || fixed_bc!=current_bc || fixed_ic!=current_ic){
			var rslt = tryOn(ID,current_g,current_bc,current_ic);
			if(rslt!=true) return rslt;
		}
	}else{
		//fixed系で判別-----------------------
		if(typeof(fixed_g)!="undefined"){
			var rslt = tryOff(ID,fixed_g,fixed_bc,fixed_ic);
			if(rslt!=true) return rslt;
		}
		//current系で判別---------------------
		if(fixed_g!=current_g || fixed_bc!=current_bc || fixed_ic!=current_ic){
			var rslt = tryOff(ID,current_g,current_bc,current_ic);
			if(rslt!=true) return rslt;
		}
	}
	//装着シミュレーション-----------------------------
	if(checkList(current_o,ID)){
		Y_optionOff(ID);
		Y_optionOnOffFlg="off";
	}else{
		Y_optionOn(ID);
		Y_optionOnOffFlg="on";
	}
	preOff_o = off_o;
	//preOff_ic = off_ic;
	Y_recoveryLists();
	return true;
	//-------------------------------------------------
	
	
	function tryOn(ID,gID,bcID,icID){
		//グレード判定
		if(!checkList(gData[gID]["oA"],ID)) return "grade";
		
		//カラー判定
		if(typeof(bcData[bcID]["oNA"][gID])!="undefined"){
			if(checkList(bcData[bcID]["oNA"][gID],ID)) return "color";
		}
		
		//インテリアオプション判定
		if(typeof(io_oLimit[gID])!="undefined" && typeof(io_oLimit[gID][ID])!="undefined"){
			for(i=0;i<io_oLimit[gID][ID].length;i++){
				if(checkList(current_io,io_oLimit[gID][ID][i])){
					return "interior";
				}
			}
		}
		
		//オプション判定
		if(typeof(oLimit[gID])!="undefined" && typeof(oLimit[gID][ID])!="undefined"){
			var flg = o_i_checkLimit(oLimit[gID][ID]);
			if(!flg){//falseだったら実行
				Y_getLimit_o(ID,gID);
				return "limit";
			}
		}
		
		//オプション判定（２つ以上装着してから装着できるオプションについて）
		if(typeof(oGLimit[gID])!="undefined" && typeof(oGLimit[gID][ID])!="undefined"){
			var flg = o_i_g_checkLimit(oGLimit[gID][ID]);
			if(!flg){
				Y_getLimit_og(ID,gID);
				return "limit2";
			}
		}
		
		return true;
	}
	
	function tryOff(ID,gID,bcID,icID){
	//io_oOn判定
		if(typeof(io_oOn[gID])!="undefined"){
			for(i in io_oOn[gID]){
				if(checkList(current_io,i)){
					for(j=0;j<io_oOn[gID][i].length;j++){
						if(io_oOn[gID][i][j]==ID){
							return "io_oOn";
						}
					}
				}
			}
		}
		return true;
	}
}

function Y_initLists()
{
	off_o = new Array();
	preOff_o = new Array();
	current_o2 = copyArray(current_o);
}
function Y_recoveryLists()
{
	current_o3 = copyArray(current_o);
	current_o = copyArray(current_o2);
	off_o3 = copyArray(off_o);
}

//事前確認（インテリアオプション）*******************************************************
var current_io2;//現状データ保存
var current_io3;//シミュレーション後データ保存
var off_io3;

function Y_confirm_I_Option(ID)
{
	Y_i_initLists();
	//装着時判別---------------------------------------
	if(!checkList(current_io,ID)){
		//fixed系で判別-----------------------
		if(typeof(fixed_g)!="undefined"){
			var rslt = tryOn(ID,fixed_g,fixed_bc,fixed_ic);
			if(rslt!=true) return rslt;
		}
		//current系で判別---------------------
		if(fixed_g!=current_g || fixed_bc!=current_bc || fixed_ic!=current_ic){
			var rslt = tryOn(ID,current_g,current_bc,current_ic);
			if(rslt!=true) return rslt;
		}
	}
	//装着シミュレーション-----------------------------
	if(checkList(current_io,ID)){
		Y_i_optionOff(ID);
	}else{
		Y_i_optionOn(ID);
		if(typeof(io_oOn[current_g])!="undefined"&&typeof(io_oOn[current_g][ID])!="undefined"){
			for(i=0;i<io_oOn[current_g][ID].length;i++){
				Y_optionOn(io_oOn[current_g][ID][i]);//インテリアオプションを装着すると強制的に付くオプションの処理：limit制限するか保留
			}
		}
	}
	preOff_o = off_o;
	preOff_io = off_io;
//	preOff_ic = off_ic;
	if(typeof(io_oOn[current_g])!="undefined"){
		preOn_o = io_oOn[current_g][ID];
	}
	Y_i_recoveryLists();
	return true;
	
	
	//-------------------------------------------------
	function tryOn(ID,gID,bcID,icID){
		//インテリア判定
		if(!checkList(icData[icID]["sIo"],ID)) return "interior";
		
		//インテリアオプション判定
		if(typeof(ioLimit[gID])!="undefined" && typeof(ioLimit[gID][ID])!="undefined"){
			var flg = i_checkLimit(ioLimit[gID][ID]);
			if(!flg){
				Y_getLimit_io(ID,gID);
				return "limit";
			}
		}
		return true;
	}
}

function Y_i_initLists()
{
	off_o = new Array();
	preOff_o = new Array();
	current_o2 = copyArray(current_o);
	off_io = new Array();
	preOff_io = new Array();
	current_io2 = copyArray(current_io);
	preOn_o = new Array();
}
function Y_i_recoveryLists()
{
	current_o3 = copyArray(current_o);
	current_o = copyArray(current_o2);
	off_o3 = copyArray(off_o);
	current_io3 = copyArray(current_io);
	current_io = copyArray(current_io2);
	off_io3 = copyArray(off_io);
}

//連携 ***********************************************************
var str3d;
var flg_limitCheck = true;
var Y_typeFlg = "grade";

function Y_callStatus(type,ID) {
	
	Y_typeFlg = type;
	resetData();
	
	// 各フラグをセットする
	switch(type){
		case "grade"://------------------------------------
			if(ID==current_g){
				flg_3d_check = true;
				return false;
			}
			
			off_g = current_g;
			current_g = ID;
			
		//	defOptions = gData[ID]["oDef"];//ボール様側で使用
			//ボディカラーチェック-------------
			Alist_bc = gData[ID]["cA"];
			Y_checkA_bc();
			//インテリアチェック---------------
			checkInterior();
			//インテリアオプションチェック
			checkInteriorOption();
			//オプションチェック-----------------------
			checkOption();
			//---------------------------------
			on_o = null;
			break;
		case "color"://------------------------------------
			if(!checkList(Alist_bc,ID)){flg_3d_check = true;return false;}
			if(ID==current_bc) return;
			off_bc = current_bc;
			current_bc = ID;
			//インテリアチェック---------------
			checkInterior();
			//インテリアオプションチェック
			checkInteriorOption();
			//オプションチェック-----------------------
			checkOption();
			//---------------------------------
			on_o = null;
			break;
		case "interior"://---------------------------------
			if(!checkList(Alist_ic,ID)){return false;}
			if(ID==current_ic) return;
			off_ic = current_ic;
			current_ic = ID;
			//インテリア変更-------------------
			Y_change_ic(ID);
			//インテリアオプションチェック
			checkInteriorOption();
			//---------------------------------
			on_o = null;
			break;
		case "option"://-----------------------------------
			current_o = copyArray(current_o3);
			off_o = copyArray(off_o3);
			//---------------------------------
			if(Y_page=="web"){
				fixed_o = copyArray(current_o);
			}
			//---------------------------------
			on_o = ID;
			break;
		case "ioption"://----------------------------------
			if(checkList(current_io,ID)==true)return;
			
			current_o = copyArray(current_o3);
			off_o = copyArray(off_o3);
			
			current_io = copyArray(current_io3);
			off_io = copyArray(off_io3);
			
			//---------------------------------
			if(Y_page=="web"){
				fixed_o = copyArray(current_o);
				fixed_io = copyArray(current_io);
			}
			//---------------------------------
			on_o = null;
			break;
	}
	
	
	
	str3d = current_g+"&"+current_bc+"&"+current_ic+"&"+current_o.toString();
	Y_entryData();//080925 ball追加
	
	return true;
	
	function resetData(){
		off_bc = "";
		off_ic = "";
		off_o = new Array();
		off_io = new Array();
		limitList = new Array();
	}
	
	// 選択可能なインテリアカラーの設定
	function checkInterior(){
		var newList = Y_getList_ic(current_bc,current_g);
		if(Alist_ic.toString()!=newList.toString()){
			Alist_ic = newList;
			Y_checkA_ic();
		}
	}
	
	// 選択可能なオプションの設定
	function checkOption(){
		var newList = Y_getList_o(current_bc,current_g);
		if(Alist_o.toString()!=newList.toString()){
			Alist_o = newList;
			flg_limitCheck = false;
			Y_checkA_o();
			flg_limitCheck = true;
		}
		Y_checkLimit_o();
	}
	/* どこにも使用されていないので削除
	function checkiOption(){
		var newList = Y_getList_io(current_bc,current_g);
		if(Alist_io.toString()!=newList.toString()){
			Alist_io = newList;
			flg_limitCheck = false;
			Y_checkA_io();
			flg_limitCheck = true;
		}
		Y_checkLimit_io();
		Y_checkLimit_io_o();
		Y_checkLimit_o();
	}
	*/
	
	// チェックインテリアオプション
	// sIo:select interior option, dIo:default interior option
	function checkInteriorOption() {
		
		var newList = icData[current_ic]["sIo"];
		
		//
		var newList2=new Array();
		for(i=0; i<gData[current_g]["ioA"].length;i++){
			if(checkList(newList,gData[current_g]["ioA"][i])){
				newList2.push(gData[current_g]["ioA"][i]);
			}
		}
		
		if(Alist_io.toString()!=newList2.toString()) {
			
			/*
			if(gData[current_g]["ioA"].length==0){//alert("old")
				Alist_io = newList;//old
				flg_limitCheck = false;//old
				Y_checkA_io();//old
				for(j=0;j<icData[current_ic]["dIo"].length;j++){//old
					Y_i_optionOn(icData[current_ic]["dIo"][j]);//old
				}//old
			}else{//alert("new(フーガから)")*/
				Alist_io = Y_Alist_io_Gcheck();//new(フーガから)
		//	}
			
			flg_limitCheck = false;
			Y_checkA_io();
			for(j=0;j<icData[current_ic]["dIo"].length;j++){
				//new
				if(!checkList3(Alist_io,icData[current_ic]["dIo"][j]))continue;
				if(checkList(Alist_io,checkList3(Alist_io,icData[current_ic]["dIo"][j]))){
					Y_i_optionOn(icData[current_ic]["dIo"][j]);
				}else{
					Y_i_optionOn(Alist_io[0]);
				}
			}
			flg_limitCheck = true;
		}
		Y_checkLimit_io();
		Y_checkLimit_io_o();
		Y_checkLimit_o();
		
	}
	////////////////////
	
}

// ３Ｄの制御
function Y3d_callStatus() {
	
	if(Y_applet){
		if(typeof(Y_group)=="object"){
			if(Y_currentEquipInfo==str3d) return;
			Y_3dMain(str3d);//3Dの表示
		}
	}
}

//
function Y_entryData()
{
	fixed_g = current_g;
	fixed_bc = current_bc;
	fixed_ic = current_ic;
	fixed_io = copyArray(current_io);
	fixed_o = copyArray(current_o);
//	Y_costCalculate();
	entryData();

}

/* 使用していない
function Y_loadCartData() {
	
	if(typeof(fixed_g)=='undefined'||fixed_g==''){
		fixed_g = current_g;
		fixed_bc = current_bc;
		fixed_ic = current_ic;
		fixed_io = copyArray(current_io);
		fixed_o = copyArray(current_o);
	}
	else{
		current_g = fixed_g;
		current_bc = fixed_bc;
		current_ic = fixed_ic;

	}
//	Y_costCalculate();
	entryData();
}
*/

//
function entryData(){
	if(!flg_firstLoad && load_3d_flg){
		Y3d_callStatus();
	}
}

//get limit data
function Y_getLimit_o(ID,gID)
{
	limitList = oLimit[gID][ID].list;
	limitType = oLimit[gID][ID].type;
}
function Y_getLimit_og(ID,gID)
{
	og_limitList = oGLimit[gID][ID].list;
	og_limitType = oGLimit[gID][ID].type;
}
function Y_getLimit_io(ID,gID)
{
	io_limitList = ioLimit[gID][ID].list;
	io_limitType = ioLimit[gID][ID].type;
}

///////////////////////////////////////////////////////////////////////////////////////
function Y_getList_ic(cID,gID)
{
	if(typeof(bcData[cID]["iNA"][gID])=="undefined"){
		var intList = gData[gID]["iA"];
	}else{
		var intList = new Array();
		for(var x=0;x<gData[gID]["iA"].length;x++){
			if(checkList(bcData[cID]["iNA"][gID],gData[gID]["iA"][x])) continue;
			intList.push(gData[gID]["iA"][x]);
		}
	}
	return intList;
}

function Y_getList_o(cID,gID)
{
	if(typeof(bcData[cID]["oNA"][gID])=="undefined"){
		var opList = gData[gID]["oA"];
	}else{
		var opList = new Array();
		for(var x=0;x<gData[gID]["oA"].length;x++){
			if(checkList(bcData[cID]["oNA"][gID],gData[gID]["oA"][x])) continue;
			opList.push(gData[gID]["oA"][x]);
		}
	}
	return opList;
}
function Y_getList_io(cID,gID)
{
	if(typeof(bcData[cID]["oNA"][gID])=="undefined"){
		var opList = gData[gID]["oA"];
	}else{
		var opList = new Array();
		for(var x=0;x<gData[gID]["oA"].length;x++){
			if(checkList(bcData[cID]["oNA"][gID],gData[gID]["oA"][x])) continue;
			opList.push(gData[gID]["oA"][x]);
		}
	}
	return opList;
}

// ボディカラーチェック
function Y_checkA_bc() {
	
	// 選択したグレードで、現在のカラーが選べないとき
	if(!checkList(gData[current_g]["cA"],current_bc)){
		off_bc = current_bc; // 現在のカラーを外れるボディカラーにする
		current_bc = gData[current_g]["cDef"]; //現在のカラーを、選択したグレードのデフォルトカラーにする
	}
}

// インテリアカラーチェック
function Y_checkA_ic() {
	
	// 選択したグレードで、現在のカラーが選べないとき
	if(!checkList(Alist_ic,current_ic)){
		Y_change_ic(Y_getA_ic()); // 現在のカラーと外すカラーの変数を変更する
	}
}

// 現在のグレードで選択できるインテリアカラーを返す
function Y_getA_ic(){
	
	if(typeof(iLimit[current_g])=="undefined") return Alist_ic[0];
	for(var x=0;x<Alist_ic.length;x++){
		if(typeof(iLimit[current_g][Alist_ic[x]])=="undefined"){
			return Alist_ic[x];
		}else{
			if(checkLimit(iLimit[current_g][Alist_ic[x]])){
				return Alist_ic[x];
			}
		}
	}
	if(debug_flg){
		alert("装着できるインテリアがありません。[function:Y_getA_ic()]");
	}
}

//オプションチェック
function Y_checkA_o()
{
	var targetList = current_o;
	for(var i=0;i<targetList.length;i++){
		if(!checkList(Alist_o,targetList[i])){
			Y_optionOff(targetList[i]);
		}
	}
}
//インテリアオプションチェック
function Y_checkA_io()
{
	var targetList = current_io;
	for(var i=0;i<targetList.length;i++){
		if(!checkList(Alist_io,targetList[i])){
			Y_i_optionOff(targetList[i]);
		}
	}
	
}
// interior ******************************************************
// 各変数の変更
function Y_change_ic(ID)
{
	off_ic = current_ic; // 外すカラー
	current_ic = ID; // 現在のカラー
	Y_checkLimit_io(); // インテリオプション
}

// i_option*********************************************************
function Y_i_optionOff(ID)
{
	if(!checkList(current_io,ID)) return;
	off_io.push(ID);
	current_io = deleteArray(current_io,ID);
	
	if(flg_limitCheck){
		Y_checkLimit_io();
		Y_checkLimit_o();
	}
}
function Y_i_optionOn(ID)
{
	
	if(checkList(current_io,ID)) return;
	current_io.push(ID);
	Y_CheckComp(ID);
	if(flg_limitCheck){
		Y_checkLimit_io();
		Y_checkLimit_io_o();
		Y_checkLimit_o();
	}
}
// option*********************************************************
function Y_optionOff(ID)
{
	if(!checkList(current_o,ID)) return;
	off_o.push(ID);// off_oに外すオプションを追加
	current_o = deleteArray(current_o,ID); // 現在のオプションから外すオプションを削除
	if(flg_limitCheck){
		Y_checkLimit_o();
	}
}
function Y_optionOn(ID)
{
	if(checkList(current_o,ID)) return;
	current_o.push(ID);
	Y_CheckComp(ID);
	if(flg_limitCheck) Y_checkLimit_o();
	//インテリアを含む場合
	if(oData[ID]["intID"]!=""){
		Y_change_ic(oData[ID]["intID"]);
	}
}
/////////////////////////////////////////////////////////////////////new・・・20071127変更
function Y_Alist_io_Gcheck()
{
	var Alist_io_data = new Array();
//Alist_io に "sIo" を入れる （現在のグレードで使用可能なオプションのみを入れる）
	for(a=0;a<icData[current_ic]["sIo"].length;a++){
		if(checkList(gData[current_g]["ioA"],icData[current_ic]["sIo"][a])){
			Alist_io_data.push(icData[current_ic]["sIo"][a]);
		}
		
	}
	return Alist_io_data;
}
//////////////////////////////////////////////////////////////////////new・・・20071127変更
//comp
function Y_CheckComp(ID)
{
	if(typeof(oData[ID])!="undefined"){
		var idx = getIndex(oData[ID]["compGID"]);
		if(idx>-1){
			for(var i=0;i<oData[ID]["compOID"][idx].length;i++){
				if(checkList(current_o,oData[ID]["compOID"][idx][i])){
					Y_optionOff(oData[ID]["compOID"][idx][i]);
				}
			}
		}
	}
	if(typeof(ioData[ID])!="undefined"){
		var idx = getIndex(ioData[ID]["compGID"]);
		if(idx>-1){
			for(var i=0;i<ioData[ID]["compOID"][idx].length;i++){
				if(checkList(current_io,ioData[ID]["compOID"][idx][i])){
					Y_i_optionOff(ioData[ID]["compOID"][idx][i]);
				}
			}
		}
	}

	function getIndex(list){
		for(var x=0;x<list.length;x++){
			for(var y=0;y<list[x].length;y++){
				if(list[x][y]==current_g) return x;
			}
		}
		return -1;
	}
}

//limit
function Y_checkLimit_io()//インテリアオプションからインテリアオプションに対してのリミット（ここではfalseだと外れるという処理）
{
	//i_option×i_option--------------------
	if(typeof(ioLimit[current_g])!="undefined"){
		for(var x in ioLimit[current_g]){
			var flg = i_checkLimit(ioLimit[current_g][x]);
			if(!flg){
				if(checkList(current_io,x)){
					Y_i_optionOff(x);
				}
			}
		}
	}
}

function Y_checkLimit_io_o(){///インテリアオプション装着時、オプションをはずす
	//i_option×option--------------------
	if(typeof(io_oLimit[current_g])!="undefined"){//装着したインテリアオプションが規定のインテリアオプションであった場合、装着されているオプションがあった場合はずす。
		for(x in io_oLimit[current_g]){
			for(var a=0;a<io_oLimit[current_g][x].length;a++){
				if(checkList(current_io,io_oLimit[current_g][x][a])){
					Y_optionOff(x);
				}
			}
		}
	}
}
function Y_checkLimit_o()//オプションからオプションに対してのリミット（ここではオプションからインテリアオプションもできるようにしました。本当はインテリアオプションのほうがポジションは上なのでオプションからインテリアオプションをはずすことはできないはずでしたができるように改良しました）。
{
	//option×option--------------------
	if(typeof(oLimit[current_g])!="undefined"){
		for(var x in oLimit[current_g]){
			var flg = o_i_checkLimit(oLimit[current_g][x]);
			if(!flg){
				if(checkList(current_o,x)){
					Y_optionOff(x);
				}
				if(checkList(current_io,x)){
					Y_optionOff(x);
				}
			}
		}
	}
	if(typeof(oGLimit[current_g])!="undefined"){
		for(var x in oGLimit[current_g]){
			var flg = o_i_g_checkLimit(oGLimit[current_g][x]);
			if(!flg){
				if(checkList(current_o,x)){
					Y_optionOff(x);
				}
			}
		}
	}
}
function checkLimit(obj){
	for(var y=0;y<obj.list.length;y++){
		if(obj.type==checkList(current_o,obj.list[y])) return true;
	}
	return false;
}
function i_checkLimit(obj){
	for(var y=0;y<obj.list.length;y++){
		if(obj.type==checkList(current_io,obj.list[y])) return true;
	}
	return false;
}
function o_i_checkLimit(obj){
	for(var y=0;y<obj.list.length;y++){
		if(obj.type==checkList(current_o,obj.list[y])) return true;
		if(obj.type==checkList(current_io,obj.list[y])) return true;
	}
	return false;
}
function o_i_g_checkLimit(obj){
	var aaaa = new Array();
	var bbbb = new Array();
	for(var i=0;i<obj.list.length;i++){
		aaaa[i] = new Array();
		for(var j=0;j<obj.list[i].length;j++){
			aaaa[i][j] = checkList(current_o,obj.list[i][j]);
			for(var k in ioData){
				if(obj.list[i][j]!=k){
					aaaa[i][j] = checkList(current_o,obj.list[i][j]);
				}else{
					aaaa[i][j] = checkList(current_io,obj.list[i][j]);
				}
			}
		}
		bbbb[i] = checkList4(aaaa[i],obj.type);
		if(obj.type==checkList(bbbb,obj.type)){
			return true;
		}
	}
	return false;
}

// library ********************************************************
// リストに一致しないものが一つでもあればfalseを返す
function checkList4(list,val) {
	
	var aa=true;
	for(var x=0;x<list.length;x++){
		if(val!=list[x]) aa=false;
	}
	return aa;
}

// リストに一致するものが一つでもあればtrueを返す
function checkList(list,val) {
	
	for(var x=0;x<list.length;x++){
		if(val==list[x]) return true;
	}
	return false;
}

/* checkListと同じ為、削除
function checkList2(list,val)
{
	
	for(var x=0;x<list.length;x++){
		if(val==list[x]) return true;
	}
	return false;
}
*/

// リストに一致するものが一つでもあればその値を返す
function checkList3(list,val) {
	
	for(var x=0;x<list.length;x++){
		if(val==list[x]) return val;
	}
	return false;
}

// valと一致しないリストの値を配列に格納し返す
function deleteArray(list,val) {
	
	var dummyArray = new Array();
	for(var x=0;x<list.length;x++){
		if(list[x]==val) continue;
		dummyArray[dummyArray.length] = list[x];
	}
	return dummyArray;
}

// 配列をコピー
function copyArray(obj) {
	var dummyArray = new Array();
	for(var x=0;x<obj.length;x++){
		dummyArray.push(obj[x]);
	}
	return dummyArray;
}

//
var sortTarget;
function sortRule(a,b)
{
	return window[sortTarget][a]["order"] - window[sortTarget][b]["order"];
}

