/*****************************************************************************
日期資料
*****************************************************************************/

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 solarMonth=new Array(31,28,31,30,31,30,31,31,30,31,30,31);
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 sFtv = new Array(
  "0101*元旦",
  "0214 情人節",
  "0308 婦女節",
  "0312 植樹節",
  "0401 愚人節",
  "0501 勞動節",
  "0808 父親節",
  "0928 孔子誕辰",
  "1010*國慶日",
  "1112 孫中山誕辰紀念",
  "1225 聖誕節"
)

//農曆節日 *表示放假日
var lFtv = new Array(
  "0101*春節",
  "0115 元宵節",
  "0505 端午節",
  "0707 七夕情人節",
  "0715 中元節",
  "0815 中秋節",
  "0909 重陽節",
  "0100*除夕"
)

//某月的第幾個星期幾
var wFtv = new Array(
  "0520 母親節"
)


/*****************************************************************************
日期計算
*****************************************************************************/

//====================================== 傳回農曆 y年的總天數
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))
}

//====================================== 傳回農曆 y年閏月的天數
function leapDays(y) {
  if(leapMonth(y)) return((lunarInfo[y-1900] & 0x10000)? 30: 29)
  else return(0)
}

//====================================== 傳回農曆 y年閏哪個月 1-12 , 沒閏傳回 0
function leapMonth(y) {
  return(lunarInfo[y-1900] & 0xf)
}

//====================================== 傳回農曆 y年m月的總天數
function monthDays(y,m) {
  return( (lunarInfo[y-1900] & (0x10000>>m))? 30: 29 )
}

//====================================== 算出農曆, 傳入日期物件, 傳回農曆日期物件
// 該物件屬性有 .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) //閏哪個月
  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(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
}

//==============================傳回國歷 y年某m+1月的天數
function solarDays(y,m) {
  if(m==1)
  return(((y%4 == 0) && (y%100 != 0) || (y%400 == 0))? 29: 28)
  else
  return(solarMonth[m])
}
//===== 某年的第n個節氣為幾日(從0小寒起算)
function sTerm(y,n){
var offDate = new Date( ( 31556925974.7*(y-1900) + sTermInfo[n]*60000 ) + Date.UTC(1900,0,6,2,5) )
return(offDate.getUTCDate())
}


//////////////////////////////////////////////////////////////////////////////
var Today = new Date();
var tY = Today.getFullYear();
var tM = Today.getMonth();
var tD = Today.getDate();
var tW = Today.getDay();

var festival='';
var aY;
var aM;
var aD;
var aW;
var aMaD;

aY=tY;
aM=tM;
aD=tD;
if(tW== 0){aW='日';}
if(tW== 1){aW='一';}
if(tW== 2){aW='二';}
if(tW== 3){aW='三';}
if(tW== 4){aW='四';}
if(tW== 5){aW='五';}
if(tW== 6){aW='六';}
aM=aM+1;

if(aM <= 9){aM='0'+aM;}
if(aD <= 9){aD='0'+aD;}
aMaD=aM+aD;

//國歷節日
for(i in sFtv){
  if(sFtv[i].match(/^(\d{4})([\s\*])(.+)$/)){
   if(Number(RegExp.$1)==(aMaD)) {
    festival=RegExp.$3;
    }
  }
}

//月周節日
for(i in wFtv){
  if(wFtv[i].match(/^(\d{2})(\d)(\d)([\s\*])(.+)$/)){
    if(Number(RegExp.$1)==(aM)){
     if(Number(RegExp.$3)==tW){
        var count=0;
        var xD=tD;
       while(xD>0){
        count++;
        xD=xD - 7;
       }
       if(count == Number(RegExp.$2)){
        if(festival ==''){
         festival=RegExp.$5;
        }else{
         festival= festival + ' ' + RegExp.$5;
        }
       
       }
      }
    }
  }
}


sDObj = new Date(tY,tM,tD);
lDObj = new Lunar(sDObj);

