// 文字コード：UTF-8

var dked_target_card = 1;					// 選択中のカードID
var dked_card_num = new Array(150);			// デッキ内のカード枚数
var dked_card_category_num = new Array(4);	// デッキ内のカードのカテゴリーごとの枚数
var dked_rarity_total = 0;					// レア度合計値
var dked_rarity_max = 0;					// レア度最大値

var dked_rule = 3;			// ルール( 0:Spd / 1:Jr. / 2:Sr. / 3:Pro )
var dked_rarity8 = 0;		// レア度8の有無( 0:なし / 1:あり )
var dked_master = 2;		// マスター
// マスター( 0:なし / 1:マスター / 2:ブラック / 3:ホワイト / 
// 4:ワンダー（ヒーリング） / 5:ワンダー（ドロー５） / 6:ワンダー（ウェイクアップ） / 7:ワンダー（リ・シャッフル） / 
// 8:グレート（ヒーリング＆リターン） / 9:グレート（かまいたち＆リフレッシュ） / 10:グレート（水晶の壁＆特技封じ） / 11:グレート（二重の盾＆誘惑） )

var dked_init_deck_code = "";					// 初期化用デッキコード

var DKED_CARD_COUNT_NUM = 4;	// カード枚数のボタンの数
var DKED_RULE_NUM       = 4;	// ルールのボタンの数
var DKED_RARITY8_NUM    = 2;	// レア度8の有無のボタンの数
var DKED_MASTER_NUM     = 12;	// マスターの選択肢の数

// カード検索のコールバック関数
function cdsc_search_callback()
{
	var search_result = document.getElementById("dked_search_result");
	
	// 検索結果リストをいったん空にする
	var opt_num = search_result.options.length;
	for(var i = 0; i < opt_num; i++){
		search_result.options[0] = null;
	}
	
	// 検索結果リストを生成する
	for(var i = 0; i < cdsc_card_data.length; i++){
		if(cdsc_card_hit[i] == 1){
			search_result.options[search_result.options.length] = new Option(cdsc_card_data[i].name, (i + 1));
			// 検索結果が 1 件だけなら、そのカードを選択中にする
			if(cdsc_card_hit_num == 1){
				dked_set_target_card(cdsc_card_data[i].id);
				break;
			}
			// 選択中のカードは selected にする
			if(cdsc_card_data[i].id == dked_target_card){
				search_result.selectedIndex = search_result.options.length - 1;
			}
		}
	}
	
	if(dked_init_deck_code != ""){
		// デッキコードを元に初期化
		dked_open_deck_code(dked_init_deck_code);
		dked_init_deck_code = "";
	}
}

// 選択中のカードを設定する
function dked_set_target_card(id)
{
	dked_target_card = id;
	
	// 選択中のカード表示
	for(var i = 0; i < cdsc_card_data.length; i++){
		if(cdsc_card_data[i].id == id){
			// カード名
			$("dked_target_card_name").innerHTML = cdsc_card_data[i].name;
			// 画像
			var image_name = "co";
			if(id < 10){
				image_name += "00" + id;
			} else if(id < 100){
				image_name += "0" + id;
			} else {
				image_name += id;
			}
			image_name += ".jpg";
			var img_obj = $("dked_target_card_image");
			img_obj.src = img_obj.src.substr(0, img_obj.src.length - image_name.length) + image_name;
			img_obj.alt = cdsc_card_data[i].name;
			// カード枚数
			dked_set_card_count(dked_card_num[dked_target_card - 1]);
			break;
		}
	}
	
	// 検索結果リストにそのカードが存在すれば selected にする
	var search_result = document.getElementById("dked_search_result");
	search_result.selectedIndex = -1;
	for(var i = 0; i < search_result.options.length; i++){
		if(search_result.options[i].value == id){
			search_result.selectedIndex = i;
			break;
		}
	}
	
	// デッキ内にそのカードが存在すれば選択状態にする
	for(var i = 0; i < cdsc_card_data.length; i++){
		var deck_card = $("dked_deck_card_" + cdsc_card_data[i].id);
		if(deck_card){
			if(cdsc_card_data[i].id == id){
				deck_card.className = "deck_card button_on";
			} else {
				deck_card.className = "deck_card button_off";
			}
		}
	}
}

