sys-calendar.js 34 KB

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