showCalendar(snongli,sInput,soutput,sStartD,sEndD,sStartDate)
//1.snongli是否是农历,
//2.sInput日历弹出位置的控件的名称,
//3.soutput取得日期的控件名称,
//4.sStartD开始有效时间,
//5.sEndD截至有效时间,
//6.sStartDate,为农历里存放相应公历的控件名
本日历显示的日期范围为(如果超过界限会自动转到当前年份):
公历不限,农历1900.1-2100.12(公历时间)
调用示例:
公历:<input name="cc" type="text" id="cc" value="" onClick="javascript:showCalendar(false,'cc','cc','1004-08-2','2500-01-29',null)">
农历:<input name="dd" type="text" id="dd" value="" onClick="javascript:showCalendar(true,'dd','dd','1978-08-1','2100-01-29','ee')"><input name="ee" type="hidden" value="2100-12-07" />
//JS源文件====================================================
//==================================================== WEB 页面显示部分 开始=====================================================
//----------------------------------------------------------------------
//转发时请保留此声明信息,这段声明不并会影响你的速度!
//******************* AZhong的WEB日历(公历、农历) V1.0 *********************************
//作者:AZhong(阿钟)
//网站:http://azhong.szbangong.com
//电子邮件:wcbm@163.com
//QQ:184258447
//版权声明:版权所有,源代码公开,各种用途均可免费使用,但是修改后必须把修改后的文件
//发送一份给作者.
//***********************************************************************
var strFrame,yy,mm,today,CFrame; //CFrame存放日历层的HTML代码
today = new Date();
yy=today.getFullYear();
mm=today.getMonth();
today.setHours(0);today.setMinutes(0);today.setSeconds(0);today.setMilliseconds(0);
document.writeln('<div id="azhongDateLayer" name="azhongDateLayer" Author="azhong" style="position:absolute;width:146px; height:198px;display:none;z-index: 1;"> 222</div>');
strFrame = '<style>';
strFrame += 'body{text-decoration:none;}';
strFrame += 'body{padding: 0pt 0pt 0pt;}';
strFrame += 'body{margin: 0pt 0pt 0pt;}';
strFrame += 'a {text-decoration: none;font-weight: bold;color:#000000;}';
strFrame += 'a:link {text-decoration: none;font-weight: bold;color:#000000;}';
strFrame += 'a:hover {text-decoration: none;font-weight: bold;color:#000000;}';
strFrame += 'a:active {text-decoration: none;font-weight: bold;color:#000000;}';
strFrame += 'input.button{BORDER-RIGHT: #cdcdcd 1px solid;BORDER-TOP: #cdcdcd 1px solid;BORDER-LEFT: #cdcdcd 1px solid;';
strFrame += 'BORDER-BOTTOM: #cdcdcd 1px solid;BACKGROUND-COLOR: #EFEFEF;font-family:宋体;}';
strFrame += 'td{FONT-SIZE: 9px;font-family:宋体; TEXT-ALIGN: center;text-decoration:none;}';
strFrame += '.title {FONT-SIZE: 12px;text-decoration:none;}';
strFrame += '</style>';
/*strFrame = '';*/
strFrame += '<table id=tbl0 width=100% height=100% border=1 align=center cellpadding=0 cellspacing=0 bordercolor=#cdcdcd bgcolor=#cdcdcd Author="azhong">';
strFrame += '<tr Author="azhong">';
strFrame += '<td width=100% height=18 bgcolor=#FFFFFF><table border=0 cellspacing=1 cellpadding=0 width=100% height=18 Author="azhong">';
strFrame += '<tr align=center Author="azhong">';
strFrame += '<td width=12% align=center bgcolor=#cdcdcd style="font-size:12px;cursor: hand;color: #EFEFEF" οnclick="javascript:redraw(0,-1);" title="向前翻 1 月" Author="azhong"><b Author="azhong"><</b> </td>';
strFrame += '<td width="43%" align=center style="font-size:12px;cursor:default" οnmοuseοver="style.backgroundColor=/'#cdcdcd/'" οnmοuseοut="style.backgroundColor=/'#EFEFEF/'" οnfοcus="javascript:WriteSelect(t_yy,t_yy.innerText.split(/'年/')[0],/'y/');" title="点击这里选择年份" id="t_yy" Author="azhong"></td>';
strFrame += '<td Author="azhong"><span id=yy_nongli style="font-size:12px;cursor:default" Author="azhong"></span></td>';
strFrame += '<td width="33%" align=center style="font-size:12px;cursor:default" οnmοuseοver="style.backgroundColor=/'#cdcdcd/'" οnmοuseοut="style.backgroundColor=/'#EFEFEF/'" οnfοcus="javascript:WriteSelect(t_mm,t_mm.innerText.split(/'月/')[0],/'m/');" title="点击这里选择月份" id="t_mm" Author="azhong"></td>';
strFrame += '<td width="12%" bgcolor=#cdcdcd align=center style="font-size:12px;cursor: hand;color: #EFEFEF" οnclick="javascript:redraw(0,1);" title="向后翻 1 月" Author="azhong"><b Author="azhong">></b></td>';
strFrame += '</tr>';
strFrame += '</table></td>';
strFrame += '</tr>';
strFrame += '<tr Author="azhong">';
strFrame += '<td width="100%" height=18><table border=1 cellspacing=0 cellpadding=0 bgcolor=#cdcdcd BORDERCOLORLIGHT=#cdcdcd BORDERCOLORDARK=#FFFFFF width="100%" height=20 style="cursor:default" Author="azhong">';
strFrame += '<tr align=center valign=bottom Author="azhong">';
strFrame += '<td style="font-size:12px;color:red" Author="azhong">日</td>';
strFrame += '<td style="font-size:12px;color:#FFFFFF" Author="azhong">一</td>';
strFrame += '<td style="font-size:12px;color:#FFFFFF" Author="azhong">二</td>';
strFrame += '<td style="font-size:12px;color:#FFFFFF" Author="azhong">三</td>';
strFrame += '<td style="font-size:12px;color:#FFFFFF" Author="azhong">四</td>';
strFrame += '<td style="font-size:12px;color:#FFFFFF" Author="azhong">五</td>';
strFrame += '<td style="font-size:12px;color:#00CC00" Author="azhong">六</td>';
strFrame += '</tr>';
strFrame += '</table></td>';
strFrame += '</tr>';
strFrame += '<tr Author="azhong">';
strFrame += '<td width="100%" height=120><TABLE border=1 cellspacing=2 cellpadding=0 bordercolorlight=#cdcdcd bordercolordark=#FFFFFF bgcolor=#EFEFEF width="100%" height=120 id="rilibody" Author="azhong">';
for(i=0;i<6;i++){
strFrame +='<tr Author="azhong">';
for(j=1;j<=7;j++)strFrame +="<td id=d"+(i*7+j)+" style='font-size:12px;' align=center οnclick=tdClick(this) Author=azhong></td>";
strFrame +="</tr>";
}
strFrame += '</TABLE></td>';
strFrame += '</tr>';
strFrame += '<tr Author="azhong">';
strFrame += '<td Author="azhong"><table border=0 cellspacing=1 cellpadding=0 width="100%" Author="azhong" bgcolor=#FFFFFF>';
strFrame += '<tr Author="azhong">';
strFrame += '<td align=left Author="azhong"><input type=button class=button value="<<" title="向前翻 1 年" οnclick="redraw(-1,0);" οnfοcus="this.blur()" style="font-size: 12px; height: 18px" Author="azhong">';
strFrame += '<input class=button title="向前翻 1 月" type=button value="< " οnclick="redraw(0,-1);" οnfοcus="this.blur()" style="font-size: 12px; height: 18px" Author="azhong"></td>';
strFrame += '<td align=center Author="azhong"><input type=button class=button value="今 天" οnclick="getnow();" οnfοcus="this.blur()" title="当前日期" style="font-size: 12px; height: 18px; cursor:hand" id="changnow" Author="azhong"></td>';
strFrame += '<td align=right><input type=button class=button value=" >" οnclick="redraw(0,1);" οnfοcus="this.blur()" title="向后翻 1 月" style="font-size: 12px; height: 18px" Author="azhong">';
strFrame += '<input type=button class=button value=">>" title="向后翻 1 年" οnclick="redraw(1,0);" οnfοcus="this.blur()" style="font-size: 12px; height: 18px" Author="azhong"></td>';
strFrame += '</tr>';
strFrame += '</table></td>';
strFrame += '</tr>';
strFrame += '</table>';
document.getElementById("azhongDateLayer").innerHTML=strFrame;
CFrame = document.getElementById("azhongDateLayer");
var nongli,inputname,outputname,startname,curday,Tstart,Tend
//==================================================== WEB 页面显示部分 结束=====================================================
function showCalendar(snongli,sInput,soutput,sStartD,sEndD,sStartDate)
{
//1.snongli是否是农历,
//2.sInput日历弹出位置的控件的名称,
//3.soutput取得日期的控件名称,
//4.sStartD开始有效时间,
//5.sEndD截至有效时间,
//6.sStartDate,为农历里存放相应公历的控件名
nongli = snongli;
inputname = document.getElementById(sInput);
outputname = document.getElementById(soutput);
startname = document.getElementById(sStartDate);
Tstart = new Date(sStartD.split('-')[0],sStartD.split('-')[1]-1,sStartD.split('-')[2],0,0,0,0);
a = new Date(2005,7,5);
Tend = new Date(sEndD.split('-')[0],sEndD.split('-')[1]-1,sEndD.split('-')[2],0,0,0,0);
if(CFrame.style.display=="block"){CFrame.style.display="none";return;}
var eT=0,eL=0,p=inputname;
var sT=document.body.scrollTop,sL=document.body.scrollLeft;
var eH=p.height,eW=p.width;
//如果是农历,则默认日期为隐藏文件输入框的值,否则(如果输出框内的值为空则取当前日期)
if (startname)
{curday=new Date(startname.value.split('-')[0],startname.value.split('-')[1]-1,startname.value.split('-')[2],0,0,0,0);}
else if(outputname.value=="")
curday=today;
else
curday=new Date(outputname.value.split('-')[0],outputname.value.split('-')[1]-1,outputname.value.split('-')[2],0,0,0,0);
yy = curday.getFullYear();
mm = curday.getMonth();
if(yy<1900||yy>2500){yy=today.getFullYear();mm=today.getMonth();}
var ttop = inputname.offsetTop; //TT控件的定位点高
var thei = inputname.clientHeight; //TT控件本身的高
var tleft = inputname.offsetLeft; //TT控件的定位点宽
var ttyp = inputname.type; //TT控件的类型
while (inputname = inputname.offsetParent){ttop+=inputname.offsetTop; tleft+=inputname.offsetLeft;}
CFrame.style.top = ((ttyp=="image")? ttop+thei : ttop+thei+6)+'px';
CFrame.style.left = tleft+'px';
CFrame.style.display="block";
drawCalendar(yy,mm);
}
function hideCalendar()
{
CFrame.style.display="none";
}
//====================================================日历显示部分 开始=====================================================
function drawCalendar(y,m)//画日历
{
if (nongli&&(y>2100||y<1901)){y=today.getFullYear();}
var x=new Date(y,m,1),mv=x.getDay(),d=x.getDate(),de;
//x为当月的1号,mv为1号为周几
yy=x.getFullYear();mm=x.getMonth();
document.getElementById("t_yy").innerHTML=yy+"年";
document.getElementById("t_mm").innerHTML=(mm+1)+"月";
//清空日历
for(var i=1;i<=mv;i++)
{
de = eval("document.getElementById('d"+i+"')");
de.innerHTML="";
de.bgColor="";
}
//画日历
if (!nongli)
{ CFrame.style.width='146px';CFrame.style.height='198px';document.getElementById("rilibody").height='130px';document.getElementById("yy_nongli").innerText="";document.getElementById("changnow").value="今天";
}
else {CFrame.style.width='244px';CFrame.style.height='264px';document.getElementById("rilibody").height='196px';document.getElementById("yy_nongli").width="17%";document.getElementById("yy_nongli").innerText=FormatLunarYear(yy);
document.getElementById("t_yy").width="34%";document.getElementById("t_mm").width="25%";
document.getElementById("yy_nongli").title="农历"+FormatLunarYear(yy);
document.getElementById("changnow").value=" 今 天 ";
}
var totaldate = new Date(y,m+1,0);
var z,dayi=1;
while(dayi<(totaldate.getDate()+1))
{
z = new Date(yy,mm,dayi);
de = eval("document.getElementById('d"+(dayi+mv)+"')");
if(z.getTime()==today.getTime())
de.bgColor="#00CC00";
else{
if(z.getTime()==curday.getTime())
de.bgColor="#FFD700";
else
de.bgColor="#e0e0e0";
}
if(z.getTime()==today.getTime())
{//如果为当前日期
if (z.getTime()>Tstart.getTime()&Tend.getTime()>z.getTime())
de.innerHTML="<a href=javascript:setDate("+dayi+");><font color=red>"+dayi+cnongli(yy,mm+1,dayi)+"</font></a>";
else
de.innerHTML="<font color=red><b>"+dayi+cnongli(yy,mm+1,dayi)+"</b></font>";
}
else if (z.getTime()>Tstart.getTime()&Tend.getTime()>z.getTime())
{//开始日期后结束日期前的显示
de.innerHTML="<a href=javascript:setDate("+dayi+"); class=bt><font color=#0066FF>"+dayi+cnongli(yy,mm+1,dayi)+"</font></a>";
}
else
{//开始日期前结束日期后的显示
de.innerHTML="<font color=#888888>"+dayi+cnongli(yy,mm+1,dayi)+"</font>";
}
dayi++;
}
while(dayi+mv<=42)
{
de = eval("document.getElementById('d"+(dayi+mv)+"')");
de.innerHTML="";
de.bgColor="";
dayi++;
}
}
//====================================================日历显示部分 结束=====================================================
//====================================================日历修改部分 开始=====================================================
function redraw(y,m){
drawCalendar(yy+y,mm+m);
}
function HiddSelect(obj,values){
if (obj==1)
document.getElementById("t_yy").innerHTML = values+"年";
else
document.getElementById("t_mm").innerHTML = values+"月";
}
function WriteSelect(obj,values,action){
if(values=="")return;
var StrArray=[],year;
if(action=="y"){
for(var i=0;i<101;i++){
year=values-50+i;
if(!((year<1901||year>2100)&&nongli)){
StrArray[i]="<option value='"+year+"'"+(values==year?"selected":"")+" Author='azhong'>"+year+"年</option>/n";}
}
obj.innerHTML="<select id='select1' Author='azhong' style='width:67px;height:15px;margin-bottom:-5px' οnchange='drawCalendar(Math.floor(this.value),"+mm+");' οnblur='HiddSelect(1,this.value);document.all.select1.style.display=/"none/"'>/n"+StrArray.join("")+"</select>";
document.getElementById("select1").focus();
}
if(action=="m"){
for(var i=1;i<13;i++){StrArray[i]="<option value='"+i+"'"+(i==values?"selected":"")+" Author='azhong'>"+i+"月</option>/n";}
obj.innerHTML="<select id='select2' style='width:47;height:15px;margin-bottom:-5px' Author='azhong' οnchange='drawCalendar("+yy+",Math.floor(this.value)-1);' οnblur='HiddSelect(2,this.value);'>/n"+StrArray+"</select>";
document.getElementById("select2").focus();
}
}
function getnow(){
var now=new Date();
drawCalendar(now.getYear(),now.getMonth());
}
function tdClick(td){
var v=td.innerText.split('/n')[0];
var td_v=td.innerHTML.replace('/n','<br>');
var replen=td_v.replace('setDate','').length;
if(replen!=td_v.length){setDate(Math.floor(v));}
}
//====================================================日历修改部分 结束=====================================================
//====================================================设置日期部分 结束=====================================================
function setDate(d)//设置日期
{
hideCalendar();
var mmm;
mmm=mm+1>9?mm+1:"0"+(mm+1);
var dstr=yy+"-"+(mmm)+"-"+(d>9?d:"0"+d);
if (nongli)
outputname.value=setnongli(dstr);
else
outputname.value=dstr;
if (startname){startname.value=dstr;}
if (Tstart){Tstart.value=dstr;}
}
//====================================================设置日期部分 结束=====================================================
//====================================================农历显示部分 开始=====================================================
var NongliData=new Array("19416","19168","42352","21717","53856","55632","21844","22191","39632","21970","19168","42422","42192","53840","53909","46415","54944","44450","38320","18807","18815","42160","46261","27216","27968","43860","11119","38256","21234","18800","25958","54432","59984","27285","23263","11104","34531","37615","51415","51551","54432","55462","46431","22176","42420","9695","37584","53938","43344","46423","27808","46416","21333","19887","42416","17779","21183","43432","59728","27296","44710","43856","19296","43748","42352","21088","62051","55632","23383","22176","38608","19925","19152","42192","54484","53840","54616","46400","46752","38310","38335","18864","43380","42160","45690","27216","27968","44870","43872","38256","19189","18800","25776","29859","59984","27480","23232","43872","38613","37600","51552","55636","54432","55888","30034","22176","43959","9680","37584","51893","43344","46240","47780","44368","21977","19360","42416","20854","21183","43312","31060","27296","44368","23378","19296","42726","42208","53856","60005","54576","23200","30371","38608","19195","19152","42192","53430","53855","54560","56645","46496","22224","21938","18864","42359","42160","43600","45653","27951","44448","19299","37759","18936","18800","25776","26790","59999","27424","42692","43759","37600","53987","51552","54615","54432","55888","23893","22176","42704","21972","21200","43448","43344","46240","46758","44368","21920","43940","42416","21168","45683","26928","29495","27296","44368","19285","19311","42352","21732","53856","59752","54560","55968","27302","22239","19168","43476","42192","53584","62034","54560");
function lYearDays(y) {
var i, sum = 348;
for(i=0x8000; i>0x8; i>>=1) sum += (NongliData[y-1900] & i)? 1: 0;
return(sum+leapDays(y));
}
function leapMonth(y) {
var lm = NongliData[y-1900] & 0xf;
return(lm==0xf?0:lm);
}
function leapDays(y) {
if(leapMonth(y)) return( (NongliData[y-1899]&0xf)==0xf? 30: 29);
else return(0);
}
function monthDays(y,m) {
if(y==1899&&m==12){return 30;}
return( (NongliData[y-1900] & (0x10000>>m))? 30: 29 )
}
function Lunar(objDate) {
var i, leap=0, temp=0;
var offset = (Date.UTC(objDate.getFullYear(),objDate.getMonth(),objDate.getDate()) - Date.UTC(1900,0,31))/86400000;
for(i=1900; i<2100 && offset>0; i++) {
temp=lYearDays(i); offset-=temp;
}
if(offset<0) {
offset+=temp; i--;
}
this.year = i;
leap = leapMonth(i);
this.isLeap = false;
for(i=1; i<13 && offset>0; i++) {
if(leap>0 && i==(leap+1) && this.isLeap==false) {
--i;
this.isLeap = true;
temp = leapDays(this.year);
} else {
temp = monthDays(this.year, i);
}
if(this.isLeap==true && i==(leap+1)) this.isLeap = false;
offset -= temp;
}
if(offset==0 && leap>0 && i==leap+1)
if(this.isLeap){
this.isLeap = false;
} else {
this.isLeap = true; --i;
}
if(offset<0){
offset += temp; --i;
}
this.month = i;
this.day = offset + 1;
}
// 将农历iLunarYear年格式化成天干地支记年法表示的字符串
function FormatLunarYear(iLunarYear)
{
var szText1 = new String("甲乙丙丁戊己庚辛壬癸");
var szText2 = new String("子丑寅卯辰巳午未申酉戌亥");
var strYear;
strYear = szText1.substr((iLunarYear - 4) % 10, 1);
strYear = strYear + szText2.substr((iLunarYear - 4) % 12, 1);
return strYear + "年";
}
// 将农历iLunarMonth月格式化成农历表示的字符串
function FormatLunarMonth(iLunarMonth)
{
var szText = new String("正二三四五六七八九十");
var strMonth;
if (iLunarMonth <= 10)
{
strMonth = szText.substr(iLunarMonth - 1, 1);
}
else if (iLunarMonth == 11) strMonth = "十一";
else strMonth = "十二";
return strMonth + "月";
}
// 将农历iLunarDay日格式化成农历表示的字符串
function FormatLunarDay(iLunarDay)
{
var szText1 = new String("初十廿三");
var szText2 = new String("一二三四五六七八九十");
var strDay;
if ((iLunarDay != 20) && (iLunarDay != 30))
{
strDay = szText1.substr((iLunarDay - 1) / 10, 1) + szText2.substr((iLunarDay - 1) % 10, 1);
}
else if (iLunarDay != 20)
{
strDay = szText1.substr(iLunarDay / 10, 1) + "十";
}
else
{
strDay = "二十";
}
return strDay;
}
function cnongli(stry,strm,strd){
var sDObj, lDObj,strl
sDObj = new Date(stry,strm-1,strd,0,0,0,0);
lDObj = new Lunar(sDObj);
if (lDObj.day!=1)
strl = "<br>"+FormatLunarDay(lDObj.day);
else
strl = "<br>"+FormatLunarMonth(lDObj.month);
if (!nongli){strl = "";}
return strl;
}
function setnongli(strdate){
var sDObj, lDObj,strl,stry,strm,strd,d,a
a = strdate.split("-");
sDObj = new Date(a[0],a[1]-1,a[2],0,0,0,0);
lDObj = new Lunar(sDObj);
if (nongli){
strl = FormatLunarYear(lDObj.year);
strl = strl+FormatLunarMonth(lDObj.month);
strl = strl+FormatLunarDay(lDObj.day);}
else
strl = strdate;
return strl;
}
function document.onkeyup() //按Esc键关闭,切换焦点关闭
{
if (window.event.keyCode==27){
hideCalendar();
}
else if(document.activeElement)
if(document.activeElement.getAttribute("Author")==null && document.activeElement != outputname)
{
hideCalendar();
}
}
function document.onclick() //任意点击时关闭该控件 //ie6的情况可以由下面的切换焦点处理代替
{
with(window.event)
{ if (srcElement.getAttribute("Author")==null && srcElement != CFrame && srcElement != outputname)
hideCalendar();
}
}