//==================================================
//
// iDate Object 日曆物件
// 版權所有 (C) 2007/03 許世衛 http://talk.away.com.tw/
// 遵循 GNU GPL 使用規範，修改或散佈時請保留這一段版權聲明。
//

function iDateObject (prefix, idDiv) {

	if (!prefix) prefix = "iDate_";
	this.prefix  = prefix;
	this.objname = this.prefix+"iDate";
	this.Img = "iDate/";

	if (!idDiv) idDiv = this.prefix+"iDateDiv";
	this.idDiv = idDiv;
	var div = document.getElementById(idDiv);
	if (!div) {
		document.write("<div id='"+idDiv+"'></div>");
		div = document.getElementById(idDiv);
	}
	this.Div = div;

	var dtStr = this.getUrlParam_("date");
	this.nowDT  = new Date(); this.setNow_(dtStr);
	this.thisDT = new Date(); this.setThis_(dtStr);
	this.thisColor  = "#e0e0c8";
	this.thisBorder = "1px solid #888888";
	this.markAy = new Array();
	this.markColor  = "#d0d0e8";
	this.markBorder = "1px solid #ffffff";

	this.onClickDay = null;
	this.autoReload = 0;

	eval("window."+this.objname+" = this;");
}

iDateObject.prototype.dt2Str_ = function (dt) {
	if (!dt) dt = this.nowDT;
	var y = dt.getFullYear();
	var m = dt.getMonth()+1; if (m<10) m = "0"+m;
	var d = dt.getDate();    if (d<10) d = "0"+d;
	var h = dt.getHours();   if (h<10) h = "0"+h;
	var i = dt.getMinutes(); if (i<10) i = "0"+i;
	var s = dt.getSeconds(); if (s<10) s = "0"+s;
	return y+"-"+m+"-"+d+" "+h+":"+i+":"+s;
}

iDateObject.prototype.dt2Day_ = function (dt) {
	if (!dt) dt = this.nowDT;
	var y = dt.getFullYear();
	var m = dt.getMonth()+1; if (m<10) m = "0"+m;
	var d = dt.getDate();    if (d<10) d = "0"+d;
	return y+"-"+m+"-"+d;
}

iDateObject.prototype.getDay1_ = function (dt) {
	if (!dt) dt = this.nowDT;
	var y = dt.getFullYear();
	var m = dt.getMonth()+1; if (m<10) m = "0"+m;
	return new Date(y+"/"+m+"/01");
}

iDateObject.prototype.setNow_ = function (dtStr) {
	if (typeof(dtStr)=="string" && dtStr!="")
		this.nowDT = this.date_(dtStr);
	return this.nowDT;
}

iDateObject.prototype.setThis_ = function (dtStr) {
	if (typeof(dtStr)=="string" && dtStr!="")
		this.thisDT = this.date_(dtStr);
	return this.thisDT;
}

iDateObject.prototype.date_ = function (dtStr) {
	while (dtStr.indexOf("-")>-1)
		dtStr = dtStr.replace("-", "/");
	var dt = new Date(dtStr);
	if (isNaN(dt)) dt = new Date();
	return dt;
}

iDateObject.prototype.dateAdd_ = function (dt, s, i, h, d, m, y) {
	if (!dt) dt = this.nowDT;
	if (m!=0 || y!=0) {
		var ym = dt.getFullYear()*12+dt.getMonth()+1+(y*12+m);
		var y2 = parseInt(ym / 12), m2 = ym % 12, d2 = dt.getDate();
		if (m2==2 && d2>28) d2 = 28;
		if ((m2==4 || m2==6 || m2==9 || m2==11) && d2>30) d2 = 30;
		dt = new Date(y2+"/"+m2+"/"+d2);
	}
	var time = dt.getTime();
	var add = (d*24+h)*60+i; add = (add*60+s)*1000;
	var dt2 = new Date(); dt2.setTime(time+add);
	return dt2;
}

