
//国历节日 *表示放假日
var sFtv = new Array(
"0101*元旦",
"0202 湿地日",
"0214 情人节",
"0303 爱耳日",
"0308 妇女节",
"0312 植树节",
"0315 ３１５",
"0321 森林日",
"0322 水日",
"0324 防结核日",
"0325 学生安全",
"0401 愚人节",
"0407 卫生日",
"0422 地球日",
"0423 图书日",
"0501*劳动节",
"0504 青年节",
"0508 红十字日",
"0512-汶川2008", //护士节
"0515 家庭日",
"0517 电信日",
"0518 博物馆日",
"0531 无烟日", 
"0601 儿童节",
"0605 环保日",
"0606 爱眼日",
"0617 防荒漠日",
"0623 奥运日",
"0625 土地日",
"0626 禁毒日",
"0701 中共诞辰",
"0707-七七事变",
"0711 人口日",
"0801 建军节",
"0815 抗日胜利",
"0908 扫盲日",
"0910 教师节", 
"0914 清洁日",
"0916 保臭氧日",
"0918 九·一八",
"0920 爱牙日",
"0927 旅游日",
"1001*国庆节",
"1004 动物日",
"1006 老人节",
"1010 精神卫生",
"1013 保健日",
"1014 标准日",
"1015 盲人节",
"1016 粮食日",
"1017 消贫日",
"1024 联合国日",
"1031 勤俭日",
"1111 光棍节",
"1121 问候日",
"1201 防艾日",
"1203 残疾人日",
"1205 志愿者日",
"1210 人权日",
"1213-南京1937",
"1224 平安夜",
"1225 圣诞节")


//某月的第几个星期几
var wFtv = new Array(
"0520 母亲节",
"0530 助残日",
"0630 父亲节",
"0932 和平日",
"0940 聋人日",
"1011 住房日",
"1013 减灾日",
"1144 感恩节")


var lFtv = new Array(
"0101*年初一",
"0102*年初二",
"0103*年初三",
"0115*元宵节",
"0505*端午节",
"0707*七夕节",
"0815*中秋节",
"0909*重阳节",
"0100*除夕")

var solarMonth=new Array(31,28,31,30,31,30,31,31,30,31,30,31);function solarDays(y,m){if(m==1) return(((y%4==0)&&(y%100!=0)||(y%400==0))?29:28);else return(solarMonth[m]);}

var solar_term_table_01 = new Array(
new Array(7,6,6,6,6,6,6,6,6,5,6,6,6,5,5,6,6,5,5,5,5,5,5,5,5,4,5,5), 
new Array(5,4,5,5,5,4,4,5,5,4,4,4,4,4,4,4,4,3,4,4,4,3,3,4,4,3,3,3), 
new Array(6,6,6,7,6,6,6,6,5,6,6,6,5,5,6,6,5,5,5,6,5,5,5,5,4,5,5,5,5), 
new Array(5,5,6,6,5,5,5,6,5,5,5,5,4,5,5,5,4,4,5,5,4,4,4,5,4,4,4,4,5), 
new Array(6,6,6,7,6,6,6,6,5,6,6,6,5,5,6,6,5,5,5,6,5,5,5,5,4,5,5,5,5), 
new Array(6,6,7,7,6,6,6,7,6,6,6,6,5,6,6,6,5,5,6,6,5,5,5,6,5,5,5,5,4,5,5,5,5), 
new Array(7,8,8,8,7,7,8,8,7,7,7,8,7,7,7,7,6,7,7,7,6,6,7,7,6,6,6,7,7), 
new Array(8,8,8,9,8,8,8,8,7,8,8,8,7,7,8,8,7,7,7,8,7,7,7,7,6,7,7,7,6,6,7,7,7), 
new Array(8,8,8,9,8,8,8,8,7,8,8,8,7,7,8,8,7,7,7,8,7,7,7,7,6,7,7,7,7), 
new Array(9,9,9,9,8,9,9,9,8,8,9,9,8,8,8,9,8,8,8,8,7,8,8,8,7,7,8,8,8), 
new Array(8,8,8,8,7,8,8,8,7,7,8,8,7,7,7,8,7,7,7,7,6,7,7,7,6,6,7,7,7), 
new Array(7,8,8,8,7,7,8,8,7,7,7,8,7,7,7,7,6,7,7,7,6,6,7,7,6,6,6,7,7) 
); 

