//==================================================
//
// iDate Object - 日曆物件
//
// 版權所有 Copyright (C) 2007/03/03 亞路科技股份有限公司 許世衛 http://talk.away.com.tw/
//
// 未經書面許可，嚴禁發佈、複製、編輯、傳輸、展示及使用。
//

window.iDateObject = function (prefix, idDiv, idMsg) { // function begin

	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;

	if (!idMsg) idMsg = this.prefix+"iDateMsg";
	this.idMsg = idMsg;
	var msg = document.getElementById(idMsg);
	if (!msg) {
		document.write("<div align=left id='"+idMsg+"' class='iDateMsg' style='display:none;'></div>");
		msg = document.getElementById(idMsg);
	}
	this.Msg = msg;

	var dtStr = this.getUrlParam_("date");
	this.nowDT  = new Date(); this.setNow_(dtStr);
	this.thisDT = new Date(); this.setThis_(dtStr);
	this.markAy = new Array();
	this.iDateStyle_ = this.iDateStyle0_;

	this.onClickDay = null;
	this.onLastMonth = null;
	this.onNextMonth = null;
	this.onMouseOver = null;
	this.onMouseOut = null;
	this.getMsg_ = null;
	this.autoReload = 0;

	eval("window."+this.objname+" = this;");
} // function end

window.iDateObject.prototype.setImgPath_ = function (path) { // function begin
	if (path.charAt(path.length-1) != "/") path = path + "/";
	this.Img = path;
} // function end

window.iDateObject.prototype.dt2Str_ = function (dt) { // function begin
	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;
} // function end

window.iDateObject.prototype.dt2Day_ = function (dt) { // function begin
	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;
} // function end

window.iDateObject.prototype.getDay1_ = function (dt) { // function begin
	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");
} // function end

window.iDateObject.prototype.setNow_ = function (dtStr) { // function begin
	if (typeof(dtStr)=="string" && dtStr!="")
		this.nowDT = this.date_(dtStr);
	return this.nowDT;
} // function end

window.iDateObject.prototype.setThis_ = function (dtStr) { // function begin
	if (typeof(dtStr)=="string" && dtStr!="")
		this.thisDT = this.date_(dtStr);
	return this.thisDT;
} // function end

window.iDateObject.prototype.date_ = function (dtStr) { // function begin
	while (dtStr.indexOf("-")>-1)
		dtStr = dtStr.replace("-", "/");
	var dt = new Date(dtStr);
	if (isNaN(dt)) dt = new Date();
	return dt;
} // function end

window.iDateObject.prototype.dateAdd_ = function (dt, s, i, h, d, m, y) { // function begin
	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==0) { y2--; m2 = 12; }
		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;
} // function end

window.iDateObject.prototype.showMiniMonth_ = function (dtStr) { // function begin
	this.iDateStyle_ = this.iDateStyle0_;
	this.iDateStyle_(dtStr);
} // function end

window.iDateObject.prototype.showMonth_ = function (dtStr) { // function begin
	this.iDateStyle_ = this.iDateStyle1_;
	this.iDateStyle_(dtStr);
} // function end

window.iDateObject.prototype.lastMonth_ = function () { // function begin
	var dtStr = this.dt2Day_(this.dateAdd_(null, 0,0,0,0,-1,0));
	if (this.onLastMonth) if (!this.onLastMonth(dtStr, this)) retrun;
	this.iDateStyle_(dtStr);
} // function end

window.iDateObject.prototype.nextMonth_ = function () { // function begin
	var dtStr = this.dt2Day_(this.dateAdd_(null, 0,0,0,0,1,0));
	if (this.onNextMonth) if (!this.onNextMonth(dtStr, this)) retrun;
	this.iDateStyle_(dtStr);
} // function end

window.iDateObject.prototype.thisDisplay_ = function (dtStr) { // function begin
	var dt = this.setThis_(dtStr);
	var td = document.getElementById(this.prefix+this.dt2Day_(dt));
	if (td) td.className = 'iDateThisDay';
} // function end

