function c$(sId) { if (sId == "") return null; return document.getElementById(sId); } function cnCalendar() { var _calendar_obj = null; var outfunc = null; var reciever; var curDate = null; var startDate = null; var endDate = null; var today = new Date(); var y = today.getFullYear(); var m = today.getMonth() + 1; this.daysInMonth = function(y, m) { switch (m) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; case 4: case 6: case 9: case 11: return 30; case 2: if (y % 4 != 0) { return 28; } if (y % 100 == 0) { return y % 400 == 0 ? 29 : 28; } return 29; } } //Generate Codes this.generateCalendarTable = function() { var gy, gm, gd; if (reciever.value) { var sDate = new Date(Date.parse(reciever.value.replace(/-/g, "/"))); gy = sDate.getFullYear(); gm = sDate.getMonth() + 1; gd = sDate.getDate(); } var i; var j = new Date(y, m - 1, 1).getDay(); var k = this.daysInMonth(y, m); var body = ''; //Frame Table Header body += ""; body += " "; body += " "; body += " "; //Calendar Table Header body += " "; body += " "; body += " "; body += " "; body += " "; body += " "; body += " "; body += " "; body += " "; if (j != 0) { body += ""; body += (""); } for (i = 1; i <= k; i++) { if ((i + j) % 7 == 1) { body += ""; } body += ""); } } if ((i + j) % 7 != 0) { body += (""); body += (""); } if (j < (36 - k)) { body += (""); } if (j == 0 && k == 28) { body += (""); } body += "" body += "
"; body += " "; body += " "; body += " "; body += " "; body += " "; body += " "; body += "
" + y + "年" + m + "月
"; body += "
"; if ((i + j) % 7 == 0) { body += ("
 
 
今天  清空
"; return body; } this.loadPreviousYear = function() { y--; _calendar_obj.innerHTML = this.generateCalendarTable(); } this.loadNextYear = function() { y++; _calendar_obj.innerHTML = this.generateCalendarTable(); } this.loadPreviousMonth = function() { m--; if (m < 1){m = 12;y--;} _calendar_obj.innerHTML = this.generateCalendarTable(); } this.loadNextMonth = function() { m++; if (m > 12) { m = 1; y++; } _calendar_obj.innerHTML = this.generateCalendarTable(); } this.changeYear = function(year) { y = parseInt(year.replace("年", "")); _calendar_obj.innerHTML = this.generateCalendarTable(); } this.changeMonth = function(month) { m = parseInt(month.replace("月", "")); _calendar_obj.innerHTML = this.generateCalendarTable(); } this.getAbsolutePosition = function(element) { var point = { x: element.offsetLeft, y: element.offsetTop }; if (element.offsetParent) { var parentPoint = this.getAbsolutePosition(element.offsetParent); point.x += parentPoint.x; point.y += parentPoint.y; } return point; }; this.initValue = function(isCur, start, end) { curDate = null; startDate = null; endDate = null; if (isCur) curDate = new Date(); if (start != "" && $(start) && c$(start).value != "") startDate = new Date(Date.parse(c$(start).value.replace(/-/g, "/"))); if (end != "" && $(end) && c$(end).value != "") endDate = new Date(Date.parse(c$(end).value.replace(/-/g, "/"))); } this.disabledDate = function(my, mm, md) { var sTime = new Date(my, mm - 1, md); var bl = false; if (curDate != null && sTime < curDate) return true; if (startDate != null && sTime < startDate) return true; if (endDate != null && sTime > endDate) return true; return bl; } this.setHook = function (obj, isCur, start, end, func) { var dateField = obj.previousSibling; if (dateField.disabled) return; reciever = dateField; if (func) outfunc = func; this.initValue(isCur, start, end); _calendar_obj = c$("calendar_div") if (!_calendar_obj) { var divObj = document.createElement("div"); divObj.id = "calendar_div"; divObj.style.position = "absolute"; divObj.style.styleFloat = "left"; divObj.style.display = "none"; divObj.style.zIndex = "999999"; document.body.appendChild(divObj); _calendar_obj = divObj; } //没有隐藏则隐藏 if (_calendar_obj.style.display != 'none' && reciever == dateField) { _calendar_obj.style.display = 'none'; return; } //定位 var point = this.getAbsolutePosition(dateField); var cw = 192; var allw = document.body.offsetWidth; var lx = point.x + dateField.offsetWidth; if (lx + cw > allw) { lx = lx - cw; } _calendar_obj.style.left = lx + 'px'; _calendar_obj.style.top = point.y + 10 + 'px'; //有值 if (reciever.value) { var tmpDate = new Date(Date.parse(reciever.value.replace(/-/g, "/"))); y = tmpDate.getFullYear(); m = tmpDate.getMonth() + 1; } _calendar_obj.innerHTML = this.generateCalendarTable(); _calendar_obj.style.display = ""; } this.fadeOut = function () { if (_calendar_obj) { _calendar_obj.style.display = 'none'; } } this.toDay = function() { var date = GetCurDate(); reciever.value = date.getFullYear() + "-" + this.getZeroNum(date.getMonth() + 1) + "-" + this.getZeroNum(date.getDate()); if (outfunc)eval(outfunc); this.fadeOut(); } this.setValue = function(date) { reciever.value = date; if (outfunc) eval(outfunc); this.fadeOut(); } this.getZeroNum = function(mon) { if (mon < 10) return "0"+mon; else return mon; } this.changeYearMonth = function(obj, sType) { obj.style.display = "none"; var str = obj.innerHTML; if (sType == "year") { c$("changeCMonth").style.display = "none"; c$("changeCYear").style.display = ""; c$("spanCMonth").style.display = ""; if (c$("changeCYear").innerHTML == "") { var yearObj = document.createElement("select"); yearObj.setAttribute("author", "outclick"); yearObj.setAttribute("date", "year"); if (yearObj.addEventListener) { yearObj.addEventListener("change", function(e) { changeValueCalendar(this, "year") }, false); } else { yearObj.attachEvent("onchange", function(e) { changeValueCalendar(yearObj, "year") }, false); } var i = 0; for (yNum = 1949; yNum <= 2050; yNum++) { var opt = new Option(yNum + "年", yNum + "年"); opt.setAttribute("author", "outclick"); opt.setAttribute("date", "month"); yearObj.options.add(opt); if (str.indexOf(yNum) != -1) yearObj.selectedIndex = i; i++; } c$("changeCYear").appendChild(yearObj); } else { var ci = 0; for (var yNum = 1949; yNum <= 2050; yNum++) { if (str.indexOf(yNum) != -1) { c$("changeCYear").childNodes[0].selectedIndex = ci; break; } ci++; } } } else { c$("changeCYear").style.display = "none"; c$("changeCMonth").style.display = ""; c$("spanCYear").style.display = ""; if (c$("changeCMonth").innerHTML == "") { var monthObj = document.createElement("select"); monthObj.setAttribute("author", "outclick"); monthObj.setAttribute("date", "month"); if (monthObj.addEventListener) { monthObj.addEventListener("change", function() { changeValueCalendar(this, "month") }, false); } else { monthObj.attachEvent("onchange", function() { changeValueCalendar(monthObj, "month") }, false); } for (var mNum = 1; mNum <= 12; mNum++) { var mopt = new Option(mNum + "月", mNum + "月"); mopt.setAttribute("author", "outclick"); mopt.setAttribute("date", "month"); monthObj.options.add(mopt); if (str.indexOf(mNum + "月") != -1) { monthObj.selectedIndex = mNum - 1; } } c$("changeCMonth").appendChild(monthObj); } else { for (var cmNum = 1; cmNum <= 12; cmNum++) { if (str.indexOf(cmNum + '月') != -1) monthObj.selectedIndex = cmNum; } } } } } function changeValueCalendar(obj, sType) { if(sType=="year"){ c$("spanCYear").innerHTML=obj.value; c$("spanCYear").style.display = ""; c$("changeCYear").style.display = "none"; calendar.changeYear(obj.value); } else { c$("spanCMonth").innerHTML=obj.value; c$("spanCMonth").style.display = ""; c$("changeCMonth").style.display = "none"; calendar.changeMonth(obj.value); } } function hideCalendar(event) { event = (event == null) ? window.event : event; var srcelement = event.target ? event.target : event.srcElement; if (srcelement.getAttribute("author") != null && srcelement.getAttribute("date")==null) { if (c$("changeCYear").style.display == "") { c$("spanCYear").style.display = ""; c$("changeCYear").style.display = "none"; } if (c$("changeCMonth").style.display == "") { c$("spanCMonth").style.display = ""; c$("changeCMonth").style.display = "none"; } }else { if (srcelement.getAttribute("author") == null && srcelement.className.indexOf("shortbtn") == -1) { calendar.fadeOut(); } } } var calendar = new cnCalendar(); window.onload = function() { if (document.addEventListener) { document.addEventListener("click", function(e) { hideCalendar(e) }, false); } else { document.attachEvent("onclick", function(e) { hideCalendar(e) }, false); } }