JavaScript实现含节日、农历的日历

清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>

<title>JavaScript实现含节日、农历的日历</title>
<table cellpadding="0" cellspacing="0" id="1">
	<tr>
		<td>
		<style>
body,td,.p1,.p2,.i {
	font-family: arial
}

body {
	margin: 6px 0 0 0;
	background-color: #fff;
	color: #000;
}

table {
	border: 0
}

#cal {
	width: 434px;
	border: 1px solid #c3d9ff;
	font-size: 12px;
	margin: 8px 0 0 15px
}

#cal #top {
	height: 29px;
	line-height: 29px;
	background: #e7eef8;
	color: #003784;
	padding-left: 70px
}

#cal #top select {
	font-size: 12px
}

#cal #top input {
	padding: 0
}

#cal ul#wk {
	margin: 0;
	padding: 0;
	height: 25px
}

#cal ul#wk li {
	float: left;
	width: 60px;
	text-align: center;
	line-height: 25px;
	list-style: none
}

#cal ul#wk li b {
	font-weight: normal;
	color: #c60b02
}

#cal #cm {
	clear: left;
	border-top: 1px solid #ddd;
	border-bottom: 1px dotted #ddd;
	position: relative
}

#cal #cm .cell {
	position: absolute;
	width: 42px;
	height: 36px;
	text-align: center;
	margin: 0 0 0 9px
}

#cal #cm .cell .so {
	font: bold 16px arial;
}

#cal #bm {
	text-align: right;
	height: 24px;
	line-height: 24px;
	padding: 0 13px 0 0
}

#cal #bm a {
	color: 7977ce
}

#cal #fd {
	display: none;
	position: absolute;
	border: 1px solid #dddddf;
	background: #feffcd;
	padding: 10px;
	line-height: 21px;
	width: 150px
}

#cal #fd b {
	font-weight: normal;
	color: #c60a00
}
</style>
		<!--[if IE]>
<style>
#cal #top{padding-top:4px}
#cal #top input{width:65px}
#cal #fd{width:170px}
</style>
<![endif]-->
		<div id="cal">
		<div id="top">公元 <select>
		</select> 年 <select>
		</select> 月 农历<span></span>年 [ <span></span>年 ] <input type="button"
			value="回到今天" title="点击后跳转回今天" style="padding: 0px"></div>
		<ul id="wk">
			<li>一</li>
			<li>二</li>
			<li>三</li>
			<li>四</li>
			<li>五</li>
			<li><b>六</b></li>
			<li><b>日</b></li>
		</ul>
		<div id="cm"></div>
		<div id="bm"></div>
		</div>
		</td>
	</tr>
