//定数
var parts_type = new Array("","hat","hair","face","ubody","lbody","hand","shoes","ritem","litem");
var PATH = "http://gelgoog/cgi-bin/hoge.php";// このアドレスにアバターのバストショットをJPEG形式のバイナリでPOST
var PATH2 = "http://localhost:8000/cgi-bin/xxx.py";// このアドレスにアバターの全身SSをJPEG形式のバイナリでPOST
var f_init_list = new Array("f_bone","","f_hair_a_01","f_face_a_01","f_ubody_a_01",
                            "f_lbody_a_01","","","","","f_anim_stand","","i_bg_01","","");
var m_init_list = new Array("m_bone","","m_hair_a_01","m_face_a_01","m_ubody_a_01",
                            "m_lbody_a_01","","","","","m_anim_stand","","i_bg_01","","");
var RESOURCE_PATH = '/na/resource/';

//以下の変数はユーザごとに上書きする必要あり
//(bone,hat,hair,face,ubody,lbody,hand,shoes,ritem,litem,stand,motion,bg,bgeffect,magic_effect)
//現在の装備を保存しておく配列
var equip_list = new Array("m_bone","","m_hair_a_01","m_face_a_01","m_ubody_a_01",
                           "m_lbody_a_01","","","","","m_anim_stand","","i_bg_01","" , "");

//デフォルト装備を保存しておく配列
var def_list = new Array("m_bone","","m_hair_a_01","m_face_a_01","m_ubody_a_01",
                         "m_lbody_a_01","","","","","m_anim_stand","","i_bg_01","","");

//キャラ作成時の装備
var init_list = new Array("m_bone","","m_hair_a_01","m_face_a_01","m_ubody_a_01",
                          "m_lbody_a_01","","","","","m_anim_stand","","i_bg_01","","");


var sex = 'm';//性別(mかf)。
var setitem_id;


var set_idx = null;	//current index of set list
var def_set_idx = null;	//デフォルト装備がセット装備の場合に必要
var prev_set_idx = null;//dequipListの中で設定


