var NO_VALUE = -1;	//値なし
ServiceList = GetServiceList();	//サービス配列
ArrServiceCategory = GetServiceCategory();	//サービス配列

pintMarume = 50000;    // まるめる額

//==============================================================================
// 初期表示関数
//==============================================================================
function InitializeScreen(){
	fm = document.form;
	//コンボボックスの選択項目を設定
	SetData2Combo( fm.service_type[0] );
	SetData2Combo( fm.service_type[1] );
	SetData2Combo( fm.service_type[2] );
	SetData2Combo( fm.service_type[3] );
	SetData2Combo( fm.service_type[4] );
}

//==============================================================================
// コンボボックス用配列定義関数
//==============================================================================
function GetServiceList(){
	var ServiceList = new Array();
	i = 0;
	//サービス - サービス種類コード - サービス種類名称
	//
	//サービス:
	//  1 介護サービス・在宅サービス
	//  2 介護サービス・居住介護支援サービス
	//  3 介護サービス・施設サービス
	//  4 介護予防サービス
	//  5 地域密着型サービス
	//  6 特例
	
	//空セル
	ServiceList[i] = new Array( NO_VALUE, NO_VALUE, "" );i++;

	//--------------------------------------
	// 在宅
	//--------------------------------------
	ServiceList[i] = new Array(  1, 11, "訪問介護" );i++;
	ServiceList[i] = new Array(  1, 12, "訪問入浴介護" );i++;
	ServiceList[i] = new Array(  1, 13, "訪問看護" );i++;
	ServiceList[i] = new Array(  1, 14, "訪問リハビリテーション" );i++;
	ServiceList[i] = new Array(  1, 31, "居宅療養管理指導" );i++;
	ServiceList[i] = new Array(  1, 15, "通所介護" );i++;
	ServiceList[i] = new Array(  1, 16, "通所リハビリテーション" );i++;
	ServiceList[i] = new Array(  1, 21, "短期入所生活介護" );i++;
	ServiceList[i] = new Array(  1, 22, "短期入所療養介護(介護老人保健施設)" );i++;
	ServiceList[i] = new Array(  1, 23, "短期入所療養介護(介護療養型医療施設等)" );i++;
	ServiceList[i] = new Array(  1, 33, "特定施設入居者生活介護" );i++;
	ServiceList[i] = new Array(  1, 17, "福祉用具貸与" );i++;

	//--------------------------------------
	// 居宅
	//--------------------------------------
	ServiceList[i] = new Array(  2, 43, "居宅介護支援" );i++;

	//--------------------------------------
	// 施設
	//--------------------------------------
	ServiceList[i] = new Array(  3, 51, "介護福祉施設サービス" );i++;
	ServiceList[i] = new Array(  3, 52, "介護保健施設サービス" );i++;
	ServiceList[i] = new Array(  3, 53, "介護医療施設サービス" );i++;

	//--------------------------------------
	// 予防
	//--------------------------------------
	ServiceList[i] = new Array(  4, 61, "介護予防訪問介護" );i++;
	ServiceList[i] = new Array(  4, 62, "介護予防訪問入浴介護" );i++;
	ServiceList[i] = new Array(  4, 63, "介護予防訪問看護" );i++;
	ServiceList[i] = new Array(  4, 64, "介護予防訪問リハビリテーション" );i++;
	ServiceList[i] = new Array(  4, 34, "介護予防居宅療養管理指導" );i++;
	ServiceList[i] = new Array(  4, 65, "介護予防通所介護" );i++;
	ServiceList[i] = new Array(  4, 66, "介護予防通所リハビリテーション" );i++;
	ServiceList[i] = new Array(  4, 24, "介護予防短期入所生活介護" );i++;
	ServiceList[i] = new Array(  4, 25, "介護予防短期入所療養介護(介護老人保健施設)" );i++;
	ServiceList[i] = new Array(  4, 26, "介護予防短期入所療養介護(介護療養型医療施設等)" );i++;
	ServiceList[i] = new Array(  4, 35, "介護予防特定施設入居者生活介護" );i++;
	ServiceList[i] = new Array(  4, 67, "介護予防福祉用具貸与" );i++;
	ServiceList[i] = new Array(  4, 46, "予防支援" );i++;

	//--------------------------------------
	// 地密
	//--------------------------------------
	ServiceList[i] = new Array(  5, 71, "夜間対応型訪問介護" );i++;
	ServiceList[i] = new Array(  5, 72, "認知症対応型通所介護" );i++;
	ServiceList[i] = new Array(  5, 73, "小規模多機能型居宅介護" );i++;
	ServiceList[i] = new Array(  5, 32, "認知症対応型共同生活介護" );i++;
	ServiceList[i] = new Array(  5, 36, "地域密着型特定施設入居者生活介護" );i++;
	ServiceList[i] = new Array(  5, 54, "地域密着型介護老人福祉施設入所者生活介護" );i++;
	ServiceList[i] = new Array(  5, 74, "介護予防認知症対応型通所介護" );i++;
	ServiceList[i] = new Array(  5, 75, "介護予防小規模多機能型居宅介護" );i++;
	ServiceList[i] = new Array(  5, 37, "介護予防認知症対応型共同生活介護" );i++;

	//--------------------------------------
	// 特例
	//--------------------------------------
	/*
	ServiceList[i] = new Array(  6, 643, "居宅介護支援のみ" );i++;
	ServiceList[i] = new Array(  6, 635, "特定施設入居者生活介護のみ" );i++;
	ServiceList[i] = new Array(  6, 632, "地密認知症共同生活のみ" );i++;
	ServiceList[i] = new Array(  6, 634, "居宅療養管理指導のみ" );i++;
	*/

	//--------------------------------------
	// 特例グループ
	//--------------------------------------
	TokureiGrp = new Array();
	// 居宅療養管理指導グループ
	TokureiGrp[31] = 31;
	TokureiGrp[34] = 31;
	// 共同生活介護グループ
	TokureiGrp[32] = 32;
	TokureiGrp[37] = 32;
	TokureiGrp[38] = 32;
	TokureiGrp[39] = 32;
	TokureiGrp[72] = 32;
	TokureiGrp[74] = 32;
	// 特定施設グループ
	TokureiGrp[33] = 33;
	TokureiGrp[35] = 33;
	TokureiGrp[36] = 33;

	return ServiceList;
}

