// Ver.1.20000716 Y.Nakahara
// Ver.1.20040622 Y.Nakahara(値の四捨五入など)

/* 定数宣言(フィッシャーとコンリーの定数) */
//	HIPの定数
var H75TO77		= 33.48;
var H78TO79		= 34.87;
var H80TO82		= 36.27;
var H83TO84		= 37.67;
var H85TO87		= 39.06;
var H88TO90		= 40.46;
var H91TO92		= 41.86;
var H93TO95		= 43.25;
var H96TO97		= 44.65;
var H98TO100	= 46.05;
var H101TO102	= 47.44;
var H103TO105	= 48.84;
var H106TO108	= 50.24;
var H109TO110	= 51.64;
var H111TO112	= 53.03;
var H113TO115	= 54.43;
var H116TO117	= 55.83;
var H118TO120	= 57.22;
var H121TO123	= 58.62;
var H124TO125	= 60.02;

//	WAISTの定数
var W50TO51		= 14.22;
var W52TO54		= 14.93;
var W55TO57		= 15.64;
var W58TO59		= 16.35;
var W60TO62		= 17.06;
var W63TO64		= 17.78;
var W65TO67		= 18.49;
var W68TO69		= 19.20;
var W70TO72		= 19.91;
var W73TO74		= 20.62;
var W75TO77		= 21.33;
var W78TO79		= 22.04;
var W80TO82		= 22.75;
var W83TO84		= 23.46;
var W85TO87		= 24.18;
var W88TO90		= 24.89;
var W91TO92		= 25.60;
var W93TO95		= 26.31;
var W96TO97		= 27.02;
var W98TO100	= 27.73;

//	身長の定数
var H146TO149	= 35.35;
var H150TO151	= 35.96;
var H152TO153	= 36.57;
var H154TO156	= 37.18;
var H157TO158	= 37.79;
var H159TO161	= 38.40;
var H162TO163	= 39.01;
var H164TO166	= 39.62;
var H167TO168	= 40.23;
var H169TO170	= 40.84;
var H171TO173	= 41.45;
var H174TO175	= 42.06;

//	体脂肪率評価のための定数
var NORMAL_FROM = 20;
var NORMAL_TO	= 25;
var HIMAN		= 30;
var height		= 0;		//	身長
var weight		= 0;		//	体重
var waist		= 0;		//	ウエスト
var hip			= 0;		//	ヒップ

/* メイン */
function percentFatCalculator(form){

	var constHeight = 0;
	var constWaist	= 0;
	var constHip	= 0;
	var percentFat	= 0;
	var evaluation	= "";

	//	フォーム値解析処理
	if(analyzeFormValue(form) == false){
		return;
	}

	//	身長の定数獲得
	constHeight = getHeight(height);
	constWaist	= getWaist(waist);
	constHip	= getHip(hip);

	//	体脂肪率を求める計算式
	percentFat = calculatePercentFat(constHeight,constWaist,constHip);
	percentFat = Math.round(percentFat * 10) / 10;

	//	脂肪重量を求める計算式
	fatWeight = getFatWeight(weight,percentFat);
	fatWeight = Math.round(fatWeight * 10) / 10;

	//	除脂肪体重を求める計算式
	leanBodyMass = getLeanBodyMass(weight,fatWeight);

	//	体脂肪率を評価する
	evaluation	= evaluatePercentFat(percentFat);

	//	画面表示
	form.textPercentFat.value	= percentFat;
	form.textFatWeight.value	= fatWeight;
	form.textLeanBodyMass.value	= leanBodyMass;
	form.textEvaluation.value	= evaluation;

}