window.iDateObject.prototype.markDisplay_ = function (dt) { // function begin
	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) if (td.className!='iDateThisDay') td.className = 'iDateMarkDay';
	}
} // function end

window.iDateObject.prototype.getUrlParam_ = function (param, url) { // function begin
	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;
} // function end

window.iDateObject.prototype.chgUrlParam_ = function (param, dtStr, url) { // function begin
	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;
} // function end

window.iDateObject.prototype.markDay_ = function (dtStr) { // function begin
	var dt = this.setNow_(dtStr);
	this.markAy.push(this.dt2Day_(dt));
	this.markDisplay_(dt);
} // function end

window.iDateObject.prototype.markInterval_ = function (dtList) { // function begin
	var dtList = dtList.split(','), dtAy='';
	for (var i=0; i<dtList.length; i++) {
		dtAy = dtList[i].split('~');
		while (dtAy[0] <= dtAy[1]) {
			this.markDay_(dtAy[0]);
			dtAy[0] = this.dt2Day_(this.dateAdd_(this.date_(dtAy[0]), 0,0,0,1,0,0));
		}
	}
} // function end

window.iDateObject.prototype.onMouseOver_ = function (e,dtStr) { // function begin
	if (this.onMouseOver) this.onMouseOver(dtStr,e,this);
	var td = document.getElementById(this.prefix+dtStr);
	if (td) {
		this.mClassName = td.className;
		td.className = 'iDateThisDay';
	}
	if (this.getMsg_) {
		var s = this.getMsg_(dtStr, this);
		if (s && s!='') {
			this.Msg.innerHTML = s;
			this.alignCtrl_(td, this.Msg, 7, td.clientHeight+7);
		}
	}
} // function end

window.iDateObject.prototype.onMouseOut_ = function (e,dtStr) { // function begin
	if (this.onMouseOut) this.onMouseOut(dtStr,e,this);
	var td = document.getElementById(this.prefix+dtStr);
	if (td) td.className = this.mClassName;
	if (this.getMsg_) {
		this.Msg.style.display = 'none';
		this.Msg.innerHTML = '';
	}
} // function end

window.iDateObject.prototype.clickDay_ = function (dtStr, mn) { // function begin
	var dtStr2 = this.dt2Day_(this.thisDT);
	if (mn==0) if (this.onLastMonth) if (!this.onLastMonth(this, dtStr)) return;
	if (mn==2) if (this.onNextMonth) if (!this.onNextMonth(this, dtStr)) return;
	this.setThis_(dtStr);
	this.iDateStyle_(dtStr);
	if (this.onClickDay)
		this.onClickDay(dtStr, dtStr2, this);
	else if (this.autoReload == 1)
		document.location.href = this.chgUrlParam_("date", dtStr);
} // function end

window.iDateObject.prototype.alignCtrl_ = function (idCtrl, idDiv, x, y) { // function begin
	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 = (parseInt(sx) + parseInt(x))+'px';
	div.style.top  = (parseInt(sy) + parseInt(y))+'px';
	div.style.display = "";

	var docW = (window.innerWidth)  ? window.innerWidth  : document.body.clientWidth;
	var divW = div.offsetWidth;
	if (parseInt(sx) + parseInt(x) + parseInt(divW) > parseInt(docW)) {
		div.style.left = (parseInt(docW) - parseInt(divW) - 2)+"px";
	}
} // function end

window.iDateObject.prototype.iDateStyle0_ = 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=0 cellspacing=1px>\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, classDay="", 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;
		}
		classDay = "iDateDay"+fromDay; if (mn==0 || mn==2) classDay = "iDateOut";
		s+="<td valign=top id='"+this.prefix+this.dt2Day_(from)+"' class='iDateBorder' style='cursor:pointer'"
		+" onClick='window."+this.objname+".clickDay_(\""+this.dt2Day_(from)+"\")'"
		+" onMouseOver='window."+this.objname+".onMouseOver_(event,\""+this.dt2Day_(from)+"\")'"
		+" onMouseOut='window."+this.objname+".onMouseOut_(event,\""+this.dt2Day_(from)+"\")'"
		+"><span class='"+classDay+"'>"+from.getDate()+"</span></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_();
}

