// Ver.1.19990616 Y.Nakahara
// Ver.1.19990617 Y.Nakahara
// Ver.1.19990618 Y.Nakahara
// Ver.1.19990622 Y.Nakahara
// Ver.1.19990626 Y.Nakahara
// Ver.1.20000711 Y.Nakahara(全面改訂)
// Ver.2.20010520 Y.Nakahara(判定基準を最新版に変更)
// Ver.2.20010535 Y.Nakahara(アドバイス不具合修正)
// Ver.2.20040622 Y.Nakahara(コメントの整理と四捨五入機能追加)

var ENERGY_PER_KG	= "7000";	//	脂肪1kg当たりのエネルギー係数(概算用)
var judgeBmi		= "";		//	Bmiによる判定
var judgeRate		= "";		//	肥満度による判定
var height			= 0;		//	身長(cm)
var weight			= 0;		//	体重(kg)
var sex				= "";		//	性別
var bmi				= 0;		//	Body Mass Index
var bmiLevel		= 0;		//	BMIの状態
var idealBmi		= 0;		//	最適なBMI
var standardWeight	= 0;		//	標準体重
var obesityRate		= 0;		//	肥満度
var obesityLevel	= 0;		//	肥満度の状態

var losingWeight	= -1;		//	減量目標値
var losingEnergy	= -1;		//	減量目標エネルギー

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

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

	//	肥満度計算
	checkObesity();

	//	評価の表示
	showEvaluation(form);
}


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

	//	フォーム値の獲得
	height	= form.textHeight.value;	//	身長の取得
	sex		= form.hiddenSex.value;		//	性別の取得
	weight	= form.textWeight.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;
	}

	//	体重(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;
	}
	return true;
}

/* 性別リセット */
function resetSex(form){
//	form.obesity.hiddenSex.value="1";
}

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

/* 肥満度の算出 */ 
function checkObesity(){

	var heightMeter = 0;	//	身長(m)

	//	念のため数値化
	height	= eval(height);
	weight	= eval(weight);

	//	身長(cm) → 身長(m)
    heightMeter = height / 100;

	//	現在のBMI
	bmi = weight / heightMeter / heightMeter;

	//	性別ごとの最適なBMI
    if(sex == "1"){
		idealBmi = 22;
	} else{
		idealBmi = 21;
	}

	//	標準体重(kg)
	standardWeight = heightMeter * heightMeter * idealBmi;

	//	肥満度(％)
	obesityRate = ( weight - standardWeight ) / standardWeight * 100;

	//	標準体重までに必要な減量値kg
	losingWeight = weight - standardWeight;

	//	標準体重までに必要な減量エネルギー値kcal
	losingEnergy = losingWeight * ENERGY_PER_KG;

	//	BMIによる判定
	/* 
	if ( bmi < 19.8 ) {
		judgeBmi = "やせ";
	} else if(bmi >= 19.8 && bmi < 24.2){
		judgeBmi = "標準";
	} else if(bmi >= 24.2 && bmi < 26.4){
		judgeBmi = "過体重";
	} else{
		judgeBmi = "肥満";
	}
	*/

	if ( bmi < 18.5 ) {
		bmiLevel = 1;
		judgeBmi = "やせ";
	} else if(bmi >= 18.5 && bmi < 25){
		bmiLevel = 2;
		judgeBmi = "標準";
	} else if(bmi >= 25 && bmi < 30){
		bmiLevel = 3;
		judgeBmi = "肥満(1度)";
	} else if(bmi >= 30 && bmi < 35){
		bmiLevel = 4;
		judgeBmi = "肥満(2度)";
	} else if(bmi >= 35 && bmi < 40){ 
		bmiLevel = 5;
		judgeBmi = "肥満(3度)";
	} else if(bmi >= 40){
		bmiLevel = 6;
		judgeBmi = "肥満(4度)";
	}

	//	肥満度による判定
	/*
	if(obesityRate < eval(-10)){
		judgeRate = "やせ";
	} else if(obesityRate >= eval(-10) && obesityRate < 10){
		judgeRate = "標準";
	} else if(obesityRate >= 10 && obesityRate < 20){
		judgeRate = "過体重";
	} else{
		judgeRate = "肥満";
	}
	*/

	if(obesityRate < eval(-15)){
		obesityLevel = 1;
		judgeRate = "やせ";
	} else if(obesityRate >= eval(-15) && obesityRate < 15){
		obesityLevel = 2;
		judgeRate = "標準";
	} else if(obesityRate >= 15){
		obesityLevel = 3;
		judgeRate = "肥満";
	}
}