</table>
<script type="text/javascript">
<!--
	(function() {
		var S = navigator.userAgent.indexOf("MSIE") != -1 && !window.opera;
		function M(C) {
			return document.getElementById(C)
		}
		function R(C) {
			return document.createElement(C)
		}
		var P = [ 19416, 19168, 42352, 21717, 53856, 55632, 91476, 22176,
				39632, 21970, 19168, 42422, 42192, 53840, 119381, 46400, 54944,
				44450, 38320, 84343, 18800, 42160, 46261, 27216, 27968, 109396,
				11104, 38256, 21234, 18800, 25958, 54432, 59984, 28309, 23248,
				11104, 100067, 37600, 116951, 51536, 54432, 120998, 46416,
				22176, 107956, 9680, 37584, 53938, 43344, 46423, 27808, 46416,
				86869, 19872, 42448, 83315, 21200, 43432, 59728, 27296, 44710,
				43856, 19296, 43748, 42352, 21088, 62051, 55632, 23383, 22176,
				38608, 19925, 19152, 42192, 54484, 53840, 54616, 46400, 46496,
				103846, 38320, 18864, 43380, 42160, 45690, 27216, 27968, 44870,
				43872, 38256, 19189, 18800, 25776, 29859, 59984, 27480, 21952,
				43872, 38613, 37600, 51552, 55636, 54432, 55888, 30034, 22176,
				43959, 9680, 37584, 51893, 43344, 46240, 47780, 44368, 21977,
				19360, 42416, 86390, 21168, 43312, 31060, 27296, 44368, 23378,
				19296, 42726, 42208, 53856, 60005, 54576, 23200, 30371, 38608,
				19415, 19152, 42192, 118966, 53840, 54560, 56645, 46496, 22224,
				21938, 18864, 42359, 42160, 43600, 111189, 27936, 44448 ];
		var K = "甲乙丙丁戊己庚辛壬癸";
		var J = "子丑寅卯辰巳午未申酉戌亥";
		var O = "鼠牛虎兔龙蛇马羊猴鸡狗猪";
		var L = [ "小寒", "大寒", "立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏", "小满",
				"芒种", "夏至", "小暑", "大暑", "立秋", "处暑", "白露", "秋分", "寒露", "霜降",
				"立冬", "小雪", "大雪", "冬至" ];
		var D = [ 0, 21208, 43467, 63836, 85337, 107014, 128867, 150921,
				173149, 195551, 218072, 240693, 263343, 285989, 308563, 331033,
				353350, 375494, 397447, 419210, 440795, 462224, 483532, 504758 ];
		var B = "日一二三四五六七八九十";
		var H = [ "正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "腊" ];
		var E = "初十廿卅";
		var V = {
			"0101" : "*1元旦节",
			"0214" : "情人节",
			"0305" : "学雷锋纪念日",
			"0308" : "妇女节",
			"0312" : "植树节",
			"0315" : "消费者权益日",
			"0401" : "愚人节",
			"0501" : "*1劳动节",
			"0504" : "青年节",
			"0601" : "国际儿童节",
			"0701" : "中国共产党诞辰",
			"0801" : "建军节",
			"0910" : "中国教师节",
			"1001" : "*3国庆节",
			"1224" : "平安夜",
			"1225" : "圣诞节"
		};
		var T = {
			"0101" : "*2春节",
			"0115" : "元宵节",
			"0505" : "*1端午节",
			"0815" : "*1中秋节",
			"0909" : "重阳节",
			"1208" : "腊八节",
			"0100" : "除夕"
		};
		function U(Y) {
			function c(j, i) {
				var h = new Date((31556925974.7 * (j - 1900) + D[i] * 60000)
						+ Date.UTC(1900, 0, 6, 2, 5));
				return (h.getUTCDate())
			}
			function d(k) {
				var h, j = 348;
				for (h = 32768; h > 8; h >>= 1) {
					j += (P[k - 1900] & h) ? 1 : 0
				}
				return (j + b(k))
			}
			function a(h) {
				return (K.charAt(h % 10) + J.charAt(h % 12))
			}
			function b(h) {
				if (g(h)) {
					return ((P[h - 1900] & 65536) ? 30 : 29)
				} else {
					return (0)
				}
			}
			function g(h) {
				return (P[h - 1900] & 15)
			}
			function e(i, h) {
				return ((P[i - 1900] & (65536 >> h)) ? 30 : 29)
			}
			function C(m) {
				var k, j = 0, h = 0;
				var l = new Date(1900, 0, 31);
				var n = (m - l) / 86400000;
				this.dayCyl = n + 40;
				this.monCyl = 14;
				for (k = 1900; k<2050&&n>0; k++) {
					h = d(k);
					n -= h;
					this.monCyl += 12
				}
				if (n < 0) {
					n += h;
					k--;
					this.monCyl -= 12
				}
				this.year = k;
				this.yearCyl = k - 1864;
				j = g(k);
				this.isLeap = false;
				for (k = 1; k<13&&n>0; k++) {
					if (j > 0 && k == (j + 1) && this.isLeap == false) {
						--k;
						this.isLeap = true;
						h = b(this.year)
					} else {
						h = e(this.year, k)
					}
					if (this.isLeap == true && k == (j + 1)) {
						this.isLeap = false
					}
					n -= h;
					if (this.isLeap == false) {
						this.monCyl++
					}
				}
				if (n == 0 && j > 0 && k == j + 1) {
					if (this.isLeap) {
						this.isLeap = false
					} else {
						this.isLeap = true;
						--k;
						--this.monCyl
					}
				}
				if (n < 0) {
					n += h;
					--k;
					--this.monCyl
				}
				this.month = k;
				this.day = n + 1
			}
			function G(h) {
				return h < 10 ? "0" + h : h
			}
			function f(i, j) {
				var h = i;
				return j.replace(/dd?d?d?|MM?M?M?|yy?y?y?/g, function(k) {
					switch (k) {
					case "yyyy":
						var l = "000" + h.getFullYear();
						return l.substring(l.length - 4);
					case "dd":
						return G(h.getDate());
					case "d":
						return h.getDate().toString();
					case "MM":
						return G((h.getMonth() + 1));
					case "M":
						return h.getMonth() + 1
					}
				})
			}
			function Z(i, h) {
				var j;
				switch (i, h) {
				case 10:
					j = "初十";
					break;
				case 20:
					j = "二十";
					break;
				case 30:
					j = "三十";
					break;
				default:
					j = E.charAt(Math.floor(h / 10));
					j += B.charAt(h % 10)
				}
				return (j)
			}
			this.date = Y;
			this.isToday = false;
			this.isRestDay = false;
			this.solarYear = f(Y, "yyyy");
			this.solarMonth = f(Y, "M");
			this.solarDate = f(Y, "d");
			this.solarWeekDay = Y.getDay();
			this.solarWeekDayInChinese = "星期" + B.charAt(this.solarWeekDay);
			var X = new C(Y);
			this.lunarYear = X.year;
			this.shengxiao = O.charAt((this.lunarYear - 4) % 12);
			this.lunarMonth = X.month;
			this.lunarIsLeapMonth = X.isLeap;
			this.lunarMonthInChinese = this.lunarIsLeapMonth ? "闰"
					+ H[X.month - 1] : H[X.month - 1];
			this.lunarDate = X.day;
			this.showInLunar = this.lunarDateInChinese = Z(this.lunarMonth,
					this.lunarDate);
			if (this.lunarDate == 1) {
				this.showInLunar = this.lunarMonthInChinese + "月"
			}
			this.ganzhiYear = a(X.yearCyl);
			this.ganzhiMonth = a(X.monCyl);
			this.ganzhiDate = a(X.dayCyl++);
			this.jieqi = "";
			this.restDays = 0;
			if (c(this.solarYear, (this.solarMonth - 1) * 2) == f(Y, "d")) {
				this.showInLunar = this.jieqi = L[(this.solarMonth - 1) * 2]
			}
			if (c(this.solarYear, (this.solarMonth - 1) * 2 + 1) == f(Y, "d")) {
				this.showInLunar = this.jieqi = L[(this.solarMonth - 1) * 2 + 1]
			}
			if (this.showInLunar == "清明") {
				this.showInLunar = "清明节";
				this.restDays = 1
			}
			this.solarFestival = V[f(Y, "MM") + f(Y, "dd")];
			if (typeof this.solarFestival == "undefined") {
				this.solarFestival = ""
			} else {
				if (/\*(\d)/.test(this.solarFestival)) {
					this.restDays = parseInt(RegExp.$1);
					this.solarFestival = this.solarFestival.replace(/\*\d/, "")
				}
			}
			this.showInLunar = (this.solarFestival == "") ? this.showInLunar
					: this.solarFestival;
			this.lunarFestival = T[this.lunarIsLeapMonth ? "00"
					: G(this.lunarMonth) + G(this.lunarDate)];
			if (typeof this.lunarFestival == "undefined") {
				this.lunarFestival = ""
			} else {
				if (/\*(\d)/.test(this.lunarFestival)) {
					this.restDays = (this.restDays > parseInt(RegExp.$1)) ? this.restDays
							: parseInt(RegExp.$1);
					this.lunarFestival = this.lunarFestival.replace(/\*\d/, "")
				}
			}
			if (this.lunarMonth == 12
					&& this.lunarDate == e(this.lunarYear, 12)) {
				this.lunarFestival = T["0100"];
				this.restDays = 1
			}
			this.showInLunar = (this.lunarFestival == "") ? this.showInLunar
					: this.lunarFestival;
			this.showInLunar = (this.showInLunar.length > 4) ? this.showInLunar
					.substr(0, 2)
					+ "..." : this.showInLunar
		}
		var Q = (function() {
			var X = {};
			X.lines = 0;
			X.dateArray = new Array(42);
			function Y(a) {
				return (((a % 4 === 0) && (a % 100 !== 0)) || (a % 400 === 0))
			}
			function G(a, b) {
				return [ 31, (Y(a) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31,
						30, 31 ][b]
			}
			function C(a, b) {
				a.setDate(a.getDate() + b);
				return a
			}
			function Z(a) {
				var f = 0;
				var c = new U(new Date(a.solarYear, a.solarMonth - 1, 1));
				var d = (c.solarWeekDay - 1 == -1) ? 6 : c.solarWeekDay - 1;
				X.lines = Math.ceil((d + G(a.solarYear, a.solarMonth - 1)) / 7);
				for ( var e = 0; e < X.dateArray.length; e++) {
					if (c.restDays != 0) {
						f = c.restDays
					}
					if (f > 0) {
						c.isRest = true
					}
					if (d-- > 0 || c.solarMonth != a.solarMonth) {
						X.dateArray[e] = null;
						continue
					}
					var b = new U(new Date());
					if (c.solarYear == b.solarYear
							&& c.solarMonth == b.solarMonth
							&& c.solarDate == b.solarDate) {
						c.isToday = true
					}
					X.dateArray[e] = c;
					c = new U(C(c.date, 1));
					f--
				}
			}
			return {
				init : function(a) {
					Z(a)
				},
				getJson : function() {
					return X
				}
			}
		})();
		var W = (function() {
			var C = M("top").getElementsByTagName("SELECT")[0];
			var X = M("top").getElementsByTagName("SELECT")[1];
			var G = M("top").getElementsByTagName("SPAN")[0];
			var c = M("top").getElementsByTagName("SPAN")[1];
			var Y = M("top").getElementsByTagName("INPUT")[0];
			function a(g) {
				G.innerHTML = g.ganzhiYear;
				c.innerHTML = g.shengxiao
			}
			function b(g) {
				C[g.solarYear - 1901].selected = true;
				X[g.solarMonth - 1].selected = true
			}
			function f() {
				var j = C.value;
				var g = X.value;
				var i = new U(new Date(j, g - 1, 1));
				Q.init(i);
				N.draw();
				if (this == C) {
					i = new U(new Date(j, 3, 1));
					G.innerHTML = i.ganzhiYear;
					c.innerHTML = i.shengxiao
				}
				var h = new U(new Date());
				Y.style.visibility = (j == h.solarYear && g == h.solarMonth) ? "hidden"
						: "visible"
			}
			function Z() {
				var g = new U(new Date());
				a(g);
				b(g);
				Q.init(g);
				N.draw();
				Y.style.visibility = "hidden"
			}
			function d(k, g) {
				for ( var j = 1901; j < 2050; j++) {
					var h = R("OPTION");
					h.value = j;
					h.innerHTML = j;
					if (j == k) {
						h.selected = "selected"
					}
					C.appendChild(h)
				}
				for ( var j = 1; j < 13; j++) {
					var h = R("OPTION");
					h.value = j;
					h.innerHTML = j;
					if (j == g) {
						h.selected = "selected"
					}
					X.appendChild(h)
				}
				C.onchange = f;
				X.onchange = f
			}
			function e(g) {
				d(g.solarYear, g.solarMonth);
				G.innerHTML = g.ganzhiYear;
				c.innerHTML = g.shengxiao;
				Y.onclick = Z;
				Y.style.visibility = "hidden"
			}
			return {
				init : function(g) {
					e(g)
				},
				reset : function(g) {
					b(g)
				}
			}
		})();
		var N = (function() {
			function C() {
				var Z = Q.getJson();
				var c = Z.dateArray;
				M("cm").style.height = Z.lines * 38 + 2 + "px";
				M("cm").innerHTML = "";
				for ( var a = 0; a < c.length; a++) {
					if (c[a] == null) {
						continue
					}
					var X = R("DIV");
					if (c[a].isToday) {
						X.style.border = "1px solid #a5b9da";
						X.style.background = "#c1d9ff"
					}
					X.className = "cell";
					X.style.left = (a % 7) * 60 + "px";
					X.style.top = Math.floor(a / 7) * 38 + 2 + "px";
					var b = R("DIV");
					b.className = "so";
					// http://www.CsrCode.Cn
					b.style.color = ((a % 7) > 4 || c[a].isRest) ? "#c60b02"
							: "#313131";
					b.innerHTML = c[a].solarDate;
					X.appendChild(b);
					var Y = R("DIV");
					Y.style.color = "#666";
					Y.innerHTML = c[a].showInLunar;
					X.appendChild(Y);
					X.onmouseover = (function(d) {
						return function(f) {
							F.show({
								dateIndex : d,
								cell : this
							})
						}
					})(a);
					X.onmouseout = function() {
						F.hide()
					};
					M("cm").appendChild(X)
				}
				var G = R("DIV");
				G.id = "fd";
				M("cm").appendChild(G);
				F.init(G)
			}
			return {
				draw : function(G) {
					C(G)
				}
			}
		})();
		var F = (function() {
			var C;
			function Y(e, c) {
				if (arguments.length > 1) {
					var b = /([.*+?^=!:${}()|[\]\/\\])/g, Z = "{".replace(b,
							"\\$1"), d = "}".replace(b, "\\$1");
					var a = new RegExp("#" + Z + "([^" + Z + d + "]+)" + d, "g");
					if (typeof (c) == "object") {
						return e.replace(a, function(f, h) {
							var g = c[h];
							return typeof (g) == "undefined" ? "" : g
						})
					}
				}
				return e
			}
			function G(b) {
				var a = Q.getJson().dateArray[b.dateIndex];
				var Z = b.cell;
				var c = "#{solarYear} 年 #{solarMonth} 月 #{solarDate} 日 #{solarWeekDayInChinese}";
				c += "<br><b>农历 #{lunarMonthInChinese}月#{lunarDateInChinese}</b>";
				c += "<br>#{ganzhiYear}年 #{ganzhiMonth}月 #{ganzhiDate}日";
				if (a.solarFestival != "" || a.lunarFestival != ""
						|| a.jieqi != "") {
					c += "<br><b>#{lunarFestival} #{solarFestival} #{jieqi}</b>"
				}
				C.innerHTML = Y(c, a);
				C.style.top = Z.offsetTop + Z.offsetHeight - 5 + "px";
				C.style.left = Z.offsetLeft + Z.offsetWidth - 5 + "px";
				C.style.display = "block"
			}
			function X() {
				C.style.display = "none"
			}
			return {
				show : function(Z) {
					G(Z)
				},
				hide : function() {
					X()
				},
				init : function(Z) {
					C = Z
				}
			}
		})();
		var A = new U(new Date());
		if (S) {
			window.attachEvent("onload", function() {
				W.reset(A)
			})
		}
		W.init(A);
		Q.init(A);
		N.draw();
	})();
//-->
</script>