From 217f101bff7b73a376f2fbbbdd292084a9f81838 Mon Sep 17 00:00:00 2001
From: muzi <1099438829@qq.com>
Date: Thu, 15 Aug 2019 22:26:34 +0800
Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=97=A5=E5=8E=86app?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/calendar/css/style.css | 1 +
app/calendar/index.html | 77 +++++++++++++++++++++++
app/calendar/js/calender.js | 94 +++++++++++++++++++++++++++++
app/calendar/js/chinesecalendar.js | 26 ++++++++
app/calendar/js/tools.js | 43 +++++++++++++
demo.html | 5 ++
img/icon/calendar.png | Bin 0 -> 18042 bytes
7 files changed, 246 insertions(+)
create mode 100644 app/calendar/css/style.css
create mode 100644 app/calendar/index.html
create mode 100644 app/calendar/js/calender.js
create mode 100644 app/calendar/js/chinesecalendar.js
create mode 100644 app/calendar/js/tools.js
create mode 100644 img/icon/calendar.png
diff --git a/app/calendar/css/style.css b/app/calendar/css/style.css
new file mode 100644
index 0000000..5d5f574
--- /dev/null
+++ b/app/calendar/css/style.css
@@ -0,0 +1 @@
+*{margin:0;padding:0;font-style:normal}ul,li{list-style:none}body{font-family:pingfang sc,helvetica neue,helvetica,microsoft yahei,arial,sans-serif;font-size:14px;color:#333}h2{font-weight:400}body{overflow:hidden;width:100%;background-size:cover;background-color:#313131}#calendar{width:910px;margin:0 auto;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#calendar .header{position:relative;width:100%;height:37px;border-bottom:1px solid #b4b2b3;background-color:#e7e5e7;border-top-left-radius:5px;border-top-right-radius:5px}#calendar .header ul{position:absolute;left:420px;top:8px;overflow:hidden;border-radius:3px;font-size:0}#calendar .header ul li{display:inline-block;width:62px;height:24px;line-height:24px;font-size:14px;text-align:center;background-color:#fff;cursor:default}#calendar .header ul li.cur{color:#fff;background-color:#6f6e6f}#calendar .sidebar{float:left;width:167px;height:609px;border-right:1px solid #d4dad3;background-color:rgba(255,255,255,.9)}#calendar .sidebar .wrapper{width:100%;padding:12px 0;border-bottom:1px solid #c8d6c7}#calendar .sidebar .title{position:relative;text-align:center}#calendar .sidebar .btn{padding:0 10px;position:absolute;cursor:default}#calendar .sidebar .btn-prev{left:8px}#calendar .sidebar .btn-next{right:8px}#calendar .sidebar .date{}#calendar .sidebar .week{height:20px;padding-top:10px;line-height:20px;font-size:0;text-align:center}#calendar .sidebar .week li{display:inline-block;font-size:12px;width:22px;height:20px;text-align:center}#calendar .sidebar .day{text-align:center;font-size:0}#calendar .sidebar .day li{display:inline-block;width:18px;height:18px;margin:2px;line-height:18px;font-size:12px;text-align:center;color:#ccc;cursor:default}#calendar .sidebar .day li.cur-month{color:#333}#calendar .sidebar .day li.cur-day{color:#fff;background-color:#ff6d6d;border-radius:50%}#calendar .container{position:relative;float:left;width:742px;height:604px;background-color:#fff}#calendar .container .render{display:none}#calendar .container .render-show{display:block}#renderMonth{padding-top:5px}#renderMonth .title{padding-left:16px;line-height:42px;font-size:30px}#renderMonth .week{height:33px;line-height:33px;border-bottom:1px solid #c8c6cc;font-size:0}#renderMonth .week li{position:relative;right:12px;display:inline-block;width:106px;font-size:18px;text-align:right}#renderMonth .day{font-size:0}#renderMonth .day li{display:inline-block;width:106px;height:88px;padding:6px;border-right:1px solid #e6e5e6;border-bottom:1px solid #e6e5e6;box-sizing:border-box;font-size:14px;vertical-align:top;color:#ccc;background-color:#fff}#renderMonth .day li.cur-month{color:#333}#renderMonth .day li.cur-day{color:#333}#renderMonth .day li.weekend{background-color:#f4f6f7}#renderMonth .day li p{margin-bottom:8px}#renderMonth .day li .info{height:20px}#renderMonth .day li .lunar{float:left}#renderMonth .day li .first-lunarday{position:relative;left:-5px;border-bottom:1px solid #ff6d6d}#renderMonth .day li .first-lunarJanuary{position:relative;left:-5px;border-bottom:2px solid #ff6d6d}#renderMonth .day li .date{float:right}#renderMonth .day li.cur-day .date{}#renderMonth .day li.cur-day .date em{display:inline-block;width:20px;height:20px;line-height:20px;margin-right:2px;text-align:center;color:#fff;background-color:#ff6d6d;border-radius:50%}#renderMonth .day li .festival{display:none;padding-left:10px;height:16px;line-height:16px;color:#333;background-color:#f9d8f8;cursor:default}#renderMonth .day li .festival.show{display:block}#renderMonth .day li .term{display:none;color:#333;height:16px;line-height:16px;padding-left:10px;background-color:#a7d1ed;cursor:default}#renderMonth .day li .term.show{display:block}#renderFullYear{padding-top:5px}#renderFullYear>.title{width:617px;height:42px;padding:0 0 10px 16px}#renderFullYear>.title h2{display:inline-block;line-height:42px;font-size:30px}#renderFullYear>.title p{float:right;margin-top:10px;margin-right:15px}#renderFullYear>.title .lunar-year{}#renderFullYear>.title .lunar-year i{display:inline-block;margin:9px 6px 0 0;width:16px;height:3px;background-color:#ff6d6d;vertical-align:top}#renderFullYear>.title .info{}#renderFullYear>.title .info i{display:inline-block;width:14px;height:1px;margin-top:-3px;margin-right:5px;background-color:#ff6d6d;vertical-align:middle}#renderFullYear .month{font-size:0}#renderFullYear .month .item{display:inline-block;width:25%;padding:0 10px;box-sizing:border-box}#renderFullYear .month .title{padding-left:8px;font-size:18px;color:#ff6d6d}#renderFullYear .month .week{font-size:0;text-align:center}#renderFullYear .month .week li{display:inline-block;width:22px;height:20px;line-height:20px;font-size:12px;color:#ccc}#renderFullYear .month .day{text-align:center;font-size:0}#renderFullYear .month .day li{display:inline-block;width:18px;height:18px;line-height:18px;margin:2px;text-align:center;color:#ccc;font-size:10px;cursor:default}#renderFullYear .month .day li.lunar-first{border-bottom:1px solid #ff6d6d}#renderFullYear .month .day li.lunar-january{border-bottom:2px solid #ff6d6d}#renderFullYear .month .day li.cur-month{color:#333}#renderFullYear .month .day li.cur-day{color:#fff;background-color:#ff6d6d;border-radius:50%}#control{position:absolute;top:16px;right:14px;font-size:0}#control input{display:inline-block;height:19px;text-align:center;border:1px solid #dadada;border-radius:4px;font-size:14px;color:#333;background:#fff;vertical-align:top;outline:0}#control .btn{width:21px}#control .btn-prev{}#control .btn-next{}#control .today{width:52px}#popup{display:none;position:absolute;left:200px;top:100px;width:260px;height:104px;background-color:#f4f6f7;box-shadow:0 0 2px rgba(0,0,0,.3);border-radius:6px;border:1px solid #efefef}#popup.popup-right{}#popup .title{height:43px;padding:0 15px;line-height:43px;margin-bottom:8px;border-bottom:1px solid #d6d6d6}#popup .arrow{display:none;position:absolute;top:36px;width:0;height:0;border-width:14px;border-style:solid}#popup .arrow:after{content:"";position:absolute;top:-14px;width:0;height:0;border-width:14px;border-style:dashed}#popup .arrow-left{left:-29px;border-color:transparent #d6d6d6 transparent transparent}#popup.popup-left .arrow-left{display:block}#popup .arrow-left:after{left:-13px;border-color:transparent #f4f6f7 transparent transparent}#popup .arrow-right{right:-29px;border-color:transparent transparent transparent #d6d6d6}#popup.popup-right .arrow-right{display:block}#popup .arrow-right:after{right:-13px;border-color:transparent transparent transparent #f4f6f7}#popup .date,#popup .lunar{padding:0 15px;line-height:20px}
\ No newline at end of file
diff --git a/app/calendar/index.html b/app/calendar/index.html
new file mode 100644
index 0000000..60bdc2e
--- /dev/null
+++ b/app/calendar/index.html
@@ -0,0 +1,77 @@
+
+
+
+
+Document
+
+
+
+
+
+
+
+
+
2017年9月
+
+- 周日
+- 周一
+- 周二
+- 周三
+- 周四
+- 周五
+- 周六
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/calendar/js/calender.js b/app/calendar/js/calender.js
new file mode 100644
index 0000000..0fa8172
--- /dev/null
+++ b/app/calendar/js/calender.js
@@ -0,0 +1,94 @@
+;(function(window,undefined){var calendar=document.querySelector('#calendar')
+var simpleMonth_area=calendar.querySelector('.sidebar')
+var simpleMonth_title=simpleMonth_area.querySelector('.date')
+var fullMonth_area=calendar.querySelector('#renderFullYear')
+var fullMonth_title=fullMonth_area.querySelector('h2')
+var fullMonth_lunar=fullMonth_area.querySelector('.lunar-year')
+var detailMonth=calendar.querySelector('#renderMonth')
+var detailMonth_title=detailMonth.querySelector('.title')
+var detailMonth_day=detailMonth.querySelector('.day')
+var tab_num=0
+var today=new Date()
+var year=today.getFullYear()
+var month=today.getMonth()
+var calendarObj=ChineseCalendar
+renderTab()
+initalToday()
+function renderTab(){var aTab=calendar.querySelector('.header').querySelectorAll('li')
+var aRender=calendar.querySelectorAll('.render')
+for(var i=0;i'+calendarObj.year2GanZhe(year)+calendarObj.getAnimal(year)+'年'
+detailMonth_title.innerHTML=year+'年'+(month+1)+'月'
+renderFullMonth()
+tools.renderDetailMonth(detailMonth_day,year,month)
+dateEvent()}
+function renderFullMonth(){var sidebar_day=simpleMonth_area.querySelector('.day')
+var fullYear_month=fullMonth_area.querySelector('.month')
+var fullMonth_hmtl=``
+var monthArr=['January','Febuary','March','April','May','June','July','August','September','Octorber','November','December']
+for(var i=0;i<12;i++){fullMonth_hmtl+=`
+ ${monthArr[i]}
+
+ - 日
+ - 一
+ - 二
+ - 三
+ - 四
+ - 五
+ - 六
+
+ ${tools.renderDay(year,i)}
+ `}
+fullYear_month.innerHTML=fullMonth_hmtl
+sidebar_day.innerHTML=tools.renderDay(year,month)}
+function dateEvent(){var sidebar_prevBtn=simpleMonth_area.querySelector('.btn-prev')
+var sidebar_nextBtn=simpleMonth_area.querySelector('.btn-next')
+var control=calendar.querySelector('#control')
+var control_btnPrev=control.querySelector('.btn-prev')
+var control_today=control.querySelector('.today')
+var control_btnNext=control.querySelector('.btn-next')
+var sidebar_date=simpleMonth_area.querySelectorAll('.day li')
+var detail_festival=detailMonth_day.querySelectorAll('.show')
+var popup=calendar.querySelector('#popup')
+var container=calendar.querySelector('.container')
+var dataTime=null
+var popupPos={lx:0,lr:0,y:0,w:detail_festival[0].offsetWidth,h:detail_festival[0].offsetHeight}
+sidebar_prevBtn.onclick=function(){if(month==0){year--
+month=11}else{month--}
+initalToday()}
+sidebar_nextBtn.onclick=function(){if(month==11){year++
+month=0}else{month++}
+initalToday()}
+control_today.onclick=function(){year=today.getFullYear()
+month=today.getMonth()
+initalToday()}
+control_btnPrev.onclick=function(){if(tab_num==0){if(month==0){year--
+month=11}else{month--}
+tools.renderDetailMonth(detailMonth_day,year,month)}else{year--}
+initalToday()}
+control_btnNext.onclick=function(){if(tab_num==0){if(month==11){year++
+month=0}else{month++}}else{year++}
+initalToday()}
+for(var i=0;i=popup.offsetWidth){popup.style.left=popupPos.lx+'px'
+popup.className='popup-left'}else{popup.style.left=popupPos.lr+'px'
+popup.className='popup-right'}
+tools.renderPopup(this,popup,dateStr)
+ev.stopPropagation()}}
+document.onclick=function(){popup.style.display='none'}}})(window)
\ No newline at end of file
diff --git a/app/calendar/js/chinesecalendar.js b/app/calendar/js/chinesecalendar.js
new file mode 100644
index 0000000..ab06f75
--- /dev/null
+++ b/app/calendar/js/chinesecalendar.js
@@ -0,0 +1,26 @@
+var ChineseCalendar={lunarInfo:[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,0x0a5b0,0x14573,0x052b0,0x0a9a8,0x0e950,0x06aa0,0x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0,0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b6a0,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,0x04afb,0x04ad0,0x0a4d0,0x1d0b6,0x0d250,0x0d520,0x0dd45,0x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0,0x14b63,0x09370,0x049f8,0x04970,0x064b0,0x168a6,0x0ea50,0x06b20,0x1a6c4,0x0aae0,0x0a2e0,0x0d2e3,0x0c960,0x0d557,0x0d4a0,0x0da50,0x05d55,0x056a0,0x0a6d0,0x055d4,0x052d0,0x0a9b8,0x0a950,0x0b4a0,0x0b6a6,0x0ad50,0x055a0,0x0aba4,0x0a5b0,0x052b0,0x0b273,0x06930,0x07337,0x06aa0,0x0ad50,0x14b55,0x04b60,0x0a570,0x054e4,0x0d160,0x0e968,0x0d520,0x0daa0,0x16aa6,0x056d0,0x04ae0,0x0a9d4,0x0a2d0,0x0d150,0x0f252,0x0d520],Gan:["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"],Zhe:["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"],Animals:["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"],solarTerm:["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"],weekend:['日','一','二','三','四','五','六','七','八','九','十'],lunarStr:['初','十','廿','卅'],lunarMonStr:['正','二','三','四','五','六','七','八','九','十','冬','腊'],sTermInfo:[0,21208,42467,63836,85337,107014,128867,150921,173149,195551,218072,240693,263343,285989,308563,331033,353350,375494,397447,419210,440795,462224,483532,504758],wFestive:['0520-母亲节','0630-父亲节','1144-感恩节'],cFestive:['0101-元旦','0214-情人节','0305#1963-雷锋日','0308-妇女节','0312-植树节','0401-愚人节','0501-劳动日','0504-青年节','0512-护士节','0601#1925-儿童节','0701#1997-建党节','0801#1927-建军节','0910-教师节','1001#1949-国庆节','1224-平安夜','1225-圣诞节',],lFestive:['1230-除夕','0101-春节','0102-正月初二','0115-元宵节','0505-端午节','0707-七夕节','0715-中元节','0815-中秋节','0909-重阳节','1208-腊八节','1224-小年'],lunarYearLength:function(y){var sum=12*29;for(var i=0x8000;i>0x8;i=i>>1){sum+=(ChineseCalendar.lunarInfo[y-1900]&i?1:0);}
+sum+=ChineseCalendar.leapMonthLengths(y);return sum;},lunarMonthLength:function(y,m){return ChineseCalendar.lunarInfo[y-1900]&(0x10000>>m)?30:29;},isLeapMonth:function(y){return ChineseCalendar.lunarInfo[y-1900]&0xf?true:false;},leapMonth:function(y){if(ChineseCalendar.isLeapMonth(y)){return ChineseCalendar.lunarInfo[y-1900]&0xf;}
+return 0;},leapMonthLengths:function(y){if(ChineseCalendar.isLeapMonth(y)){return ChineseCalendar.lunarInfo[y-1900]&0x10000?30:29;}
+return 0;},year2GanZhe:function(y){var gan=(y-3)%10;if(gan===0){gan=10;}
+var zhe=(y-3)%12;if(zhe===0){zhe=12;}
+return ChineseCalendar.Gan[gan-1]+ChineseCalendar.Zhe[zhe-1];},month2GanZhe:function(y,m){var ganY=(y-3)%10;if(ganY===0){ganY=10;}
+var month=((ganY-1)%5)*12+m+1;return ChineseCalendar.Gan[month%10]+ChineseCalendar.Zhe[month%12];},day2GanZhe:function(offset){var temp=40+offset;return ChineseCalendar.Gan[temp%10]+ChineseCalendar.Zhe[temp%12];},sTerm:function(y,n){var ms=31556925974.7*(y-1900)+ChineseCalendar.sTermInfo[n]*60000;var base=Date.UTC(1900,0,6,2,5);var date=new Date(ms+base);return date;},isTerm:function(y,m,d){var date=new Date(y,m-1,d);var n=(m-1)*2;var dateTerm=ChineseCalendar.sTerm(y,n);if(ChineseCalendar.isSameDay(dateTerm,date)){return ChineseCalendar.solarTerm[n];}
+n=n+1;dateTerm=ChineseCalendar.sTerm(y,n);if(ChineseCalendar.isSameDay(dateTerm,date)){return ChineseCalendar.solarTerm[n];}
+return false;},isSameDay:function(date1,date2){return date1.getFullYear()===date2.getFullYear()&&date1.getMonth()===date2.getMonth()&&date1.getDate()===date2.getDate();},getStar:function(month,day){var start=['魔羯','水瓶','双鱼','白羊','金牛','双子','巨蟹','狮子','处女','天秤','天蝎','射手','魔羯'],limit=[20,19,21,21,21,22,23,23,23,23,22,22],result=(month-1)+(day>limit[month-1]?1:0);return start[result]+'座';},toLunarMonth:function(m,flag){if(flag){return '闰'+ChineseCalendar.lunarMonStr[m-1]+'月';}
+return ChineseCalendar.lunarMonStr[m-1]+'月';},toLunarDay:function(d){if(d===10){return '初十';}
+return ChineseCalendar.lunarStr[Math.floor(d/10)]+(d%10===0?'十':ChineseCalendar.weekend[d%10]);},getAnimal:function(y){return ChineseCalendar.Animals[(y-4)%12];},isTody:function(date){var now=new Date();return date.getFullYear()===now.getFullYear()&&date.getMonth()===now.getMonth()&&date.getDate()===now.getDate();},isFestive:function(y,m,d,ly,lm,ld){var lstr=lm>9?(lm+''):'0'+lm;lstr+=ld>9?(ld+''):'0'+ld;var cstr=m>9?(m+''):'0'+m;cstr+=d>9?(d+''):'0'+d;var festive=ChineseCalendar.lFestive;for(var i=0,l=festive.length;iyear[1]){if(year[0]===cstr){return test[2];}}else if(!year[1]){if(test[1]===cstr){return test[2];}}}
+festive=ChineseCalendar.wFestive;var date=new Date(y,m-1,d);for(var i=0,l=festive.length;i9?(m+''):'0'+m;if(str===month&&date.getDay()===parseInt(day)){var temp=ChineseCalendar.theNoWeek(y,m,d);if(temp===parseInt(nWeek)){return test[2];}}}
+return false;},theNoWeek:function(y,m,d){var first=new Date(y,m-1,d);first.setDate(1);var date=new Date(y,m-1,d);var day=first.getDay(),current=date.getDate();if(day===0){day=7;}
+var head=1,tail=8-day,result=1;while(1){if(current>=head&¤t<=tail){return result;}
+result+=1;head=tail+1;tail=head+6;}},isRunYear:function(year){return year%400===0||(year%4===0&&year%100!==0);},getlunarYMD:function(date){var result={year:date.getFullYear(),month:date.getMonth()+1,day:date.getDate()};var offset=(Date.UTC(result.year,result.month-1,result.day)-Date.UTC(1900,0,31))/(60*60*24*1000),temp=0;for(var i=1900;i<2101&&offset>0;i++){temp=ChineseCalendar.lunarYearLength(i);offset-=temp;}
+if(offset<0){offset+=temp;i--;}
+result.lunarYear=i;var isLear=false,lunarMonth=ChineseCalendar.leapMonth(result.lunarYear);for(var i=1;i<13&&offset>=0;i++){temp=ChineseCalendar.lunarMonthLength(result.lunarYear,i);offset-=temp;isLear=false;if(i===lunarMonth){if(offset<0){i--;isLear=true;}else{temp=ChineseCalendar.leapMonthLengths(result.lunarYear);offset-=temp;}}}
+if(offset<0){if(i===lunarMonth&&isLear){offset+=temp;isLear=false;}else if(i===(lunarMonth+1)){offset+=temp;isLear=true;i--;}else{offset+=temp;i--;}}
+result.lunarMonth=i;result.lunarMonthChiness=ChineseCalendar.toLunarMonth(result.lunarMonth,isLear);result.lunarDay=offset+1;result.lunarDayChiness=ChineseCalendar.toLunarDay(result.lunarDay);return result;},lunarFestival:function(date){var result=ChineseCalendar.getlunarYMD(date);var festive=ChineseCalendar.isFestive(result.year,result.month,result.day,result.lunarYear,result.lunarMonth,result.lunarDay);var term=ChineseCalendar.isTerm(result.year,result.month,result.day);if(festive){return festive}},lunarTerm:function(date){var result=ChineseCalendar.getlunarYMD(date);var term=ChineseCalendar.isTerm(result.year,result.month,result.day);if(term){return term}},lunarTime:function(date){var result=ChineseCalendar.getlunarYMD(date);return result.lunarDayChiness;},date2lunar:function(date){date=date||new Date();var result={year:date.getFullYear(),month:date.getMonth()+1,day:date.getDate()};var offset=(Date.UTC(result.year,result.month-1,result.day)-Date.UTC(1900,0,31))/(60*60*24*1000),temp=0;result.gzD=ChineseCalendar.day2GanZhe(offset);for(var i=1900;i<2101&&offset>0;i++){temp=ChineseCalendar.lunarYearLength(i);offset-=temp;}
+if(offset<0){offset+=temp;i--;}
+result.lunarYear=i;var isLear=false,lunarMonth=ChineseCalendar.leapMonth(result.lunarYear);for(var i=1;i<13&&offset>=0;i++){temp=ChineseCalendar.lunarMonthLength(result.lunarYear,i);offset-=temp;isLear=false;if(i===lunarMonth){if(offset<0){i--;isLear=true;}else{temp=ChineseCalendar.leapMonthLengths(result.lunarYear);offset-=temp;}}}
+if(offset<0){if(i===lunarMonth&&isLear){offset+=temp;isLear=false;}else if(i===(lunarMonth+1)){offset+=temp;isLear=true;i--;}else{offset+=temp;i--;}}
+result.lunarMonth=i;result.lunarMonthChiness=ChineseCalendar.toLunarMonth(result.lunarMonth,isLear);result.lunarDay=offset+1;result.lunarDayChiness=ChineseCalendar.toLunarDay(result.lunarDay);result.animal=ChineseCalendar.getAnimal(result.year);result.week="星期"+ChineseCalendar.weekend[date.getDay()];result.start=ChineseCalendar.getStar(result.month,result.day);result.gzY=ChineseCalendar.year2GanZhe(result.lunarYear);result.isTody=ChineseCalendar.isTody(date);result.gzM=ChineseCalendar.month2GanZhe(result.lunarYear,result.lunarMonth);result.isTerm=ChineseCalendar.isTerm(result.year,result.month,result.day);if(result.isTerm){result.term=result.isTerm;result.isTerm=true;}
+result.isFestive=ChineseCalendar.isFestive(result.year,result.month,result.day,result.lunarYear,result.lunarMonth,result.lunarDay);if(result.isFestive){result.festive=result.isFestive;result.isFestive=true;}
+return result;}}
\ No newline at end of file
diff --git a/app/calendar/js/tools.js b/app/calendar/js/tools.js
new file mode 100644
index 0000000..1317d11
--- /dev/null
+++ b/app/calendar/js/tools.js
@@ -0,0 +1,43 @@
+var tools=(function(){var toolsObj={renderPopup:function(festival,obj,str){var title=obj.querySelector('.title')
+var date=obj.querySelector('.date')
+var lunar=obj.querySelector('.lunar')
+var dateFormat=tools.strFormatDate(str)
+var lunarObj=ChineseCalendar.date2lunar(dateFormat);console.log(dateFormat)
+title.innerHTML=festival.innerHTML
+date.innerHTML=dateFormat.getFullYear()+'年'+(dateFormat.getMonth()+1)+'月'+dateFormat.getDate()+'日'
+lunar.innerHTML=lunarObj.lunarMonthChiness+lunarObj.lunarDayChiness+' · '+lunarObj.gzY+'年'+lunarObj.gzM+'月'+lunarObj.gzD+'日'},renderDay:function(year,n){var year=year
+var month=n
+var firstDay=new Date(year,n,1)
+var _hmtl=``
+for(var i=0;i<42;i++){var allDay=new Date(year,month,i+1-firstDay.getDay());var allDay_str=tools.returnDateStr(allDay)
+var firstDay_str=tools.returnDateStr(firstDay)
+var first_lunarday=ChineseCalendar.date2lunar(allDay).lunarDayChiness
+var lunarJanuary_month=ChineseCalendar.date2lunar(allDay).lunarMonthChiness
+if(tools.returnDateStr(new Date())===allDay_str){if(first_lunarday=='初一'){if(lunarJanuary_month=='正月'){_hmtl+=`${allDay.getDate()}`}else{_hmtl+=`${allDay.getDate()}`}}else{_hmtl+=`${allDay.getDate()}`}}else if(firstDay_str.substr(0,6)===allDay_str.substr(0,6)){if(first_lunarday=='初一'){if(lunarJanuary_month=='正月'){_hmtl+=`${allDay.getDate()}`}else{_hmtl+=`${allDay.getDate()}`}}else{_hmtl+=`${allDay.getDate()}`}}else{if(first_lunarday=='初一'){if(lunarJanuary_month=='正月'){_hmtl+=`${allDay.getDate()}`}else{_hmtl+=`${allDay.getDate()}`}}else{_hmtl+=`${allDay.getDate()}`}}}
+return _hmtl},renderDetailMonth:function(dayWrapper,recivedYear,recivedMonth){var array=[]
+var recivedDate=new Date()
+var _html=``
+var date=new Date(recivedYear,recivedMonth,1)
+date.setDate(1)
+var week=date.getDay()
+date.setDate(1-week)
+var month=date.getMonth()
+for(var i=0;i<42;i++){if(month!==recivedMonth){if(date.getDay()===0||date.getDay()===6){array.push({day:date.getDate(),first_lunarday:ChineseCalendar.lunarTime(date),lunar:ChineseCalendar.date2lunar(date).lunarMonthChiness,state:'weekend',festival:ChineseCalendar.lunarFestival(date),term:ChineseCalendar.lunarTerm(date),dateStr:tools.returnDateStr(date)})}else{array.push({day:date.getDate(),first_lunarday:ChineseCalendar.lunarTime(date),lunar:ChineseCalendar.date2lunar(date).lunarMonthChiness,state:'',festival:ChineseCalendar.lunarFestival(date),term:ChineseCalendar.lunarTerm(date),dateStr:tools.returnDateStr(date)})}}else if(tools.curDay(date,recivedDate)){if(date.getDay()===0||date.getDay()===6){array.push({day:date.getDate(),first_lunarday:ChineseCalendar.lunarTime(date),lunar:ChineseCalendar.date2lunar(date).lunarMonthChiness,state:'weekend cur-day',festival:ChineseCalendar.lunarFestival(date),term:ChineseCalendar.lunarTerm(date),dateStr:tools.returnDateStr(date)})}else{array.push({day:date.getDate(),first_lunarday:ChineseCalendar.lunarTime(date),lunar:ChineseCalendar.date2lunar(date).lunarMonthChiness,state:'cur-day',festival:ChineseCalendar.lunarFestival(date),term:ChineseCalendar.lunarTerm(date),dateStr:tools.returnDateStr(date)})}}else{if(date.getDay()===0||date.getDay()===6){array.push({day:date.getDate(),first_lunarday:ChineseCalendar.lunarTime(date),lunar:ChineseCalendar.date2lunar(date).lunarMonthChiness,state:'weekend cur-month',festival:ChineseCalendar.lunarFestival(date),term:ChineseCalendar.lunarTerm(date),dateStr:tools.returnDateStr(date)})}else{array.push({day:date.getDate(),first_lunarday:ChineseCalendar.lunarTime(date),lunar:ChineseCalendar.date2lunar(date).lunarMonthChiness,state:'cur-month',festival:ChineseCalendar.lunarFestival(date),term:ChineseCalendar.lunarTerm(date),dateStr:tools.returnDateStr(date)})}}
+date.setDate(date.getDate()+1)
+month=date.getMonth()}
+console.log(array);for(var j=0;j
+
+ ${first_lunarday}
+ ${array[j].day}日
+
+ ${array[j].festival}
+ ${array[j].term}
+ `}
+dayWrapper.innerHTML=_html},nowDate:function(){return new Date()},returnDateStr:function(date){var year=date.getFullYear();var month=date.getMonth()+1;var day=date.getDate();month=month<=9?('0'+month):(''+month);day=day<=9?('0'+day):(''+day);return year+month+day;},curDay:function(oldTime,nowTime){return oldTime.getFullYear()===nowTime.getFullYear()&&oldTime.getMonth()===nowTime.getMonth()&&oldTime.getDate()===nowTime.getDate()},strFormatDate:function(str){var date=new Date(parseInt(str.substr(0,4)),parseInt(str.substr(4,2)),parseInt(str.substr(6)))
+console.log(str)
+return date}}
+return toolsObj}())
\ No newline at end of file
diff --git a/demo.html b/demo.html
index 3a162e3..49f1da3 100644
--- a/demo.html
+++ b/demo.html
@@ -74,6 +74,11 @@
GameCenter
+
+

+
Calendar
+
+
iCloud
diff --git a/img/icon/calendar.png b/img/icon/calendar.png
new file mode 100644
index 0000000000000000000000000000000000000000..f9e1064faf66f1a8c14da182e022f62ca7b9f559
GIT binary patch
literal 18042
zcmW(+1yob-8{Wo%5yEH$gpC}CfC$nxKw4V5L%Knb8lBQ1-6$Z9q|zx8(g@Ps-SOY=
zf6m?R+0MD=eBbxR^S;mX-UyYqGEZ=+Z~*|o6FFHaHS`_z-v@$){_YYr8ARW}?
YFCncfb`FH=P^|u$Z?z9*C2IFamPQxOX^Im=;
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