var lY;
var lM;
var lD;
var lMlD;

lY = lDObj.year;
lM = lDObj.month;
lD = lDObj.day;
if(lM <= 9){lM='0'+lM;}
if(lD <= 9){lD='0'+lD;}
lMlD=lM+lD;

//農曆節日
for(i in lFtv){
  if(lFtv[i].match(/^(\d{4})([\s\*])(.+)$/)){
   if(Number(RegExp.$1)==(lMlD)) {
    if(festival ==''){
     festival=RegExp.$3;
    }else{
     festival= festival + ' ' + RegExp.$3;
    }
    }
  }
}

//節氣
var st='';
var sTermResult1=sTerm(tY, tM*2);
var sTermResult2=sTerm(tY, tM*2+1);
if(tD == sTermResult1){st=solarTerm[tM*2]}
if(tD == sTermResult2){st=solarTerm[tM*2+1]}

var cal;

cal=
  '<div id="cal" summary="calendar" >'+
  '<span id="ymd"> </span>'+
  '<span id="week"></span>';
if(st == ''){
 cal=cal+
   '<span id="lunar"> </span>';
}else{
 cal=cal +
   '<span id="lunar"> </td>';
}
cal=cal +
  '<span id="fest">' + festival + '</span>' +
  '</div>'; 
document.writeln(cal);



function CalConv()
 {
 FIRSTYEAR = 1998;
 LASTYEAR = 2031;

 today = new Date();
 SolarYear = today.getFullYear();
 SolarMonth = today.getMonth() + 1;
 SolarDate = today.getDate();
 Weekday = today.getDay();

 LunarCal = [
  new tagLunarCal( 27,  5, 3, 43, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1 ),
  new tagLunarCal( 46,  0, 4, 48, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1 ), /* 1999 */
  new tagLunarCal( 35,  0, 5, 53, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1 ), /* 2000 */
  new tagLunarCal( 23,  4, 0, 59, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 ),
  new tagLunarCal( 42,  0, 1,  4, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 ),
  new tagLunarCal( 31,  0, 2,  9, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0 ),
  new tagLunarCal( 21,  2, 3, 14, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1 ), /* 2004 */
  new tagLunarCal( 39,  0, 5, 20, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1 ),
  new tagLunarCal( 28,  7, 6, 25, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1 ),
  new tagLunarCal( 48,  0, 0, 30, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1 ),
  new tagLunarCal( 37,  0, 1, 35, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1 ), /* 2008 */
  new tagLunarCal( 25,  5, 3, 41, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1 ),
  new tagLunarCal( 44,  0, 4, 46, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1 ),
  new tagLunarCal( 33,  0, 5, 51, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 ),
  new tagLunarCal( 22,  4, 6, 56, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 ), /* 2012 */
  new tagLunarCal( 40,  0, 1,  2, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 ),
  new tagLunarCal( 30,  9, 2,  7, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1 ),
  new tagLunarCal( 49,  0, 3, 12, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1 ),
  new tagLunarCal( 38,  0, 4, 17, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0 ), /* 2016 */
  new tagLunarCal( 27,  6, 6, 23, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1 ),
  new tagLunarCal( 46,  0, 0, 28, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0 ),
  new tagLunarCal( 35,  0, 1, 33, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0 ),
  new tagLunarCal( 24,  4, 2, 38, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 ), /* 2020 */
  new tagLunarCal( 42,  0, 4, 44, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 ),
  new tagLunarCal( 31,  0, 5, 49, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0 ),
  new tagLunarCal( 21,  2, 6, 54, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1 ),
  new tagLunarCal( 40,  0, 0, 59, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1 ), /* 2024 */
  new tagLunarCal( 28,  6, 2,  5, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0 ),
  new tagLunarCal( 47,  0, 3, 10, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1 ),
  new tagLunarCal( 36,  0, 4, 15, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1 ),
  new tagLunarCal( 25,  5, 5, 20, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0 ), /* 2028 */
  new tagLunarCal( 43,  0, 0, 26, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1 ),
  new tagLunarCal( 32,  0, 1, 31, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0 ),
  new tagLunarCal( 22,  3, 2, 36, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0 ) ];


 /* 西曆年每月之日數 */
 SolarCal = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];

 /* 西曆年每月之累積日數, 平年與閏年 */
 SolarDays = [
  0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365, 396,
  0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366, 397 ];

 AnimalIdx = ["馬 ", "羊 ", "猴 ", "雞 ", "狗 ", "豬 ", "鼠 ", "牛 ", "虎 ", "兔 ", "龍 ", "蛇 " ];
 LocationIdx = [ "南", "東", "北", "西" ];

 if ( SolarYear <= FIRSTYEAR || SolarYear > LASTYEAR ) return 1;

 sm = SolarMonth - 1;
 
 if ( sm < 0 || sm > 11 ) return 2;
 
 leap = GetLeap( SolarYear );

 if ( sm == 1 )
  d = leap + 28;
 else
  d = SolarCal[sm];

 if ( SolarDate < 1 || SolarDate > d ) return 3;

 y = SolarYear - FIRSTYEAR;
 acc = SolarDays[ leap*14 + sm ] + SolarDate;
 kc = acc + LunarCal[y].BaseKanChih;
 Kan = kc % 10;
 Chih = kc % 12;
 Location = LocationIdx[kc % 4];
 Age = kc % 60;
 if ( Age < 22 )
  Age = 22 - Age;
 else
  Age = 82 - Age;

 Age =Age + 3;