/* 評価の表示 */
function showEvaluation(form){

//	form.textBmi.value    = bmi;
	form.textBmi.value    = Math.round(bmi * 10) / 10;
//	form.textIdealBmi.value   = idealBmi;
	form.textIdealBmi.value   = Math.round(idealBmi * 10) / 10;
//	form.textStandardWeight.value  = standardWeight;
	form.textStandardWeight.value  = Math.round(standardWeight * 10) / 10;
//	form.textObesityRate.value  = obesityRate;
	form.textObesityRate.value  = Math.round(obesityRate * 10) / 10;
	form.textJudgeBmi.value   = judgeBmi;
	form.textObesityJudgeRate.value = judgeRate;

	if(losingWeight > 0){
//		form.textLosingWeight.value = losingWeight;
		form.textLosingWeight.value = Math.round(losingWeight * 10) / 10;
	} else{
		losingWeight = 0;
		form.textLosingWeight.value = 0;
	}

	if(losingEnergy > 0){
//		form.textLosingEnergy.value = losingEnergy;
		form.textLosingEnergy.value = Math.round(losingEnergy * 10) / 10;
	} else{
		losingEnergy = 0;
		form.textLosingEnergy.value = 0;
	}
}

/* ウィンドウへのメッセージの書き出し */
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){

	var comments	= "";		//	コメント
	var title		= "";		//	言葉
	if(division == 1){
		title = "あなたのBMI";
		comments = "現在のあなたのBMI(BODY MASS INDEX:ボディ マス インデックス)を示しています。現在は、肥満判定において標準的に使われている指標で、体重を身長の2乗で割ることにより求められます。<br>BMI = 体重(kg) / 身長(m)<sup>2</sup><br>もちろん、身長と体重だけしか考慮していないため、必ずしも肥満の状態を反映しない場合もあることに留意してください。";
	} else if(division == 2){
		title = "標準的なBMI";
		comments = "統計的に疾病が少ないとされるBMIの値がを基準にしているとされます。通常22ですが、このページでは女性に対して21を設定しています。";
	} else if(division == 3){
		title = "標準体重";
		comments = "ここでは、上の標準的なBMIを基準にして標準体重を算出しています。<br>標準体重 = 身長(m)<sup>2</sup> * 22 <br> or <br> 標準体重 = 身長(m)<sup>2</sup> * 21 ";
	} else if(division == 4){
		title = "あなたの肥満度";
		comments = "あなたの体重が標準体重に対して何%上回っているかを判定しています。<br>肥満度 = ( 実際体重 - 標準体重 ) / 標準体重 * 100";
	} else if(division == 5){
		if ( bmiLevel == 1 ){
			title = "判定：やせ … BMIが18.5未満";
			comments = "現在やせる必要はありません。体調に不安がある場合は医師に相談してみましょう。";
		} else if(bmiLevel == 2){
			title = "判定：標準 … BMIが18.5以上25未満";
			comments = "あなたの体重は現在標準の範囲にあります。¥n基本的に減量をする必要はありません。¥n何らかの事情で減量を行っている人は、BMIが18.5を下回ることがないよう、注意してください。";
		} else if(bmiLevel == 3){
			title = "判定：肥満(1度) … BMIが25以上30未満";
			comments = "通常は、減量する必要があります。ただし、筋肉が発達している場合など、必ずしも不都合があるとは限りません。";
		} else if(bmiLevel == 4){
			title = "判定：肥満(2度) … BMIが30以上35未満";
			comments = "減量をする必要があると考えられます。¥n";
			comments += "減量を試みる場合、必ず医師に相談なさってください。";
		} else if(bmiLevel == 5){
			title = "判定：肥満(3度) … BMIが35以上40未満";
			comments = "減量をする必要があると考えられます。¥n";
			comments += "減量を試みる場合、必ず医師に相談なさってください。";
		} else if(bmiLevel == 6){
			title = "判定：肥満(4度) … BMI40以上";
			comments = "減量をする必要があると考えられます。¥n";
			comments += "減量を試みる場合、必ず医師に相談なさってください。";
		} else{
			title = "Error";
			comments = "計算ボタンを押してから、判定結果をごらんください";
		}
	} else if(division == 6){
		if(obesityLevel == 1){
			title = "判定：やせ(肥満度が-15％未満)";
			comments = "あなたは現在やせる必要はありません。体調に不安がある場合は医師に相談してみましょう。";
		} else if(obesityLevel == 2){
			title = "判定：標準(肥満度が-15％以上15％未満)";
			comments = "あなたの体重は現在標準の範囲にあります。¥n";
			comments += "基本的にやせる必要はありませんが、何らかの事情で減量を行われる場合、肥満度が-15％を割らないよう、注意しましょう。";
		}
		/*
		else if(cont == "過体重"){
			title = "判定：過体重(肥満度が10％以上20％未満)";
			comments = "あなたの体重は標準に対して少しオーバーしています。ただし、筋肉が発達している場合など、必ずしも不都合があるとは限りません。";
			smallAdvice( title, comments );
		}
		*/
		else if(obesityLevel == 3){
			title = "判定：肥満(肥満度が15％以上)";
			comments = "あなたは肥満の可能性が高いといえます。ただし、筋肉が極めて発達しているようなケースでは、必ずしも不都合があるとは限りません。";
		} else{
			title = "Error";
			comments = "計算ボタンを押してから、判定結果をごらんください";
		}
	} else if(division == 7){
		title = "標準体重に達するまでに必要な減量値(kg)";
		comments = "ここには、あなたが標準体重に達するまでに、あとどれだけ体重を落とせばよいのかを表示しています。";
		if(losingWeight == 0){
			comments +="¥nあなたは現在、標準体重以下ですので、減量の必要はないといえます。";
		}
	} else if(division == 8){
		title = "標準体重に達するまでに消費しなければならないエネルギー値(kcal)";
		comments = "ここには、あなたが標準体重に達するまでに、あとどれだけのエネルギーを消費しなければならないかを示しています。¥n";
		if(losingWeight == 0){
			comments +="¥nあなたは現在、標準体重以下ですので、減量の必要はないといえます。";
		} else if(losingWeight > 0) {
			comments +="単位(kg)当たりの体脂肪のエネルギーには個人差があり(体脂肪組織は脂肪と同時に水分も含んでいるためです)、研究者によりまちまちに報告されていますが、ここでは7000kcal/kgと仮定して計算しています。¥n";
		}
	}
	smallAdvice( title, comments );
}

/* データのリセット */
function	resetData(form){
	form.hiddenSex.value = 2;
	judgeBmi		= "";		//	Bmiによる判定
	judgeRate		= "";		//	肥満度による判定
	height			= 0;		//	身長(cm)
	weight			= 0;		//	体重(kg)
	sex				= "";		//	性別
	bmi				= 0;		//	Body Mass Index
	bmiLevel		= 0;		//	BMIの状態
	idealBmi		= 0;		//	最適なBMI
	standardWeight	= 0;		//	標準体重
	obesityRate		= 0;		//	肥満度
	obesityLevel	= 0;		//	肥満度の状態
	losingWeight	= -1;		//	減量目標値
	losingEnergy	= -1;		//	減量目標エネルギー
}
