//******************************************************************************
//**** 雀の往来：文字コードを指定して保存


function strlen(x_str) {
	var x_str_byte = 0;
	var ll = 0;
	for (ll=0; ll<x_str.length; ll++) {
		if (x_str.charCodeAt(ll) > 255) {
			x_str_byte++;
		}
		x_str_byte++;
	}
	return x_str_byte;
}


function str_byte_pad(str, maxbyte) {
	var x_str = "";
	var vv = 0;
	for (vv=0; vv<str.length; vv++) {
		x_str += str.charAt(vv);
		if (strlen(x_str) > maxbyte) {
			if (strlen(str) > strlen(x_str)) {
				x_str += "...";
			}
			break;
		}
	}
	return x_str;
}


function intval(val) {
	var num = val;
	if (isNaN(num)) {
		num = 0;
	}
	return parseInt(num, 10);
}


function getwday(m, d, y) {
	var mm = parseInt(m, 10);
	var dd = parseInt(d, 10);
	var yy = parseInt(y, 10);
	if (mm == 1 || mm == 2) {
		yy--;
		mm += 12;
	}
	wday = parseInt(yy + (yy >> 2) - parseInt(yy / 100, 10) + parseInt(yy / 400, 10) + parseInt((13 * mm + 8) / 5, 10) + dd, 10) % 7;
	return wday;
}


function monthday(p_year, p_month) {
	// 引数が2つある場合、1つ目の引数は「年」、2つ目は「月」。
	// 引数が1つの場合、引数は「月」。
	var yy = parseInt(p_year, 10);
	var mm = parseInt(p_month, 10);
	var dd = 31;
	if (mm == 2) {
		dd = leapYear(yy);
	} else if (mm == 4 || mm == 6 || mm == 9 || mm == 11) {
		dd = 30;
	}
	return dd;
}


function leapYear(year) {
	// うるう年なら29を、そうでなければ28を返す
	var dd = 28;
	if ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0)) {
		dd++;
	}
	return dd;
}


function DateAdd(mm, dd, yy, df) {

	//**** 入力された日付に日数を加減算した日付を取得
	//**** diff には日数を格納

	var p_diff  = parseInt(df, 10);
	var p_year  = parseInt(yy, 10);
	var p_month = parseInt(mm, 10);
	var p_day   = parseInt(dd, 10);

	//**** 入力された日付のエポックからの秒数を取得。時間は正午。
	var dd = new Date();
	dd.setFullYear(p_year);
	dd.setMonth(p_month - 1);
	dd.setDate(p_day);

	//**** 日付を加算（1日は86400000ミリ秒）
	dd.setTime(dd.getTime() + p_diff * 86400000);

	p_month = dd.getMonth() + 1;
	p_day   = dd.getDate();
	p_year  = dd.getFullYear();

	return [p_month, p_day, p_year];

}


function getSpringHoliday(gsh_year) {
	//**** 春分の日の計算。1980年から2099年まで有効。
	var gsh = 20;
	if (2099 >= gsh_year && gsh_year >= 1980) {
		gsh = parseInt(20.8341 + 0.242194 * (gsh_year - 1980) - ((gsh_year - 1980) >> 2), 10);
	} else if ((gsh_year % 4 == 0) && (gsh_year % 100 != 0) || (gsh_year % 400 == 0)) {
		gsh++;
	}
	return gsh;
}


function getAutumnHoliday(gah_year) {
	//**** 秋分の日の計算。1980年から2099年まで有効。
	var gah = 22;
	if (2099 >= gah_year && gah_year >= 1980) {
		gah = parseInt(23.2488 + 0.242194 * (gah_year - 1980) - ((gah_year - 1980) >> 2), 10);
	} else if ((gah_year % 4 == 0) && (gah_year % 100 != 0) || (gah_year % 400 == 0)) {
		gah++;
	}
	return gah;
}


