// JavaScript Document
<!--
/*****************************************************************************
                                   日期資料
*****************************************************************************/
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 Gan=new Array("甲","乙","丙","丁","戊","己","庚","辛","壬","癸");
var Zhi=new Array("子","丑","寅","卯","辰","巳","午","未","申","酉","戍","亥");
var Animals=new Array("鼠","牛","虎","兔","龍","蛇","馬","羊","猴","雞","狗","豬");
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 nStr1 = new Array('日','一','二','三','四','五','六','七','八','九','十')
var nStr2 = new Array('初','十','廿','卅','　')
var monthName = new Array("1 月","2 月","3 月","4 月","5 月","6 月","7 月","8 月","9 月","10 月","11 月","12 月");

//國曆節日 *表示放假日
/*var sFtv = new Array(
"0101*元旦",
"0214 情人節",
"0308 婦女節",
"0312 植樹節",
"0315 消費者權益日",
"0401 愚人節",
"0404 婦幼節",
"0501 勞動節",
"0808 父親節",
"0928 教師節",
"1010*國慶日",
"1225 聖誕節",
"1225 行憲紀念日");

//農曆節日 *表示放假
var lFtv = new Array(
"0101*春節，彌勒佛聖誕",
"0106 定光佛聖誕",
"0115 元宵節",
"0208 釋迦牟尼佛出家",
"0215 釋迦牟尼佛涅盤",
"0219 觀世音菩薩聖誕",
"0221 普賢菩薩聖誕",
"0316 准提菩薩聖誕",
"0404 文殊菩薩聖誕",
"0408 釋迦牟尼佛聖誕",
"0505 端午節",
"0513 伽藍菩薩聖誕",
"0603 護法韋駝尊天聖誕",
"0619 觀世音菩薩成道──此日放生、念佛、功德殊聖",
"0707 七夕情人節",
"0713 大勢至菩薩聖誕",
"0715 中元節",
"0724 龍樹菩薩聖誕",
"0730 地藏菩薩聖誕",
"0815 中秋節",
"0822 燃燈佛聖誕",
"0909 重陽節",
"0919 觀世音菩薩出家紀念日",
"0930 藥師琉璃光如來聖誕",
"1005 達摩祖師聖誕",
"1107 阿彌陀佛聖誕",
"1208 釋迦如來成道日，臘八節",
"1224 小年",
"1229 華嚴菩薩聖誕",
"0100*除夕");

//某月的第幾個星期幾
var wFtv = new Array(
"0520 母親節",
"0730 被奴役國家週");*/

var sFtv = [];
var lFtv = [];
var wFtv = [];

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

//====================================== 傳回農曆 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])
}
//============================== 傳入 offset 傳回干支, 0=甲子
function cyclical(num) {
   return(Gan[num%10]+Zhi[num%12])
}

//============================== 月曆屬性
function calElement(sYear,sMonth,sDay,week,lYear,lMonth,lDay,isLeap,cYear,cMonth,cDay) {

      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.cYear      = cYear;
      this.cMonth     = cMonth;
      this.cDay       = cDay;

      this.color      = '';

      this.lunarFestival = ''; //農曆節日
      this.solarFestival = ''; //國曆節日
      this.solarTerms    = ''; //節氣

}

//===== 某年的第 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())
}

//============================== 傳回月曆物件 (y年,m+1月)
function calendar(y,m) {

   var sDObj, lDObj, lY, lM, lD=1, lL, lX=0, tmp1, tmp2
   var lDPOS = new Array(3)
   var n = 0
   var firstLM = 0

   sDObj = new Date(y,m,1)            //當月一日日期

   this.length    = solarDays(y,m)    //國曆當月天數
   this.firstWeek = sDObj.getDay()    //國曆當月 1 日星期幾


   for(var i=0;i<this.length;i++) {

      if(lD>lX) {
         sDObj = new Date(y,m,i+1)    //當月一日日期
         lDObj = new Lunar(sDObj)     //農曆
         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
      }

      //sYear,sMonth,sDay,week,
      //lYear,lMonth,lDay,isLeap,
      //cYear,cMonth,cDay
      this[i] = new calElement(y, m+1, i+1, nStr1[(i+this.firstWeek)%7],
                               lY, lM, lD++, lL,
                               cyclical(lDObj.yearCyl) ,cyclical(lDObj.monCyl), cyclical(lDObj.dayCyl++) )


      if((i+this.firstWeek)%7==0)   this[i].color = 'red'  //週日顏色
      //if((i+this.firstWeek)%14==13) this[i].color = 'red'  //週休二日顏色
   }

   //節氣
   tmp1=sTerm(y,m*2  )-1
   tmp2=sTerm(y,m*2+1)-1
   this[tmp1].solarTerms = solarTerm[m*2]
   this[tmp2].solarTerms = solarTerm[m*2+1]
   if(m==3) this[tmp1].color = 'red' //清明顏色

   //國曆節日
   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 + '<br />'
            if(RegExp.$3=='*') this[Number(RegExp.$2)-1].color = 'red'
         }

   //月週節日
   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)
            this[((this.firstWeek>tmp2)?7:0) + 7*(tmp1-1) + tmp2 - this.firstWeek].solarFestival += RegExp.$5 + '<br />'
         }

   //農曆節日
   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].lunarFestival += RegExp.$4 + '<br />'
               if(RegExp.$3=='*') this[tmp2].color = 'red'
            }
         }
      }

   //黑色星期五
   /*if((this.firstWeek+12)%7==5)
      this[12].solarFestival += '黑色星期五'*/

   //今日
   if(y==tY && m==tM) this[tD-1].isToday = true;

}