if (Age < 10)
  Age=Age+60;

 Animal = AnimalIdx[ Chih ];

 if ( acc <= LunarCal[y].BaseDays ) {
  y--;
  LunarYear = SolarYear - 1;
  leap = GetLeap( LunarYear );
  sm += 12;
  acc = SolarDays[leap*14 + sm] + SolarDate;
  }
 else
  LunarYear = SolarYear;
  
 l1 = LunarCal[y].BaseDays;
 for ( i=0; i<13; i++ ) {
  l2 = l1 + LunarCal[y].MonthDays[i] + 29;
  if ( acc <= l2 ) break;
  l1 = l2;
  }

 LunarMonth = i + 1;
 LunarDate = acc - l1;
 im = LunarCal[y].Intercalation;

 if ( im != 0 && LunarMonth > im ) {
  LunarMonth--;
  if ( LunarMonth == im ) LunarMonth = -im;
  }

 if ( LunarMonth > 12 ) LunarMonth -= 12;

 document.write( "<font size=2 color='ff9900'>歡迎光臨耀百貨,今天是西元 " + SolarYear + "年" + SolarMonth + "月" + SolarDate + "日 " );
       document.write( "農曆 " + LunarMonth + "月 " + LunarDate + "日 " );

       document.write( "煞" + Location + " 沖" + Animal + Age + " 歲</font>" );
                
 
 return 0;
 }

 /* 求此西曆年是否為閏年, 返回 0 為平年, 1 為閏年 */
function GetLeap( year )
 {
   if ( year % 400 == 0 )
     return 1;
   else if ( year % 100 == 0 )
     return 0;
   else if ( year % 4 == 0 )
     return 1;
   else
     return 0;
 }

function tagLunarCal( d, i, w, k, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13) {
 this.BaseDays = d;         /* 到西曆 1 月 1 日到農曆正月初一的累積日數 */
 this.Intercalation = i;    /* 閏月月份. 0==此年沒有閏月 */
 this.BaseWeekday = w;      /* 此年西曆 1 月 1 日為星期幾再減 1 */
 this.BaseKanChih = k;      /* 此年西曆 1 月 1 日之干支序號減 1 */
 this.MonthDays = [ m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13 ]; /* 此農曆年每月之大小, 0==小月(29日), 1==大月(30日) */
}

//-->

CalConv();


