//(setJapaneseDateFormat|setADDateFormat|getJapaneseDateFormat|getDate|getDateObject|separateDate|checkDate|checkDateYMD|checkLeapyear|addDay|addMonth|changeDate|getMonthEndDay|compareDate|differenceDate|getWeek|getWhatDayOfWeek)

/**
 * 西暦を受け取り和暦に変換する
 * 変換された和暦を指定されたコントロールに表示する
 * @param get_control_or_id
 * @param set_control
 * @return
 */
function setJapaneseDateFormat(get_control_or_id, set_control) {
	var control_value = getValue(get_control_or_id);
	var set_value = getJapaneseDateFormat(control_value)
	setValue(set_control, set_value);
}


/**
 * H22.08.22形式の和暦を受け取り西暦に変換して
 * 指定されたコントロールに表示する
 * 
 * @param JYYsMMsDD 西暦に変換する和暦を受け取る
 * @param set_control_or_id
 *  			変換後の西暦を表示うるコントロールまたはIDを受け取る
 * @return
 */
function setADDateFormat(JYYsMMsDD, set_control_or_id) {
	var strJYYsMMsDD = '';
	var type_of = typeof JYYsMMsDD;
	if (type_of == 'string') {
		strJYYsMMsDD = JYYsMMsDD;
	} else if (type_of == 'object') {
		strJYYsMMsDD = getValue(JYYsMMsDD);
	} else {
		var message = '設定されていないtypeです。[' + type_of + ']';
		alert(message);
	}
	var rex = new RegExp("([a-zA-Z])([0-9]{2})\.([0-9]{1,2})\.([0-9]{1,2})", "i"); 
	var result = false;
	if (strJYYsMMsDD != '') {
		if (strJYYsMMsDD.match(rex)) {
			var gg = RegExp.$1;
			var year = RegExp.$2;
			year = sprintf("%02d", year);
			var month = RegExp.$3 - 0;//数値に変換
			month = sprintf("%02d", month);
			var date = RegExp.$4 - 0;//数値に変換
			date = sprintf("%02d",date);
			result = true;
		} else {
			alert('日付は「[MTSH]yy.mm.dd」形式で入力してください。strJYYsMMsDD[' + strJYYsMMsDD + ']');
			result = false;
		}
		var ymd = year + month + date;
		if (result == true) {
			switch (gg) {
			case 'M':
				//明治元年（1868年1月25日）から明治45年（大正元年、1912年）7月30日
				if (ymd >= '010125' && year <= '450730') {
					//明治時代
					year = parseInt(year) + 1867;
				} else {
					var message = '明治時代は、明治元年1月25日から明治45年7月30日までです。';
					return false;
				}
				break;
			case 'T':
				//大正元年（1912年）7月30日から大正15年（1926年）12月25日
				if (ymd >= '010731' && year <= '151225') {
					//大正元年
					year = parseInt(year) + 1911;
				} else {
					var message = '大正時代は、大正元年7月31日から大正15年12月25日までです。';
					return false;
				}
				break;
			case 'S':
				//昭和元年（大正15年、1926年）12月25日から昭和64年（1989年）1月7日
				if (ymd >= '011225' && year <= '640107') {
					//昭和
					year = parseInt(year) + 1925;
				} else {
					var message = '昭和時代は、昭和元年12月25日から昭和64年1月7日までです。';
					return false;
				}
				break;
			case 'H':
				//1989年1月8日から
				if (ymd >= '010108') {
					//平成
					year = parseInt(year) + 1988;
				} else {
					var message = '平成時代は、平成元年1月8日からです。';
					return false;
				}
				break;
			default:
				var message = '設定されていない。年号です。[' + gg + ']';
				alert(message);
				return "";
			}
			var set_value = String(year) + '/' + month + '/' + date;
			setValue(set_control_or_id ,set_value);
		}
	}
}