/* フォーム値解析処理 */
function analyzeFormValue(form){

	//	フォーム値の獲得
	height	= form.textHeight.value;	//	身長の取得
	weight	= form.textWeight.value;	//	体重の取得
	waist	= form.textWaist.value;		//	ウエストの取得
	hip		= form.textHip.value;		//	ヒップの取得

	//	身長(cm)入力チェック
	if(height == ""){
		alert("身長(cm)を入力してください");
		form.textHeight.focus();
		return false;
	} else if(checkNumeric(height) == false){ 
		alert("身長(cm)の値に問題があります");
		form.textHeight.focus();
		form.textHeight.select();
		return false;
	} else if(height < 146 || 175 < height){
		alert("身長に入力できる値は146-175の範囲になります");
		form.textHeight.focus();
		form.textHeight.select();
		return false;
	}

	//	体重(kg)入力チェック
	if(weight == ""){
		alert("体重(kg)を入力してください");
		form.textWeight.focus();
		return false;
	} else if(checkNumeric(weight) == false){
		alert("体重(kg)の値に問題があります");
		form.textWeight.focus();
		form.textWeight.select();
		return false;
	}

	//	ウエスト(cm)の入力チェック
	if(waist == ""){
		alert("ウエスト(cm)を入力してください");
		form.textWaist.focus();
		return false;
	} else if(checkNumeric(waist) == false){
		alert("ウエスト(cm)の値に問題があります");
		form.textWaist.focus();
		form.textWaist.select();
		return false;
	} else if(waist < 50 || 100 < waist){
		alert("ウエストに入力できる値は50-100の範囲になります");
		form.textWaist.focus();
		form.textWaist.select();
		return false;
	}

	//	ヒップ(cm)の入力チェック
	if(hip == ""){
		alert("ヒップ(cm)を入力してください");
		form.textHip.focus();
		return false;
	} else if(checkNumeric(hip) == false){
		alert("ヒップ(cm)の値に問題があります");
		form.textHip.focus();
		form.textHip.select();
		return false;
	} else if(hip < 75 || 125 < hip){
		alert("ヒップに入力できる値は75-125の範囲になります");
		form.textHip.focus();
		form.textHip.select();
		return false;
	}

	/*  
	//	年齢の入力チェック
	if(age == ""){
		alert("年齢を入力してください");
		form.textHip.focus();
		return false;
	} else if(checkNumericAge(age) == false){
		alert("年齢に数字以外は入力できません");
		form.textHip.focus();
		form.textHip.select();
		return false;
	} else if(age < 6){
		alert("ヒップに入力できる値は75-125の範囲になります");
		form.textHip.focus();
		form.textHip.select();
		return false;
	}
	*/
	return true;
}

/* 身長の定数を求める */
function getHeight(height){
	if(146 <= height && height <= 149){
		return H146TO149;
	}
	if(150 <= height && height <= 151){
		return H150TO151;
	}
	if(152 <= height && height <= 153){
		return H152TO153;
	}
	if(154 <= height && height <= 156){
		return H154TO156;
	}
	if(157 <= height && height <= 158){
		return H157TO158;
	}
	if(159 <= height && height <= 161){
		return H159TO161;
	}
	if(162 <= height && height <= 163){
		return H162TO163;
	}
	if(164 <= height && height <= 166){
		return H164TO166;
	}
	if(167 <= height && height <= 168){
		return H167TO168;
	}
	if(169 <= height && height <= 170){
		return H169TO170;
	}
	if(171 <= height && height <= 173){
		return H171TO173;
	}
	if(174 <= height && height <= 175){
		return H174TO175;
	}
}

/*
	ウエストの定数を求める
*/
function getWaist(waist){
	if(50 <= waist && waist <= 51){
		return W50TO51;
	}
	if(52 <= waist && waist <= 54){
		return W52TO54;
	}
	if(55 <= waist && waist <= 57){
		return W55TO57;
	}
	if(58 <= waist && waist <= 59){
		return W58TO59;
	}
	if(60 <= waist && waist <= 62){
		return W60TO62;
	}
	if(63 <= waist && waist <= 64){
		return W63TO64;
	}
	if(65 <= waist && waist <= 67){
		return W65TO67;
	}
	if(68 <= waist && waist <= 69){
		return W68TO69;
	}
	if(70 <= waist && waist <= 72){
		return W70TO72;
	}
	if(73 <= waist && waist <= 74){
		return W73TO74;
	}
	if(75 <= waist && waist <= 77){
		return W75TO77;
	}
	if(78 <= waist && waist <= 79){
		return W78TO79;
	}
	if(80 <= waist && waist <= 82){
		return W80TO82;
	}
	if(83 <= waist && waist <= 84){
		return W83TO84;
	}
	if(85 <= waist && waist <= 87){
		return W85TO87;
	}
	if(88 <= waist && waist <= 90){
		return W88TO90;
	}
	if(91 <= waist && waist <= 92){
		return W91TO92;
	}
	if(93 <= waist && waist <= 95){
		return W93TO95;
	}
	if(96 <= waist && waist <= 97){
		return W96TO97;
	}
	if(98 <= waist && waist <= 100){
		return W98TO100;
	}
}