//髪と帽子の対応表
//3:Normalな髪型 , 0:髪なし
var hairs = {'' : 3 , f_hat_a_01 : 3 , f_hat_a_02 : 3 , f_hat_b_01 : 2 , f_hat_b_02  : 2 ,
            f_hat_c_01 : 2 , f_hat_c_01 : 2 , f_hat_d_01 : 1 , f_hat_e_01 : 1 , f_hat_e_02 : 1 ,
            f_hat_e_03 : 1 , f_hat_e_04 : 1 , f_hat_e_05 : 1 , f_hat_za_01 : 2 , f_hat_zb_01 : 3 ,
            m_hat_a_01 : 1 , m_hat_a_02 : 1 , m_hat_b_01 : 2 , m_hat_b_02 : 2 , m_hat_c_01 : 2 ,
            m_hat_d_01 : 1 , m_hat_e_01 : 2 , m_hat_e_02 : 2 , m_hat_e_03 : 2 , m_hat_e_04 : 2 ,
            m_hat_e_05 : 2 , m_hat_za_01 : 2 , m_hat_zb_01 : 3 , m_hat_zc_01 : 3 , m_hat_f_01 : 0 , 
            m_hat_g_01 : 0 , f_hat_zc_01 : 3 , f_hat_zd_01 : 3, f_hat_f_01 : 3 , f_hat_f_02 : 3 , m_hat_h_01 : 3 , 
            m_hat_h_02 : 2 , m_hat_zd_01 : 1 , m_hat_zd_02 : 1 , m_hat_i_01 : 2 , f_hat_g_01 : 3 , m_hat_h_03 : 3 , 
      f_hat_g_02 : 3 , m_hat_h_04 : 2  , f_hat_f_03 : 3  , f_hat_f_04 : 3 , f_hat_ze_01 : 3 , f_hat_ze_02 : 3 , 
      f_hat_ze_03 : 3 , f_hat_ze_04 : 3 , f_hat_j_01 : 3 , m_hat_h_05 : 3 , f_hat_g_03 : 3 , m_hat_x_01 : 2 , 
      f_hat_zf_01 : 1 , m_hat_ze_01 : 1 , m_hat_t_01 : 3 , m_hat_u_01 : 3 , f_hat_m_01 : 0 , f_hat_h_01 : 2 , 
      f_hat_h_02 : 2 , f_hat_h_03: 1 , f_hat_h_05 : 3 , m_hat_l_01 : 2 , m_hat_l_02 : 2 , m_hat_l_03 : 1 , m_hat_l_04 : 3 ,
	  f_hat_h_001 : 2 , f_hat_h_002 : 2 , f_hat_h_003: 1 , f_hat_h_005 : 3 , m_hat_l_001 : 2 , m_hat_l_002 : 2 , m_hat_l_003 : 1 , m_hat_l_004 : 3 ,
      m_hat_r_01 : 2 , f_hat_k_01 : 2 , m_hat_x_01 : 0 , 
m_hat_ya_01 : 2 , f_hat_ya_01 : 2 , f_hat_ya_02 : 2 , f_hat_ya_03 : 2 , f_hat_ya_04 : 2 , f_hat_ya_05 : 2 , f_hat_yb_01 : 3 , f_hat_yb_02 : 3 , m_hat_p_03 : 1 , f_hat_f_05 : 3 , m_hat_y_01 : 3 , f_hat_r_01 : 3 , m_hat_01aa_01 : 3 ,
 f_hat_yc_01 : 3 , f_hat_yc_02 : 3 , f_hat_yd_01 : 3 , f_hat_yd_02 : 3 ,
 f_hat_n_01 : 2, f_hat_00ab_01 : 3 , f_hat_01ab_01 : 2 ,
 m_hat_b_04 : 1 , m_hat_b_03 : 1 , m_hat_m_01 : 1 , m_hat_m_02 : 1 , f_hat_02aa_01 : 2 , m_hat_02aa_01 : 3 , f_hat_02ab_01 : 3 ,
 m_hat_02ab_01 : 1 ,m_hat_yf_05 : 3 , m_hat_yf_03 : 3 , f_hat_ye_06 : 3 , f_hat_ye_01 : 3 , m_hat_ye_01 : 3 , m_hat_ye_06 : 3 , f_hat_yf_01 : 0 , f_hat_yf_03 : 0 , m_hat_ye_01 : 3 , f_hat_l_01 : 1 , f_hat_l_02 : 1 , m_hat_s_01 : 1 , m_hat_s_02 : 1 , m_hat_02al_02 : 3 , m_hat_p_04 : 1 , m_hat_02af_01 : 3 , m_hat_02af_02 : 3 , m_hat_02af_03 : 3 , m_hat_02af_04 : 3 , m_hat_02ac_01 : 2 , f_hat_02ao_01 : 1 , m_hat_02ay_02 : 2 , m_hat_02ay_01 : 3 , m_hat_02ax_01 : 3 , m_hat_02az_01 : 3 , m_hat_02av_01 : 3 , f_hat_staff_01 : 1 , m_hat_yj_01 : 3, m_hat_yj_02 : 3, m_hat_staff_01 : 1 , m_hat_02be_01 : 3 , f_hat_02ay_01 : 3 , m_hat_ye_15 : 3 , m_hat_ye_13 : 3 , f_hat_02bm_01 : 3 , f_hat_00ac_01 : 3 , f_hat_00ac_02 : 3 , m_hat_02bt_01 : 3 , f_hat_02bk_01 : 3};