function getHoliday(x_month, x_day, x_year) {

	//**** 渡された日付が休日かどうかを判別する。
	//**** 休日かそうでないかによって、対応するstyle値を変更する。

	//**************************************************************************
	//**** 引数を数値に変換

	var p_month = parseInt(x_month, 10);	//**** 引数1（月）
	var p_day   = parseInt(x_day, 10);		//**** 引数2（日）
	var p_year  = parseInt(x_year, 10);		//**** 引数3（年）

	//**************************************************************************
	//**** 基本のstyle指定（この値は他の変数によって上書きされる）

	var bgstyle   = 0;
	var tomorrow  = 0;
	var yesterday = 0;

	//**************************************************************************
	//**** 昨日と今日の日付を取得

	//**** 昨日は何月何日か
	var prev_date  = DateAdd(p_month, p_day, p_year, -1);

	//**** 明日は何月何日か
	var next_date  = DateAdd(p_month, p_day, p_year, 1);

	//**************************************************************************

	bgstyle   = HolidayCheck(p_month, p_day, p_year);
	tomorrow  = HolidayCheck(next_date[0], next_date[1], next_date[2]);
	yesterday = HolidayCheck(prev_date[0], prev_date[1], prev_date[2]);

	if (bgstyle < 9) {

		//**** bgstyle >= 9 なら祝日。
		//**** bgstyle が 9 未満なら祝日ではない。
		//**** tomorrow および yesterday も同様。

		if (p_month == 1 && p_day == 2 || p_month == 1 && p_day == 3) {
			//**** 三箇日
//			bgstyle = 8;
		} else if (yesterday >= 9 && tomorrow >= 9 && bgstyle <= 6 && bgstyle >= 1) {
			//**** 前日および翌日が祝日となっている平日＆土曜日なら「国民の休日」となる。
			bgstyle = 8;
		} else {

			//**** 振替休日の判定

			while (1) {

				if (yesterday < 9) {
					//**** 前日が平日である場合は処理を終了
					break;
				} else if (yesterday >= 9 && getwday(prev_date[0], prev_date[1], prev_date[2]) == 0) {
					//**** 前日が祝日で、かつ日曜日なら振替休日
					bgstyle = 7;
					break;
				}

				//**** 前日が祝日で、しかし日曜日でないなら日付を -1 して再度判定
				prev_date = DateAdd(prev_date[0], prev_date[1], prev_date[2], -1);
				yesterday = HolidayCheck(prev_date[0], prev_date[1], prev_date[2]);

			}

			//**** 振替休日の算出としてこのような方法を取るのは、2007/1/1施行の改正祝日法により、
			//**** 振替休日の定義が「祝日直後の平日」とされたためである。
			//**** そのため、祝日が連続し、かつ、その中に日曜日が含まれる場合、
			//**** 振替休日が月曜日以外の曜日になる場合がある。
			//**** ただし、2007年4月現在、この条件に該当する可能性があるのは5月6日のみである。

		}

	}

	return bgstyle;

}