iDateObject.prototype.showMiniMonth_ = function (dtStr) {
	var dt = this.setNow_(dtStr), y = dt.getFullYear(); m = dt.getMonth()+1;
	var s = ""
	+"<table id='"+this.prefix+"MainTable' class='iDateCalendar' border=0 cellpadding=1 cellspacing=0>\r\n"
	+"<tr>"
		+"<td colspan=7 id='"+this.prefix+"Header' class='iDateHeader'>"
			+"<img src='"+this.Img+"arrow_left.gif' border=0 style='cursor:pointer;' id='"+this.prefix+"LastMonth' onClick='window."+this.objname+".lastMiniMonth_()'>"
			+"&nbsp;"+y+"/"+m+"&nbsp;"
			+"<img src='"+this.Img+"arrow_right.gif' border=0 style='cursor:pointer;' id='"+this.prefix+"NaxtMonth' onClick='window."+this.objname+".nextMiniMonth_()'>"
		+"</td>"
	+"</tr>\r\n"
	+"<tr>"
		+"<td id='"+this.prefix+"Header0' class='iDateHeader0'>日</td>"
		+"<td id='"+this.prefix+"Header1' class='iDateHeader1'>一</td>"
		+"<td id='"+this.prefix+"Header2' class='iDateHeader2'>二</td>"
		+"<td id='"+this.prefix+"Header3' class='iDateHeader3'>三</td>"
		+"<td id='"+this.prefix+"Header4' class='iDateHeader4'>四</td>"
		+"<td id='"+this.prefix+"Header5' class='iDateHeader5'>五</td>"
		+"<td id='"+this.prefix+"Header6' class='iDateHeader6'>六</td>"
	+"</tr>\r\n";
	var day1 = this.getDay1_(dt), w = day1.getDay();
	var from = this.dateAdd_(day1,0,0,0,-w,0,0), fromDay = 0;
	var wn = 0, mn = 0, className = "";
	while (wn<60) { wn++;
		if (from.getMonth()+1==m) mn = 1;
		else if (mn==1) mn = 2;
		fromDay = from.getDay();
		if (fromDay==0) {
			s += "<tr>";
			if (mn==2) break;
		}
		className = "iDateDay"+fromDay;
		if (mn==0 || mn==2) className = "iDateDayOver";
		s+="<td id='"+this.prefix+this.dt2Day_(from)+"' class='"+className+"' style='cursor:pointer'"
		+" onClick='window."+this.objname+".clickDay_(\""+this.dt2Day_(from)+"\")'"
		+" onMouseOver='window."+this.objname+".onMouseOver_(\""+this.dt2Day_(from)+"\")'"
		+" onMouseOut='window."+this.objname+".onMouseOut_(\""+this.dt2Day_(from)+"\")'"
		+">"+from.getDate()+"</td>";
		if (fromDay==6) s += "</tr>\r\n";
		from = this.dateAdd_(from, 0,0,0,1,0,0);
	}
	s+="</table>\r\n";

	this.Div.innerHTML = s;

	this.markDisplay_();
	this.thisDisplay_();
}

iDateObject.prototype.lastMiniMonth_ = function () {
	var dtStr = this.dt2Day_(this.dateAdd_(null, 0,0,0,0,-1,0));
	this.showMiniMonth_(dtStr);
}

iDateObject.prototype.nextMiniMonth_ = function () {
	var dtStr = this.dt2Day_(this.dateAdd_(null, 0,0,0,0,1,0));
	this.showMiniMonth_(dtStr);
}

iDateObject.prototype.showMonth_ = function (dtStr) {
	var dt = this.setNow_(dtStr), y = dt.getFullYear(); m = dt.getMonth()+1;
	var s = ""
	+"<table id='"+this.prefix+"MainTable' class='iDateMonth' border=0 cellpadding=2px cellspacing=0>\r\n"
	+"<tr>"
		+"<td colspan=7 id='"+this.prefix+"Header' class='iDateHeader'>"
		+"<img src='"+this.Img+"arrow_left.gif' border=0 style='cursor:pointer;' id='"+this.prefix+"LastMonth' onClick='window."+this.objname+".lastMonth_()'>"
		+"&nbsp;"+y+"/"+m+"&nbsp;"
		+"<img src='"+this.Img+"arrow_right.gif' border=0 style='cursor:pointer;' id='"+this.prefix+"NaxtMonth' onClick='window."+this.objname+".nextMonth_()'>"
		+"</td>"
	+"</tr>\r\n"
	+"<tr>"
		+"<td id='"+this.prefix+"Header0' class='iDateHeader0'>日</td>"
		+"<td id='"+this.prefix+"Header1' class='iDateHeader1'>一</td>"
		+"<td id='"+this.prefix+"Header2' class='iDateHeader2'>二</td>"
		+"<td id='"+this.prefix+"Header3' class='iDateHeader3'>三</td>"
		+"<td id='"+this.prefix+"Header4' class='iDateHeader4'>四</td>"
		+"<td id='"+this.prefix+"Header5' class='iDateHeader5'>五</td>"
		+"<td id='"+this.prefix+"Header6' class='iDateHeader6'>六</td>"
	+"</tr>\r\n";
	var day1 = this.getDay1_(dt), w = day1.getDay();
	var from = this.dateAdd_(day1,0,0,0,-w,0,0), fromDay = 0;
	var wn = 0, mn = 0, className = "";
	while (wn<60) { wn++;
		if (from.getMonth()+1==m) mn = 1;
		else if (mn==1) mn = 2;
		fromDay = from.getDay();
		if (fromDay==0) {
			s += "<tr>";
			if (mn==2) break;
		}
		className = "iDateDay"+fromDay;
		if (mn==0 || mn==2) className = "iDateDayOver";
		s+="<td valign=top id='"+this.prefix+this.dt2Day_(from)+"' class='"+className+"' style='cursor:pointer'"
			+" onClick='window."+this.objname+".clickDay_(\""+this.dt2Day_(from)+"\")'"
			+" onMouseOver='window."+this.objname+".onMouseOver_(\""+this.dt2Day_(from)+"\")'"
			+" onMouseOut='window."+this.objname+".onMouseOut_(\""+this.dt2Day_(from)+"\")'>"
			+"<div align=right><span class='iDateCtrl' id='ctrl_"+this.prefix+this.dt2Day_(from)+"'>...</span>&nbsp;<b>"+from.getDate()+"</b></div>"
			+"<div width=100% class='iDateContent' id='div_"+this.prefix+this.dt2Day_(from)+"'>...</div>"
			+"</td>";
		if (fromDay==6) s += "</tr>\r\n";
		from = this.dateAdd_(from, 0,0,0,1,0,0);
	}
	s+="</table>\r\n";

	this.Div.innerHTML = s;

	this.markDisplay_();
	this.thisDisplay_();
}