//セットアイテム
//setitem  = (骨,帽子,髪,顔,上服,下服,手,靴,右手,左手,立ちモーション,モーション);
var any = null;
var setitem1 = new Array(any,any,any,any,any,any,any,any,any,any,any,any); //ダミー
var setitem2 = new Array(any,'m_hat_d_01',any,any,'m_ubody_e_01','m_lbody_e_01','m_hand_a_06','m_shoes_c_01',any,any,any,any);//シド
var setitem3 = new Array(any,any,any,any,'m_ubody_f_01','m_lbody_f_01',any,any,any,any,any,any);//ラファエロ
var setitem4 = new Array(any,"",any,any,'f_ubody_e_01','f_lbody_e_01','','f_shoes_c_01',any,any,any,any);//クロマ
var setitem5 = new Array(any,"",any,any,'f_ubody_f_01','f_lbody_f_01','','f_shoes_d_01',any,any,any,any);//シロマ
var setitem6 = new Array(any ,"m_hat_f_01","",any,"m_ubody_i_01","m_lbody_i_01","m_hand_d_01","m_shoes_f_01",any,any,any,any);//暗黒セシル
var setitem7 = new Array(any,"m_hat_g_01","",any,"m_ubody_j_01","m_lbody_j_01","m_hand_e_01","m_shoes_g_01",any,any,any,any);//FF4カイン
var setitem8 = new Array(any,any,any,any,"f_ubody_zg_01","f_lbody_zg_01","","f_shoes_zg_01",any,any,any,any);//正月アイテム女子1
var setitem9 = new Array(any,any,any,any,"f_ubody_zg_02","f_lbody_zg_02","","f_shoes_zg_01",any,any,any,any);//正月アイテム女子2
var setitem10 = new Array(any,any,any,any,"m_ubody_zg_01","m_lbody_zg_01","","m_shoes_zg_01",any,any,any,any);//正月アイテム男子1
var setitem11 = new Array(any,any,any,any,"m_ubody_zg_02","m_lbody_zg_02","","m_shoes_zg_02",any,any,any,any);//正月アイテム男子2
var setitem12 = new Array(any,any,"m_hair_g_01",any,"m_ubody_k_01","m_lbody_k_01","m_hand_f_01","m_shoes_h_01",any,any,any,any);//エッジセット
var setitem13 = new Array(any,any,"m_hair_f_01",any,"m_ubody_h_01","m_lbody_h_01","m_hand_c_01","m_shoes_e_01",any,any,any,any);//セシルセット
var setitem14 = new Array(any,any,"m_hair_za_01",any,"m_ubody_zh_01","m_lbody_zh_01",any,"m_shoes_zh_01",any,any,any,any);//SOドーンアイテム
var setitem15 = new Array(any,any,"f_hair_f",any,"f_ubody_h_01","f_lbody_h_01",any,"f_shoes_f_01",any,any,any,any);//FF4ローザセット
var setitem16 = new Array(any,any,"f_hair_g_01",any,"f_ubody_i_01","f_lbody_i_01",any,any,any,any,any,any);//FF4リディアセット
var setitem17 = new Array(any,"","f_hair_za_01",any,"f_ubody_zh_01","f_lbody_zh_01","","f_shoes_zh_01",any,any,any,any);//SOミリィアイテム
var setitem18 = new Array(any,"","m_hair_zb_01",any,"m_ubody_zi_01","m_lbody_zi_01",any,"m_shoes_zi_01",any,any,any,any);//SOラティクス
var setlist = new Array(setitem1,setitem2,setitem3,setitem4,setitem5,setitem6,setitem7,setitem8,setitem9,setitem10,setitem11,setitem12,setitem13,setitem14,setitem15,setitem16,setitem17,setitem18);

var drk_idx = 5; //暗黒騎士装備のindex