var solar_term_year_01 = new Array(
new Array(13,49,85,117,149,185,201,250,250), 
new Array(13,45,81,117,149,185,201,250,250), 
new Array(13,48,84,112,148,184,200,201,250), 
new Array(13,45,76,108,140,172,200,201,250),
new Array(13,44,72,104,132,168,200,201,250),
new Array(5 ,33,68,96 ,124,152,188,200,201),
new Array(29,57,85,120,148,176,200,201,250),
new Array(13,48,76,104,132,168,196,200,201),
new Array(25,60,88,120,148,184,200,201,250),
new Array(16,44,76,108,144,172,200,201,250),
new Array(28,60,92,124,160,192,200,201,250),
new Array(17,53,85,124,156,188,200,201,250)
); 


var solar_term_table_02 = new Array(
new Array(21,21,21,21,21,20,21,21,21,20,20,21,21,20,20,20,20,20,20,20,20,19,20,20,20,19,19,20),
new Array(20,19,19,20,20,19,19,19,19,19,19,19,19,18,19,19,19,18,18,19,19,18,18,18,18,18,18,18),
new Array(21,21,21,22,21,21,21,21,20,21,21,21,20,20,21,21,20,20,20,21,20,20,20,20,19,20,20,20,20),
new Array(20,21,21,21,20,20,21,21,20,20,20,21,20,20,20,20,19,20,20,20,19,19,20,20,19,19,19,20,20),
new Array(21,22,22,22,21,21,22,22,21,21,21,22,21,21,21,21,20,21,21,21,20,20,21,21,20,20,20,21,21),
new Array(22,22,22,22,21,22,22,22,21,21,22,22,21,21,21,22,21,21,21,21,20,21,21,21,20,20,21,21,21),
new Array(23,23,24,24,23,23,23,24,23,23,23,23,22,23,23,23,22,22,23,23,22,22,22,23,22,22,22,22,23),
new Array(23,24,24,24,23,23,24,24,23,23,23,24,23,23,23,23,22,23,23,23,22,22,23,23,22,22,22,23,23),
new Array(23,24,24,24,23,23,24,24,23,23,23,24,23,23,23,23,22,23,23,23,22,22,23,23,22,22,22,23,23),
new Array(24,24,24,24,23,24,24,24,23,23,24,24,23,23,23,24,23,23,23,23,22,23,23,23,22,22,23,23,23),
new Array(23,23,23,23,22,23,23,23,22,22,23,23,22,22,22,23,22,22,22,22,21,22,22,22,21,21,22,22,22),
new Array(22,22,23,23,22,22,22,23,22,22,22,22,21,22,22,22,21,21,22,22,21,21,21,22,21,21,21,21,22)
); 
var solar_term_year_02 = new Array(
new Array(13,45,81,113,149,185,201),new Array(21,57,93,125,161,193,201),new Array(21,56,88,120,152,188,200,201),
new Array(21,49,81,116,144,176,200,201),new Array(17,49,77,112,140,168,200,201),
new Array(28,60,88,116,148,180,200,201),new Array(25,53,84,112,144,172,200,201),
new Array(29,57,89,120,148,180,200,201),new Array(17,45,73,108,140,168,200,201),
new Array(28,60,92,124,160,192,200,201),new Array(16,44,80,112,148,180,200,201),
new Array(17,53,88,120,156,188,200,201));


function solar_term_1(sy,sm)
{var done_index;var solar_term;done_index = 0;
while(sy >= solar_term_year_01[sm - 1][done_index]) {done_index++;}
solar_term = solar_term_table_01[sm - 1][4*done_index + sy%4];
if((sy == 121)&&(sm == 4))solar_term = 5;
if((sy == 132)&&(sm == 4))solar_term = 5;
if((sy == 194)&&(sm == 6))solar_term = 6;
return(solar_term);
}


