// 選択されている条件をmask配列[index=>bit]で返却する
function getMask() {
	var mask = [];
	for(var i = 0; i < array_num; i++) {
		mask[i] = 0;
	}

	$("input:checked[accommodationcondition!='other']").each(function() {
		var list = $(this).attr('value').split(",");
		for( var i = 0; i < array_num; i++ ) {
			mask[i] |= parseInt(list[i], 16);
		}
	})
	$("select[accommodationcondition='x'] option:selected").each(function() {
		var list = $(this).attr('maskvalue').split(",");
		for( var i = 0; i < array_num; i++ ) {
			mask[i] |= parseInt(list[i], 16);
		}
	})
	return mask;
}

function cal_keyword_num(mask) {
	var result_num = 0;
	var num = [];
	// keywordの数だけ配列を作成する。
	for(var bit = 0; bit < keyword_num; bit++) {
		num[bit] = 0;
	}
	var selected = [];
	var c = 0;
	// iは施設のインデックス、施設でloop
	for(var i = 0; i < keyword.length; i++) {
		var and_result = _and(mask, keyword[i]);// 選択されているand条件の要素に関して、施設が満たすかどうか
		var or_result = [];
		for(var oi = 0; oi < or_mask.length; oi++) {
			or_result[oi] = _or(mask, keyword[i], oi);// 選択されているor条件の要素に関して、施設が満たすかどうか
		}
		if(and_result && isOneOrMoreTrue(or_result)) {// 施設が選択されている要素を満たした場合、この状態から他の項目が選択された場合の施設数を求める。
			// iiは施設のmaskのインデックス、全マスクでloop
			asdf: for(var ii = 0; ii < keyword[i].length; ii++) {
				if(typeof selectbox_mask_group_list != 'undefined'){// 対象のキーワードがselectboxの項目であれば別で計算するのでbreakする。
					for(var z = 0; z < selectbox_mask_group_list.length; z++){
						for(var x = 0; x < selectbox_mask_group_list[z].length; x++){
							if(ii == selectbox_mask_group_list[z][x]) continue asdf;
						}
					}
				}
				var k = keyword[i][ii];// 施設のキーワードmask[ii]
				// or_maskでloop
				for(var oi = 0; oi < or_mask.length; oi++) {
					if(!or_result[oi]) {
						k &= or_mask[oi][ii];
					}
				}
				for(var bit = 0; bit < unit; bit++) {
					num[ii*unit+bit] += k & 1;
					k >>>= 1;
				}
			}
			if (isAllTrue(or_result)) {
				result_num++;
				selected[c++] = company_id[i];
			}
		}
		
	}
	// selectbox内の項目に関しては同じselectbox内のmaskを無視して再計算をかける。
	// selectboxのキーワードグループでループ
	if(typeof selectbox_mask_group_list != 'undefined'){
		for(var z = 0; z < selectbox_mask_group_list.length; z++){
			var selectboxgroup = [];
			var tmp_mask_for_this_selectbox = mask.slice(0);
			for(var x = 0; x < selectbox_mask_group_list[z].length; x++){
				// 対象のキーワードグループのmaskを書き換え
				selectboxgroup[x] = selectbox_mask_group_list[z][x];
				tmp_mask_for_this_selectbox[selectbox_mask_group_list[z][x]] = 0;
			}
			 // alert(selectboxgroup);
			// alert(mask);alert(tmp_mask_for_this_selectbox);
			
			// 再計算
			var selected = [];
			var c = 0;
			// iは施設のインデックス、施設でloop
			for(var i = 0; i < keyword.length; i++) {
				var and_result = _and(tmp_mask_for_this_selectbox, keyword[i]);// 選択されているand条件の要素に関して、施設が満たすかどうか
				var or_result = [];
				for(var oi = 0; oi < or_mask.length; oi++) {
					or_result[oi] = _or(tmp_mask_for_this_selectbox, keyword[i], oi);// 選択されているor条件の要素に関して、施設が満たすかどうか
				}
				if(and_result && isOneOrMoreTrue(or_result)) {// 施設が選択されている要素を満たした場合、この状態から他の項目が選択された場合の施設数を求める。
					// iiは施設のmaskのインデックス、全マスクでloop
					for(var ii = 0; ii < selectboxgroup.length; ii++) {
						var k = keyword[i][selectboxgroup[ii]];// 施設のキーワードmask[ii]
						// or_maskでloop
						for(var oi = 0; oi < or_mask.length; oi++) {
							if(!or_result[oi]) {
								k &= or_mask[oi][selectboxgroup[ii]];
							}
						}
						for(var bit = 0; bit < unit; bit++) {
							num[selectboxgroup[ii]*unit+bit] += k & 1;
							k >>>= 1;
						}
					}
					if (isAllTrue(or_result)) {
						// result_num++;
						selected[c++] = company_id[i];
					}
				}
			}
		}
	}
	num[-1] = result_num;
	var ret = {'keyword': num, 'company': selected};
	return ret;
}