//Constructor
function Avatar(id , sex){
	this.id = id;
	if(sex == 'm'){
		this.equip_list = 
			new Array("m_bone","","m_hair_a_01","m_face_a_01","m_ubody_a_01",
			"m_lbody_a_01","","","","","m_anim_stand","","i_bg_01","" , "");//現在の装備を保存しておく配列
		this.def_list = new Array("m_bone","","m_hair_a_01","m_face_a_01","m_ubody_a_01",
                         "m_lbody_a_01","","","","","m_anim_stand","","i_bg_01","","");//デフォルト装備を保存しておく配列
		this.init_list = new Array("m_bone","","m_hair_a_01","m_face_a_01","m_ubody_a_01",
                          "m_lbody_a_01","","","","","m_anim_stand","","i_bg_01","","");//キャラ作成時の装備
	}else if(sex == 'f'){
		this.equip_list = 
			new Array("f_bone","","f_hair_a_01","f_face_a_01","f_ubody_a_01",
			"f_lbody_a_01","","","","","f_anim_stand","","i_bg_01","" , "");
		this.def_list = new Array("f_bone","","f_hair_a_01","f_face_a_01","f_ubody_a_01",
                         "f_lbody_a_01","","","","","f_anim_stand","","i_bg_01","","");
		this.init_list = new Array("f_bone","","f_hair_a_01","f_face_a_01","f_ubody_a_01",
                          "f_lbody_a_01","","","","","f_anim_stand","","i_bg_01","","");
	}else{
		this.equip_list = new Array();
		this.def_list = new Array();
		this.init_list = new Array();
	}
	this.sex = sex;//性別(mかf)。
	this.set_idx = null;	//current index of set list
	this.def_set_idx = null;	//デフォルト装備がセット装備の場合に必要
	this.getMovie = function(){return document.getElementById(this.id);};
}

function thisMovie() {return document.getElementById("ui");}

//単一のアイテム装備
function changeEquip(id,parts)
{
	var dequiped = dequipList(parts);//必要に応じてセットアイテムを外す
	var parts_list = parts.split(",");
	var with_effect = true;
	
	for (j = 0; j < parts_list.length; j++)
	{
		p = Number(parts_list[j]);
		e = equip_list[p];
		if(p === 0) { thisMovie().removeCache(); } //bone変更時にはキャッシュ消去
		/*
		for (i = 0; i < equip_list.length; i++)
		{
			if (equip_list[i] == e)
			{
				equip_list[i] = def_list[i];
			}
		}
		*/
		equip_list[p] = id;
		//魔法関連の処理。以下の処理は微妙
		if(p == 14) { with_effect = false; } //魔法を装備するときは、装備変更エフェクトをださない
		if(p == 11) { equip_list[14] = ""; } //モーション装備のときは、魔法を解除する
		if(p == 14 && id !== "") { equip_list [11] = sex + "_anim_magic"; } //魔法を装備する場合は、魔法モーションを自動的に装備
		if(p == 14 && id === "") { equip_list [11] = ""; } //魔法を外す場合は、モーションも外す
	}
	
	//デフォルト装備がセットアイテムの場合で、セットアイテム装備が解除されていた場合
	if(def_set_idx !== null && dequiped){
		//デフォルト装備が装備可能かどうか
		var enable = true;
		var sets = setlist[def_set_idx];
		for(i = 0 ; i < sets.length ; i++)
		{
			if(sets[i] != any && equip_list[i] != init_list[i]) { enable = false; }
		}
		
		if(enable){
			for(i = 0 ; i< sets.length ; i++){ if (sets[i]!=any) { equip_list[i]=sets[i]; } }
			set_idx = def_set_idx;
		}
	}
	
	//デフォルト装備がセットアイテムでなく、セットアイテム装備が解除されていた場合
	if(def_set_idx === null && dequiped) {
		for(k = 0; k < setlist[prev_set_idx].length ; k++) 
		{
			var ok = true;
			for(var j = 0 ; j < parts_list.length ; j++){
				if(k == parts_list[j]) { ok = false; }
			}
			
			if(setlist[prev_set_idx][k] != any && ok){
				equip_list[k] = def_list[k];
			}
		}
	}
	
	//本やハープ装備の場合。モーションを修正(TODO:今後バリエーションが増えるので、外部に追いやること)
	if(equip_list[8] == 'c_ritem_za_01' || equip_list[8] == 'c_ritem_za_02' ||
	   equip_list[8] == 'c_ritem_za_03' || equip_list[8] == 'c_ritem_zb_01')
	{
	   equip_list[10] = sex + '_anim_stand_book';
	   if(equip_list[11] !== '')
	   {
	   		ls = equip_list[11].split(',');
	   		if (ls.length==1) { equip_list[11] = sex + '_anim_book_before,' + equip_list[11] + ',' + sex + '_anim_book_after'; }
	   }
	}else{
		equip_list[10] = sex + '_anim_stand';
		ls = equip_list[11].split(',');
		if(ls.length == 3){equip_list[11] = ls[1];}
	}
	
	if(with_effect)
	{
		thisMovie().changeEquip(getXML());
	}else{
		thisMovie().changeEquip0(getXML());
	}
}

