/* ------------------------------------------------
 * 言語			：JavaScript
 * 名称			：js_mu_date
 * バージョン	：Ver.0.2.1
 * 内容			：日付・時刻ライブラリ
 * 動作確認		：MSIE6、Netscape7、Mozilla1.6、Opera7
 * 作成日		：2003/11/09
 * 更新日		：2004/03/05
 * 作成者		：D.asano
 * 著作者		：YDS
 * ライセンス	：パブリックドメイン相当。利用、改変、再配布は自由です。
 * 配布元		：http://www.mula-net.com/mulib/
 * ------------------------------------------------
 */

function mu_Date(p_format) {
	/* コンストラクタ */
	if (p_format==undefined)	p_format	= 'Ymd';
	this.format	= p_format;
}
function _mu_Date_onchange(p_obj) {
	/* フォームの onchange イベント */
	var	v1 = p_obj.value;
	if (v1=='')	return true;
	var v2 = this.complete(v1,this.format);
	if (this.isValid(v2)==false)	return false;
	if (v1!=v2) p_obj.value = v2;
	return true;
}
function _mu_Date_complete(p_day,p_format) {
	/* 日付の補完 */
	if (p_day==undefined)	return null;
	if (p_format==undefined)	p_format	= this.format;
	var ad = this.parse(p_day,p_format);
	var df = ad['part'];
	var sd = p_day;
	var st = p_day;
	if (p_format.match(/[Ymdy]/) && p_format.match(/[His]/)) {
		w  = p_day.split(' ',2);
		sd = '';
		st = w[0];
		if (w.length==2) { sd = w[0];st = w[1]; }
	}
	if (sd=='' && st=='')	return p_day;
	var ar = new this.sub_iniArray('');
	var at = new Array();
	for (c=i=0;c<p_format.length;c++)	if (re = p_format.substring(c,c+1).match(/[His]/)) at[i++] = re[0];
	var ad = new Array();
	var i = 0;
	for (c=p_format.length;c>=0;c--) if (re = p_format.substring((c-1),c).match(/[Ymdy]/)) ad[i++] = re[0];
	var td	= new Array();
	var td1 = this.getToday('Ymd H:i:s');
	td['Y']	= td1.substring(0,4);
	td['m']	= td1.substring(4,6);
	td['d']	= td1.substring(6,8);
	td['H']	= td1.substring(9,11);
	td['i']	= '00';
	td['s']	= '00';
	td['y1'] = parseInt(td1.substring(0,2),10)*100;
	/* 時刻のチェック */
	if (at.length > 0) {
		if (re = st.match(/^(\d{1,2})$/)) ar[at[0]] = re[1];
		if (at.length > 1) {
			if (re = st.match(/^(\d{1,})[\:.]$/)) ar[at[0]] = re[1];
			if (re = st.match(/^(\d{1,})(\d{2})$/)) {
				ar[at[0]] = re[1];	ar[at[1]] = re[2];
			}
			if (re = st.match(/^(\d{1,})[\:.](\d{1,})$/)) {
				ar[at[0]] = re[1];	ar[at[1]] = re[2];
			}
			if (re = st.match(/^[\:.](\d{1,})$/)) {
				ar[at[1]] = re[1];
			}
		}
		if (at.length > 2) {
			if (re = st.match(/^(\d{1,})(\d{2})(\d{2})$/)) {
				ar[at[0]] = re[1];	ar[at[1]] = re[2];	ar[at[2]] = re[3];
			}
			if (re = st.match(/^(\d{1,})[\:.](\d{1,})[\:.](\d{1,})$/)) {
				ar[at[0]] = re[1];	ar[at[1]] = re[2];	ar[at[2]] = re[3];
			}
		}
	}
	/* 日付のチェック */
	if (ad[0]=='Y' && (re = sd.match(/^(\d{1,4})$/))) ar[ad[0]]	= re[1];
	if (ad[0]!='Y' && (re = sd.match(/^(\d{1,2})$/))) ar[ad[0]]	= re[1];
	if (ad.length > 1) {
		if (ad[0]=='Y' && (re = sd.match(/^(\d{1,})(\d{4})$/))) {
			ar[ad[0]] = re[2];	ar[ad[1]] = re[1];
		}
		if (ad[0]!='Y' && (re = sd.match(/^(\d{1,})(\d{2})$/))) {
			ar[ad[0]] = re[2];	ar[ad[1]] = re[1];
		}
		if (re = sd.match(/^(\d{1,})[\/.-]$/))	ar[ad[1]] = re[1];
		if (re = sd.match(/^(\d{1,})[\/.-](\d{1,})$/)) {
			ar[ad[0]] = re[2];	ar[ad[1]] = re[1];
		}
		if (re = sd.match(/^[\/.-](\d{1,})[\/.-](\d{1,})$/)) {
			ar[ad[0]] = re[2];	ar[ad[1]] = re[1];
		}
	}
	if (ad.length > 2) {
		if (re = sd.match(/^(\d{1,})[\/.-](\d{1,})[\/.-]$/)) {
			ar[ad[1]] = re[2];	ar[ad[2]] = re[1];
		}
		if (re = sd.match(/^\d{5,}$/)) {
			if (ad[0]=='Y' && (re = sd.match(/^(\d{2})(\d{2})(\d{4})$/))) {
				ar[ad[0]] = re[3];	ar[ad[1]] = re[2];	ar[ad[2]] = re[1];
			}
			if (ad[1]=='Y' && (re = sd.match(/^(\d{2})(\d{4})(\d{1,})$/))) {
				ar[ad[0]] = re[3];	ar[ad[1]] = re[2];	ar[ad[2]] = re[1];
			}
			if (ad[2]=='Y' && (re = sd.match(/^(\d{1,})(\d{2})(\d{2})$/))) {
				ar[ad[0]] = re[3];	ar[ad[1]] = re[2];	ar[ad[2]] = re[1];
			}
		}
	}
	if (ad.length==3) {
	 	if (re = sd.match(/^(\d{1,})[\/.-](\d{1,})[\/.-](\d{1,})$/)) {
			ar[ad[0]] = re[3];	ar[ad[1]] = re[2];	ar[ad[2]] = re[1];
		}
	 	if (re = sd.match(/^(\d{1,})[\/.-](\d{1,2})(\d{2})$/)) {
			ar[ad[0]] = re[3];	ar[ad[1]] = re[2];	ar[ad[2]] = re[1];
		}
	}
	var e = 1;
	for (var c=0;c<ad.length;c++) {if (ar[ad[c]]!='') e = 0;}
	for (var c=0;c<at.length;c++) {if (ar[at[c]]!='') e = 0;}
	if (e) return p_day;

	if (df['Y'] && ar['Y'].length>0 && ar['Y'].length<4) {
		var w1	= Number(td['y1']) + Number(ar['Y']);
		var w2	= Number(td['y1']) + Number(ar['Y']) - 100;
		if (Math.abs(Number(td['Y'])-w1) > Math.abs(Number(td['Y'])-w2)) ar['Y']	= w2.toString();
		else	ar['Y']	= w1.toString();
	}

	r = p_format.toString();
	for (var jc=0;jc<ad.length;jc++) {
		var p = ad[jc];
		if (ar[p].length > 0)	ar[p] = this.sub_cmpZero(ar[p]);
		if (ar[p]=='')			ar[p] = td[p];
		r = r.replace(p,ar[p]);
	}
	for (var jc=0;jc<at.length;jc++) {
		var p = at[jc];
		if (ar[p].length > 0)	ar[p] = this.sub_cmpZero(ar[p]);
		if (ar[p]=='')			ar[p] = td[p];
		r = r.replace(p,ar[p]);
	}
	return r;
}
function _mu_Date_isValid(p_date,p_format) {
	/* 値の整合性チェック */
	if (p_date==undefined)		return false;
	if (p_format==undefined)	p_format	= this.format;
	var ad = this.parse(p_date,p_format);
	var f = ad['part'];
	var v = ad['value'];
	var y = v['Y'];	var m = v['m'];	var d = v['d'];
	var h = v['H'];	var i = v['i'];	var s = v['s'];
	if (f['Y'] && y==null) return false;
	if (f['m'] && (m==null || m<1 || m>12)) return false;
	if (f['d'] && (d==null || d<1 || d>31)) return false;
	if (f['m'] && f['d'] && m==2 && d > 29) return false;
	if (f['m'] && f['d'] && d>30 && (m==4 || m==6 || m==9 || m==11)) return false;
	if (f['Y'] && f['m'] && f['d'] && m==2 && (y%4!=0||(y%100==0 && y%400!=0)) && d>28) return false;
	if (f['H'] && (h==null || h<0 || h>23)) return false;
	if (f['i'] && (i==null || i<0 || i>59)) return false;
	if (f['s'] && (s==null || s<0 || s>59)) return false;
	return true;
}
function _mu_Date_parse(p_val,p_format) {
	/* 値を分解する */
	if (p_val==undefined) return false;
	if (p_format==undefined) p_format = this.format;
	var ar = new Array();
	ar['part']  = this.sub_iniArray(false);
	ar['value'] = this.sub_iniArray(null);
	if (p_format.match(/[^YmdHis]/)) at = this.sub_iniArray('[0-9]{1,}');
	else {at = this.sub_iniArray('[0-9]{2}');at['Y'] = '[0-9]{4}';}
	var ap = p_format.match(/([YmdHis]{1})/g);
	for (c=0;c<ap.length;c++) ar['part'][ap[c]]	= true;
	rs	= p_format.replace('d','dd');
	rs	= rs.replace('Y','('+at['Y']+')');
	rs	= rs.replace('m','('+at['m']+')');
	rs	= rs.replace('dd','('+at['d']+')');
	rs	= rs.replace('H','('+at['H']+')');
	rs	= rs.replace('i','('+at['i']+')');
	rs	= rs.replace('s','('+at['s']+')');
	rs	= rs.replace('/','\/');
	reg	= new RegExp('^'+rs+'$');
	if (reg2 = p_val.match(reg)) {
		for (c=1;c<reg2.length;c++) ar['value'][ap[(c-1)]] = parseInt(reg2[c],10);
	}
	return ar;
}
function _mu_Date_toString(p_day,p_format) {
	/* Dateオブジェクトを文字列で返す */
	if (p_format==undefined)	p_format	= this.format;
	if (p_day.getYear) {
		var yy = p_day.getYear();
		if (yy < 2000) yy+=1900;
		var mm	= p_day.getMonth()+1;
		var dd	= p_day.getDate();
		var hh	= p_day.getHours();
		var ii	= p_day.getMinutes();
		var ss	= p_day.getSeconds();
		var y2	= yy-(Math.floor(yy/100)*100);
	} else {
		var ad = this.parse(p_day,this.format);
		var v = ad['value'];
		var yy = v['Y'];	var mm = v['m'];		var dd = v['d'];
		var hh = v['H'];	var ii = v['i'];		var ss = v['s'];
		var y2	= yy-(Math.floor(yy/100)*100);
	}
	var r = p_format.toString();
	if (p_format.indexOf('Y')!=-1) r = r.replace('Y',yy);
	if (p_format.indexOf('m')!=-1) r = r.replace('m',this.sub_cmpZero(mm));
	if (p_format.indexOf('d')!=-1) r = r.replace('d',this.sub_cmpZero(dd));
	if (p_format.indexOf('H')!=-1) r = r.replace('H',this.sub_cmpZero(hh));
	if (p_format.indexOf('i')!=-1) r = r.replace('i',this.sub_cmpZero(ii));
	if (p_format.indexOf('s')!=-1) r = r.replace('s',this.sub_cmpZero(ss));
	if (p_format.indexOf('y')!=-1) r = r.replace('y',this.sub_cmpZero(y2));
	return r;
}
function _mu_Date_toObject(p_day,p_format) {
	/* 日付文字列を Date オブジェクトに変換 */
	if (p_day==undefined)		return false;
	if (p_format==undefined)	p_format	= this.format;
	var a	= this.parse(p_day,this.format);
	var v	= a['value'];
	return  new Date(v['Y'],v['m']-1,v['d'],v['H'],v['i'],v['s']);
}
function _mu_Date_getToday(p_format) {
	/* 今日の日付を返す */
	if (p_format==undefined)	p_format	= this.format;
	return this.toString(new Date(),p_format);
}
function _mu_Date_getDay(p_day,p_type) {
	/* 曜日を求める */
	if (p_day==undefined)		return false;
	if (p_type==undefined)		p_type = 0;
	if (this.isValid(p_day,this.format)==false)	return false;
	var ob	= this.toObject(p_day,this.format);
	var ww	= new Array();
	ww[0]	= new Array('日','月','火','水','木','金','土');
	ww[1]	= new Array('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
	ww[2]	= new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
	var dd	= ob.getDay();
	return ww[p_type][dd];
}
function _mu_Date_getIntervalSecond(p_day1, p_day2) {
	/* 日付の差分を秒で求める */
	if (p_day1==undefined || p_day2==undefined)	return false;
	var a1	= this.parse(p_day1,this.format);
	var a2	= this.parse(p_day2,this.format);
	var v1	= a1['value'];
	var v2	= a2['value'];
	var d1	= new Date(v1['Y'],v1['m']-1,v1['d'],v1['H'],v1['i'],v1['s']);
	var d2	= new Date(v2['Y'],v2['m']-1,v2['d'],v2['H'],v2['i'],v2['s']);
	var r	= (d2.getTime() - d1.getTime()) / 1000;
	return r;
}
function _mu_Date_getIntervalDay(p_day1, p_day2) {
	/* 日付の差分を日数で求める - 日付以下の部分は切り捨て */
	if (p_day1==undefined || p_day2==undefined)	return false;
	var a1	= this.parse(p_day1,this.format);
	var a2	= this.parse(p_day2,this.format);
	var v1	= a1['value'];
	var v2	= a2['value'];
	var d1	= new Date(v1['Y'],v1['m']-1,v1['d'],0,0,0);
	var d2	= new Date(v2['Y'],v2['m']-1,v2['d'],0,0,0);
	var r	= (d2.getTime() - d1.getTime()) / 86400000;
	return r;
}
function _mu_Date_sub_cmpZero(p_str,p_len) {
	/* 内部処理：先頭をゼロで埋める */
	if (p_len==undefined)	p_len	= 2;
	var r = p_str.toString();
	while (r.length < p_len) r='0'+r;
	return r;
}
function _mu_Date_sub_iniArray(p_def) {
	/* 内部処理：配列作成 */
	var r = new Array();
	var v = new Array('Y','m','d','H','i','s');
	for (var i=0;i<v.length;i++) {r[v[i]]=p_def;}
	return r;
}

mu_Date.prototype.toString			= _mu_Date_toString;
mu_Date.prototype.toObject			= _mu_Date_toObject;
mu_Date.prototype.onchange			= _mu_Date_onchange;
mu_Date.prototype.complete			= _mu_Date_complete;
mu_Date.prototype.isValid			= _mu_Date_isValid;
mu_Date.prototype.getIntervalSecond	= _mu_Date_getIntervalSecond;
mu_Date.prototype.getIntervalDay	= _mu_Date_getIntervalDay;
mu_Date.prototype.getToday			= _mu_Date_getToday;
mu_Date.prototype.getDay			= _mu_Date_getDay;
mu_Date.prototype.parse				= _mu_Date_parse;

mu_Date.prototype.sub_cmpZero		= _mu_Date_sub_cmpZero;
mu_Date.prototype.sub_iniArray		= _mu_Date_sub_iniArray;