function getJapaneseDateFormat(ymd, format, separators) {
	if (ymd=='') {
		return "";
	}
	if (format == undefined) {
		format = 'JYYMMDD';
	}
	if (separators == undefined) {
		separators='.';
	}

	var y = separateDate(ymd, 'year');
	if (y == false) {
		return "";
	}
	var m = separateDate(ymd, 'month');
	var d = separateDate(ymd, 'date');
	///// separatorの処理 >> /////
	var year_separator = '年';
	var month_separator = '月';
	var day_separator = '日';
	if (separators != undefined) {
		//separatorが指定された
		if (is_array(separators) == true) {
			//配列で指定された
			for (var i=0; i < separators.length; i++) {
				switch (i) {
				case 0:
					year_separator = separators[0];
					break;
				case 1:
					month_separator = separators[1];
					break;
				case 2:
					day_separator = separators[2];
					break;
				}
			}
		} else {
			year_separator = month_separator = separators;
			day_separator = '';
		}
	}
	///// separatorの処理 << /////
	
	var gg = "";
	var yy = "";
	var mm = "";
	var dd = "";
	var date = "";
	if(format.charAt(0)=="J") {
		
		//年月日を文字列として結合
		var ymd = sprintf("%02d%02d%02d", y, m, d);
		if (ymd <= "19120729") {
			if (format.charAt(1)=="J") {
				gg = "明治";
			} else {
				gg = 'M';
			}
			yy = y - 1867;
		} else if (ymd >= "19120730" && ymd <= "19261224") {
			if (format.charAt(1)=="J") {
				gg = "大正";
			} else {
				gg = "T";
			}
			yy = y - 1911;
		} else if (ymd >= "19261225" && ymd <= "19890107") {
			if (format.charAt(1)=="J") {
				gg = "昭和";
			} else {
				gg = 'S';
			}
			yy = y - 1925;
		} else if (ymd >= "19890108") {
			if (format.charAt(1)=="J") {
				gg = "平成";
			} else {
				gg = "H";
			}
			yy = y - 1988;
		}
		if (format.indexOf("YY")== -1) {
			//YYが見つからなかった
			yy = yy;
		} else {
			yy = sprintf("%02d",yy);
		}
		yy += year_separator;
	} else {
		yy = y + year_separator;
	}
	
	if(format.indexOf("MM") !== -1) {
		//見つかった
		mm = sprintf("%02d", m) + month_separator;
	} else if(format.indexOf("M") !== -1) {
		mm = sprintf("%d", m) + month_separator;
	} else {
		mm = "";
	}

	if(format.indexOf("DD") !== -1) {
		//見つかった
		dd = sprintf("%02d", d) + day_separator;
	} else if(format.indexOf("D") !== -1) {
		//見つかった
		dd = sprintf("%d", d) + day_separator;
	} else {
		dd = "";
	}
	date = gg + yy + mm + dd;
	
	return date;
}

function getDate(date_type) {
	var nowdate = new Date();
	var result = '';
	switch (date_type) {
		case "month_year":
			year = new Date().getFullYear();
			month = new Date().getMonth() + 1;
			result = month + '/' + year;
			break;
		case "year":
			result = nowdate.getFullYear(); // 年 
			break;
		case "month":
			result = nowdate.getMonth() + 1; // 月 
			break;
		case "date":
			result = nowdate.getDate(); // 日
			break;
		case "day":
			result = nowdate.getDay(); // 曜日 
			break;
		case "ymd":
			result = nowdate.getFullYear(); // 年 
			result = result + '/' + (nowdate.getMonth() + 1); // 月 
			result = result + '/' + nowdate.getDate(); // 日
			break;
		case "hour":
			result = nowdate.getHours(); // 時 
			break;
		case "minute":
			result  = nowdate.getMinutes(); // 分 
			break;
		case "second":
			result  = nowdate.getSeconds(); // 秒 
			break;
		case "millisecond":
			result = nowdate.getMilliseconds(); // ミリ秒 
			break;
		default:
			alert("[" + date_type + "]は設定されていません。");
	}
	return result;
}

/**
 * 指定した日付のDate型オブジェクトを生成
 * 
 */