//帽子の装備
function changeHat(id,type){
	hairs[id] = Number(type);
	changeEquip(id , '1');
	}

//魔法の装備(obsolete)
function changeMagic(id){changeEquip(id , '14');}

//セットアイテム装備
function changeEquipList(n)
{
	if (n < 0 || n >= setlist.length) {return;} //範囲外indexにアクセスした場合
	var sets = setlist[n];
	var parts =new Array();
	var k = 0;
	for(j = 0 ; j < sets.length ; j++)
	{
		if(sets[j] != any){parts[k] = j;k++;}
	}
	dequipList(parts.join(','));

	set_idx = n;
	for(i = 0; i < sets.length; i++)
	{
		if(sets[i] != any) { equip_list[i] = sets[i]; }
	}
	
	//本・ハープ装備が解除された場合、モーションを修正(現状では必要なし)
	thisMovie().changeEquip(getXML());
}

//特定の部位の装備を外す(デフォルトに戻す)(e.g. rmEquip('4') )
//セットアイテムに使用しないこと
function rmEquip(part)
{
	if(def_set_idx === null)//デフォルト装備が、セットアイテムでない場合は問題ない
	{
		changeEquip(def_list[Number(part)] , part);
	}else if(setlist[def_set_idx][Number(part)]==any){
		//デフォルトセットアイテムと干渉しない部位の場合
		changeEquip(def_list[Number(part)] , part);
	}else{//デフォルトセットアイテムが装備可能かチェックして、装備可能なら、装備
		var sets = setlist[def_set_idx];
		var enable = true;
		for(i = 0 ; i < sets.length ; i++)
		{
			if(sets[i] != any && equip_list[i] != init_list[i] && i != Number(part)){
				enable = false;
				break;
			}
		}
		
		if(enable)
		{
			changeEquipList(def_set_idx);
		}else{
			changeEquip(init_list[Number(part)] , part);
		}
	}
}

function rmHat(){
	rmEquip('1');
}

//セット装備を付けている場合に必要があれば一旦解除
//返り値(true:装備解除した場合、false:解除しなかった場合)
function dequipList(parts)
{
	if(set_idx === null) {return false;} //セットアイテムを装備していない場合は、解除する必要なし
	//装備変更箇所がセットアイテムと衝突しないかどうかチェック
	var ok = true;
	parts_list = parts.split(",");
	for(i = 0 ; i < parts_list.length ; i++) {
		if(setlist[set_idx][parts_list[i]] != any) {ok = false;}
	}
	if(ok) {return false;}
	
	//衝突する場合は、装備解除
	for(k = 0; k < setlist[set_idx].length ; k++) 
	{
		if(setlist[set_idx][k] != any) {equip_list[k] = init_list[k];}
	}
	
	prev_set_idx = set_idx;
	set_idx = null;//解除完了
	return true;
}

//試着状態にあるセットアイテムを外す
function rmTryingEquipList(){
	if(def_set_idx === null){
		for(k = 0; k < setlist[set_idx].length ; k++) 
		{
			if(setlist[set_idx][k] != any) {equip_list[k] = def_list[k];}
		}
		set_idx = null;
		thisMovie().changeEquip(getXML());
	}else{
		for(k = 0; k < setlist[set_idx].length ; k++) 
		{
			if(setlist[set_idx][k] != any) {equip_list[k] = init_list[k];}
		}
		set_idx = def_set_idx;
		changeEquipList(def_set_idx);
	}
}