//--------------------------------------
// サービスをくくる
//--------------------------------------
function GetServiceCategory () {
	var Arr = new Array();
	
	for (var i=1; i<ServiceList.length; i++) {     // 0番目は空セルなので
		Arr[ServiceList[i][1]] = ServiceList[i][0];
	}
	return Arr;
}
//==============================================================================
// コンボボックス用配列定義関数
//==============================================================================
function SetData2Combo( obj ){
	for (i = 0; i < ServiceList.length; i++) {
		obj.options[obj.length] = new Option( ServiceList[i][2], ServiceList[i][1] );
//		obj.options[obj.length] = new Option( ServiceList[i][1]+ServiceList[i][2], ServiceList[i][1] );
	}
}

//==============================================================================
// ご利用料金取得関数
//==============================================================================
function GetRiyoRyokin( value, rate, min, max ){
	var ryokin = Math.round( value * rate );
	if( ryokin > max ) return max;
	if( ryokin < min ) return min;
	
	return ryokin;
}
function CalcRyokin( service_value, kingaku ){
	var ryokin = 0;
	switch( service_value ){
		case 1:	//在宅サービス
			ryokin = GetRiyoRyokin( kingaku, 0.009, 3000, 30000 );
			break;
		case 2:	//居宅サービス
			ryokin = GetRiyoRyokin( kingaku, 0.009, 3000, 20000 );
			break;
		case 3:	//施設サービス
			ryokin = GetRiyoRyokin( kingaku, 0.003, 3000, 60000 );
			break;
		case 4:	//介護予防サービス
			ryokin = GetRiyoRyokin( kingaku, 0.009, 3000, 10000 );
			break;
		case 5:	//地域密着型サービス
			ryokin = GetRiyoRyokin( kingaku, 0.009, 3000, 10000 );
			break;
		case 6:	//居宅介護支援のみ
			ryokin = GetRiyoRyokin( kingaku, 0.009, 3000, 20000 );
			break;
		default:
			ryokin = 0;
			break;
	}
	return ryokin;
}

