
 
//==== \u4f20\u5165 offset \u4f20\u56de\u5e72\u652f, 0=\u7532\u5b50
function cyclical(num) { return(Gan[num%10]+Zhi[num%12])}

//==== \u4f20\u56de\u519c\u5386 y\u5e74\u7684\u603b\u5929\u6570
function lYearDays(y) {
   var i, sum = 348
   for(i=0x8000; i>0x8; i>>=1) sum += (lunarInfo[y-1900] & i)? 1: 0
   return(sum+leapDays(y))
}

//==== \u4f20\u56de\u519c\u5386 y\u5e74\u95f0\u6708\u7684\u5929\u6570
function leapDays(y) {
   if(leapMonth(y))  return((lunarInfo[y-1900] & 0x10000)? 30: 29)
   else return(0)
}

//==== \u4f20\u56de\u519c\u5386 y\u5e74\u95f0\u54ea\u4e2a\u6708 1-12 , \u6ca1\u95f0\u4f20\u56de 0
function leapMonth(y) { return(lunarInfo[y-1900] & 0xf)}

//====================================== \u4f20\u56de\u519c\u5386 y\u5e74m\u6708\u7684\u603b\u5929\u6570
function monthDays(y,m) { return( (lunarInfo[y-1900] & (0x10000>>m))? 30: 29 )}

//==== \u7b97\u51fa\u519c\u5386, \u4f20\u5165\u65e5\u671f\u7269\u4ef6, \u4f20\u56de\u519c\u5386\u65e5\u671f\u7269\u4ef6
//     \u8be5\u7269\u4ef6\u5c5e\u6027\u6709 .year .month .day .isLeap .yearCyl .dayCyl .monCyl
function Lunar(objDate) {
   var i, leap=0, temp=0
   var baseDate = new Date(1900,0,31)
   var offset   = (objDate - baseDate)/86400000

   this.dayCyl = offset + 40
   this.monCyl = 14

   for(i=1900; i<2050 && offset>0; i++) {
      temp = lYearDays(i)
      offset -= temp
      this.monCyl += 12
   }
   if(offset<0) {
      offset += temp;
      i--;
      this.monCyl -= 12
   }

   this.year = i
   this.yearCyl = i-1864

   leap = leapMonth(i) //\u95f0\u54ea\u4e2a\u6708
   this.isLeap = false

   for(i=1; i<13 && offset>0; i++) {
      //\u95f0\u6708
      if(leap>0 && i==(leap+1) && this.isLeap==false)
         { --i; this.isLeap = true; temp = leapDays(this.year); }
      else
         { temp = monthDays(this.year, i); }

      //\u89e3\u9664\u95f0\u6708
      if(this.isLeap==true && i==(leap+1)) this.isLeap = false

      offset -= temp
      if(this.isLeap == false) this.monCyl ++
   }

   if(offset==0 && leap>0 && i==leap+1)
      if(this.isLeap)
         { this.isLeap = false; }
      else
         { this.isLeap = true; --i; --this.monCyl;}

   if(offset<0){ offset += temp; --i; --this.monCyl; }

   this.month = i
   this.day = offset + 1
}
var lunarInfo=new Array(
0x04bd8,0x04ae0,0x0a570,0x054d5,0x0d260,0x0d950,0x16554,0x056a0,0x09ad0,0x055d2,
0x04ae0,0x0a5b6,0x0a4d0,0x0d250,0x1d255,0x0b540,0x0d6a0,0x0ada2,0x095b0,0x14977,
0x04970,0x0a4b0,0x0b4b5,0x06a50,0x06d40,0x1ab54,0x02b60,0x09570,0x052f2,0x04970,
0x06566,0x0d4a0,0x0ea50,0x06e95,0x05ad0,0x02b60,0x186e3,0x092e0,0x1c8d7,0x0c950,
0x0d4a0,0x1d8a6,0x0b550,0x056a0,0x1a5b4,0x025d0,0x092d0,0x0d2b2,0x0a950,0x0b557,
0x06ca0,0x0b550,0x15355,0x04da0,0x0a5d0,0x14573,0x052d0,0x0a9a8,0x0e950,0x06aa0,
0x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0,
0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b5a0,0x195a6,
0x095b0,0x049b0,0x0a974,0x0a4b0,0x0b27a,0x06a50,0x06d40,0x0af46,0x0ab60,0x09570,
0x04af5,0x04970,0x064b0,0x074a3,0x0ea50,0x06b58,0x055c0,0x0ab60,0x096d5,0x092e0,
0x0c960,0x0d954,0x0d4a0,0x0da50,0x07552,0x056a0,0x0abb7,0x025d0,0x092d0,0x0cab5,
0x0a950,0x0b4a0,0x0baa4,0x0ad50,0x055d9,0x04ba0,0x0a5b0,0x15176,0x052b0,0x0a930,
0x07954,0x06aa0,0x0ad50,0x05b52,0x04b60,0x0a6e6,0x0a4e0,0x0d260,0x0ea65,0x0d530,
0x05aa0,0x076a3,0x096d0,0x04bd7,0x04ad0,0x0a4d0,0x1d0b6,0x0d250,0x0d520,0x0dd45,
0x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0)
var Animals=new Array("\u9f20","\u725b","\u864e","\u5154","\u9f99","\u86c7","\u9a6c","\u7f8a","\u7334","\u9e21","\u72d7","\u732a");
var Gan=new Array("\u7532","\u4e59","\u4e19","\u4e01","\u620a","\u5df1","\u5e9a","\u8f9b","\u58ec","\u7678");
var Zhi=new Array("\u5b50","\u4e11","\u5bc5","\u536f","\u8fb0","\u5df3","\u5348","\u672a","\u7533","\u9149","\u620c","\u4ea5");
var now = new Date();
var SY = now.getYear();
var SM = now.getMonth();
var SD = now.getDate();
 function YYMMDD(){ 
    var cl = '<font color="#0000df" STYLE="font-size:9pt;">'; 
    if (now.getDay() == 0) cl = '<font color="#c00000" STYLE="font-size:9pt;">'; 
    if (now.getDay() == 6) cl = '<font color="#00c000" STYLE="font-size:9pt;">';
    return(cl+SY+'\u5e74'+(SM+1)+'\u6708'+SD+'\u65e5</font>'); 
 }
 function weekday(){ 
    var day = new Array("\u661f\u671f\u65e5","\u661f\u671f\u4e00","\u661f\u671f\u4e8c","\u661f\u671f\u4e09","\u661f\u671f\u56db","\u661f\u671f\u4e94","\u661f\u671f\u516d");
    var cl = '<font color="#ff0000" STYLE="font-size:9pt;">'; 
    if (now.getDay() == 0) cl = '<font color="#c00000" STYLE="font-size:9pt;">';
    if (now.getDay() == 6) cl = '<font color="#00c000" STYLE="font-size:9pt;">'; 
    return(cl+ day[now.getDay()]+ '</font>'); 
 }
