/*****************************************************************************************
	@file
	hyp_date.js <br/>
	日付関連処理ファイル <br/>
	<br/>
	@breif date time process
	@author Hideki Ikeda
	@version 1.0.0.0
	@since 07/10/2009
	$Revision: $
******************************************************************************************/
//----------- Grobal variables -----------------------------------------------------------
var YEAR_CHAR_MAP  = {'ja':"年", 'en':"",  'zh':"年"};
var MONTH_CHAR_MAP = {'ja':"月", 'en':"/", 'zh':"月"};
var DAY_CHAR_MAP   = {'ja':"日", 'en':"",  'zh':"日"};

var HOUR_AM_CHAR_MAP = {'ja':"時", 'en':"am", 'zh':"\u65f6"};
var HOUR_PM_CHAR_MAP = {'ja':"時", 'en':"pm", 'zh':"\u65f6"};
var MINUTE_CHAR_MAP =  {'ja':"分", 'en':"",   'zh':"分"};

var YEAR_MONTH_ORDER = {'ja':'YM', 'en':'MY', 'zh':'YM'};
var USE_AMPM = {'ja':'n', 'en':'y', 'zh':'n'};

var EN_MONTH_CHAR = ['none','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
var MONTH_CHAR_CONVERTER = {
	'ja':function(v){return v;},
	'en':function(v){return EN_MONTH_CHAR[v];},
	'zh':function(v){return v;}
};

var HOUR_CHAR_CONVERTER = {
	'ja':function(v) {return v;},
	'en':function(v) {
		return ((v % 12) == 0) ? 12 : (v % 12);
	},
	'zh':function(v) {return v;}
};
//----------------------------------------------------------------------------------------
var HypLocale = Class.create();
HypLocale.prototype = {

	initialize : function(lc_lang) {
		this.lc_lang = lc_lang;

		this.yearChr = YEAR_CHAR_MAP[lc_lang];
		this.monthChr = MONTH_CHAR_MAP[lc_lang];
		this.dayChr = DAY_CHAR_MAP[lc_lang];
		this.amHourChr = HOUR_AM_CHAR_MAP[lc_lang];
		this.pmHourChr = HOUR_PM_CHAR_MAP[lc_lang];
		this.minuteChr = MINUTE_CHAR_MAP[lc_lang];
		
		this.ymOrder = YEAR_MONTH_ORDER[lc_lang];
		this.useAmPm = USE_AMPM[lc_lang];
		
		this.monthCharConverter = MONTH_CHAR_CONVERTER[lc_lang];
		this.hourCharConverter = HOUR_CHAR_CONVERTER[lc_lang];
	}
};

var HypDateCombo = Class.create();
HypDateCombo.prototype = {

	initialize : function(lc_lang, startYM, endYM, currentDateTime) {
		this.locale = new HypLocale(lc_lang);

		if (startYM != null) {
			this.startYear = parseInt(startYM.substr(0,4),10);
			this.startMonth = parseInt(startYM.substr(4,2),10);
		}

		if (endYM != null) {
			this.endYear = parseInt(endYM.substr(0,4),10);
			this.endMonth = parseInt(endYM.substr(4,2),10);
		}

		if (currentDateTime != null) {
			this.currentTime = new Date();//将来的にサーバから取得する時要変更。
		} else {
			this.currentTime = new Date();
		}
	},

	getCurrentYMOptions : function() {
		var ymArray = new Array();
		for (var y = this.startYear; y <= this.endYear; y++) {
			for (var m = 1; m <= 12; m++) {
				if (y == this.startYear && m < this.startMonth)
					m = this.startMonth;
				if (y == this.endYear && m > this.endMonth)
					break;
				var monthChar = this.locale.monthCharConverter(m);
				var option = new Option(this._concatYM(y, monthChar), y+this._paddingZero(m));
				if (this.currentTime.getFullYear() == y && (this.currentTime.getMonth() + 1) == m) {
					option.selected = true;
				}
				ymArray.push(option);
			}
		}
		return ymArray;
	},

	getCurrentDayOptions : function() {
		var dayArray = new Array();
		var max = this._getMaxDayOfMonth(this.currentTime.getFullYear(), this.currentTime.getMonth() + 1);
		for (var d = 1; d <= max; d++) {
			var option = new Option(this._paddingZero(d)+this.locale.dayChr, this._paddingZero(d));
			if (this.currentTime.getDate() == d) {
				option.selected = true;
			}
			dayArray.push(option);
		}
		return dayArray;
	},

	getCurrentHourOptions : function() {
		var hourArray = new Array();
		for (var h = 0; h < 24; h++) {
			var value = this._paddingZero(h);
			var label = "";
			var hourChar = this.locale.hourCharConverter(h);
			switch(this.locale.useAmPm) {
			case 'n':
				label = this._paddingZero(hourChar) + this.locale.amHourChr;
				break;
			case 'y':
				if (h < 12) {
					label = this._paddingZero(hourChar) + this.locale.amHourChr;
				} else {
					label = this._paddingZero(hourChar) + this.locale.pmHourChr;
				}
				break;
			default:
				break;
			}
			var option = new Option(label, value);
			if (this.currentTime.getHours() == h) {
				option.selected = true;
			}
			hourArray.push(option);
		}
		return hourArray;
	},

	getCurrentMinuteOptions : function() {
		var minuteArray = new Array();
		for (var m = 0; m < 60; m++) {
			var option = new Option(this._paddingZero(m)+this.locale.minuteChr, this._paddingZero(m));
			if (this.currentTime.getMinutes() == m) {
				option.selected = true;
			}
			minuteArray.push(option);
		}
		return minuteArray;
	},

	getDayOptions : function(yyyymm, selectedDay) {
		var year = parseInt(yyyymm.substr(0, 4),10);
		var month = parseInt(yyyymm.substr(4, 2),10);
		var max = this._getMaxDayOfMonth(year, month);

		var dayArray = new Array();
		for (var d = 1; d <= max; d++) {
			var option = new Option(this._paddingZero(d)+this.locale.dayChr, this._paddingZero(d));
			if (selectedDay == d) {
				option.selected = true;
			}
			dayArray.push(option);
		}
		return dayArray;
	},

	_concatYM : function(year, month) {
		switch(this.locale.ymOrder) {
		case 'YM':
			return year + this.locale.yearChr
							+ this._paddingZero(month) + this.locale.monthChr;
		case 'MY':
			return this._paddingZero(month) + this.locale.monthChr
							+ year + this.locale.yearChr;
		default:
			return "";
		}
	},
	
	_getMaxDayOfMonth : function(year, month) {
		switch(month) {
		case 2:
			if (((year%4) == 0 && (year % 100) != 0) || year % 400 == 0) {
				return 29;
			} else {
				return 28;
			}
		case 4:
		case 6:
		case 9:
		case 11:
			return 30;
		default:
			return 31;
		}
	},

	_paddingZero : function(value) {
		return (value < 10) ? "0" + value : "" + value;
	}
};

function init_hyp_date() {
	var lc_lang = $F('lc_lang');
	var startYM = $F('support_s_ym');
	var endYM = $F('support_e_ym');
	
	var hdc = new HypDateCombo(lc_lang, startYM, endYM);

	var ymSel = $('ymSel');
	var yms = hdc.getCurrentYMOptions();
	for (var i = 0; i < yms.length; i++) {
		ymSel.options[i] = yms[i];
	}

	var daySel = $('day');
	var days = hdc.getCurrentDayOptions();
	for (var i = 0; i < days.length; i++) {
		daySel.options[i] = days[i];
	}

	var hourSel = $('hour');
	var hours = hdc.getCurrentHourOptions();
	for (var i = 0; i < hours.length; i++) {
		hourSel.options[i] = hours[i];
	}

	var minuteSel = $('minute');
	var minutes = hdc.getCurrentMinuteOptions();
	for (var i = 0; i < minutes.length; i++) {
		minuteSel.options[i] = minutes[i];
	}

	changeDayOptions(ymSel.value);
	setYearMonthElm();
};

function changeDayOptions(yyyymm) {
	var lc_lang = $F('lc_lang');

	var daySel = $('day');
	var curDayVal = parseInt(daySel.value,10);
	var hdc = new HypDateCombo(lc_lang);

	for (var i = daySel.options.length; i >= 0; i--) {
		daySel.remove(i);
	}

	var days = hdc.getDayOptions(yyyymm, curDayVal);
	for (var i = 0; i < days.length; i++) {
		daySel.options[i] = days[i];
	}
};

function setYearMonthElm() {
	var ym = $F('ymSel');
	$('year').value = ym.substr(0, 4);
	$('month').value = ym.substr(4, 2);
};


/*--- m-okuda ADD↓--------------------------------------------------------------------------------------------------*/

function init_hyp_date_golf() {
	var lc_lang = $F('lc_lang');
	var startYM = $F('support_s_ym');
	var endYM = $F('support_e_ym');
	
	var hdc = new HypDateCombo(lc_lang, startYM, endYM);
	
	var golf_ymSel = $('golf_ymSel');
	var golf_yms = hdc.getCurrentYMOptions();
	for (var i = 0; i < golf_yms.length; i++) {
		golf_ymSel.options[i] = golf_yms[i];
	}

	var golf_daySel = $('golf_day');
	var golf_days = hdc.getCurrentDayOptions();
	for (var i = 0; i < golf_days.length; i++) {
		golf_daySel.options[i] = golf_days[i];
	}

	var golf_hourSel = $('golf_hour');
	var golf_hours = hdc.getCurrentHourOptions();
	for (var i = 0; i < golf_hours.length; i++) {
		golf_hourSel.options[i] = golf_hours[i];
	}

	var golf_minuteSel = $('golf_minute');
	var golf_minutes = hdc.getCurrentMinuteOptions();
	for (var i = 0; i < golf_minutes.length; i++) {
		golf_minuteSel.options[i] = golf_minutes[i];
	}
	
	changeDayOptionsGolf(golf_ymSel.value);
	setYearMonthElmGolf();
};

function changeDayOptionsGolf(yyyymm) {
	var lc_lang = $F('lc_lang');

	var daySel = $('golf_day');
	var curDayVal = parseInt(daySel.value,10);
	var hdc = new HypDateCombo(lc_lang);

	for (var i = daySel.options.length; i >= 0; i--) {
		daySel.remove(i);
	}

	var days = hdc.getDayOptions(yyyymm, curDayVal);
	for (var i = 0; i < days.length; i++) {
		daySel.options[i] = days[i];
	}
};

function setYearMonthElmGolf() {
	var ym = $F('golf_ymSel');
	$('golf_year').value = ym.substr(0, 4);
	$('golf_month').value = ym.substr(4, 2);
};

/*--- m-okuda ADD↑--------------------------------------------------------------------------------------------------*/