//==============================================================================
// 基本料金取得関数
//==============================================================================
function GetKihonRyokin(){
	fm = document.form;
	fst = fm.service_type;
	
	kihon_ryokin = 0;
	
	//オブジェクトの数だけ繰り返す
	for( loop2 = 0; loop2 < fst.length; loop2++ ){
		combo_value = fst[loop2][fst[loop2].selectedIndex].value;
		service_value = GetServiceValue( combo_value );
		if( 1 == service_value || 2 == service_value || 3 == service_value || 4 == service_value || 5 == service_value ){
			kihon_ryokin = 7000;
			break;
		}
	}
	
	return kihon_ryokin;
}

//==============================================================================
// サービス値取得関数
//==============================================================================
function GetServiceValue( combo_value ){
	var ret1 = NO_VALUE;
	
	//ServiceListの数だけ繰り返す
	for (loop = 0; loop < ServiceList.length; loop++) {
		//同じ値が見つかったら返値用変数に代入
		if( combo_value == ServiceList[loop][1] ){
			ret1 = ServiceList[loop][0];
			break;
		}
	}
	
	return ret1;
}

//==============================================================================
// 特例取得関数
//==============================================================================
function GetCalcType(){
	fm = document.form;
	fst = fm.service_type;
	
	selected_count = 0;
	last_value = NO_VALUE;
	grp_brk = false;
	last_grp = NO_VALUE;
	
	//オブジェクトの数だけ繰り返す
	for( i = 0; i < fst.length; i++ ){
		//オブジェクトの値を代入
		selected_value = fst[i][fst[i].selectedIndex].value;
		if( NO_VALUE != selected_value ){
			last_value = selected_value;
			selected_count++;
			
			// 特例
			if ( last_grp == NO_VALUE && grp_brk == false && TokureiGrp[selected_value] != undefined ) {
				last_grp = TokureiGrp[selected_value];
			}
			
			// if ( last_grp != NO_VALUE && grp_brk == false) {
			if ( grp_brk == false) {
				if ( last_grp != TokureiGrp[selected_value] ) {
					last_grp = NO_VALUE;
					grp_brk = true;
				}
			}
		}
	}
	if( 1 == selected_count ){
		if( 43 == last_value ){
			return last_value;
		}
		else if (last_grp != NO_VALUE) {
			return last_grp;
		}
	}
	else if (last_grp != NO_VALUE) {
		return last_grp;
	}
	
	return NO_VALUE;
}

//==============================================================================
// サービス取得関数
//==============================================================================
function GetServiceTypes(obj){
	var LastValue = NO_VALUE;
	
	ServiceTypes = Array();	//サービス種別格納用
	buf = Array();
	
	//オブジェクトの数だけ繰り返す
	for( i = 0; i < obj.length; i++ ){
		//オブジェクトの値を代入
		selected_value = obj[i][obj[i].selectedIndex].value;
		//非選択値なら処理しない
		if( NO_VALUE != selected_value ){
			//サービス値を配列に代入
			service_value = GetServiceValue( selected_value );
			if( NO_VALUE != service_value ){
				ServiceTypes[ServiceTypes.length] = service_value;
			}
		}
	}
	//ソートしてから重複値を削除してbufに入れる
	ServiceTypes.sort();	//ソート
	for (i = 0; i < ServiceTypes.length; i++) {
		//前回の値と一緒でない(重複値の削除)ならbufにコピー
		if( LastValue != ServiceTypes[i] ){
			buf[buf.length] = ServiceTypes[i];
			LastValue = ServiceTypes[i];
		}
	}
	
	return buf;
}

//==============================================================================
// サービス取得関数
//==============================================================================
function GetSelectedCount(){
	fm = document.form;
	fst = fm.service_type;
	
	selected_count = 0;
	
	//オブジェクトの数だけ繰り返す
	for( loop3 = 0; loop3 < fst.length; loop3++ ){
		//オブジェクトの値を代入
		selected_value = fst[loop3][fst[loop3].selectedIndex].value;
		//非選択値なら処理しない
		if( NO_VALUE != selected_value ){
			selected_count++;
		}
	}
	
	return selected_count;
}