function HolidayCheck(mm, dd, yy) {

	//**** 以下の分岐は y が年、m が月、d が日。
	//**** 祝日に該当する場合は holiday に true を格納して呼び出し元に値を返す。
	//**** 関数 getwday() は引数として月・日・年を渡すと、その日の曜日を返す。

	var holiday = getwday(mm, dd, yy);		//**** 返す値を初期化

	if (mm == 1) {
		//**** 一月
		if (dd == 1) {
			//**** 元旦
			holiday = 9;
		} else if (14 >= dd && dd >= 8 && getwday(mm, dd, yy) == 1) {
			//**** 成人の日は1/8〜1/14の期間にある月曜日
			holiday = 10;
		}
	} else if (mm == 2) {
		//**** 二月
		if (dd == 11) {
			//**** 建国記念の日
			holiday = 11;
		}
	} else if (mm == 3) {
		//**** 三月
		if (dd == getSpringHoliday(yy)) {
			//**** 春分の日
			holiday = 12;
		}
	} else if (mm == 4) {
		//**** 四月
		if (dd == 29) {
			//**** 昭和の日（旧みどりの日）
			holiday = 13;
		}
	} else if (mm == 5) {
		//**** 五月
		if (dd == 3) {
			//**** 憲法記念日
			holiday = 14;
		} else if (dd == 4) {
			//**** みどりの日
			holiday = 15;
		} else if (dd == 5) {
			//**** こどもの日
			holiday = 16;
		}
//	} else if (mm == 6) {
		//**** 六月に祝日はないためコメントアウトしている

	} else if (mm == 7) {
		//**** 七月
		if (21 >= dd && dd >= 15 && getwday(mm, dd, yy) == 1) {
			//**** 海の日は7/15〜7/21の期間にある月曜日
			holiday = 17;
		}
//	} else if (mm == 8) {
		//**** 八月に祝日はないためコメントアウトしている

	} else if (mm == 9) {
		//**** 九月
		if (21 >= dd && dd >= 15 && getwday(mm, dd, yy) == 1) {
			//**** 敬老の日は9/15〜9/21の期間にある月曜日
			holiday = 18;
		} else if (dd == getAutumnHoliday(yy)) {
			//**** 秋分の日
			holiday = 19;
		}
	} else if (mm == 10) {
		//**** 十月
		if (14 >= dd && dd >= 8 && getwday(mm, dd, yy) == 1) {
			//**** 体育の日は10/8〜10/14の期間にある月曜日
			holiday = 20;
		}
	} else if (mm == 11) {
		//**** 十一月
		if (dd == 3) {
			//**** 文化の日
			holiday = 21;
		} else if (dd == 23) {
			//**** 勤労感謝の日
			holiday = 22;
		}
	} else if (mm == 12) {
		//**** 十二月
		if (dd == 23) {
			//**** 天皇誕生日
			holiday = 23;
		}
	}

	return holiday;
}


function getHolidayName(num) {
	// **** 配列定義
	var HolidayName = new Array();
	HolidayName[0]  = "日曜日 ";
	HolidayName[1]  = "月曜日 ";
	HolidayName[2]  = "火曜日 ";
	HolidayName[3]  = "水曜日 ";
	HolidayName[4]  = "木曜日 ";
	HolidayName[5]  = "金曜日 ";
	HolidayName[6]  = "土曜日 ";
	HolidayName[7]  = "振替休日 ";
	HolidayName[8]  = "国民の休日 ";
	HolidayName[9]  = "元旦 ";
	HolidayName[10] = "成人の日 ";
	HolidayName[11] = "建国記念の日 ";
	HolidayName[12] = "春分の日 ";
	HolidayName[13] = "昭和の日 ";
	HolidayName[14] = "憲法記念日 ";
	HolidayName[15] = "みどりの日 ";
	HolidayName[16] = "こどもの日 ";
	HolidayName[17] = "海の日 ";
	HolidayName[18] = "敬老の日 ";
	HolidayName[19] = "秋分の日 ";
	HolidayName[20] = "体育の日 ";
	HolidayName[21] = "文化の日 ";
	HolidayName[22] = "勤労感謝の日 ";
	HolidayName[23] = "天皇誕生日 ";
	return HolidayName[num];
}


function getWdayName(wday, lang) {
	// **** 配列定義
	var Common_WdayName = new Array();
	Common_WdayName[0] = new Array();
	Common_WdayName[0][0] = "日 ";
	Common_WdayName[0][1] = "月 ";
	Common_WdayName[0][2] = "火 ";
	Common_WdayName[0][3] = "水 ";
	Common_WdayName[0][4] = "木 ";
	Common_WdayName[0][5] = "金 ";
	Common_WdayName[0][6] = "土 ";
	Common_WdayName[1] = new Array();
	Common_WdayName[1][0] = "Sun ";
	Common_WdayName[1][1] = "Mon ";
	Common_WdayName[1][2] = "Tue ";
	Common_WdayName[1][3] = "Wed ";
	Common_WdayName[1][4] = "Thu ";
	Common_WdayName[1][5] = "Fri ";
	Common_WdayName[1][6] = "Sat ";
	return Common_WdayName[lang][wday];
}