// カード枚数をセット
function dked_set_card_count(val)
{
	var button_id;
	
	if( (val < 0) || (DKED_CARD_COUNT_NUM <= val) ){
		return;
	}
	
	// 枚数ボタン
	for(var i = 0; i < DKED_CARD_COUNT_NUM; i++){
		button_id = "dked_card_count_" + i;
		document.getElementById(button_id).className = "card_count button_off";
	}
	button_id = "dked_card_count_" + val;
	document.getElementById(button_id).className = "card_count button_on";
	
	// 枚数の変更がなければこれ以下の処理は行わない
	if(dked_card_num[dked_target_card - 1] == val){
		return;
	}
	
	// 枚数の変更
	var card_num_old = dked_card_num[dked_target_card - 1];
	dked_card_num[dked_target_card - 1] = val;
	
	// デッキ内のカード表示
	var category = cdsc_card_data[dked_target_card - 1].type;
	if(val == 0){
		var deck_category = $("dked_deck_category_" + category);
		deck_category.removeChild($("dked_deck_card_" + dked_target_card));
	} else {
		if(card_num_old == 0){
			var deck_category = $("dked_deck_category_" + category);
			var card_button = document.createElement("input");
			card_button.setAttribute("type", "button");
			card_button.setAttribute("value", cdsc_card_data[dked_target_card - 1].name + " x" + val);
			card_button.setAttribute("id", "dked_deck_card_" + dked_target_card);
			if(Prototype.Browser.IE){
				card_button.setAttribute("onclick", new Function("dked_set_target_card(" + dked_target_card + ");"));
			} else {
				card_button.setAttribute("onclick", "dked_set_target_card(" + dked_target_card + ")");
			}
			card_button.className = "deck_card button_on";
			deck_category.appendChild(card_button);
		} else {
			var button = $("dked_deck_card_" + dked_target_card);
			button.value = cdsc_card_data[dked_target_card - 1].name + " x" + val;
		}
	}
	
	// 合計枚数の変更
	dked_card_category_num[category] += val - card_num_old;
	var card_category_num_total = 0;
	for(var i = 0; i < dked_card_category_num.length; i++){
		card_category_num_total += dked_card_category_num[i];
	}
	$("dked_card_category_num_" + category).innerHTML = dked_card_category_num[category];
	$("dked_card_category_num_total").innerHTML = card_category_num_total;
	
	// レア度の変更
	var rarity_one = cdsc_card_data[dked_target_card - 1].rarity;
	dked_rarity_total += rarity_one * (val - card_num_old);
	$("dked_rarity_total").innerHTML = dked_rarity_total;
	dked_change_max_rarity(rarity_one, val, card_num_old);
	
	// 投稿できる状態か確認
	dked_validate_deck();
}

// 最大レア度の変更
function dked_change_max_rarity(rarity_one, card_num_new, card_num_old)
{
	if(dked_master <= 3){
		// マスターがワンダーかグレートでない
		if(card_num_new == 0){
			if(rarity_one == dked_rarity_max){
				dked_rarity_max = 0;
				for(var i = 0; i < dked_card_num.length; i++){
					if( (dked_card_num[i] > 0) && (cdsc_card_data[i].rarity > dked_rarity_max) ){
						dked_rarity_max = cdsc_card_data[i].rarity;
					}
				}
				$("dked_rarity_max").innerHTML = dked_rarity_max;
			}
		} else if(card_num_old == 0){
			if(rarity_one > dked_rarity_max){
				dked_rarity_max = rarity_one;
				$("dked_rarity_max").innerHTML = dked_rarity_max;
			}
		}
	} else {
		// マスターがワンダーかグレート
		dked_rarity_max = 8;
		$("dked_rarity_max").innerHTML = dked_rarity_max;
	}
}

// ルールをセット
function dked_set_rule(val)
{
	var button_id;
	
	if( (val < 0) || (DKED_RULE_NUM <= val) ){
		return;
	}
	
	for(var i = 0; i < DKED_RULE_NUM; i++){
		button_id = "dked_rule_" + i;
		document.getElementById(button_id).className = "rule button_off";
	}
	button_id = "dked_rule_" + val;
	document.getElementById(button_id).className = "rule button_on";
	dked_rule = val;
	
	if(val == 0){
		// Spd
		// マスターをセット
		dked_set_master(0);
	} else if(val == 1){
		// Jr.
		// マスターをセット
		dked_set_master(1);
	} else {
		// Sr. Pro
		if( (dked_master == 0) || (dked_master == 1) ){
			// マスターをセット
			dked_set_master(2);
		} else {
			// 投稿できる状態か確認
			dked_validate_deck();
		}
	}
}

// レア度8の有無をセット
function dked_set_rarity8(val)
{
	var button_id;
	
	if( (val < 0) || (DKED_RARITY8_NUM <= val) ){
		return;
	}
	
	for(var i = 0; i < DKED_RARITY8_NUM; i++){
		button_id = "dked_rarity8_" + i;
		document.getElementById(button_id).className = "rarity8 button_off";
	}
	button_id = "dked_rarity8_" + val;
	document.getElementById(button_id).className = "rarity8 button_on";
	dked_rarity8 = val;
	
	// 投稿できる状態か確認
	dked_validate_deck();
}