//==============================================================================
// フォームのお掃除関数
//==============================================================================
function ClearCalcKin(){
	fm = document.form;
	
	//利用料金を消す
	/*
	for( loop4 = 0; loop4 < fm.riyo_kin.length; loop4++ ){
		fm.riyo_kin[loop4].value = "";
	}
	*/
	
	fm.kihon_kin.value = "";		//基本料金
	fm.month_sum1_kin.value = "";	//月額利用料小計
	fm.month_sum2_kin.value = "";	//月額利用料合計
	fm.sanka_kin.value = "";		//参加費
}

//==============================================================================
// フォームクリア関数
//==============================================================================
function ClearAll(){
	fm = document.form;
	
	//クリア
	ClearCalcKin();
	
	//入力欄を消す
	/*
	for( loop5 = 0; loop5 < fm.riyo_kin.length; loop5++ ){
		fm.service_type[loop5].selectedIndex = 0;
		fm.seq_kin[loop5].value = "";
	}
	*/
	for( loop5 = 0; loop5 < fm.seq_kin.length; loop5++ ){
		fm.seq_kin[loop5].value = "";
	}
}

//==============================================================================
// フォーム検査関数
//==============================================================================
function CheckFormKin(){
	fm = document.form;
	fst = fm.service_type;
	
	last_value = NO_VALUE;
	
	//オブジェクトの数だけ繰り返す
	for( i = 0; i < fst.length; i++ ){
		if( NO_VALUE != fst[i][fst[i].selectedIndex].value ){
			//値を数値に強制変更
			temp = stripComma(fm.seq_kin[i].value);
			temp = Math.round( temp-0, 10 );
			fm.seq_kin[i].value = ( isNaN(temp) ? 0 : addComma(temp));
//			fm.seq_kin[i].value = ( isNaN(temp) ? 0 : temp);
		}else{
			fm.seq_kin[i].value = "";
		}
	}
}

//==============================================================================
// 計算関数
//==============================================================================
function CalcAll(){
	fm = document.form;
	fst = fm.service_type;
	
	sum1_kin = 0;
	sum2_kin = 0;
	buf1 = 0;
	
	//クリア
	ClearCalcKin();
	
	//入力値チェック
	CheckFormKin();
	
	//コンボボックスのサービスを取得
	ServiceTypes = GetServiceTypes( fm.service_type );
	
	//計算種別取得
	calc_type = GetCalcType();
//	alert(calc_type);

	sum1_kin = 0;
	if (calc_type == NO_VALUE || 43 == calc_type ) {
	// ===== 通常計算か「43のみ」の場合
		//--------------------------------------
		// コンボボックスの値を取得し、
		// サービス毎にまるめる
		//--------------------------------------
		var Arr = CalcServiceMarume(calc_type);
		
		//--------------------------------------
		// まるめた額に従量計算を加える
		//--------------------------------------
		for (val in Arr) {
			sum1_kin += CalcRyokin(Number(val), Arr[val]);
		}
	}
	else {
	// ===== 特別計算
		if( 31 == calc_type ){
			sum1_kin = 3000;
		}
		else if( 32 == calc_type ){
			sum1_kin = 8000;
		}
		else if( 33 == calc_type ){
			sum1_kin = 8000;
		}
	}
	

	
	//計算した金額を設定
	if( 0 != GetSelectedCount() ){
		if( NO_VALUE == calc_type ){
			kihon_ryokin = GetKihonRyokin();
		}else{
			kihon_ryokin = 0;
		}
		//基本料金を設定
		fm.kihon_kin.value = kihon_ryokin;
		
		//月額利用料小計
		fm.month_sum1_kin.value = sum1_kin;
		
		//月額利用料合計
		fm.month_sum2_kin.value = parseInt( ( parseInt(sum1_kin) + parseInt(kihon_ryokin) ) * 1.05 );
		
		//参加費を設定
		fm.sanka_kin.value = 50000 * 1.05;
	}
	
	addCommaForm(fm);
}