/* ヒップの定数を求める */
function getHip(hip){
	if(75 <= hip && hip <= 77){
		return H75TO77;
	}
	if(78 <= hip && hip <= 79){
		return H78TO79;
	}
	if(80 <= hip && hip <= 82){
		return H80TO82;
	}
	if(83 <= hip && hip <= 84){
		return H83TO84;
	}
	if(85 <= hip && hip <= 87){
		return H85TO87;
	}
	if(88 <= hip && hip <= 90){
		return H88TO90;
	}
	if(91 <= hip && hip <= 92){
		return H91TO92;
	}
	if(93 <= hip && hip <= 95){
		return H93TO95;
	}
	if(96 <= hip && hip <= 97){
		return H96TO97;
	}
	if(98 <= hip && hip <= 100){
		return H98TO100;
	}
	if(101 <= hip && hip <= 102){
		return H101TO102;
	}
	if(103 <= hip && hip <= 105){
		return H103TO105;
	}
	if(106 <= hip && hip <= 108){
		return H106TO108;
	}
	if(109 <= hip && hip <= 110){
		return H109TO110;
	}
	if(111 <= hip && hip <= 112){
		return H111TO112;
	}
	if(113 <= hip && hip <= 115){
		return H113TO115;
	}
	if(116 <= hip && hip <= 117){
		return H116TO117;
	}
	if(118 <= hip && hip <= 120){
		return H118TO120;
	}
	if(121 <= hip && hip <= 123){
		return H121TO123;
	}
	if(124 <= hip && hip <= 125){
		return H124TO125;
	}

}

/* 体脂肪率を求める */
function calculatePercentFat(height,waist,hip){
	var calculated = hip + waist - height;
	return calculated;
}

/* 脂肪重量を求める */
function getFatWeight(weight,percentFat){
	var calculated = weight * percentFat / 100;
	return calculated;
}

/* 除脂肪体重を求める */
function getLeanBodyMass(weight,fatWeight){
	var calculated = weight - fatWeight;
	return calculated;
}

/* 体脂肪率を評価する */
function evaluatePercentFat(percentFat, age){
	if(percentFat < NORMAL_FROM){
		return "やせ";
	} else if(NORMAL_FROM <= percentFat && percentFat <= NORMAL_TO){
		return "正常範囲";
	} else if(NORMAL_TO < percentFat && percentFat < HIMAN){
		return "境界域(正常範囲と肥満の狭間)";
	} else if(HIMAN <= percentFat){
		return "肥満";
	}
}

/* 数値チェック */
function checkNumeric(numeric){
	var numericTable = "1234567890.";
	var dotCount = 0;
	for(i=0;i<numeric.length;i++){
		if(numeric.substring(i,i+1) == "."){
			dotCount++;
			if(2 <= dotCount){
				return false;
			}
		}
		if(numericTable.indexOf(numeric.substring(i,i+1))==-1){
			return false;
		}
	}
	return true;
}

/* 数値チェック(年齢) */
function checkNumericAge(numeric){
	var numericTable = "1234567890";
	for(i=0;i<numeric.length;i++){
		if(numericTable.indexOf(numeric.substring(i,i+1))==-1){
			return false;
		}
	}
	return true;
}

/* ウィンドウへのメッセージの書き出し */
function hw(htmlDocument){
    hwin.document.write(htmlDocument);
}

/* 小ウィンドウの表示とメッセージの作成 */ 
function smallAdvice(title, comments){
	hwin=window.open("","","status=0,menubar=0,width=350,height=350");
	hw("<HTML><HEAD><title>解 説</title></HEAD><BODY>");
	hw("<h3>");
	hw( title );
	hw("</h3>");
	hw("<SPAN STYLE='font-size: 11pt; line-height: 22px'><font color='#000080'>");
	hw( comments );
	hw("</font></span>");
	hw("<FORM><DIV ALIGN='center'>");
	hw("<INPUT TYPE='button' VALUE='閉じる' onClick='window.close();'>");
	hw("</DIV></FORM>");
	hw("</BODY></HTML>");
}