function getDateObject(YMD) {
	if (checkDate(YMD) == false) {
		return false;
	}
	var year;
	var month;
	var day;
	var result;
	var date = '';
	
	var rex = new RegExp("([0-9]{4})\/([0-9]{1,2})\/([0-9]{1,2})", "i"); 

	if (YMD.match(rex)) { 
		year = RegExp.$1;
		month = RegExp.$2;
		day = RegExp.$3;
		result = true;
	} else {
		alert('日付は「yyyy/mm/dd」形式で入力してください。');
		result = false;
	}
	if (result == true) {
		var date = new Date(year, month - 1, day);
	}
	return date;
}


function separateDate(YMD, date_type) {
	var target_date = getDateObject(YMD);
	if (target_date == false) {
		return false;
	}
	var result = '';
	switch (date_type) {
		case "year":
			result = target_date.getFullYear(); // 年 
			break;
		case "month":
			result = target_date.getMonth() + 1; // 月 
			break;
		case "date":
			result = target_date.getDate(); // 日
			break;
		case "day":
			result = target_date.getDay(); // 曜日 
			break;
		case "ymd":
			result = target_date.getFullYear(); // 年 
			result = result + '/' + (target_date.getMonth() + 1); // 月 
			result = result + '/' + target_date.getDate(); // 日
			break;
		case "hour":
			result = target_date.getHours(); // 時 
			break;
		case "minute":
			result  = target_date.getMinutes(); // 分 
			break;
		case "second":
			result  = target_date.getSeconds(); // 秒 
			break;
		case "millisecond":
			result = target_date.getMilliseconds(); // ミリ秒 
			break;
		default:
			alert("[" + date_type + "]は設定されていません。");
	}
	return result;
}

//*****************************************
//日付チェック
//*****************************************
function checkDate(objOrStringOrControl) {
	var result = false;
	var type_of = typeof objOrStringOrControl;
	if (type_of == 'string') {
		//文字列で渡された
		if (objOrStringOrControl == '') {
			result = true;
		} else {
			if(objOrStringOrControl.match(/^\d{4}\/\d{1,2}\/\d{1,2}$/)) { 
				result = true;
			} else {
				alert('日付は「yyyy/mm/dd」形式で入力して下さい。');
				result = false;
			}
		}
	} else if (type_of == 'date') {
		//dateで渡された。
		if(objOrStringOrControl.value=='') {
			result =  true;
		} else {
			if(objOrStringOrControl.value.match(/^\d{4}\/\d{1,2}\/\d{1,2}$/)) {
				result =  true;
			} else {
				alert('日付は「yyyy/mm/dd」形式で入力して下さい。');
				objOrStringOrControl.value='';
				result =  false;
			}
		}
	} else if (type_of == 'object') {
		//コントロールで渡された。
		if(objOrStringOrControl.value=='') {
			result =  true;
		} else {
			if(objOrStringOrControl.value.match(/^\d{4}\/\d{1,2}\/\d{1,2}$/)) {
				result =  true;
			} else {
				alert('日付は「yyyy/mm/dd」形式で入力して下さい。');
				objOrStringOrControl.value='';
				result =  false;
			}
		}
	}
	return result;
}


/**
 * 日付の妥当性チェック
 * year 年
 * month 月
 * day 日
 */
function checkDateYMD(year, month, day) {
    var dt = new Date(year, month - 1, day);
    if(dt == null || dt.getFullYear() != year || dt.getMonth() + 1 != month || dt.getDate() != day) {
        return false;
    }
    return true;
}

//うるう年（閏年）の判定
function checkLeapyear(year) {
    return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
}
/**
 * 年月日と加算日からn日後、n日前を求める関数
 * year 年
 * month 月
 * day 日
 * addDays 加算日。マイナス指定でn日前も設定可能
 */
function addDay(year, month, day, addDays) {
    var dt = new Date(year, month - 1, day);
    var baseSec = dt.getTime();
    var addSec = addDays * 86400000;//日数 * 1日のミリ秒数
    var targetSec = baseSec + addSec;
    dt.setTime(targetSec);
    return dt;
}