//==============================================================================
// Enterキーでフォーカスの切り替え
//==============================================================================
function nextForm(frm,obj) {
	fm = document.form;
	frk = fm.seq_kin;
	if(13 == event.keyCode){
		if( obj == frk[frk.length-1] ){
			frk[0].focus();
			CalcAll();
		}else{
			for( i = 0; i < frk.length; i++ ){
				if( obj == frk[i] ){
					frk[i+1].focus();
				}
			}
		}
	}
}

//==============================================================================
// カンマ区切り関数
//==============================================================================
function addComma(val_3) {
	var val_2 = "" + val_3;
	var val_1 = val_2.indexOf(".");
	var i;
	
	if( val_1 < 0 ){
		val_1 = val_2.length;
	}
	var da = val_2.substring( val_1, val_2.length );
	for( i = 0; i < val_1; i++ ){
		var ti = val_2.substring( val_1 - 1 - i, val_1 - 0 - i );
		if (ti < "0" || ti > "9") {
			da = val_2.substring(0, val_1 - i) + da;
			break;
		}
		if (i > 0 && i % 3 == 0) {
		    da = "," + da;
		}
		da = ti + da;
	}
	return da;
}

//==============================================================================
// フォーム内カンマ区切り削除関数
//==============================================================================
function addCommaForm(obj){
	fm = document.form;
	/*
	frk = fm.riyo_kin;
	for( i = 0; i < frk.length; i++ ){
		frk[i].value = addComma( frk[i].value );
	}
	*/
	obj.kihon_kin.value      = addComma( obj.kihon_kin.value );			//基本料金
	obj.month_sum1_kin.value = addComma( obj.month_sum1_kin.value );	//月額利用料小計
	obj.month_sum2_kin.value = addComma( obj.month_sum2_kin.value );	//月額利用料合計
	obj.sanka_kin.value      = addComma( obj.sanka_kin.value );	//参加費
}
//==============================================================================
// フォーム内カンマ区切り追加関数
//==============================================================================
function removeCommaForm(obj){
	fm = document.form;
	/*
	frk = fm.riyo_kin;
	for( i = 0; i < frk.length; i++ ){
		frk[i].value = frk[i].value.replace("\,","");
	}
	*/
	obj.kihon_kin.value      = obj.kihon_kin.value.replace("\,","");		//基本料金
	obj.month_sum1_kin.value = obj.month_sum1_kin.value.replace("\,","");	//月額利用料小計
	obj.month_sum2_kin.value = obj.month_sum2_kin.value.replace("\,","");	//月額利用料合計
	obj.sanka_kin.value      = obj.sanka_kin.value.replace("\,","");		//参加費
}

//まるめ関数
function CalcServiceMarume (_calc_type) {

	var i;
	var ArrRtn = new Array();
	var fm = document.form;
	var _Arr = fst = fm.service_type;

	// 入力値取得
	for( i = 0; i < _Arr.length; i++ ){
		combo_value = _Arr[i][_Arr[i].selectedIndex].value;
		if( NO_VALUE != combo_value ) {
			if (_calc_type != 43) {
				if (ArrRtn[ArrServiceCategory[Number(combo_value)]] == undefined) {
					ArrRtn[ArrServiceCategory[Number(combo_value)]] = 0;
				}
				ArrRtn[ArrServiceCategory[Number(combo_value)]] += Number(stripComma(fm.seq_kin[i].value));
			}
			else {
				ArrRtn[6] = Number(stripComma(fm.seq_kin[i].value));
			}
		}
	}
	
	// まるめる
	for (val in ArrRtn) {
		if (ArrRtn[val] != NO_VALUE) {
			ArrRtn[val] = CalcMarume(ArrRtn[val], pintMarume);
		}
	}
	
	return ArrRtn;
}



// まるめ関数
function CalcMarume (_intVal, _intMarume) {

	// 数値判別
	intVal = Number(_intVal);
	if (isNaN(intVal)) {
		return false;
	}
	// まるめ以下判別
	if (intVal < _intMarume) {
		return _intMarume;
	}
	// 処理
	intVal = intVal / _intMarume;
	intVal = Math.floor(intVal);
	intVal = intVal * _intMarume;
	return intVal;
}


function stripComma (_val) {
	while (_val.indexOf("\,") != NO_VALUE) {
		_val = _val.replace("\,", "");
	}
	return _val;
}