iDateObject.prototype.lastMonth_ = function () {
	var dtStr = this.dt2Day_(this.dateAdd_(null, 0,0,0,0,-1,0));
	this.showMonth_(dtStr);
}

iDateObject.prototype.nextMonth_ = function () {
	var dtStr = this.dt2Day_(this.dateAdd_(null, 0,0,0,0,1,0));
	this.showMonth_(dtStr);
}

iDateObject.prototype.thisDisplay_ = function (dtStr) {
	var dt = this.setThis_(dtStr);
	var td = document.getElementById(this.prefix+this.dt2Day_(dt));
	if (td) {
		td.style.backgroundColor = this.thisColor;
		td.style.border = this.thisBorder;
	}
}

iDateObject.prototype.markDisplay_ = function (dt) {
	var dtAy = this.markAy, td="";
	if (dt) dtAy = new Array(this.dt2Day_(dt));
	for (var i=0; i<dtAy.length; i++) {
		td = document.getElementById(this.prefix+dtAy[i]);
		if (td) {
			td.style.backgroundColor = this.markColor;
			td.style.border = this.markBorder;
		}
	}
}

iDateObject.prototype.getUrlParam_ = function (param, url) {
	if (!url) url = document.location.href;
	var s = "";
	if (url.indexOf(param+"=")>=0) {
		s = url.substr(url.indexOf(param+"="))+"&";
		var sAy = s.split("&");
		sAy = sAy[0].split("=");
		s = sAy[1];
	}
	return s;
}

iDateObject.prototype.chgUrlParam_ = function (param, dtStr, url) {
	if (!url) url = document.location.href;
	if (url.indexOf("?")>=0) {
		var param = url.substr(url.indexOf("?")+1);
		var paramAy = param.split("&");
		url = url.substr(0, url.indexOf("?"));
		param = "";
		for (var i=0; i<paramAy.length; i++)
		if (paramAy[i].indexOf("date=")==-1)
			param += paramAy[i]+"&";
		param += "date="+dtStr;
		url += "?"+param;
	}
	else
		url += "?date="+dtStr;
	return url;
}

iDateObject.prototype.markDay_ = function (dtStr) {
	var dt = this.setNow_(dtStr);
	this.markAy.push(this.dt2Day_(dt));
	this.markDisplay_(dt);
}

iDateObject.prototype.onMouseOver_ = function (dtStr) {
	var td = document.getElementById(this.prefix+dtStr);
	td.style.backgroundColor = this.thisColor;
	td.style.border = this.thisBorder;
}

iDateObject.prototype.onMouseOut_ = function (dtStr) {
	if (dtStr==this.dt2Day_(this.thisDT))
		return;
	var td = document.getElementById(this.prefix+dtStr);
	for (var i=0; i<this.markAy.length; i++)
	if (this.markAy[i]==dtStr) {
		td.style.backgroundColor = this.markColor;
		td.style.border = this.markBorder;
		return;
	}
	td.style.backgroundColor = "";
	td.style.border = "";
}

iDateObject.prototype.clickDay_ = function (dtStr) {
	var dtStr2 = this.dt2Day_(this.thisDT);
	this.setThis_(dtStr);
	this.showMiniMonth_(dtStr);
	if (this.onClickDay)
		this.onClickDay(dtStr, dtStr2, this);
	else if (this.autoReload == 1)
		document.location.href = this.chgUrlParam_("date", dtStr);
}

iDateObject.prototype.alignCtrl_ = function (idCtrl, idDiv, x, y) {
	var ctrl = (typeof(idCtrl)=="string") ? document.getElementById(idCtrl) : idCtrl;
	var div  = (typeof(idDiv)=="string")  ? document.getElementById(idDiv)  : idDiv;
	if (!x) x = 0; if (!y) y = 0;

	var sx = ctrl.offsetLeft, sy = ctrl.offsetTop;
	do {
		ctrl = ctrl.offsetParent;
		sx	+= ctrl.offsetLeft;
		sy += ctrl.offsetTop;
	} while(ctrl.tagName!="BODY");

	div.style.left = sx + x;
	div.style.top  = sy + y;
	div.style.display = "";
}

var iDate = new iDateObject();