// マスターをセット
function dked_set_master(val)
{
	if( (val < 0) || (DKED_MASTER_NUM <= val) ){
		return;
	}
	
	dked_master = val;
	$("dked_master").selectedIndex = val;
	
	// 最大レア度を変更
	dked_change_max_rarity(dked_rarity_max, 0, 0);
	
	// 投稿できる状態か確認
	dked_validate_deck();
}

// 投稿できる状態か確認
function dked_validate_deck()
{
	var message = "";
	
	var card_num_total = 0;
	for(var i = 0; i < dked_card_category_num.length; i++){
		card_num_total += dked_card_category_num[i];
	}
	
	if(dked_rule == 0){
		// Spd
		// カード枚数
		if(dked_card_category_num[0] + dked_card_category_num[1] != 10){
			message += "前衛、後衛の合計が10枚になっていません。<br />";
		}
		if(dked_card_category_num[2] + dked_card_category_num[3] != 4){
			message += "スーパー、マジックの合計が4枚になっていません。<br />";
		}
		for(var i = 0; i < dked_card_num.length; i++){
			if(dked_card_num[i] >= 3){
				message += "Spdでは同種のカードを3枚デッキに入れることはできません。<br />";
				break;
			}
		}
		// マスター
		if(dked_master != 0){
			message += "Spdではマスターは「なし」しか選べません。<br />";
		}
		// Spd使用不可のカード
		for(var i = 0; i < dked_card_num.length; i++){
			if( (dked_card_num[i] > 0) && (cdsc_card_data[i].spd_no == 1) ){
				message += "Spdで使えないカードがデッキに入っています。<br />";
				break;
			}
		}
	} else if(dked_rule == 1){
		// Jr.
		// カード枚数
		if(card_num_total != 20){
			message += "カード枚数の合計が20枚になっていません。<br />";
		}
		// マスター
		if(dked_master != 1){
			message += "Jr.ではマスターは「マスター」しか選べません。<br />";
		}
	} else if(dked_rule == 2){
		// Sr.
		// カード枚数
		if(card_num_total != 20){
			message += "カード枚数の合計が20枚になっていません。<br />";
		}
		// マスター
		if( (dked_master == 0) || (dked_master == 1) ){
			message += "Sr.ではマスターは「なし」と「マスター」は選べません。<br />";
		}
	} else if(dked_rule == 3){
		// Pro
		// カード枚数
		if(card_num_total != 30){
			message += "カード枚数の合計が30枚になっていません。<br />";
		}
		// マスター
		if( (dked_master == 0) || (dked_master == 1) ){
			message += "Proではマスターは「なし」と「マスター」は選べません。<br />";
		}
	}
	
	// レア度8の有無
	if( (dked_rarity8 == 0) && (dked_rarity_max == 8) ){
		message += "レア度8のカードがデッキに入っています。<br />";
	}
	
	if(message != ""){
		$("dked_validate_message").innerHTML = message;
		$("dked_submit_button").disabled = true;
		$("dked_preview_button").disabled = true;
	} else {
		$("dked_validate_message").innerHTML = "";
		$("dked_submit_button").disabled = false;
		$("dked_preview_button").disabled = false;
	}
}

// 送信処理
function dked_submit()
{
	document.dked_form.deck_code.value = dked_get_deck_code();
	document.dked_form.submit();
}

// プレビュー画面への送信処理
function dked_preview()
{
	document.dked_preview_form.d.value = dked_get_deck_code();
	document.dked_preview_form.submit();
}

// デッキコードを生成して取得
//	
//	ビッグエンディアンの64進数(6bit)
//		1文字目：
//			1～2bit：ルール
//			3～6bit：マスター
//		2文字目：
//			1～5bit：0
//			   6bit：レア度8の有無
//		3文字目以降は、1種類のカードの枚数を1～2文字で表す：
//			デッキ内のカードをID順に並べたとき、直前のカードとのIDの差が8以下のカードは1文字、差が9以上のカードは2文字で表す
//			   1    bit：0(1文字) or 1(2文字)
//			2～3    bit：枚数
//			4～6(12)bit：直前のカードとのIDの差から1を引いた値
//		
function dked_get_deck_code()
{
	var chars = new Array();
	var char_index = 0;
	
	chars[char_index++] = (dked_rule << 4) + parseInt(dked_master, 10);
	chars[char_index++] = dked_rarity8;
	
	var last_card_id = -1;
	for(var i = 0; i < dked_card_num.length; i++){
		if(dked_card_num[i] > 0){
			var dist = (i - last_card_id) - 1;
			if(dist < 8){
				chars[char_index] = (dked_card_num[i] << 3) + dist;
				char_index++;
			} else {
				chars[char_index + 0] = (1 << 5) + (dked_card_num[i] << 3) + (dist >> 6);
				chars[char_index + 1] = (dist & 63);
				char_index += 2;
			}
			last_card_id = i;
		}
	}
	
	var deck_code = "";
	for(var i = 0; i < chars.length; i++){
		deck_code += dked_int_to_string64(chars[i]);
	}
	
	return deck_code;
}