//==== \u4e2d\u6587\u65e5\u671f
function cDay(m,d){
 var nStr1 = new Array('\u65e5','\u4e00','\u4e8c','\u4e09','\u56db','\u4e94','\u516d','\u4e03','\u516b','\u4e5d','\u5341');
 var nStr2 = new Array('\u521d','\u5341','\u5eff','\u5345','\u3000');
 var day="";
 var month="";
 if (m>10){month = '\u5341'+nStr1[m-10]} else {month = nStr1[m]}// month += '\u6708'
 switch (d) {
  case 10:day += '\u521d\u5341'; break;
  case 20:day += '\u4e8c\u5341'; break;
  case 30:day += '\u4e09\u5341'; break;
  default:day += nStr2[Math.floor(d/10)]; day += nStr1[Math.floor(d%10)];
 }
 //alert("m="+m+" d="+nStr2[Math.floor(d/10)]);
 //alert("month="+month+" day="+day);
 return new monthAndDay(month,day);
}

function monthAndDay(month,day){
	this.month=month;
	this.day=day;
}

function getAnimal(year){
	return Animals[(year-4)%12];
}

 function solarDay1(){
    var sDObj = new Date(SY,SM,SD);
    var lDObj = new Lunar(sDObj);
    var cl = '<font color="violet" STYLE="font-size:9pt;">'; 
    
    var tt = '\u3010'+Animals[Math.floor((SY-4)%12)]+'\u3011'+cyclical(lDObj.monCyl)+'\u6708 '+cyclical(lDObj.dayCyl++)+'\u65e5' ;
    return(cl+tt+'</font>');
 }
 function solarDay2(){
    var sDObj = new Date(SY,SM,SD);
    var lDObj = new Lunar(sDObj);
    var cl = '<font color="#000066" STYLE="font-size:9pt;">'; 
    //\u519c\u5386BB'+(cld[d].isLeap?'\u95f0 ':' ')+cld[d].lMonth+' \u6708 '+cld[d].lDay+' \u65e5
    var tt = cyclical(SY-1900+36)+'\u5e74 '+cDay(lDObj.month,lDObj.day);
    return(cl+tt+'</font>');
 }
 function solarDay3(){
var sTermInfo = new Array(0,21208,42467,63836,85337,107014,128867,150921,173149,195551,218072,240693,263343,285989,308563,331033,353350,375494,397447,419210,440795,462224,483532,504758)
var solarTerm = new Array("\u5c0f\u5bd2","\u5927\u5bd2","\u7acb\u6625","\u96e8\u6c34","\u60ca\u86f0","\u6625\u5206","\u6e05\u660e","\u8c37\u96e8","\u7acb\u590f","\u5c0f\u6ee1","\u8292\u79cd","\u590f\u81f3","\u5c0f\u6691","\u5927\u6691","\u7acb\u79cb","\u5904\u6691","\u767d\u9732","\u79cb\u5206","\u5bd2\u9732","\u971c\u964d","\u7acb\u51ac","\u5c0f\u96ea","\u5927\u96ea","\u51ac\u81f3")
var lFtv = new Array("0101*\u6625\u8282","0115 \u5143\u5bb5\u8282","0505 \u7aef\u5348\u8282","0707 \u4e03\u5915\u60c5\u4eba\u8282","0715 \u4e2d\u5143\u8282","0815 \u4e2d\u79cb\u8282","0909 \u91cd\u9633\u8282","1208 \u814a\u516b\u8282","1224 \u5c0f\u5e74","1230*\u9664\u5915")
var sFtv = new Array("0101*\u5143\u65e6","0214 \u60c5\u4eba\u8282","0308 \u5987\u5973\u8282","0312 \u690d\u6811\u8282","0315 \u6d88\u8d39\u8005\u6743\u76ca\u65e5","0401 \u611a\u4eba\u8282","0418 MM\u7684\u751f\u65e5","0501 \u52b3\u52a8\u8282","0504 \u9752\u5e74\u8282","0512 \u62a4\u58eb\u8282","0601 \u513f\u7ae5\u8282","0701 \u5efa\u515a\u8282 \u9999\u6e2f\u56de\u5f52\u7eaa\u5ff5",
"0801 \u5efa\u519b\u8282","0808 \u7236\u4eb2\u8282","0909 \u6bdb\u6cfd\u4e1c\u901d\u4e16\u7eaa\u5ff5","0910 \u6559\u5e08\u8282","0928 \u5b54\u5b50\u8bde\u8fb0","1001*\u56fd\u5e86\u8282",
"1006 \u8001\u4eba\u8282","1024 \u8054\u5408\u56fd\u65e5","1112 \u5b59\u4e2d\u5c71\u8bde\u8fb0","1220 \u6fb3\u95e8\u56de\u5f52\u7eaa\u5ff5","1225 \u5723\u8bde\u8282","1226 \u6bdb\u6cfd\u4e1c\u8bde\u8fb0")

  var sDObj = new Date(SY,SM,SD);
  var lDObj = new Lunar(sDObj);
  var lDPOS = new Array(3)
  var festival='',solarTerms='',solarFestival='',lunarFestival='',tmp1,tmp2;
  //\u519c\u5386\u8282\u65e5 
  for(i in lFtv)
  if(lFtv[i].match(/^(\d{2})(.{2})([\s\*])(.+)$/)) {
   tmp1=Number(RegExp.$1)-lDObj.month
   tmp2=Number(RegExp.$2)-lDObj.day
   if(tmp1==0 && tmp2==0) lunarFestival=RegExp.$4 
  }
  //\u56fd\u5386\u8282\u65e5
  for(i in sFtv)
  if(sFtv[i].match(/^(\d{2})(\d{2})([\s\*])(.+)$/)){
   tmp1=Number(RegExp.$1)-(SM+1)
   tmp2=Number(RegExp.$2)-SD
   if(tmp1==0 && tmp2==0) solarFestival = RegExp.$4 
  }
  //\u8282\u6c14
  tmp1 = new Date((31556925974.7*(SY-1900)+sTermInfo[SM*2+1]*60000)+Date.UTC(1900,0,6,2,5))
  tmp2 = tmp1.getUTCDate()
  if (tmp2==SD) solarTerms = solarTerm[SM*2+1]  
  tmp1 = new Date((31556925974.7*(SY-1900)+sTermInfo[SM*2]*60000)+Date.UTC(1900,0,6,2,5))
  tmp2= tmp1.getUTCDate()
  if (tmp2==SD) solarTerms = solarTerm[SM*2] 

	return new dateInfo(solarTerms,solarFestival,lunarFestival);
 }
 
 function dateInfo(jieqi,yanglijie,yinlijie){
 	this.jieqi=jieqi;
 	this.yanglijie=yanglijie;
 	this.yinlijie=yinlijie;
 }
 
 
 
 
 function setCalendar(){
    document.write('<table align=center CELLPADDING=2 CELLSPACING=0 border=1><tr><td bgcolor=#FEFEEF><table border=0 CELLPADDING=0 CELLSPACING=0><tr><td align=center>');
    document.write(YYMMDD()+'&nbsp;&nbsp;'+weekday());
    document.write('</td></tr>');
    document.write('<tr><td align=center>'); 
    document.write(solarDay1());
    document.write('</td></tr><tr><td align=center>'); 
    document.write(solarDay2());
    document.write('</td></tr><tr><td>');
    document.write(solarDay3());
    document.write('</td></tr></table></td></tr></table>');
 }