window.iDateObject.prototype.iDateStyle1_ = 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, classDay="", 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;
		}
		classDay = "iDateDay"+fromDay; if (mn==0 || mn==2) classDay = "iDateOut";
		ctrl = document.getElementById('ctrl_'+this.prefix+this.dt2Day_(from));
		ctrl = (ctrl) ? ctrl.innerHTML : '';
		html = document.getElementById('div_'+this.prefix+this.dt2Day_(from));
		html = (html) ? html.innerHTML : '<br>';
		s+="<td valign=top id='"+this.prefix+this.dt2Day_(from)+"' class='iDateBorder' style='cursor:pointer'"
		+" onClick='window."+this.objname+".clickDay_(\""+this.dt2Day_(from)+"\","+mn+")'"
		+" onMouseOver='window."+this.objname+".onMouseOver_(event,\""+this.dt2Day_(from)+"\")'"
		+" onMouseOut='window."+this.objname+".onMouseOut_(event,\""+this.dt2Day_(from)+"\")'>"
		+"<div align=right><span class='iDateCtrl' id='ctrl_"+this.prefix+this.dt2Day_(from)+"'>"+ctrl+"</span>&nbsp;<span class='"+classDay+"'>"+from.getDate()+"</span></div>"
		+"<div width=100% isValue=0 class='iDateContent' id='div_"+this.prefix+this.dt2Day_(from)+"'>"+html+"</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_();
}

window.iDateObject.prototype.iDateStyle2_ = 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 = "", ctrl='', html='';
	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";
		ctrl = document.getElementById('ctrl_'+this.prefix+this.dt2Day_(from));
		ctrl = (ctrl) ? ctrl.innerHTML : '';
		html = document.getElementById('div_'+this.prefix+this.dt2Day_(from));
		html = (html) ? html.innerHTML : '<br>';
		s+="<td valign=top id='"+this.prefix+this.dt2Day_(from)+"' class0='iDateDay+"+fromDay+"' class='"+className+"' style='cursor:pointer'"
			+" onClick='window."+this.objname+".clickDay_(\""+this.dt2Day_(from)+"\", "+mn+")'"
			+" onMouseOver='window."+this.objname+".onMouseOver_(event,\""+this.dt2Day_(from)+"\")'"
			+" onMouseOut='window."+this.objname+".onMouseOut_(event,\""+this.dt2Day_(from)+"\")'>"
			+"<div align=right><span class='iDateCtrl' id='ctrl_"+this.prefix+this.dt2Day_(from)+"'>"+ctrl+"</span>&nbsp;<b>"+from.getDate()+"</b></div>"
			+"<div width=100% isValue=0 class='iDateContent' id='div_"+this.prefix+this.dt2Day_(from)+"'>"+html+"</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_();
}

window.iDateObject.prototype.setContent_ = function (dtStr, s) { // function begin
	dtStr = this.dt2Day_(this.date_(dtStr));
	document.getElementById('div_'+this.prefix+dtStr).innerHTML = s;
} // function end

window.iDateObject.prototype.addContent_ = function (dtStr, s) { // function begin
	dtStr = this.dt2Day_(this.date_(dtStr));
	var em = document.getElementById('div_'+this.prefix+dtStr);
	if (em)
	if (em.getAttribute('isValue')==0) {
		em.setAttribute('isValue', 1);
		em.innerHTML = s;
	}
	else
		em.innerHTML = em.innerHTML+s;
} // function end

window.iDateObject.prototype.getContent_ = function (dtStr) { // function begin
	dtStr = this.dt2Day_(this.date_(dtStr));
	return document.getElementById('div_'+this.prefix+dtStr).innerHTML;
} // function end

var iDate = new iDateObject();
if (typeof(wdbPath)!="undefined") { iDate.setImgPath_(wdbPath+'/iDate/'); }