// or_resultの配列内で一つでもtrueがあればtrueを返却する
function isOneOrMoreTrue(or_result) {
	var ret = false;
	for(var i = 0; i < or_result.length; i++) {
		ret = ret || or_result[i];
	}
	return ret;
}

// or_resultの配列内で一つでもfalseがあればfalseを返却する
function isAllTrue(or_result) {
	var ret = true;
	for(var i = 0; i < or_result.length; i++) {
		ret = ret && or_result[i];
	}
	return ret;
}
// 桁数の調整のための関数
function formatNumSuppressString(keta, num) {
  var src = new String(num);
  var cnt = keta - src.length;
  var asdf = "";
  if (cnt <= 0) return "";
  while (cnt-- > 0) asdf = "0" + asdf; return asdf;
}

function set_keyword_num(num, exclude) {
	for(var i = 0; i < num.length; i++) {
		var num_id = "num"+i;
		var cb_id = "cb"+i;
// キーワードのヒット数が変化すると配置がずれてしまう。
// このため、文字列を2文字に固定にする。（ヒット数が3桁になると困るが）<- 2012/01/26 tsujimoto 改修
// その際、背景が白のため、白色の文字で表示。スペースでは数字文字の幅と異なるためずれてしまう。
//		$("#"+num_id).text(num[i]);
		var digits = 2;
		var n = num[i]+"";
		var suppress_str = formatNumSuppressString(digits,n)+n;
		$("#"+num_id).html((n.length<digits) ? "<span class='hit_num'>"+ formatNumSuppressString(digits,n) +"</span>"+n: n);
		$("select[accommodationcondition='x'] > option[id="+cb_id+"]").html((n.length<=digits) ? $("option[id="+cb_id+"]").attr('title') + "(<span class='hit_num'>"+ formatNumSuppressString(digits,n) +"</span>"+n + ")": n);
		if(num[i]) {
			$("#"+cb_id).attr("disabled","");
		} else {
			$("#"+cb_id).attr("checked","");
			$("#"+cb_id).attr("disabled","disabled");
		}
	}
	$("#result_num").text(num[-1]);
}

/**
 * @param mask	 選択されているmask配列
 * @param kw		 施設のキーワード情報のmask配列
 */
function _and(mask, kw) {
	var ret = true;
	var _m = false;

	// 施設のキーワード配列でloop
	for(var i = 0; i < kw.length; i++) {
		var _mask = mask[i] & and_mask[i];	// その要素がand条件のbitで、選択されていれていればbitをたてる
		var _kw = kw[i];								// 施設の要素
		ret = ret && (_mask & _kw) == _mask; // 施設が満たしているかどうか
		_m |= _mask;
	}
	return (!_m) ? true : ret;
}

function _or(mask, kw, oi) {
	var ret = false;
	var _m;
	for(var i = 0; i < kw.length; i++) {
		var _mask = mask[i] & or_mask[oi][i];
		var _kw = kw[i];
		ret = ret || (_mask & _kw) ? true : false;
		_m |= _mask;
	}
	return (!_m) ? true : ret;
}

