/**
 * 指定日付の存在チェック
 *
 *   @since  1.0
 *   @return true :存在する
 *           flase:存在しない
 *   @param  yy [ I ]年
 *   @param  mm [ I ]月
 *   @param  dd [ I ]日
 *
 *//*
 *   note:
 */
function existDate(yy, mm, dd) {

	if (yy == ''  || mm == ''  || dd == ''  ||
		isNaN(yy) || isNaN(mm) || isNaN(dd)) {
		return (false);
	}

	if (yy < 1000) {
		return (false);
	}

	if (mm < 1 || mm > 12) {
		return (false);
	}

	last = getLastDay(yy, mm);

	if (dd < 1 || dd > last) {
		return (false);
	}

	return (true);


} /*- existDate() -*/

/**
 * 指定年月の月末日取得
 *
 *   @since  1.0
 *   @return 月末日
 *   @param  yy [ I ]年
 *   @param  mm [ I ]月
 *
 *//*
 *   note:
 */
function getLastDay(yy, mm) {

	var mdays = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

	if (mm != 2) {
		return (mdays[mm - 1]);
	}
	else {
		if (chkLeapYear(yy)) {
			return (29);
		}
		else{
			return (28);
		}
	}


} /*- getLastDay() -*/

/**
 * 指定年の閏年チェック
 *
 *   @since  1.0
 *   @return true :閏年である
 *           flase:閏年でない
 *   @param  yy [ I ]年
 *
 *//*
 *   note:
 */
function chkLeapYear(yy, mm, dd) {


	if ((yy % 4 == 0 && yy % 100 != 0) || yy % 400 == 0) {
		return (true);
	}

	return (false);


} /*- chkLeapYear() -*/

/**
 * 指定年月日の前後月を取得
 *
 *   @since  1.0
 *   @return 日付
 *           [0]年
 *           [1]月
 *           [2]日
 *   @param  yy     [ I ]年
 *   @param  mm     [ I ]月
 *   @param  dd     [ I ]日
 *   @param  befaft [ I ]前後月
 *
 *//*
 *   note:存在しない日になる場合、月末とする
 */
function getBefAftMonthDate(yy, mm, dd, befaft) {

	var	array;
	var	chk_yy, chk_mm, chk_dd, abs_befaft, ii, last;

	array = new Array(yy, mm, dd);

	if (befaft == 0) {
		return (array);
	}

	chk_yy = yy;
	chk_mm = mm;

	abs_befaft = Math.abs(befaft);

	for (ii = 0; ii < abs_befaft; ii++) {
		if (befaft > 0) {
			if (chk_mm == 12) {
				chk_yy++;
				chk_mm = 1;
			}
			else {
				chk_mm++;
			}
		}
		else {
			if (chk_mm == 1) {
				chk_yy--;
				chk_mm = 12;
			}
			else {
				chk_mm--;
			}
		}
	}

	if (befaft > 0) {
		if (dd == 1) {
			if (chk_mm == 1) {
				chk_yy--;
				chk_mm = 12;
			}
			else {
				chk_mm--;
			}
			chk_dd = getLastDay(chk_yy, chk_mm);
		}
		else {
			chk_dd = dd - 1;
			if (!existDate(chk_yy, chk_mm, chk_dd)) {
				chk_dd = getLastDay(chk_yy, chk_mm);
			}
		}
	}
	else {
		last = getLastDay(yy, mm);
		if (dd == last) {
			if (chk_mm == 12) {
				chk_yy++;
				chk_mm = 1;
			}
			else {
				chk_mm++;
			}
			chk_dd = 1;
		}
		else {
			chk_dd = dd + 1;
			if (!existDate(chk_yy, chk_mm, chk_dd)) {
				if (chk_mm == 12) {
					chk_yy++;
					chk_mm = 1;
				}
				else {
					chk_mm++;
				}
				chk_dd = 1;
			}
		}
	}

	array[0] = chk_yy;
	array[1] = chk_mm;
	array[2] = chk_dd;

	return (array);


} /*- getBefAftMonthDate() -*/