//====================== 中文日期
function cDay(d){
   var s;

   switch (d) {
      case 10:
         s = '初十'; break;
      case 20:
         s = '二十'; break;
         break;
      case 30:
         s = '三十'; break;
         break;
      default :
         s = nStr2[Math.floor(d/10)];
         s += nStr1[d%10];
   }
   return(s);
}

///////////////////////////////////////////////////////////////////////////////
var cld;

var lunarMonthStr = ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一', '十二']

function drawCld(SY,SM) {
   var i,sD,s,size;
   cld = new calendar(SY,SM);
   if(SY>1874 && SY<1909) yDisplay = '光緒' + (((SY-1874)==1)?'元':SY-1874)
   if(SY>1908 && SY<1912) yDisplay = '宣統' + (((SY-1908)==1)?'元':SY-1908)
   if(SY>1911) yDisplay = '民國' + (((SY-1911)==1)?'元':SY-1911)
   //  if(SY>1949) yDisplay = '僕睿弊' + (((SY-1949)==1)?'元':SY-1949)

   //GD.innerHTML = ' 西曆 ' + SY + ' 年 ' + SM + ' 月 ';
   //GZ.innerHTML = yDisplay +'年 農曆' + cyclical(SY-1900+36) + '年 &nbsp;&nbsp;【'+Animals[(SY-4)%12]+'】';
   var month = SM + 1;
   month = (month < 10) ? '0' + month : month;
   document.getElementById('CldCDate').innerHTML = SY + ' 年 ' + month + ' 月';

   /*YMBG.innerHTML = "&nbsp;" + SY + "<br />&nbsp;" + monthName[SM];*/


   for(i=0;i<42;i++) {

      gObj = $('#GD' + i);
	  sObj = $('#SD' + i);
      lObj = $('#LD' + i);

      //sObj.className = '';
	  gObj.removeClass('td-2-s').addClass('td-2');
	  
      sD = i - cld.firstWeek;

      if(sD>-1 && sD<cld.length) { //日期內
         sObj.html(sD+1);

         if(cld[sD].isToday) gObj.removeClass('td-2').addClass('td-2-s'); //今日顏色

         sObj.css('color', cld[sD].color); //國定假日顏色
		
         if(cld[sD].lDay==1) //顯示農曆月
            lObj.html('<strong>' + lunarMonthStr[cld[sD].lMonth-1] + '</strong>');
         else //顯示農曆日
            lObj.html('&nbsp;')//lObj.html(cDay(cld[sD].lDay));

         s=cld[sD].lunarFestival;
         if(s.length>0) { //農曆節日
            if(s.length>2) s = s.substr(0, 2);
            s = s.fontcolor('red');
         }
         else { //國曆節日
            s=cld[sD].solarFestival;
            if(s.length>0) {
               size = (s.charCodeAt(0)>0 && s.charCodeAt(0)<128)?4:2;
               if(s.length > size) s = s.substr(0, size);
               s = s.fontcolor('blue');
            }
            else { //二十四節氣
               s=cld[sD].solarTerms;
               if(s.length>0) s = s.fontcolor('limegreen');
            }
         }
         if(s.length>0) lObj.html(s);

      }
      else { //非日期
         sObj.html('');
         lObj.html('');
      }
   }
}

var dateStore = {
	ajax:false,
	y:0,
	m:0
}