function solar_term_2(sy,sm)
{var done_index;var solar_term;done_index = 0;
while(sy >= solar_term_year_02[sm - 1][done_index]){done_index++;}
solar_term = solar_term_table_02[sm - 1][4*done_index + sy%4];
if((sy == 171)&&(sm == 3))solar_term = 21;
if((sy == 181)&&(sm == 5))solar_term = 21;
return(solar_term);
}


var solarTerm=new Array("小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至");


function calElement(sYear,sMonth,sDay,week,lYear,lMonth,lDay,isLeap){
this.isToday=false;this.sYear=sYear;this.sMonth=sMonth;this.sDay=sDay;this.week=week;this.lYear=lYear;this.lMonth=lMonth;this.lDay=lDay;this.isLeap=isLeap;
this.color='#6699cc';this.solarTerms='';this.lunarFestival=''; this.solarFestival=''; this.hint1='';this.hint2='';this.hint3='';this.v=-1;}

function calendar(y,m){var sDObj,lDObj,lY,lM,lD=1,lL,lX=0;

var lDPOS=new Array(3);var n=0;var firstLM=0;

sDObj=new Date(y,m,1,0,0,0,0);this.length=solarDays(y,m);
this.firstWeek=sDObj.getDay();

for(var i=0;i<this.length;i++){
if(lD>lX){lDObj=new Lunar(y,m,i+1);lY=lDObj.year;lM=lDObj.month;
lD=lDObj.day;lL=lDObj.isLeap;lX=lL?leapDays(lY):monthDays(lY,lM);

if(n==0) firstLM=lM;lDPOS[n++]=i-lD+1;

}
this[i]=new calElement(y,m+1,i+1,(i+this.firstWeek)%7,lY,lM,lD++,lL);
}
tmp1=solar_term_1(y-1900,m+1)-1;tmp2=solar_term_2(y-1900,m+1)-1;
this[tmp1].solarTerms=solarTerm[m*2];this[tmp2].solarTerms=solarTerm[m*2+1];if(y==tY&&m==(tM-1)) this[tD-1].isToday=true;


//公历节日
for(i in sFtv)
if(sFtv[i].match(/^(\d{2})(\d{2})([\s\*\-])(.+)$/))
if(Number(RegExp.$1)==(m+1)) {
this[Number(RegExp.$2)-1].solarFestival = RegExp.$4 ;

if(RegExp.$3=='*'){
this[Number(RegExp.$2)-1].color = 'red';
}
else if(RegExp.$3=='-'){
this[Number(RegExp.$2)-1].color = 'black';
}

}

//月周节日
for(i in wFtv)
if(wFtv[i].match(/^(\d{2})(\d)(\d)([\s\*])(.+)$/))
if(Number(RegExp.$1)==(m+1)) {
tmp1=Number(RegExp.$2);
tmp2=Number(RegExp.$3);
if(tmp1<5)
this[((this.firstWeek>tmp2)?7:0) + 7*(tmp1-1) + tmp2 - this.firstWeek].solarFestival = RegExp.$5 ;
else {
tmp1 -= 5;
tmp3 = (this.firstWeek+this.length-1)%7; //当月最后一天星期?
this[this.length - tmp3 - 7*tmp1 + tmp2 - (tmp2>tmp3?7:0) - 1 ].solarFestival = RegExp.$5 ;
}
}


for(i in lFtv)
if(lFtv[i].match(/^(\d{2})(.{2})([\s\*])(.+)$/)) {
tmp1=Number(RegExp.$1)-firstLM;
if(tmp1==-11) tmp1=1;
if(tmp1 >=0 && tmp1<n) {
tmp2 = lDPOS[tmp1] + Number(RegExp.$2) -1;
if( tmp2 >= 0 && tmp2<this.length && this[tmp2].isLeap!=true) {
this[tmp2].lunarFestival = RegExp.$4 ;
if(RegExp.$3=='*') this[tmp2].color = 'red';
}
}
}


}var monthName=new Array("JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC");

var Gan=new Array("甲","乙","丙","丁","戊","己","庚","辛","壬","癸");
var Zhi=new Array("子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥");
function cyclical(num){return(Gan[num%10]+Zhi[num%12]);}
Animals=new Array("鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪");