// デッキコードを元にデッキ内容・画面の状態を初期化
function dked_open_deck_code(deck_code)
{
	var button_id;
	
	var codes = new Array();
	for(var i = 0; i < deck_code.length; i++){
		codes[i] = dked_string64_to_int(deck_code.charAt(i));
	}
	
	// ルール、マスター、レア度8の有無
	dked_rule    = (codes[0] >> 4);
	dked_master  = (codes[0] & 15);
	dked_rarity8 = (codes[1] & 1);
	
	// ルール
	for(var i = 0; i < DKED_RULE_NUM; i++){
		button_id = "dked_rule_" + i;
		document.getElementById(button_id).className = "rule button_off";
	}
	button_id = "dked_rule_" + dked_rule;
	document.getElementById(button_id).className = "rule button_on";
	
	// マスター
	$("dked_master").selectedIndex = dked_master;
	
	// レア度8の有無
	for(var i = 0; i < DKED_RARITY8_NUM; i++){
		button_id = "dked_rarity8_" + i;
		document.getElementById(button_id).className = "rarity8 button_off";
	}
	button_id = "dked_rarity8_" + dked_rarity8;
	document.getElementById(button_id).className = "rarity8 button_on";

	// デッキ内のカード、タイプ別枚数、最大レア度、合計レア度
	var last_card_id = 0;
	for(var i = 2; i < codes.length; i++){
		var ch_num   = (codes[i] >> 5);
		var card_num = ((codes[i] >> 3) & 3);
		var card_id;
		if(ch_num == 0){
			// 1文字
			card_id = (codes[i] & 7);
		} else {
			// 2文字
			card_id = ((codes[i] & 7) << 6) + codes[i + 1];
			i++;
		}
		last_card_id += card_id + 1;
		if(last_card_id > 150){
			break;
		}
		dked_card_num[last_card_id - 1] = card_num;
		
		dked_card_category_num[cdsc_card_data[last_card_id - 1].type] += card_num;
		
		var rarity = cdsc_card_data[last_card_id - 1].rarity;
		dked_rarity_total += rarity * card_num;
		if(rarity > dked_rarity_max){
			dked_rarity_max = rarity;
		}
	}
	if(dked_master >= 4){
		dked_rarity_max = 8;
	}
	
	// デッキ内のカード表示
	for(var i = 0; i < dked_card_num.length; i++){
		if(dked_card_num[i] > 0){
			var category = cdsc_card_data[i].type;
			var deck_category = $("dked_deck_category_" + category);
			var card_button = document.createElement("input");
			card_button.setAttribute("type", "button");
			card_button.setAttribute("value", cdsc_card_data[i].name + " x" + dked_card_num[i]);
			card_button.setAttribute("id", "dked_deck_card_" + (i + 1));
			if(Prototype.Browser.IE){
				card_button.setAttribute("onclick", new Function("dked_set_target_card(" + (i + 1) + ");"));
			} else {
				card_button.setAttribute("onclick", "dked_set_target_card(" + (i + 1) + ")");
			}
			card_button.className = "deck_card button_off";
			deck_category.appendChild(card_button);
		}
	}
	
	// 合計枚数の変更
	var card_category_num_total = 0;
	for(var i = 0; i < dked_card_category_num.length; i++){
		$("dked_card_category_num_" + i).innerHTML = dked_card_category_num[i];
		card_category_num_total += dked_card_category_num[i];
	}
	$("dked_card_category_num_total").innerHTML = card_category_num_total;
	
	// レア度の変更
	$("dked_rarity_total").innerHTML = dked_rarity_total;
	$("dked_rarity_max").innerHTML = dked_rarity_max;
	
	// 選択中のカードを設定
	dked_set_target_card(dked_target_card);
	
	// 投稿できる状態か確認
	dked_validate_deck();
}

// 数値を64進数に変換
function dked_int_to_string64(val)
{
	return ["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","[","]"][val];
}

// 64進数を数値に変換
function dked_string64_to_int(val)
{
	return "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ[]".indexOf(val,0);
}

// 初期化処理
function dked_init()
{
	var param = document.location.href.split("#");
	if( (param.length > 1) && (param[1].length > 0) ){
		dked_init_deck_code = param[1];
	}
	
	for(var i = 0; i < dked_card_num.length; i++){
		dked_card_num[i] = 0;
	}
	for(var i = 0; i < dked_card_category_num.length; i++){
		dked_card_category_num[i] = 0;
	}
	
	cdsc_get_card_data();
}

window.onload = dked_init;