function clear_checkbox() {
        $("#sakusaku_form input[type='checkbox']").attr('checked', false);

	var ret = cal_keyword_num(getMask());
	set_keyword_num(ret.keyword);
	set_selected_company_id(ret.company);
}
function change_contents(contents) {
	$("#contents_flg").val(contents);

	if(contents == 0) {
		$("#contents0").html("<img src='../themes/default/search/sakusaku_btn_base_o.png' width='95' height='24' alt='基本情報' />");
		$("#contents1").html("<a href='javascript: void(0)' onclick='change_contents(1)' class='roll'><img src='../themes/default/search/sakusaku_btn_price.png' width='95' height='24' alt='料金情報' /></a>");

		$("[id^=basic_contents]").show();
		$("[id^=charge_contents]").hide();
	} else if(contents == 1) {
		$("#contents0").html("<a href='javascript: void(0)' onclick='change_contents(0)' class='roll'><img src='../themes/default/search/sakusaku_btn_base.png' width='95' height='24' alt='基本情報' /></a>");
		$("#contents1").html("<img src='../themes/default/search/sakusaku_btn_price_o.png' width='95' height='24' alt='料金情報' />");

		$("[id^=basic_contents]").hide();
		$("[id^=charge_contents]").show();
	}
}
function change_photo(photo) {
	$("#photo_flg").val(photo);

	if(photo == 0) {
		$("#photo0").html("<img src='../themes/default/search/sakusaku_btn_gaikan_o.png' width='95' height='24' alt='外観' />");
		$("#photo1").html("<a href='javascript: void(0)' onclick='change_photo(1)' class='roll'><img src='../themes/default/search/sakusaku_btn_room.png' width='95' height='24' alt='部屋' /></a>");
		$("#photo2").html("<a href='javascript: void(0)' onclick='change_photo(2)' class='roll'><img src='../themes/default/search/sakusaku_btn_bath.png' width='95' height='24' alt='風呂' /></a>");

		$("[id^=externals_image]").show();
		$("[id^=room_image]").hide();
		$("[id^=bath_image]").hide();
	} else if(photo == 1) {
		$("#photo0").html("<a href='javascript: void(0)' onclick='change_photo(0)' class='roll'><img src='../themes/default/search/sakusaku_btn_gaikan.png' width='95' height='24' alt='外観' /></a>");
		$("#photo1").html("<img src='../themes/default/search/sakusaku_btn_room_o.png' width='95' height='24' alt='部屋' />");
		$("#photo2").html("<a href='javascript: void(0)' onclick='change_photo(2)' class='roll'><img src='../themes/default/search/sakusaku_btn_bath.png' width='95' height='24' alt='風呂' /></a>");

		$("[id^=externals_image]").hide();
		$("[id^=room_image]").show();
		$("[id^=bath_image]").hide();
	} else if(photo == 2) {
		$("#photo0").html("<a href='javascript: void(0)' onclick='change_photo(0)' class='roll'><img src='../themes/default/search/sakusaku_btn_gaikan.png' width='95' height='24' alt='外観' /></a>");
		$("#photo1").html("<a href='javascript: void(0)' onclick='change_photo(1)' class='roll'><img src='../themes/default/search/sakusaku_btn_room.png' width='95' height='24' alt='部屋' /></a>");
		$("#photo2").html("<img src='../themes/default/search/sakusaku_btn_bath_o.png' width='95' height='24' alt='風呂' />");

		$("[id^=externals_image]").hide();
		$("[id^=room_image]").hide();
		$("[id^=bath_image]").show();
	}
}

function normal_search() {
	$('#outline_flg').val(1);
	$('#search_flg').val(1);
	$('#sakusaku_form').submit();
}


function detail_search() {
	$('#outline_flg').val(0);
	$('#search_flg').val(0);
	$('#sakusaku_form').submit();
}

function change_pos(pos) {
	$('#search_flg').val(0);
	$("#result_block_pos").val(pos);
	$("#sakusaku_form").submit();
}

function change_page_unit(unit) {
	$('#search_flg').val(0);
	$("#result_block_pos").val(0);
	$("#page_unit").val(unit);
	$("#sakusaku_form").submit();
}

function change_order(order) {
	$('#search_flg').val(1);
	$("#order_flg").val(order);
	$("#sakusaku_form").attr("action","#a_search_control");
	$("#sakusaku_form").submit();
}