/**
 * 年月日と加算月からnヶ月後、nヶ月前の日付を求める
 * year 年
 * month 月
 * day 日
 * addMonths 加算月。マイナス指定でnヶ月前も設定可能
 */
function addMonth(YMD, addMonths) {
	var year = separateDate(YMD, 'year');//年
	var month = separateDate(YMD, 'month');//月
	var date = separateDate(YMD, 'date');//日
	
	var result_date = new Date(year, month-1, date);
	
	result_date.setMonth(result_date.getMonth() + parseInt(addMonths));
	
	var date_string = result_date.getFullYear() + '/' + sprintf("%02d",(result_date.getMonth() + 1)) + '/' + sprintf("%02d",result_date.getDate());
	return date_string;
}

/**
 * 日付形式の文字列から日を指定されて日に書き換える
 * @param YMD
 * @param date
 * @return
 */
function changeDate(YMD, date) {
	var date_object = getDateObject(YMD);
	var date_string = date_object.getFullYear() + '/' + sprintf("%02d", (date_object.getMonth() + 1)) + '/' + sprintf("%02d", date);
	return date_string;
}

/**
 * 年月を指定して月末日を求める関数
 * year 年
 * month 月
 */
function getMonthEndDay(year, month) {
    //日付を0にすると前月の末日を指定したことになります
    //指定月の翌月の0日を取得して末日を求めます
    //そのため、ここでは month - 1 は行いません
    var dt = new Date(year, month, 0);
    return dt.getDate();
}



function compareDate(year1, month1, day1, year2, month2, day2) {
	//2007-8-10と2007-7-31を比較します
	//処理Aが実行されます
	var dt1 = new Date(year1, month1 - 1, day1);
	var dt2 = new Date(year2, month2 - 1, day2);
	var result;
	if (dt1.getTime() > dt2.getTime()) {
	    //Aの方が大きい
		result = 1;
	} else if (dt1.getTime() > dt2.getTime()) {
	    //Bの方が大きい
		result = -1;
	} else {
		//等しい
		result = 0;
	}
	return result;
}

/**
 * 2つの日付の差を求める関数
 * year1 1つのめ日付の年
 * month1 1つめの日付の月
 * day1 1つめの日付の日
 * year2 2つのめ日付の年
 * month2 2つめの日付の月
 * day2 2つめの日付の日
 */
function differenceDate(year1, month1, day1, year2, month2, day2) {
    var dt1 = new Date(year1, month1 - 1, day1);
    var dt2 = new Date(year2, month2 - 1, day2);
    var diff = dt1 - dt2;
    var diffDay = diff / 86400000;//1日は86400000ミリ秒
    return diffDay;
}

/**
 * 曜日を取得する
 * 
 * 
 */
function getWeek(year, montn, day) {
	//2007年8月10日の曜日を表示
	//金曜日が表示されます
	var week = new Array("日", "月", "火", "水", "木", "金", "土");
	var dt = new Date(year, month - 1, day);
	var dayOfWeek = week[dt.getDay()];
	
	document.write("曜日=" + dayOfWeek + "<br />\r\n");
}

/**
 * 任意の年月の第n曜日の日付を求める関数
 * year 年
 * month 月
 * number 何番目の曜日か、第1曜日なら1。第3曜日なら3
 * dayOfWeek 求めたい曜日。0-6までの数字で曜日の日～土を指定する
 */
function getWhatDayOfWeek(year, month, number, dayOfWeek) {
    var firstDt = new Date(year, month - 1, 1);
    var firstDayOfWeek = firstDt.getDay();//指定した年月の1日の曜日を取得
    var day = dayOfWeek - firstDayOfWeek + 1;
    if(day <= 0) day += 7;//1週間を足す
    var dt = new Date(year, month - 1, day);
    var msTime = dt.getTime();
    msTime += (86400000 * 7 * (number - 1));//n曜日まで1週間を足し込み
    dt.setTime(msTime);
    return dt;
}
