sys-calendar.js 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886
  1. /*
  2. * SYSUI-SYSBOX2.0
  3. * 2020-12-15 version1.2
  4. * 799129700@qq.com SYSHUXL-化海天堂 www.husysui.com
  5. * Reserved head available commercial use
  6. * Universal background system interface framework
  7. */
  8. var Calendar = function (element, options) {
  9. this.el = $(element);
  10. this.el.empty()
  11. this.options = $.extend(true, {}, this.options, options);
  12. this.init();
  13. }
  14. Calendar.prototype = {
  15. options: {
  16. mode: "month",
  17. weekMode: ["一", "二", "三", "四", "五", "六", "日"],
  18. addholiday:true,//是否自定义节假日时间
  19. holiday:null,//放假安排
  20. work:null,//上班时间
  21. datecoding:[19416, 19168, 42352, 21717, 53856, 55632, 91476, 22176, 39632, 21970, 19168, 42422, 42192, 53840, 119381, 46400, 54944, 44450, 38320, 84343, 18800, 42160, 46261, 27216, 27968, 109396, 11104, 38256, 21234, 18800, 25958, 54432, 59984, 28309, 23248, 11104, 100067, 37600, 116951, 51536, 54432, 120998, 46416, 22176, 107956, 9680, 37584, 53938, 43344, 46423, 27808, 46416, 86869, 19872, 42448, 83315, 21200, 43432, 59728, 27296, 44710, 43856, 19296, 43748, 42352, 21088, 62051, 55632, 23383, 22176, 38608, 19925, 19152, 42192, 54484, 53840, 54616, 46400, 46496, 103846, 38320, 18864, 43380, 42160, 45690, 27216, 27968, 44870, 43872, 38256, 19189, 18800, 25776, 29859, 59984, 27480, 21952, 43872, 38613, 37600, 51552, 55636, 54432, 55888, 30034, 22176, 43959, 9680, 37584, 51893, 43344, 46240, 47780, 44368, 21977, 19360, 42416, 86390, 21168, 43312, 31060, 27296, 44368, 23378, 19296, 42726, 42208, 53856, 60005, 54576, 23200, 30371, 38608, 19415, 19152, 42192, 118966, 53840, 54560, 56645, 46496, 22224, 21938, 18864, 42359, 42160, 43600, 111189, 27936, 44448],
  22. signyear : "甲乙丙丁戊己庚辛壬癸",
  23. signyears : "子丑寅卯辰巳午未申酉戌亥",
  24. sign :"鼠牛虎兔龙蛇马羊猴鸡狗猪",
  25. terms: ["小寒", "大寒", "立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏", "小满", "芒种", "夏至", "小暑", "大暑", "立秋", "处暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪", "冬至"],
  26. datenate: [0, 21208, 43467, 63836, 85337, 107014, 128867, 150921, 173149, 195551, 218072, 240693, 263343, 285989, 308563, 331033, 353350, 375494, 397447, 419210, 440795, 462224, 483532, 504758],
  27. period:"日一二三四五六七八九十",
  28. lunar:["正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "腊"],
  29. lunarperiod:"初十廿卅",
  30. festival:{
  31. "0101": "*1元旦节",
  32. "0214": "情人节",
  33. "0305": "学雷锋纪念日",
  34. "0308": "妇女节",
  35. "0312": "植树节",
  36. "0315": "消费者权益日",
  37. "0401": "愚人节",
  38. "0501": "*1劳动节",
  39. "0504": "青年节",
  40. "0601": "国际儿童节",
  41. "0701": "中国共产党诞辰",
  42. "0801": "建军节",
  43. "0910": "中国教师节",
  44. "1001": "*3国庆节",
  45. "1224": "平安夜",
  46. "1225": "圣诞节"
  47. },
  48. festivals:{
  49. "0101": "*2春节",
  50. "0115": "元宵节",
  51. "0505": "*1端午节",
  52. "0815": "*1中秋节",
  53. "0909": "重阳节",
  54. "1208": "腊八节",
  55. "0100": "除夕"
  56. },
  57. newDate: new Date(),
  58. currentDate:'',
  59. width: null,
  60. shwoLunar: false,
  61. showModeBtn: true,
  62. showEvent: true,
  63. maxEvent: null
  64. },
  65. init: function () {
  66. var me = this,
  67. el = me.el,
  68. opts = me.options,
  69. cycleData=null;
  70. el.addClass("calendar");
  71. // opts.width = el.width();
  72. //opts.height = el.height();
  73. typeof (opts.newDate) == "string" ? opts.newDate = me._getDateByString(opts.newDate) : "";
  74. me._createCalendar();
  75. me.eve=function(eve){
  76. var evt = eve || window.event; //指向触发事件的元素
  77. var obj = evt.target || evt.srcElement || eve.srcElement; //指向触发事件的元素
  78. return obj;
  79. },
  80. //绑定事件
  81. //changeMode
  82. el.off("click", ".calendar-mode-select .btn").on("click", ".calendar-mode-select .btn", function (e) {
  83. e.stopPropagation();
  84. var modeText = $(this).text();
  85. var mode = modeText == "月" ? "month" : "year";
  86. me.changeMode(mode);
  87. })
  88. //calendar-cell日期点击事件
  89. el.off("click", ".calendar-cell").on("click", ".calendar-cell", function (e) {
  90. e.stopPropagation();
  91. $(".dropdown-month").removeClass("open");
  92. $(".dropdown-year").removeClass("open");
  93. $('.calendar-table td').removeClass("calendar-today");
  94. $(e.currentTarget).addClass("calendar-today")
  95. var cellDate = $(this).attr("title");
  96. var DataArry=[];
  97. var viewData = me.viewData;
  98. var year = parseInt(cellDate.split("年")[0]);
  99. var month = parseInt(cellDate.split("年")[1].split("月")[0]) - 1;
  100. var datajson=viewData[month];
  101. var date = parseInt(cellDate.split("年")[1].split("月")[1].split("日")[0]);
  102. opts.currentDate = {
  103. year:year,
  104. month:month+1
  105. }
  106. if (opts.mode == "year") {
  107. if (opts.cellClick) opts.cellClick.call(me, datajson,e,me)
  108. }
  109. else if (opts.mode == "month" && month == opts.newDate.getMonth()) {
  110. if(datajson!=undefined){
  111. for (var d = 0; d < datajson.length; d++) {
  112. var start = me._getDateByString(datajson[d].startDate);
  113. var dataday= start.getDate();
  114. if(dataday==date){
  115. DataArry.push(datajson[d]);
  116. }
  117. }
  118. }
  119. if (opts.cellClick) opts.cellClick.call(me, DataArry,e,me)
  120. }
  121. })
  122. //年份下拉
  123. el.off("click", ".calendar-year-select").on("click", ".calendar-year-select", function (e) {
  124. e.stopPropagation();
  125. var eve=me.eve(e);
  126. var parent= eve.parentNode;
  127. $(parent).find(".dropdown-month").removeClass("open");
  128. $(parent).find(".dropdown-year").toggleClass("open");
  129. //创建下拉数据
  130. var yearText = opts.newDate.getFullYear();
  131. var s = '';
  132. for (var i = 0; i < 21; i++) {
  133. if (i == 10) {
  134. s += '<li class="year-item active">'
  135. }
  136. else {
  137. s += '<li class="year-item">'
  138. }
  139. s += '<span class="year-check">' + (yearText - 10 + i) + '</span>'
  140. s += '<span >年</span>'
  141. s += '</li>'
  142. }
  143. me.el.find(".dropdown-year").html(s);
  144. })
  145. //年份改变
  146. el.off("click", ".year-item").on("click", ".year-item", function (e) {
  147. var eve=me.eve(e);
  148. var parent= eve.parentNode.parentNode.parentNode;
  149. var cycleData=null;
  150. e.stopPropagation();
  151. $(".dropdown-year").removeClass("open");
  152. var yearText = $(this).text();
  153. var yearNum = yearText.split("年")[0];
  154. if (yearNum == opts.newDate.getFullYear()) return;
  155. opts.newDate.setFullYear(yearNum);
  156. opts.mode == "month" ? me._refreshCalendar(opts.newDate,cycleData) : me._refreshYearCalendar(opts.newDate);
  157. $(parent).find(".calendar-year-text").text(yearText);
  158. if (opts.yearSelect) opts.yearSelect.call(yearText,yearNum,me)
  159. })
  160. //触发选择月份
  161. el.off("click", ".calendar-month-select").on("click", ".calendar-month-select", function (e) {
  162. e.stopPropagation();
  163. var eve=me.eve(e);
  164. var parent= eve.parentNode;
  165. $(parent).find(".dropdown-year").removeClass("open");
  166. $(parent).find(".dropdown-month").toggleClass("open");
  167. })
  168. //月份check事件
  169. el.off("click", ".month-item").on("click", ".month-item", function (e) {
  170. var eve=me.eve(e);
  171. var parent= eve.parentNode.parentNode;
  172. e.stopPropagation();
  173. $(parent).find(".dropdown-month").removeClass("open");
  174. var monthText = $(this).text();
  175. var monthNum = monthText.split("月")[0];
  176. if (monthNum == (opts.newDate.getMonth() + 1)) return;
  177. var beforeDate = opts.newDate.getDate();
  178. opts.newDate.setMonth(monthNum - 1);
  179. var afterDate = opts.newDate.getDate();
  180. if (opts.monthClick) opts.monthClick.call(monthText,e, parseInt(monthNum),opts,me);
  181. //处理日期30号,切换到2月不存在30号
  182. if (beforeDate != afterDate) {
  183. opts.newDate.setDate(opts.newDate.getDate() - 1);
  184. }
  185. opts.mode == "month" ? me._refreshCalendar(opts.newDate,cycleData) : me._refreshYearCalendar(opts.newDate);
  186. $(parent).find(".calendar-month-text").text(monthText);
  187. })
  188. $(document.body).off("click").on("click", function (e) {
  189. $(".dropdown-month").removeClass("open");
  190. $(".dropdown-year").removeClass("open");
  191. })
  192. },
  193. //公开方法
  194. changeMode: function (mode) {
  195. var me = this;
  196. if (mode == me.options.mode) return;
  197. me.options.mode = mode;
  198. me._createCalendar();
  199. },
  200. getOffsetTop: function(obj) {
  201. var tmp = obj.offsetTop;
  202. var val = obj.offsetParent;
  203. while(val != null) {
  204. tmp += val.offsetTop;
  205. val = val.offsetParent;
  206. }
  207. return tmp;
  208. },
  209. getOffsetLeft: function(obj) {
  210. var tmp = obj.offsetLeft;
  211. var val = obj.offsetParent;
  212. while(val != null) {
  213. tmp += val.offsetLeft;
  214. val = val.offsetParent;
  215. }
  216. return tmp;
  217. },
  218. getViewDate: function (viewDate,cycleData) {
  219. var me = this,
  220. opts = me.options,
  221. mode = opts.mode;
  222. if(cycleData!=null){
  223. var data =cycleData;
  224. }else{
  225. var data = opts.data;
  226. }
  227. if (!data || data.length == 0) return [];
  228. var viewData = {},
  229. monthData={},
  230. modeYear = viewDate.getFullYear(),
  231. modeMonth = null;
  232. if (mode == "month") { modeMonth = viewDate.getMonth() };
  233. //筛选视图数据并转化未对象 要不要转化为属性
  234. for (var i = 0; i < data.length; i++) {
  235. var item = data[i];
  236. var start = me._getDateByString(item.startDate);
  237. var year = start.getFullYear();
  238. var month = start.getMonth();
  239. var date = start.getDate();
  240. if (modeMonth && year == modeYear && modeMonth == month) {
  241. if (!viewData[month]) viewData[month] = [];
  242. viewData[month].push(item);
  243. }
  244. else if (!modeMonth && year == modeYear) {
  245. if (!viewData[month]) viewData[month] = [];
  246. viewData[month].push(item);
  247. }
  248. }
  249. return viewData;
  250. },
  251. _getDateByString: function (stringDate) {
  252. var me = this;
  253. var timearr = stringDate.replace(" ", ":").replace(/\:/g, "-").split("-");
  254. var timestr = ""+timearr[0]+"-" + timearr[1] + "-" + timearr[2];
  255. var year = timestr.split("-")[0];
  256. var mont= parseInt(stringDate.split("-")[1]);
  257. // if(mont==1){
  258. // var month =stringDate.split("-")[1];
  259. // }else{
  260. var month = stringDate.split("-")[1]-1;
  261. //}
  262. var date = timestr.split("-")[2];
  263. return new Date(year, month, date);
  264. },
  265. Width: function() {
  266. return self.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
  267. },
  268. Height: function() {
  269. return self.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
  270. },
  271. //私有方法
  272. _createCalendar: function () {
  273. var me = this;
  274. var dateMode = me.options.mode;
  275. me._createView()
  276. //dateMode == "year" ? me._createYearView() : me._createMonthView();
  277. },
  278. _createView: function () {
  279. var me = this,
  280. el = me.el,
  281. opts = me.options,
  282. mode = opts.mode,
  283. newDate = opts.newDate,
  284. w = opts.width,
  285. h = opts.height,
  286. cycleData=null,
  287. html = '';
  288. html += me._createToolbar();
  289. html += '<div class="calendar-body">';
  290. html += '<table class="calendar-table" cellspacing="0">'
  291. if (mode == "month") {
  292. html += me._createHeader();
  293. }
  294. html += me._createBody();
  295. html += '</table>'
  296. html += '</div>'
  297. el.html(html);
  298. if (mode == "month") {
  299. me._refreshCalendar(newDate,cycleData);
  300. }
  301. else {
  302. me._refreshYearCalendar(newDate);
  303. }
  304. if(w!=null){
  305. el.css({width:w })
  306. }else{
  307. el.css({
  308. width:me.Width(),
  309. height:me.Height()-$(".calendar-header").height()
  310. })
  311. }
  312. },
  313. /**************时间转换格式方法*************/
  314. transferDate:function(date) {
  315. // 年
  316. var year = date.getFullYear();
  317. // 月
  318. var month = date.getMonth() + 1;
  319. // 日
  320. var day = date.getDate();
  321. if (month >= 1 && month <= 9) {
  322. month = "0" + month;
  323. }
  324. if (day >= 0 && day <= 9) {
  325. day = "0" + day;
  326. }
  327. var dateString = year + '' + month + '' + day;
  328. return dateString;
  329. },
  330. calendardata:function(Y,weekDay){
  331. var newarr=[];
  332. var me=this,
  333. holiday= me.options.holiday,
  334. work=me.options.work,
  335. P=me.options.datecoding,
  336. K=me.options.signyear,
  337. J=me.options.signyears,
  338. O=me.options.sign,
  339. L=me.options.terms,
  340. D=me.options.datenate,
  341. B=me.options.period,
  342. H=me.options.lunar,
  343. E=me.options.lunarperiod,
  344. V=me.options.festival,
  345. T=me.options.festivals;
  346. var c=function(j, i) {
  347. var h = new Date((31556925974.7 * (j - 1900) + D[i] * 60000) + Date.UTC(1900, 0, 6, 2, 5));
  348. return (h.getUTCDate())
  349. }
  350. var d=function(k) {
  351. var h, j = 348;
  352. for (h = 32768; h > 8; h >>= 1) {
  353. j += (P[k - 1900] & h) ? 1 : 0
  354. }
  355. return (j + b(k))
  356. }
  357. var a=function(h) {
  358. return (K.charAt(h % 10) + J.charAt(h % 12))
  359. }
  360. var b=function(h) {
  361. if (g(h)) {
  362. return ((P[h - 1900] & 65536) ? 30 : 29)
  363. } else {
  364. return (0)
  365. }
  366. }
  367. var g=function(h) {
  368. return (P[h - 1900] & 15)
  369. }
  370. var e=function(i, h) {
  371. return ((P[i - 1900] & (65536 >> h)) ? 30 : 29)
  372. }
  373. var C=function(m){
  374. var k, j = 0, arr=[],
  375. h = 0;
  376. var l = new Date(1900, 0, 31);
  377. var n = (m - l) / 86400000;
  378. arr.dayCyl = n + 40;
  379. arr.monCyl = 14;
  380. for (k = 1900; k < 2050 && n > 0; k++) {
  381. h = d(k);
  382. n -= h;
  383. arr.monCyl += 12
  384. }
  385. if (n < 0) {
  386. n += h;
  387. k--;
  388. arr.monCyl -= 12
  389. }
  390. arr.year = k;
  391. arr.yearCyl = k - 1864;
  392. j = g(k);
  393. arr.isLeap = false;
  394. for (k = 1; k < 13 && n > 0; k++) {
  395. if (j > 0 && k == (j + 1) && arr.isLeap == false) {--k;
  396. arr.isLeap = true;
  397. h = b(arr.year)
  398. } else {
  399. h = e(arr.year, k)
  400. }
  401. if (arr.isLeap == true && k == (j + 1)) {
  402. arr.isLeap = false
  403. }
  404. n -= h;
  405. if (arr.isLeap == false) {
  406. arr.monCyl++
  407. }
  408. }
  409. if (n == 0 && j > 0 && k == j + 1) {
  410. if (arr.isLeap) {
  411. arr.isLeap = false
  412. } else {
  413. arr.isLeap = true; --k; --arr.monCyl
  414. }
  415. }
  416. if (n < 0) {
  417. n += h; --k; --arr.monCyl
  418. }
  419. arr.month = k;
  420. arr.day = n + 1;
  421. return arr;
  422. }
  423. var G=function(h) {
  424. return h < 10 ? "0" + h: h
  425. }
  426. var f=function(i, j) {
  427. var h = i;
  428. return j.replace(/dd?d?d?|MM?M?M?|yy?y?y?/g,
  429. function(k) {
  430. switch (k) {
  431. case "yyyy":
  432. var l = "000" + h.getFullYear();
  433. return l.substring(l.length - 4);
  434. case "dd":
  435. return G(h.getDate());
  436. case "d":
  437. return h.getDate().toString();
  438. case "MM":
  439. if(weekDay==1){
  440. return G((h.getMonth()));
  441. }else{
  442. return G((h.getMonth() + 1));
  443. }
  444. case "M":
  445. if(weekDay==1){
  446. return G((h.getMonth()));
  447. }else{
  448. return G((h.getMonth() + 1));
  449. }
  450. }
  451. })
  452. }
  453. var Z=function(i, h) {
  454. var j;
  455. switch (i, h) {
  456. case 10:
  457. j = "初十";
  458. break;
  459. case 20:
  460. j = "二十";
  461. break;
  462. case 30:
  463. j = "三十";
  464. break;
  465. default:
  466. j = E.charAt(Math.floor(h / 10));
  467. j += B.charAt(h % 10)
  468. }
  469. return (j)
  470. }
  471. newarr.date = Y;
  472. newarr.isToday = false;
  473. newarr.isRestDay = false;
  474. newarr.solarYear = f(Y, "yyyy");
  475. newarr.solarMonth = f(Y, "M");
  476. newarr.solarDate = f(Y, "d");
  477. newarr.solarWeekDay = Y.getDay();
  478. newarr.solarWeekDayInChinese = "星期" + B.charAt(newarr.solarWeekDay);
  479. var X =C(Y);
  480. newarr.lunarYear = X.year;
  481. newarr.shengxiao = O.charAt((newarr.lunarYear - 4) % 12);
  482. newarr.lunarMonth = X.month;
  483. newarr.lunarIsLeapMonth = X.isLeap;
  484. newarr.lunarMonthInChinese = newarr.lunarIsLeapMonth ? "闰" + H[X.month - 1] : H[X.month - 1];
  485. newarr.lunarDate = X.day;
  486. newarr.showInLunar = newarr.lunarDateInChinese = Z(newarr.lunarMonth, newarr.lunarDate);
  487. if (newarr.lunarDate == 1) {
  488. newarr.showInLunar = newarr.lunarMonthInChinese + "月"
  489. }
  490. newarr.ganzhiYear = a(X.yearCyl);
  491. newarr.ganzhiMonth = a(X.monCyl);
  492. newarr.ganzhiDate = a(X.dayCyl++);
  493. newarr.holidayDate="";
  494. newarr.holidayName="";
  495. newarr.holidayTime="";
  496. newarr.jieqi = "";
  497. newarr.restDays = 0;
  498. if (c(newarr.solarYear, (newarr.solarMonth - 1) * 2) == f(Y, "d")) {
  499. newarr.showInLunar = newarr.jieqi = L[(newarr.solarMonth - 1) * 2]
  500. }
  501. if (c(newarr.solarYear, (newarr.solarMonth - 1) * 2 + 1) == f(Y, "d")) {
  502. newarr.showInLunar = newarr.jieqi = L[(newarr.solarMonth - 1) * 2 + 1]
  503. }
  504. if (newarr.showInLunar == "清明") {
  505. newarr.showInLunar = "清明节";
  506. newarr.restDays = 1
  507. }
  508. newarr.solarFestival = V[f(Y, "MM") + f(Y, "dd")];
  509. if (typeof newarr.solarFestival == "undefined") {
  510. newarr.solarFestival = ""
  511. } else {
  512. if (/\*(\d)/.test(newarr.solarFestival)) {
  513. newarr.restDays = parseInt(RegExp.$1);
  514. newarr.solarFestival = newarr.solarFestival.replace(/\*\d/, "")
  515. }
  516. }
  517. newarr.showInLunar = (newarr.solarFestival == "") ? newarr.showInLunar: newarr.solarFestival;
  518. newarr.lunarFestival = T[newarr.lunarIsLeapMonth ? "00": G(newarr.lunarMonth) + G(newarr.lunarDate)];
  519. if (typeof newarr.lunarFestival == "undefined") {
  520. newarr.lunarFestival = ""
  521. } else {
  522. if (/\*(\d)/.test(newarr.lunarFestival)) {
  523. newarr.restDays = (newarr.restDays > parseInt(RegExp.$1)) ? newarr.restDays: parseInt(RegExp.$1);
  524. newarr.lunarFestival = newarr.lunarFestival.replace(/\*\d/, "")
  525. }
  526. }
  527. if (newarr.lunarMonth == 12 && newarr.lunarDate == e(newarr.lunarYear, 12)) {
  528. newarr.lunarFestival = T["0100"];
  529. newarr.restDays = 1
  530. }
  531. newarr.showInLunar = (newarr.lunarFestival == "") ? newarr.showInLunar: newarr.lunarFestival;
  532. newarr.showInLunar = (newarr.showInLunar.length > 4) ? newarr.showInLunar.substr(0, 2) + "...": newarr.showInLunar ;
  533. if(holiday!=null){
  534. holiday.myMap(function(eve,i){
  535. var name=eve.holiday_name;
  536. var lt=eve.holiday_time;
  537. for(var t=0;t<lt.length;t++){
  538. var startDate = me._getDateByString(lt[t]); // 日期变换
  539. var year = startDate.getFullYear();
  540. var month = startDate.getMonth()+1;
  541. var day = startDate.getDate();
  542. if(newarr.solarYear==year){
  543. if(newarr.solarMonth==month){
  544. if(newarr.solarDate ==day ){
  545. newarr.holidayDate="holiday";
  546. newarr.holidayName=name;
  547. }
  548. }
  549. }
  550. }
  551. });
  552. }
  553. for(var w=0;w<work.length;w++){
  554. var startDate = me._getDateByString(work[w]); // 日期变换
  555. var year = startDate.getFullYear();
  556. var month = startDate.getMonth()+1;
  557. var day = startDate.getDate();
  558. if(newarr.solarYear==year){
  559. if(newarr.solarMonth==month){
  560. if(newarr.solarDate ==day ){
  561. newarr.holidayDate="work";
  562. }
  563. }
  564. }
  565. }
  566. return newarr
  567. },
  568. structure:function(date,X){
  569. var me=this;
  570. X.lines = 0;
  571. X.dateArray = new Array(42);
  572. var Y=function(a) {
  573. return (((a % 4 === 0) && (a % 100 !== 0)) || (a % 400 === 0))
  574. }
  575. var G=function(a, b) {
  576. return [31, (Y(a) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][b]
  577. }
  578. var C=function(a, b) {
  579. a.setDate(a.getDate() + b);
  580. return a
  581. }
  582. var Z=function(a) {
  583. var f = 0;
  584. var c = me.calendardata(new Date(a.solarYear, a.solarMonth, 1));
  585. var d = (c.solarWeekDay - 1 == -1) ? 6 : c.solarWeekDay-1;
  586. X.lines = Math.ceil((d + G(a.solarYear, a.solarMonth)) / 7);
  587. for (var e = 0; e < X.dateArray.length; e++) {
  588. if (c.restDays != 0) {
  589. f = c.restDays
  590. }
  591. if (f > 0) {
  592. c.isRest = true
  593. }
  594. if (d-->0) {
  595. var days=parseInt(a.solarDate)+d;
  596. var o = me.calendardata(new Date(a.solarYear, a.solarMonth-1,days));
  597. X.dateArray[e] =o;
  598. }else{
  599. var b = me.calendardata(new Date());
  600. if (c.solarYear == b.solarYear && c.solarMonth == b.solarMonth && c.solarDate == b.solarDate) {
  601. c.isToday = true
  602. }
  603. X.dateArray[e] = c;
  604. c = me.calendardata(C(c.date, 1));
  605. f--
  606. }
  607. }
  608. }
  609. Z(date);
  610. },
  611. _createToolbar: function () {
  612. var me = this,
  613. newDare = me.options.newDate,
  614. mode = me.options.mode,
  615. showModeBtn = me.options.showModeBtn,
  616. s = '';
  617. var year = newDare.getFullYear();
  618. var month = newDare.getMonth() + 1;
  619. s += '<div class="calendar-header">'
  620. s += '<div class="calendar-select calendar-year-select" >'
  621. s += '<span class="calendar-year-text"> ' + year + '年</span >'
  622. s += '<span class="calendar-icon"><i class="iconfont iconxiala"></i></span>'
  623. s += '<ul id="dropdown-year" class="dropdown-year">'
  624. s += '</ul>'
  625. s += '</div > '
  626. if (mode == "month") {
  627. s += '<div class="calendar-select calendar-month-select">'
  628. s += '<span class="calendar-month-text"> ' + month + '月</span >'
  629. s += '<span class="calendar-icon"><i class="iconfont iconxiala"></i></span>'
  630. //创建月份下拉(写死)
  631. s += '<ul class="dropdown-month">'
  632. for (var i = 1; i <= 12; i++) {
  633. s += '<li class="month-item">'
  634. s += '<span class="month-check">' + i + '</span>'
  635. s += '<span >月</span>'
  636. s += '</li>'
  637. }
  638. s += '</ul>'
  639. s += '</div > '
  640. }
  641. if (showModeBtn) {
  642. s += '<div class="calendar-select calendar-mode-select">'
  643. s += '<div class="btn-group">'
  644. if (mode == "month") {
  645. s += '<span class="btn calendar-select-active">月</span>'
  646. s += '<span class="btn">年</span>'
  647. }
  648. else {
  649. s += '<span class="btn">月</span>'
  650. s += '<span class="btn calendar-select-active">年</span>'
  651. }
  652. s += '</div>'
  653. s += '</div>'
  654. }
  655. s += '</div >'
  656. return s;
  657. },
  658. _createHeader: function () {
  659. var me = this,
  660. opts = me.options,
  661. weekMode = opts.weekMode;
  662. var s = '<thead><tr>'
  663. weekMode.forEach(function (item) {
  664. s += ' <th class="calendar-column-header" title="周' + item + '"><span class="calendar-column-header-inner">' + item + '</span></th>'
  665. })
  666. s += '</thead></tr>'
  667. return s;
  668. },
  669. _createBody: function () {
  670. var me = this;
  671. var s = ' <tbody class="calendar-tbody">'
  672. s += '</tbody>'
  673. return s;
  674. },
  675. _refreshYearCalendar: function (newDate) {
  676. var me = this,
  677. showEvent = me.options.showEvent,
  678. maxEvent = me.options.maxEvent,
  679. s = '';
  680. //每次都重新获取会不会影响性能
  681. me.viewData = viewData = me.getViewDate(newDate);
  682. var year = newDate.getFullYear(), month = newDate.getMonth();
  683. //四行三列
  684. for (var i = 0; i < 4; i++) {
  685. s += '<tr>'
  686. for (var l = 0; l < 3; l++) {
  687. renderMonth = i * 3 + l;
  688. if (month == renderMonth) {
  689. s += '<td title="' + year + '年' + (renderMonth + 1) + '月" class="calendar-cell calendar-thisMonth">';
  690. }
  691. else {
  692. s += '<td title="' + year + '年' + (renderMonth + 1) + '月" class="calendar-cell">';
  693. }
  694. s += '<div class="calendar-date">';
  695. s += '<div class="calendar-value">' + (renderMonth + 1) + '月</div>';
  696. s += '<div class="calendar-content"><ul class="events">'
  697. if (showEvent && viewData[renderMonth]) {
  698. if (maxEvent && viewData[renderMonth].length > maxEvent) {
  699. s += viewData[renderMonth].length + "个事件";
  700. }
  701. else {
  702. viewData[renderMonth].forEach(function (item) {
  703. s += '<li><span>' + item.name + '</span></li>'
  704. })
  705. }
  706. }
  707. s += '</ul ></div > ';
  708. s += '</div></td>';
  709. }
  710. s += '</tr>'
  711. }
  712. me.el.find(".calendar-tbody").html(s);
  713. },
  714. _refreshCalendar: function (newDate,cycleData) {
  715. var me = this,
  716. showEvent = me.options.showEvent,
  717. maxEvent = me.options.maxEvent,
  718. holiday= me.options.holiday,
  719. h= me.options.height,
  720. mode = me.options.mode,
  721. el = me.el,
  722. s = '',
  723. X={};
  724. if(cycleData!=null){
  725. me.viewData = viewData = me.getViewDate(newDate,cycleData);
  726. }else{
  727. me.viewData =viewData=me.getViewDate(newDate,null);
  728. }
  729. var _newDate = me._cloneDate(newDate);
  730. //当前date
  731. var nowNum = _newDate.getDate();
  732. var week=[6,0];
  733. //第一天周几
  734. _newDate.setDate(1);
  735. var weekDay = _newDate.getDay() == 0 ? 7 : _newDate.getDay();
  736. //视图第一天
  737. var viewDate = me._cloneDate(_newDate);
  738. viewDate.setDate(viewDate.getDate() - weekDay + 1);
  739. //当前第几周/行 (暂不处理)
  740. var spileDate = (newDate.getTime() - viewDate.getTime()) / (1000 * 60 * 60 * 24);
  741. renderDate = me._cloneDate(viewDate);
  742. var A=me.calendardata(renderDate,weekDay);
  743. me.structure(A,X);
  744. var ins= X.dateArray;
  745. //固定六行
  746. for (var i = 0; i < 6; i++) {
  747. s += '<tr>'
  748. for (var l = 0; l < 7; l++) {
  749. var year = renderDate.getFullYear();
  750. var month = renderDate.getMonth() + 1;
  751. var date = renderDate.getDate();
  752. var day = renderDate.getDay();
  753. if (renderDate.getMonth() < newDate.getMonth()) {
  754. s += '<td title="' + year + '年' + month + '月' + date + '日" class="calendar-cell calendar-last-month-cell">';
  755. }
  756. else if (renderDate.getMonth() > newDate.getMonth()) {
  757. s += '<td title="' + year + '年' + month + '月' + date + '日" class="calendar-cell calendar-next-month-cell">';
  758. }
  759. else if (date == nowNum) {
  760. s += '<td title="' + year + '年' + month + '月' + date + '日" class="calendar-cell calendar-today">';
  761. }else if(day==week[0] || day==week[1]){
  762. s += '<td title="' + year + '年' + month + '月' + date + '日" class="calendar-cell calendar-weekend">';
  763. }
  764. else {
  765. s += '<td title="' + year + '年' + month + '月' + date + '日" class="calendar-cell">';
  766. }
  767. s += '<div class="calendar-date">';
  768. s += '<div class="calendar-value">' + date + '</div>';
  769. for (var a = 0; a < ins.length; a++) {
  770. if(ins[a]!=null){
  771. if(ins[a].solarMonth==month){
  772. if(ins[a].solarDate==date){
  773. // if(ins[a].holidayName==""){
  774. // s += '<div class="value">' + ins[a].showInLunar + '</div>';
  775. // }else{
  776. // var result = ins[a].holidayName.split(",");
  777. // for(var n = 0; n < result.length; n++) {
  778. // if(ins[a].showInLunar==result[n]){
  779. // s += '<div class="value">' + ins[a].holidayName + '</div>';
  780. // }
  781. // }
  782. // }
  783. if(ins[a].holidayDate=="holiday"){
  784. // s += '<div class="calendar-holiday">休</div><span class="calendar-holiday-bg"></span>';
  785. }else if(ins[a].holidayDate=="work"){
  786. // s += '<div class="calendar-work"><i class="iconfont iconshexiangji"></i></div><span class="calendar-work-bg"></span>';
  787. }
  788. }
  789. }
  790. }
  791. }
  792. s += '<div class="calendar-content"><ul class="events">';
  793. var Datajson=viewData[month-1];
  794. if(Datajson!=undefined){
  795. if (showEvent && Datajson && renderDate.getMonth() == newDate.getMonth()) {
  796. Datajson.forEach(function (item) {
  797. var start = me._getDateByString(item.startDate);
  798. var datamonth = start.getMonth()+1;
  799. var dataday= start.getDate();
  800. if(datamonth==month){
  801. if(dataday==date){
  802. if (maxEvent && Datajson.length > maxEvent) {
  803. s += Datajson.length + "个事件";
  804. }else{
  805. s += '<li class="calendar-work"><i class="iconfont iconshexiangji"></i></li><span class="calendar-work-bg"></span>';
  806. // s += '<li><span>' + item.name + '</span></li>'
  807. }
  808. }
  809. }
  810. })
  811. }
  812. }
  813. s += '</ul ></div > ';
  814. s += '</div></td>';
  815. renderDate.setDate(renderDate.getDate() + 1);
  816. }
  817. s += '</tr>'
  818. }
  819. me.el.find(".calendar-tbody").html(s);
  820. },
  821. _cloneDate: function (date) {
  822. return new Date(date.getFullYear(), date.getMonth(), date.getDate());
  823. },
  824. }
  825. $.fn.calendar = function (options) {
  826. var name = "calendar",
  827. type = Calendar;
  828. var ui = $.data(this, name);
  829. if (!ui) {
  830. ui = new type(this, options);
  831. $.data(this, name, ui);
  832. }
  833. return ui;
  834. };
  835. (function(w) {
  836. /**
  837. * map遍历数组
  838. * @param fn [function] 回调函数;
  839. * @param context [object] 上下文;
  840. */
  841. Array.prototype.myMap = function(fn, context) {
  842. context = context || window;
  843. var ary = [];
  844. if(Array.prototype.map) {
  845. ary = this.map(fn, context);
  846. } else {
  847. for(var i = 0; i < this.length; i++) {
  848. ary[i] = fn.apply(context, [this[i], i, this]);
  849. }
  850. }
  851. return ary;
  852. };
  853. })(window);