//装備状態にあるセットアイテムを解除する
function rmEquipList(){
	var tmp = def_set_idx;
	def_set_idx = null;
	//今のところ上半身・下半身は必ずセットアイテムで指定される
	changeEquip(init_list[4], '4');
	def_set_idx = tmp;
}


//equip_listからXMLを生成
function getXML()
{
	str = "<?xml version=\"1.0\" encoding=\"utf-8\"?><scene><character>";
	for (i = 0; i < equip_list.length; i++)
	{
		if (equip_list[i] === "") {continue;}
		isConflict = false;
		for (j = 0; j < i; j++)
		{
			if (equip_list[i] == equip_list[j]) {isConflict = true;}
		}
		if (isConflict) {continue;}
		switch(i)
		{
		case 0: // bone
			str += "<bone>" + getName(equip_list[i]) + "</bone>";
			break;
		case 10: // anim
			str += "<anim parts=\"stand\">" + getName(equip_list[i]) + "</anim>";
			break;
		case 11:
			ls = equip_list[i].split(',');
			for(j=0;j<ls.length;j++) {
				str +=  "<anim parts=\"motion" + j +"\">" + getName(ls[j]) + "</anim>";
			}
			//str += "<anim>" + getName(equip_list[i]) + "</anim>";
			break;
		case 12: // background
			if(equip_list[i]=='i_bg_16' || equip_list[i] == 'i_bg_01_158'){
				str += "<background maxWidth='158'>"+ RESOURCE_PATH + "images/" + equip_list[i] + ".jpg</background>";
			}else{
				str += "<background  maxWidth='474'>" + RESOURCE_PATH + "images/" + equip_list[i] + ".jpg</background>";
			}
			break;
		case 13: //background effect
			str += "<bgeffect>" + RESOURCE_PATH + "swf/" + equip_list[i] + ".swf</bgeffect>";
			break;
		case 14: //magic effect
			str += "<magic>../resource/swf/" + equip_list[i] + ".swf</magic>";
			break;
		case 2: // hair model
			var t = hairs[equip_list[1]];
			if( equip_list[2].indexOf('f_hair_j_') === 0 && equip_list[4] == 'f_ubody_f_01') {t=4;}
			if( t > 0 ) {str += "<model parts=\"" + parts_type[i] + "\">" + getName(equip_list[i] + "_0" + t) +"</model>";}
			break;
		default: // model
			str += "<model parts=\"" + parts_type[i] + "\">" + getName(equip_list[i]) + "</model>";
			break;
		}
	}
	str += "</character></scene>";
	return str;
}

function getName(id)
{
	return RESOURCE_PATH + "collada/" + skin_color + id + ".dae";
}

function activate()
{
	thisMovie().activate();
}

function deactivate()
{
	if (isIE)
	{
		if (!document.activeElement) {thisMovie().deactivate();}
	}
	else
	{
		thisMovie().deactivate();
	}
}
/*
function isFirefox()
{
	return !isIE;
}
*/
function getFocus()
{
	var element = (document.activeElement || window.getSelection().focusNode);
	if (element) {
	  return 1;
	}else{
	   return 0;
	}
}


function cameraConfirm(){
snapshot_panel_open();
/*
  var ok = window.confirm('スナップショットを保存しますか?');
  if(ok){
    thisMovie().exitStop();
  }else{
    thisMovie.exitStop();
  }
*/
}

function getCategoryStringFromIndex(n){
  var category_strings = new Array('bone' , 'hat'  , 'hair' , 'face' , 'ubody' , 'lbody' , 'hand' , 
                                   'shoes' , 'ritem' , 'litem' , 'stand' , 'motion' , 'background' , 
                                   'background_effect' , 'magic_effect');
  return category_strings[n];
}

