sys-calendar.js 34 KB

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