//算出农历, 传入国历日月年
//该对象属性有 .year .month .day .isLeap .yearCyl .dayCyl .monCyl
function Lunar(objDate) {
  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 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++) {
      var t, sum = 348
	  for(t=0x8000; t>0x8; t>>=1) sum += (lunarInfo[I-1900] &t)? 1: 0
      temp = (sum+((lunarInfo[I-1900] & 0xf)?((lunarInfo[I-1900] & 0x10000)? 30: 29):(0)))//传回农历 y年的总天数

      offset -= temp
      this.monCyl += 12
   }

   if(offset<0) {
      offset += temp;
      I--;
      this.monCyl -= 12
   }

   this.year = I
   this.yearCyl = I-1864

   leap = (lunarInfo[I-1900] & 0xf) //农历 I年闰哪个月 1-12 , 没闰传回 0
   this.isLeap = false



   for(I=1; I<13 && offset>0; I++) {
      //闰月
      if(leap>0 && I==(leap+1) && this.isLeap==false){
		 --I;
		 this.isLeap = true;
		 //得到农历 y年闰月的天数
		 temp = (lunarInfo[(this.year)-1900] & 0xf)?((lunarInfo[(this.year)-1900] & 0x10000)? 30: 29):(0); 
	  }
      else{ 
		//得到农历 y年m月的总天数
		temp = ( (lunarInfo[this.year-1900] & (0x10000>>I))? 30: 29 ); 
	  }

      //解除闰月
      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
}


//得到天干地支
function cyclical(num) {
   var Gan=new Array("甲","乙","丙","丁","戊","己","庚","辛","壬","癸");
   var Zhi=new Array("子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥");
   return(Gan[num%10]+Zhi[num%12])
}

//得到某年的生肖
function shengxiao(y){
	var Animals=new Array("鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪");
	return (Animals[(y-4)%12]);
}

//得到某年某月某日的节气(从0小寒起算)
function sTerm(y,m,d) {
   var solarTerm = new Array("小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至");

   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 offDate = new Date( ( 31556925974.7*(y-1900) + sTermInfo[m*2]*60000  ) + Date.UTC(1900,0,6,2,5) );
   var temp1 = (offDate.getUTCDate());
   if(temp1==d) return solarTerm[m*2];
   else{
    offDate = new Date( ( 31556925974.7*(y-1900) + sTermInfo[m*2+1]*60000  ) + Date.UTC(1900,0,6,2,5) );
	var temp2 = (offDate.getUTCDate());
	if(temp2==d) return solarTerm[m*2+1];
   }
   return "";
}

//得到公历节日
function glGala(g_m,g_d){
	var sFtv = new Array("0101 元旦","0214 情人节","0308 妇女节","0312 植树节","0315 消费者权益日","0401 愚人节","0501 劳动节","0504 青年节","0512 护士节","0601 儿童节","0701 建党节 香港回归纪念","0801 建军节","0909 毛泽东逝世纪念","0910 教师节","0928 孔子诞辰","1001 国庆节","1006 老人节","1024 联合国日","1112 孙中山诞辰纪念","1220 澳门回归纪念","1225 圣诞节","1226 毛泽东诞辰纪念");

	var str = "";
	for(I in sFtv)
		if(sFtv[I].match(/^(\d{2})(\d{2})([\s])(.+)$/))
		 if(Number(RegExp.$1)==(g_m)&&Number(RegExp.$2)==g_d) {
			str = str+RegExp.$4 ;
		 }
	return str;
}

//得到农历节日
function nlGala(n_m,n_d){
	var lFtv = new Array("0101 春节","0115 元宵节","0505 端午节","0707 七夕情人节","0715 中元节","0815 中秋节","0909 重阳节","1208 腊八节","1224 小年","0100 除夕");

	var str = "";
	for(I in lFtv)
		if(lFtv[I].match(/^(\d{2})(\d{2})([\s])(.+)$/))
		 if(Number(RegExp.$1)==(n_m)&&Number(RegExp.$2)==n_d) {
			str = str+RegExp.$4 ;
		 }
	return str;
}

//得到星期
function strWeek(w){
	var nStr1 = new Array('日','一','二','三','四','五','六');
	return "星期"+nStr1[w];
}

//得到农历日期表达
function strNongLi(n_m,n_d,isLeap){
	var strNL_d = new Array('初一','初二','初三','初四','初五','初六','初七','初八','初九','初十','十一','十二','十三','十四','十五','十六','十七','十八','十九','廿','廿一','廿二','廿三','廿四','廿五','廿六','廿七','廿八','廿九','卅');
	var strNL_m = new Array('正月','二月','三月','四月','五月','六月','七月','八月','九月','十月','冬月','腊月');
	var str = "农历";
	if(isLeap) str = str+" 闰 ";
	str = str +" "+ strNL_m[n_m-1] +" "+ strNL_d[n_d-1];
	return str;
}

//得到日期的天干地支
function strTGDZ(yearCyl,monCyl,dayCyl){
  return cyclical(yearCyl)+"年 "+cyclical(monCyl)+"月 "+cyclical(dayCyl)+"日 ";
}

//得到国历日期
function strGL(y,m,d){
	return y+"年 "+m+"月 "+d+"日 ";
}