/* アドバイス作成(2大ブラウザの3以上に対応) */ 
function makeAdvice(division, cont){
	if(cont == null || cont == ""){
		alert("まずは体脂肪率計算を行ってみましょう。");
		return;
	}
	var comments	= "";		//	コメント
	var title		= "";		//	言葉

	if(division == 1){
		title = "体脂肪率(％)について";
		comments = "体脂肪率(％)とは、あなたの体重(kg)に占める、あなたの体脂肪の重さ(kg)の割合を表す数値です。";
		smallAdvice(title, comments);
	} else if(division == 2){
		title = "あなたの脂肪重量(kg)";
		comments = "体脂肪率(％)によってあなたの体内の脂肪重量(kg)を推定したものです。現在";
		comments += cont;
		comments += "kgの体脂肪があなたの体内に存在すると推定されます。";
		smallAdvice(title, comments);
	} else if(division == 3){
		title = "あなたの除脂肪体重(kg)";
		comments = "あなたの体重(kg)から脂肪重量(kg)を引いた値でLBMと略して呼ばれることが多いようです。体脂肪以外の組織、例えば、筋肉や骨、血液などの総重量を指します。<BR>";
		comments += "この中で特に筋肉は代謝量の大きい組織ですので、筋力トレーニングなどで筋肉を発達させるとエネルギー消費量を大きくできます。つまり、体脂肪を効率的に落とすためには、筋力トレーニングは有効な手段であるといえるでしょう。";
		smallAdvice( title, comments );
	} else if(division == 4){
		title = "評価について";
		comments = "平成6年度以降に、一般的に使われている判定基準を参考にしました。<BR>";
		comments += "<ul><li>20％未満は痩せ</li><li>20-25％は正常</li><li>25％より大きく30％未満は境界域</li><li>30％以上は肥満</li></ul>";
		smallAdvice( title, comments );
	} else if(division == 5){
		if ( cont == "やせ" ){
			title = "判定：やせ(BMIが19.8未満)";
			comments = "現在やせる必要はありません。体調に不安がある場合は医師に相談してみましょう。";
			smallAdvice( title, comments );
		} else if(cont == "標準"){
			title = "判定：標準(BMIが19.8以上24.2未満)";
			comments = "あなたの体重は現在標準の範囲にあります。";
			smallAdvice( title, comments );
		} else if(cont == "過体重"){
			title = "判定：過体重(BMIが24.2以上26.4未満)";
			comments = "あなたの体重は標準に対して少しオーバーしています。ただし、筋肉が発達している場合など、必ずしも不都合があるとは限りません。";
			smallAdvice( title, comments );
		} else if(cont == "肥満"){
			title = "判定：肥満(BMIが26.4以上)";
			comments = "あなたは肥満の可能性が高いといえます。ただし、筋肉が極めて発達しているようなケースでは、必ずしも不都合があるとは限りません。";
			smallAdvice( title, comments );
		}
	} else if(division == 6){
		if(cont == "やせ"){
			title = "判定：やせ(肥満度が-10％未満)";
			comments = "あなたは現在やせる必要はありません。体調に不安がある場合は医師に相談してみましょう。";
			smallAdvice( title, comments );
		} else if(cont == "標準"){
			title = "判定：標準(肥満度が-10％以上10％未満)";
			comments = "あなたの体重は現在標準の範囲にあります。";
			smallAdvice( title, comments );
		} else if(cont == "過体重"){
			title = "判定：過体重(肥満度が10％以上20％未満)";
			comments = "あなたの体重は標準に対して少しオーバーしています。ただし、筋肉が発達している場合など、必ずしも不都合があるとは限りません。";
			smallAdvice( title, comments );
		} else if(cont == "肥満"){
			title = "判定：肥満(肥満度が20％以上)";
			comments = "あなたは肥満の可能性が高いといえます。ただし、筋肉が極めて発達しているようなケースでは、必ずしも不都合があるとは限りません。";
			smallAdvice( title, comments );
		}
	}
}