function changeCld() {
   drawCld(dateStore.y,dateStore.m);
}

function pushBtm(K) {
	if(dateStore.ajax) {
		return;
	}
	
   old_year = dateStore.y;
   switch (K){
      case 'YU' :
         if(dateStore.y>1900) dateStore.y--;
         break;
      case 'YD' :
         if(dateStore.y<2049) dateStore.y++;
         break;
      case 'MU' :
         if(dateStore.m>0) {
            dateStore.m--;
         }
         else {
            dateStore.m=11;
            if(dateStore.y>0) dateStore.y--;
         }
         break;
      case 'MD' :
         if(dateStore.m<11) {
            dateStore.m++;
         }
         else {
            dateStore.m=0;
            if(dateStore.y<2049) dateStore.y++;
         }
         break;
      default :
         dateStore.y=tY;
         dateStore.m=tM;
		 break;
   }
   
   if(old_year != dateStore.y) {
	   get_cal_data();
   } else {
	   changeCld();
   }
}

function get_cal_data() {
	dateStore.ajax = true;
	$url = get_cal_url() + '&year=' + dateStore.y;
	$.ajax({
		url: $url,
		type: 'get',
		dataType: 'json',
		success: function(data) {
			if(!data) {
				return;
			}
			
			dateStore.ajax = false;
			
			sFtv = data['solar'];
			lFtv = data['lunar'];
			
			changeCld();
		}
	});
}

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

var width = "180";
var offsetx = 3;
var offsety = 5;

var snow = 0;
var sw = 0;
var cnt = 0;

//顯示詳細日期資料
function mOvr(v) {
   var s,festival;
   var sObj=document.getElementById('SD'+ v);
   var d=sObj.innerHTML-1;

	if(sObj.innerHTML!='') {
		if(cld[d].solarTerms == '' && cld[d].solarFestival == '' && cld[d].lunarFestival == '')
			festival = '';
		else
			festival = '<table class="calFestival" cellspacing="1"><tr><td>'+ cld[d].solarTerms + ' ' + cld[d].solarFestival + ' ' + cld[d].lunarFestival+'</td></tr></table>';
		
		s= '<table id="cldContent" width="130" cellspacing="0"><tr><td>' +
			'<table class="calDate" cellspacing="0"><tr><td>'+
			cld[d].sYear+' 年 '+cld[d].sMonth+' 月 '+cld[d].sDay+' 日<br>星期'+cld[d].week+'<br>'+
			'<span class="lunarDate">農曆'+(cld[d].isLeap?'潤 ':' ')+cld[d].lMonth+' 月 '+cld[d].lDay+' 日</span><br />'+
			'<span class="sunDate">'+cld[d].cYear+'年 '+cld[d].cMonth+'月 '+cld[d].cDay + '日</span>'+
			'</td></tr></table>'+ festival +'</td></tr></table>';
		
		
		$("#detail").html(s);
		
		if (snow == '0') {
			obj = $('#GD'+ v);
			position = obj.position();
			$('#detail').css({
				'left': (position.left + obj.width() + offsetx) + 'px',
				'top': (position.top + offsety) + 'px'
			});
			$('#detail').show();
			snow = 1;
		}
	}
	
	if(!$.browser.msie)
		event.stopPropagation();
}

//清除詳細日期資料
function mOut(v) {
	if ( cnt >= 1 ) { sw = 0 }
	if ( sw == 0 ) { snow = 0;	$('#detail').hide();}
	else cnt++;
	
	if(!$.browser.msie)
		event.stopPropagation();
}

/////////////////////////////////////////////////////////

var enabled = 0; today = new Date();
var day; var date;
if(today.getDay()==0) day = "星期日";
if(today.getDay()==1) day = "星期一";
if(today.getDay()==2) day = "星期二";
if(today.getDay()==3) day = "星期三";
if(today.getDay()==4) day = "星期四";
if(today.getDay()==5) day = "星期五";
if(today.getDay()==6) day = "星期六";

function drawInitCld() {
	var gNum;
    for(i=0;i<6;i++) { 
       document.write('<tr>');
       for(j=0;j<7;j++) { 
          gNum = i*7+j 
          document.write('<td id="GD' + gNum +'" onmouseover="mOvr(' + gNum +')" onmouseout="mOut(' + gNum + ')" class="td-2"><span id="SD' + gNum +'"> </span><br /><span id="LD' + gNum + '"></span></td>');
       } 
       document.write('</tr>');
    }
	
	$(document).ready(function () {
		pushBtm();
	});
}