1"use strict"; 2 3// ax5.ui.calendar 4(function () { 5 6 var UI = ax5.ui; 7 var U = ax5.util; 8 var CALENDAR; 9 10 UI.addClass({ 11 className: "calendar", 12 version: "1.4.20" 13 }, function () { 14 15 /** 16 * @class ax5calendar 17 * @classdesc 18 * @author [email protected] 19 * @logs 20 * 2014-06-21 tom : ìì 21 * @example 22 * ```js 23 * ax5.info.months = ["1ì","2ì","3ì","4ì","5ì","6ì","7ì","8ì","9ì","10ì","11ì"]; 24 * ax5.info.weekNames = [ 25 * {label: "ì¼"}, 26 * {label: "ì"}, 27 * {label: "í"}, 28 * {label: "ì"}, 29 * {label: "목"}, 30 * {label: "ê¸"}, 31 * {label: "í "} 32 * ]; 33 * 34 * var myCalendar = new ax5.ui.calendar({ 35 * control: { 36 * left: 'âª', 37 * yearTmpl: '%s', 38 * monthTmpl: '%s', 39 * right: 'â«', 40 * yearFirst: true 41 * }, 42 * 43 * dimensions: { 44 * itemPadding: 1, 45 * height: 200 46 * }, 47 * 48 * target: document.getElementById("calendar-target"), 49 * displayDate: (new Date()), 50 * mode: "day", 51 * selectMode: "day", 52 * 53 * marker: (function () { 54 * var marker = {}; 55 * marker[_c_date(today, {'return': 'yyyy-MM-dd', 'add': {d: -1}})] = true; 56 * marker[_c_date(today, {'return': 'yyyy-MM-dd', 'add': {d: 0}})] = true; 57 * marker[_c_date(today, {'return': 'yyyy-MM-dd', 'add': {d: 1}})] = true; 58 * 59 * return marker; 60 * })(), 61 * onClick: function () { 62 * console.log(myCalendar.getSelection()); 63 * }, 64 * onStateChanged: function () { 65 * console.log(this); 66 * } 67 * , multipleSelect: 2 68 * }); 69 * ``` 70 */ 71 var ax5calendar = function ax5calendar() { 72 var self = this, 73 cfg, 74 selectableCount = 1; 75 76 this.instanceId = ax5.getGuid(); 77 this.target = null; 78 this.selection = []; 79 this.selectionMap = {}; 80 this.selectableMap = {}; 81 this.markerMap = {}; 82 this.printedDay = { 83 start: "", end: "" 84 }; 85 this.config = { 86 clickEventName: "click", 87 theme: 'default', 88 startOfWeek: 0, 89 mode: 'day', // day|month|year, 90 dateFormat: 'yyyy-MM-dd', 91 displayDate: new Date(), 92 animateTime: 100, 93 dimensions: { 94 controlHeight: '40', 95 controlButtonWidth: '40', 96 colHeadHeight: '30', 97 itemPadding: 2 98 }, 99 lang: { 100 yearHeading: "Choose the year", 101 monthHeading: "Choose the month", 102 yearTmpl: "%s", 103 months: ax5.info.months || ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC'], 104 dayTmpl: "%s" 105 }, 106 multipleSelect: false, 107 selectMode: 'day', 108 defaultMarkerTheme: 'holiday', 109 defaultPeriodTheme: 'period' 110 }; 111 112 cfg = this.config; 113 114 var onStateChanged = function onStateChanged(opts, that) { 115 if (opts && opts.onStateChanged) { 116 opts.onStateChanged.call(that, that); 117 } else if (this.onStateChanged) { 118 this.onStateChanged.call(that, that); 119 } 120 121 that = null; 122 }, 123 getFrame = function getFrame() { 124 var data = jQuery.extend(true, {}, cfg, { 125 controlCSS: {}, 126 controlButtonCSS: {} 127 }); 128 129 data.controlButtonCSS["height"] = data.controlCSS["height"] = U.cssNumber(cfg.dimensions.controlHeight); 130 data.controlButtonCSS["line-height"] = data.controlCSS["line-height"] = U.cssNumber(cfg.dimensions.controlHeight);
131 data.controlButtonCSS["width"] = U.cssNumber(cfg.dimensions.controlHeight); 132 133 data.controlCSS = U.css(data.controlCSS); 134 data.controlButtonCSS = U.css(data.controlButtonCSS); 135 136 try { 137 return CALENDAR.tmpl.get.call(this, "frameTmpl", data); 138 } finally { 139 data = null; 140 } 141 }, 142 setDisplay = function setDisplay() { 143 var myDate = U.date(cfg.displayDate), 144 yy = "", 145 mm = "", 146 yy1, 147 yy2; 148 149 if (cfg.control) { 150 if (cfg.mode == "day" || cfg.mode == "d") { 151 yy = cfg.control.yearTmpl ? cfg.control.yearTmpl.replace('%s', myDate.getFullYear()) : myDate.getFullYear(); 152 mm = cfg.control.monthTmpl ? cfg.control.monthTmpl.replace('%s', cfg.lang.months[myDate.getMonth()]) : cfg.lang.months[myDate.getMonth()]; 153 154 this.$["control-display"].html(function () { 155 if (cfg.control.yearFirst) { 156 return '<span data-calendar-display="year">' + yy + '</span>' + '<span data-calendar-display="month">' + mm + '</span>'; 157 } else { 158 return '<span data-calendar-display="month">' + mm + '</span>' + '<span data-calendar-display="year">' + yy + '</span>'; 159 } 160 }()); 161 } else if (cfg.mode == "month" || cfg.mode == "m") { 162 yy = cfg.control.yearTmpl ? cfg.control.yearTmpl.replace('%s', myDate.getFullYear()) : myDate.getFullYear(); 163 this.$["control-display"].html('<span data-calendar-display="year">' + yy + '</span>'); 164 } else if (cfg.mode == "year" || cfg.mode == "y") { 165 yy1 = cfg.control.yearTmpl ? cfg.control.yearTmpl.replace('%s', myDate.getFullYear() - 10) : myDate.getFullYear() - 10; 166 yy2 = cfg.control.yearTmpl ? cfg.control.yearTmpl.replace('%s', Number(myDate.getFullYear()) + 9) : Number(myDate.getFullYear()) + 9; 167 this.$["control-display"].html(yy1 + ' ~ ' + yy2); 168 } 169 170 this.$["control-display"].find('[data-calendar-display]').on(cfg.clickEventName, function (e) { 171 var target = U.findParentNode(e.target, function (target) { 172 if (target.getAttribute("data-calendar-display")) { 173 return true; 174 } 175 }), 176 mode; 177 if (target) { 178 mode = target.getAttribute("data-calendar-display"); 179 this.changeMode(mode); 180 } 181 target = null; 182 mode = null; 183 }.bind(this)); 184 } 185 186 myDate = null; 187 yy = null; 188 mm = null; 189 yy1 = null; 190 yy2 = null; 191 return this; 192 }, 193 printDay = function printDay(nowDate) { 194 var dotDate = U.date(nowDate), 195 monthStratDate = new Date(dotDate.getFullYear(), dotDate.getMonth(), 1, 12), 196 _today = cfg.displayDate, 197 tableStartDate = function () { 198 var day = monthStratDate.getDay(); 199 if (day == 0) day = 7; 200 day -= cfg.startOfWeek; 201 202 try { 203 return U.date(monthStratDate, { add: { d: -day } }); 204 } finally { 205 day = null; 206 } 207 }(), 208 loopDate, 209 thisMonth = dotDate.getMonth(), 210 itemStyles = {}, 211 i, 212 k, 213 _k, 214 frameWidth = this.$["body"].width(), 215 frameHeight = Math.floor(frameWidth * (6 / 7)), 216 // 1week = 7days, 1month = 6weeks 217 data, 218 tmpl; 219 220 if (cfg.dimensions.height) { 221 frameHeight = U.number(cfg.dimensions.height) - U.number(cfg.dimensions.colHeadHeight); 222 } 223 224 itemStyles['height'] = Math.floor(frameHeight / 6) - U.number(cfg.dimensions.itemPadding) * 2 + 'px'; 225 itemStyles['line-height'] = itemStyles['height']; 226 itemStyles['padding'] = U.cssNumber(cfg.dimensions.itemPadding); 227 228 data = { 229 weekNames: [].concat(ax5.info.weekNames), 230 list: [] 231 }; 232 233 if (cfg.startOfWeek) { 234 data.weekNames = data.weekNames.concat(data.weekNames.slice(0, cfg.startOfWeek)).splice(cfg.startOfWeek); 235 } 236
237 data.weekNames.forEach(function (n) { 238 n.colHeadHeight = U.cssNumber(cfg.dimensions.colHeadHeight); 239 }); 240 241 loopDate = tableStartDate; 242 i = 0; 243 while (i < 6) { 244 k = 0; 245 while (k < 7) { 246 _k = (7 + (k - cfg.startOfWeek)) % 7; 247 var thisDate = '' + U.date(loopDate, { "return": cfg.dateFormat }), 248 _date = { 249 'row': i, 250 'col': k, 251 isStartOfWeek: k == 0, 252 thisDate: '' + thisDate, 253 thisDataLabel: cfg.lang.dayTmpl.replace('%s', loopDate.getDate()), 254 itemStyles: U.css(itemStyles), 255 addClass: function () { 256 257 var classNames = ""; 258 259 if (cfg.selectable) { 260 if (self.selectableMap[thisDate]) { 261 classNames += loopDate.getMonth() == thisMonth ? " live" : ""; 262 } else { 263 classNames += " disable"; 264 } 265 } else { 266 if (loopDate.getMonth() == thisMonth) { 267 if (thisDate == U.date(_today, { "return": "yyyyMMdd" })) { 268 classNames += " focus"; 269 } else { 270 classNames += " live"; 271 } 272 273 if (loopDate.getDay() == 0) { 274 classNames += " sunday"; 275 } 276 if (loopDate.getDay() == 6) { 277 classNames += " saturday"; 278 } 279 } 280 } 281 282 return classNames; 283 }() + ' ' + function () { 284 return self.markerMap[thisDate] ? self.markerMap[thisDate].theme || cfg.defaultMarkerTheme : ''; 285 }() + ' ' + function () { 286 return self.selectionMap[thisDate] ? "selected-day" : ''; 287 }() 288 }; 289 data.list.push(_date); 290 291 k++; 292 loopDate = U.date(loopDate, { add: { d: 1 } }); 293 294 thisDate = null; 295 _date = null; 296 } 297 i++; 298 } 299 tmpl = CALENDAR.tmpl.get.call(this, "dayTmpl", data); 300 this.$["body"].html(tmpl); 301 this.$["body"].find('[data-calendar-item-date]').on(cfg.clickEventName, function (e) { 302 e = e || window.event; 303 onclick.call(self, e, 'date'); 304 U.stopEvent(e); 305 }); 306 307 this.printedDay = { 308 start: tableStartDate, end: loopDate 309 }; 310 311 onStateChanged.call(this, null, { 312 self: this, 313 action: "printDay", 314 printedDay: this.printedDay 315 }); 316 setDisplay.call(this); 317 318 dotDate = null; 319 monthStratDate = null; 320 _today = null; 321 tableStartDate = null; 322 loopDate = null; 323 thisMonth = null; 324 itemStyles = null; 325 i = null; 326 k = null; 327 frameWidth = null; 328 frameHeight = null; 329 data = null; 330 tmpl = null; 331 }, 332 printMonth = function printMonth(nowDate) { 333 var dotDate = U.date(nowDate), 334 nMonth = dotDate.getMonth(), 335 itemStyles = {}, 336 i, 337 k, 338 m, 339 tableStartMonth, 340 frameWidth = this.$["body"].width(), 341 frameHeight = Math.floor(frameWidth * (6 / 7)), 342 data, 343 tmpl; 344 345 if (cfg.dimensions.height) { 346 frameHeight = U.number(cfg.dimensions.height) - U.number(cfg.dimensions.colHeadHeight); 347 } 348 349 itemStyles['height'] = Math.floor(frameHeight / 4) - U.number(cfg.dimensions.itemPadding) * 2 + 'px'; 350 itemStyles['line-height'] = itemStyles['height']; 351 itemStyles['padding'] = U.cssNumber(cfg.dimensions.itemPadding); 352 353 data = { 354 colHeadHeight: U.cssNumber(cfg.dimensions.colHeadHeight),
355 colHeadLabel: cfg.lang.monthHeading, 356 list: [] 357 }; 358 359 tableStartMonth = 0; 360 m = 0; 361 i = 0; 362 while (i < 4) { 363 k = 0; 364 while (k < 3) { 365 var _month = { 366 row: i, 367 col: k, 368 isStartOfRow: k == 0, 369 thisMonth: dotDate.getFullYear() + '-' + U.setDigit(m + 1, 2) + '-' + U.setDigit(dotDate.getDate(), 2), 370 thisMonthLabel: cfg.lang.months[m], 371 itemStyles: U.css(itemStyles), 372 addClass: function () { 373 if (cfg.selectable) { 374 return self.selectableMap[m] ? 'live' : 'disable'; 375 } else { 376 return 'live'; 377 } 378 }() + ' ' + function () { 379 return m == nMonth ? "focus" : ""; 380 }() + ' ' + function () { 381 return self.markerMap[m] ? self.markerMap[m].theme || cfg.defaultMarkerTheme : ''; 382 }() 383 }; 384 data.list.push(_month); 385 m++; 386 k++; 387 _month = null; 388 } 389 i++; 390 } 391 tmpl = CALENDAR.tmpl.get.call(this, "monthTmpl", data); 392 this.$["body"].html(tmpl); 393 this.$["body"].find('[data-calendar-item-month]').on(cfg.clickEventName, function (e) { 394 e = e || window.event; 395 onclick.call(self, e, 'month'); 396 U.stopEvent(e); 397 }); 398 399 this.printedDay = { 400 start: dotDate.getFullYear() + '-' + U.setDigit(tableStartMonth + 1, 2), 401 end: dotDate.getFullYear() + '-' + U.setDigit(m, 2) 402 }; 403 404 onStateChanged.call(this, null, { 405 self: this, 406 action: "printMonth", 407 printedDay: this.printedDay 408 }); 409 setDisplay.call(this); 410 411 dotDate = null; 412 nMonth = null; 413 itemStyles = null; 414 i = null; 415 k = null; 416 m = null; 417 tableStartMonth = null; 418 frameWidth = null; 419 frameHeight = null; 420 data = null; 421 tmpl = null; 422 }, 423 printYear = function printYear(nowDate) { 424 var dotDate = U.date(nowDate), 425 nYear = dotDate.getFullYear(), 426 itemStyles = {}, 427 i, 428 k, 429 y, 430 tableStartYear, 431 frameWidth = this.$["body"].width(), 432 frameHeight = Math.floor(frameWidth * (6 / 7)), 433 data, 434 tmpl; 435 436 if (cfg.dimensions.height) { 437 frameHeight = U.number(cfg.dimensions.height) - U.number(cfg.dimensions.colHeadHeight); 438 } 439 440 itemStyles['height'] = Math.floor(frameHeight / 5) - U.number(cfg.dimensions.itemPadding) * 2 + 'px'; 441 itemStyles['line-height'] = itemStyles['height']; 442 itemStyles['padding'] = U.cssNumber(cfg.dimensions.itemPadding); 443 444 data = { 445 colHeadHeight: U.cssNumber(cfg.dimensions.colHeadHeight), 446 colHeadLabel: cfg.lang.yearHeading, 447 list: [] 448 }; 449 450 tableStartYear = nYear - 10; 451 y = nYear - 10; 452 i = 0; 453 while (i < 5) { 454 k = 0; 455 while (k < 4) { 456 var _year = { 457 row: i, 458 col: k, 459 isStartOfRow: k == 0, 460 thisYear: y + '-' + U.setDigit(dotDate.getMonth() + 1, 2) + '-' + U.setDigit(dotDate.getDate(), 2), 461 thisYearLabel: cfg.lang.yearTmpl.replace('%s', y), 462 itemStyles: U.css(itemStyles), 463 addClass: function () { 464 if (cfg.selectable) { 465 return self.selectableMap[y] ? 'live' : 'disable'; 466 } else { 467 return 'live'; 468 } 469 }() + ' ' + function () { 470 return y == nYear ? "focus" : ""; 471 }() + ' ' + function () { 472 return self.selectableMap[y] ? self.selectableMap[y].theme || cfg.defaultMarkerTheme : ''; 473 }() 474 }; 475 data.list.push(_year); 476 y++; 477 k++; 478 _year = null; 479 } 480 i++; 481 } 482 tmpl = CALENDAR.tmpl.get.call(this, "yearTmpl", data); 483 this.$["body"].html(tmpl); 484 this.$["body"].find('[data-calendar-item-year]').on(cfg.clickEventName, function (e) { 485 e = e || window.event; 486 onclick.call(this, e, 'year'); 487 U.stopEvent(e); 488 }); 489 490 this.printedDay = { 491 start: tableStartYear, end: y - 1 492 }; 493 494 onStateChanged.call(this, null, { 495 self: this, 496 action: "printYear", 497 printedDay: this.printedDay 498 }); 499 setDisplay.call(this); 500 501 dotDate = null; 502 nYear = null; 503 itemStyles = null; 504 i = null; 505 k = null; 506 y = null; 507 tableStartYear = null; 508 frameWidth = null; 509 frameHeight = null; 510 data = null; 511 tmpl = null; 512 }, 513 onclick = function onclick(e, mode, target, value) { 514 var removed, dt, selectable; 515 516 mode = mode || "date"; 517 target = U.findParentNode(e.target, function (target) { 518 if (target.getAttribute("data-calendar-item-" + mode)) { 519 return true; 520 } 521 }); 522 if (target) { 523 value = target.getAttribute("data-calendar-item-" + mode); 524 525 dt = U.date(value, { "return": cfg.dateFormat }); 526 selectable = true; 527 selectableCount = cfg.multipleSelect ? U.isNumber(cfg.multipleSelect) ? cfg.multipleSelect : 2 : 1; 528 529 if (cfg.selectable) { 530 if (!self.selectableMap[dt]) selectable = false;
531 } 532 533 if (mode == "date") { 534 if (selectable) { 535 536 if (self.selection.length >= selectableCount) { 537 removed = self.selection.splice(0, self.selection.length - (selectableCount - 1)); 538 removed.forEach(function (d) { 539 self.$["body"].find('[data-calendar-item-date="' + U.date(d, { "return": cfg.dateFormat }) + '"]').removeClass("selected-day"); 540 }); 541 } 542 543 jQuery(target).addClass("selected-day"); 544 self.selection.push(value); 545 546 if (self.onClick) { 547 self.onClick.call({ 548 self: this, date: value, target: this.target, dateElement: target 549 }); 550 } 551 } 552 } else if (mode == "month") { 553 if (cfg.selectMode == "month") { 554 if (selectable) { 555 if (self.selection.length >= selectableCount) { 556 removed = self.selection.splice(0, self.selection.length - (selectableCount - 1)); 557 removed.forEach(function (d) { 558 self.$["body"].find('[data-calendar-item-month="' + U.date(d, { "return": 'yyyy-MM-dd' }) + '"]').removeClass("selected-month"); 559 }); 560 } 561 562 jQuery(target).addClass("selected-month"); 563 self.selection.push(value); 564 565 if (self.onClick) { 566 self.onClick.call({ 567 self: this, date: value, target: this.target, dateElement: target 568 }); 569 } 570 } 571 } else { 572 self.changeMode("day", value); 573 } 574 } else if (mode == "year") { 575 if (cfg.selectMode == "year") { 576 if (selectable) { 577 if (self.selection.length >= selectableCount) { 578 removed = self.selection.splice(0, self.selection.length - (selectableCount - 1)); 579 removed.forEach(function (d) { 580 self.$["body"].find('[data-calendar-item-year="' + U.date(d, { "return": 'yyyy-MM-dd' }) + '"]').removeClass("selected-year"); 581 }); 582 } 583 584 jQuery(target).addClass("selected-year"); 585 self.selection.push(value); 586 587 if (self.onClick) { 588 self.onClick.call({ 589 self: this, date: value, target: this.target, dateElement: target 590 }); 591 } 592 } 593 } else { 594 self.changeMode("month", value); 595 } 596 } 597 } 598 599 mode = null; 600 target = null; 601 value = null; 602 removed = null; 603 dt = null; 604 selectable = null; 605 }, 606 move = function move(e, target, value) { 607 target = U.findParentNode(e.target, function (target) { 608 if (target.getAttribute("data-calendar-move")) { 609 return true; 610 } 611 }); 612 if (target) { 613 value = target.getAttribute("data-calendar-move"); 614 if (cfg.mode == "day" || cfg.mode == "d") { 615 if (value == "left") { 616 cfg.displayDate = U.date(cfg.displayDate, { add: { m: -1 } }); 617 } else { 618 cfg.displayDate = U.date(cfg.displayDate, { add: { m: 1 } }); 619 } 620 printDay.call(this, cfg.displayDate); 621 } else if (cfg.mode == "month" || cfg.mode == "m") { 622 if (value == "left") { 623 cfg.displayDate = U.date(cfg.displayDate, { add: { y: -1 } }); 624 } else { 625 cfg.displayDate = U.date(cfg.displayDate, { add: { y: 1 } }); 626 } 627 printMonth.call(this, cfg.displayDate); 628 } else if (cfg.mode == "year" || cfg.mode == "y") { 629 if (value == "left") { 630 cfg.displayDate = U.date(cfg.displayDate, { add: { y: -10 } }); 631 } else { 632 cfg.displayDate = U.date(cfg.displayDate, { add: { y: 10 } }); 633 } 634 printYear.call(this, cfg.displayDate); 635 } 636 } 637 638 target = null; 639 value = null; 640 }, 641 applyMarkerMap = function applyMarkerMap() { 642 setTimeout(function () { 643 if (cfg.mode === "day" || cfg.mode === "d") { 644 for (var k in this.markerMap) { 645 this.$["body"].find('[data-calendar-item-date="' + k + '"]').addClass(this.markerMap[k].theme || cfg.defaultMarkerTheme); 646 } 647 } 648 }.bind(this)); 649 }, 650 applySelectionMap = function applySelectionMap() { 651 setTimeout(function () { 652 for (var k in this.selectionMap) { 653 this.$["body"].find('[data-calendar-item-date="' + k + '"]').addClass("selected-day"); 654 } 655 }.bind(this)); 656 }, 657 applyPeriodMap = function applyPeriodMap() { 658 setTimeout(function () { 659 if (cfg.mode === "day" || cfg.mode === "d") {
660 for (var k in this.periodMap) { 661 if (this.periodMap[k].label) { 662 this.$["body"].find('[data-calendar-item-date="' + k + '"]').find(".addon-footer").html(this.periodMap[k].label); 663 } 664 this.$["body"].find('[data-calendar-item-date="' + k + '"]').addClass(this.periodMap[k].theme); 665 } 666 } 667 }.bind(this)); 668 }, 669 clearPeriodMap = function clearPeriodMap() { 670 if (cfg.mode === "day" || cfg.mode === "d") { 671 for (var k in this.periodMap) { 672 this.$["body"].find('[data-calendar-item-date="' + k + '"]').find(".addon-footer").empty(); 673 this.$["body"].find('[data-calendar-item-date="' + k + '"]').removeClass(this.periodMap[k].theme); 674 } 675 } 676 }; 677 678 /** 679 * Preferences of calendar UI 680 * @method ax5calendar.setConfig 681 * @param {Object} config - í´ëì¤ ìì±ê° 682 * @param {Element|nodelist} config.target 683 * @param {String} [config.mode=day|month|year] 684 * @param {Function} [config.onClick} 685 * @returns {ax5calendar} 686 * @example 687 * ```js 688 * var myCalendar = new ax5.ui.calendar(); 689 * myCalendar.setConfig({ 690 * target: $("#target"), 691 * mode: "day" 692 * }); 693 * ``` 694 */ 695 //== class body start 696 this.init = function () { 697 // after setConfig(); 698 699 this.onStateChanged = cfg.onStateChanged; 700 this.onClick = cfg.onClick; 701 702 if (!cfg.target) { 703 console.log(ax5.info.getError("ax5calendar", "401", "setConfig")); 704 } 705 this.target = jQuery(cfg.target); 706 707 cfg.displayDate = U.date(cfg.displayDate); 708 this.target.html(getFrame.call(this)); 709 710 // íí¸ìì§ 711 this.$ = { 712 "root": this.target.find('[data-calendar-els="root"]'), 713 "control": this.target.find('[data-calendar-els="control"]'), 714 "control-display": this.target.find('[data-calendar-els="control-display"]'), 715 "body": this.target.find('[data-calendar-els="body"]') 716 }; 717 718 if (cfg.control) { 719 this.$["root"].on(cfg.clickEventName, '[data-calendar-move]', function (e) { 720 move.call(this, e || window.event); 721 }.bind(this)); 722 } 723 724 // collect selectableMap 725 if (cfg.selection) { 726 this.setSelection(cfg.selection, false); 727 } 728 // collect selectableMap 729 if (cfg.selectable) { 730 this.setSelectable(cfg.selectable, false); 731 } 732 // collect markerMap 733 if (cfg.marker) { 734 this.setMarker(cfg.marker, false); 735 } 736 737 setTimeout(function () { 738 if (cfg.mode === "day" || cfg.mode === "d") { 739 printDay.call(this, cfg.displayDate); 740 } else if (cfg.mode === "month" || cfg.mode === "m") { 741 printMonth.call(this, cfg.displayDate); 742 } else if (cfg.mode === "year" || cfg.mode === "y") { 743 printYear.call(this, cfg.displayDate); 744 } 745 }.bind(this)); 746 }; 747 748 /** 749 * @method ax5calendar.changeMode 750 * @param {String} mode 751 * @param {String} changeDate 752 * @returns {ax5calendar} 753 */ 754 this.changeMode = function (mode, changeDate) { 755 756 if (typeof changeDate != "undefined") cfg.displayDate = changeDate; 757 if (mode) cfg.mode = mode; 758 759 this.$["body"].removeClass("fadein").addClass("fadeout"); 760 setTimeout(function () { 761 if (cfg.mode == "day" || cfg.mode == "d") { 762 printDay.call(this, cfg.displayDate); 763 } else if (cfg.mode == "month" || cfg.mode == "m") { 764 printMonth.call(this, cfg.displayDate); 765 } else if (cfg.mode == "year" || cfg.mode == "y") { 766 printYear.call(this, cfg.displayDate); 767 } 768 this.$["body"].removeClass("fadeout").addClass("fadein"); 769 }.bind(this), cfg.animateTime); 770 771 return this; 772 }; 773 774 /** 775 * @method ax5calendar.setSelection 776 * @param {Array} selection 777 * @returns {ax5calendar} 778 * @example 779 * ``` 780 * 781 * ``` 782 */ 783 this.setSelection = function () { 784 self.selectionMap = {}; 785 var processor = { 786 'arr': function arr(v, map, count) { 787 map = {}; 788 if (!U.isArray(v)) return map; 789 self.selection = v = v.splice(0, count); 790 v.forEach(function (n) { 791 if (U.isDate(n)) n = U.date(n, { 'return': cfg.dateFormat }); 792 map[n] = true; 793 }); 794 return map; 795 } 796 }; 797 798 return function (selection, isPrint) { 799 var result = {}; 800 selectableCount = cfg.multipleSelect ? U.isNumber(cfg.multipleSelect) ? cfg.multipleSelect : 2 : 1; 801 802 if (cfg.selection = selection) { 803 if (U.isArray(selection)) { 804 result = processor.arr(selection, {}, selectableCount); 805 } else { 806 return this; 807 } 808 } 809 810 this.selectionMap = jQuery.extend({}, result); 811 // ë³ê²½ë´ì© ì ì©íì¬ ì¶ë ¥ 812 813 if (isPrint !== false) applySelectionMap.call(this); 814 815 result = null; 816 817 return this; 818 }; 819 }(); 820 821 /** 822 * @method ax5calendar.getSelection 823 */
824 this.getSelection = function () { 825 return this.selection; 826 }; 827 828 /** 829 * @method ax5calendar.setSelectable 830 */ 831 this.setSelectable = function () { 832 self.selectableMap = {}; 833 var processor = { 834 'arr': function arr(v, map) { 835 map = {}; 836 if (!U.isArray(v)) return map; 837 v.forEach(function (n) { 838 if (U.isDate(n)) n = U.date(n, { 'return': cfg.dateFormat }); 839 map[n] = true; 840 }); 841 return map; 842 }, 843 'obj': function obj(v, map) { 844 map = {}; 845 if (U.isArray(v)) return map; 846 if (v.range) return map; 847 for (var k in v) { 848 map[k] = v[k]; 849 } 850 return map; 851 }, 852 'range': function range(v, map) { 853 map = {}; 854 if (U.isArray(v)) return map; 855 if (!v.range) return map; 856 857 v.range.forEach(function (n) { 858 if (U.isDateFormat(n.from) && U.isDateFormat(n.to)) { 859 for (var d = U.date(n.from); d <= U.date(n.to); d.setDate(d.getDate() + 1)) { 860 map[U.date(d, { "return": cfg.dateFormat })] = true; 861 } 862 } else { 863 for (var i = n.from; i <= n.to; i++) { 864 map[i] = true; 865 } 866 } 867 }); 868 869 return map; 870 } 871 }; 872 873 return function (selectable, isPrint) { 874 875 var key, 876 result = {}; 877 878 if (cfg.selectable = selectable) { 879 if (U.isArray(selectable)) { 880 result = processor.arr(selectable); 881 } else { 882 for (key in processor) { 883 if (selectable[key]) { 884 result = processor[key](selectable); 885 break; 886 } 887 } 888 if (Object.keys(result).length === 0) { 889 result = processor.obj(selectable); 890 } 891 } 892 } 893 894 this.selectableMap = result; 895 // ë³ê²½ë´ì© ì ì©íì¬ ì¶ë ¥ 896 if (isPrint !== false) this.changeMode(); 897 898 return this; 899 }; 900 }(); 901 902 /** 903 * @method ax5calendar.setMarker 904 */ 905 this.setMarker = function () { 906 self.markerMap = {}; 907 var processor = { 908 'obj': function obj(v, map) { 909 map = {}; 910 if (U.isArray(v)) return map; 911 if (v.range) return map; 912 for (var k in v) { 913 map[k] = v[k]; 914 } 915 916 v = null; 917 return map; 918 }, 919 'range': function range(v, map) { 920 map = {}; 921 if (U.isArray(v)) return map; 922 if (!v.range) return map; 923 924 v.range.forEach(function (n) { 925 if (U.isDateFormat(n.from) && U.isDateFormat(n.to)) { 926 for (var d = U.date(n.from); d <= U.date(n.to); d.setDate(d.getDate() + 1)) { 927 map[U.date(d, { "return": cfg.dateFormat })] = { theme: n.theme, label: n.label }; 928 } 929 } else { 930 for (var i = n.from; i <= n.to; i++) { 931 map[i] = { theme: n.theme, label: n.label }; 932 } 933 } 934 }); 935 936 v = null; 937 return map; 938 } 939 }; 940 941 return function (marker, isApply) { 942 943 var key, 944 result = {}; 945 946 if (cfg.marker = marker) { 947 for (key in processor) { 948 if (marker[key]) { 949 result = processor[key](marker); 950 break; 951 } 952 } 953 if (Object.keys(result).length === 0) { 954 result = processor.obj(marker); 955 } 956 } 957 958 this.markerMap = result; 959 // ë³ê²½ë´ì© ì ì©íì¬ ì¶ë ¥ 960 if (isApply !== false) applyMarkerMap.call(this); 961 return this; 962 }; 963 }(); 964 965 /** 966 * @method ax5calendar.setPeriod 967 */ 968 this.setPeriod = function () { 969 self.periodMap = {}; 970 971 var processor = { 972 'range': function range(v, map) { 973 map = {}; 974 if (U.isArray(v)) return map; 975 if (!v.range) return map; 976 977 v.range.forEach(function (n) { 978 if (U.isDateFormat(n.from) && U.isDateFormat(n.to)) { 979 for (var d = new Date(U.date(n.from)); d <= U.date(n.to); d.setDate(d.getDate() + 1)) { 980 if (d.getTime() == U.date(n.from).getTime()) { 981 map[U.date(d, { "return": cfg.dateFormat })] = { theme: n.theme || cfg.defaultPeriodTheme, label: n.fromLabel }; 982 } else if (d.getTime() == U.date(n.to).getTime()) { 983 map[U.date(d, { "return": cfg.dateFormat })] = { theme: n.theme || cfg.defaultPeriodTheme, label: n.toLabel }; 984 } else { 985 map[U.date(d, { "return": cfg.dateFormat })] = { theme: n.theme || cfg.defaultPeriodTheme }; 986 } 987 } 988 } 989 }); 990 991 v = null; 992 return map; 993 } 994 }; 995 996 return function (period, isApply) { 997 998 var key, 999 result = {}; 1000 1001 // ë³ê²½ë´ì© ì ì©íì¬ ì¶ë ¥ 1002 if (isApply !== false) { 1003 clearPeriodMap.call(this); 1004 } 1005 1006 if (cfg.period = period) { 1007 result = processor.range(period); 1008 } 1009
1010 this.periodMap = result; 1011 1012 //console.log(this.periodMap); 1013 1014 // ë³ê²½ë´ì© ì ì©íì¬ ì¶ë ¥ 1015 if (isApply !== false) { 1016 applyPeriodMap.call(this); 1017 } 1018 return this; 1019 }; 1020 }(); 1021 1022 // í´ëì¤ ìì±ì 1023 this.main = function () { 1024 1025 UI.calendar_instance = UI.calendar_instance || []; 1026 UI.calendar_instance.push(this); 1027 1028 if (arguments && U.isObject(arguments[0])) { 1029 this.setConfig(arguments[0]); 1030 } 1031 }.apply(this, arguments); 1032 }; 1033 return ax5calendar; 1034 }()); 1035 CALENDAR = ax5.ui.calendar; 1036})(); 1037// ax5.ui.calendar.tmpl 1038(function () { 1039 1040 var CALENDAR = ax5.ui.calendar; 1041 1042 var frameTmpl = function frameTmpl(columnKeys) { 1043 return "\n <div class=\"ax5-ui-calendar {{theme}}\" data-calendar-els=\"root\" onselectstart=\"return false;\">\n {{#control}}\n <div class=\"calendar-control\" data-calendar-els=\"control\" style=\"{{controlCSS}}\">\n <a class=\"date-move-left\" data-calendar-move=\"left\" style=\"{{controlButtonCSS}}\">{{{left}}}</a>\n <div class=\"date-display\" data-calendar-els=\"control-display\" style=\"{{controlCSS}}\"></div>\n <a class=\"date-move-right\" data-calendar-move=\"right\" style=\"{{controlButtonCSS}}\">{{{right}}}</a>\n </div>\n {{/control}}\n <div class=\"calendar-body\" data-calendar-els=\"body\"></div>\n </div>\n "; 1044 }; 1045 var dayTmpl = function dayTmpl(columnKeys) { 1046 return "\n <table data-calendar-table=\"day\" cellpadding=\"0\" cellspacing=\"0\" style=\"width:100%;\">\n <thead>\n <tr>\n {{#weekNames}}\n <td class=\"calendar-col-{{col}}\" style=\"height: {{colHeadHeight}}\">\n {{label}}\n </td>\n {{/weekNames}}\n </tr>\n </thead>\n <tbody>\n <tr>\n {{#list}} \n {{#isStartOfWeek}}\n {{^@first}}\n </tr>\n <tr>\n {{/@first}}\n {{/isStartOfWeek}}\n <td class=\"calendar-col-{{col}}\" style=\"{{itemStyles}}\">\n <a class=\"calendar-item-day {{addClass}}\" data-calendar-item-date=\"{{thisDate}}\">\n <span class=\"addon addon-header\"></span>\n {{thisDataLabel}}\n <span class=\"addon addon-footer\"></span>\n </a>\n </td>\n {{/list}}\n </tr>\n </tbody>\n </table>\n "; 1047 }; 1048 var monthTmpl = function monthTmpl(columnKeys) { 1049 return "\n <table data-calendar-table=\"month\" cellpadding=\"0\" cellspacing=\"0\" style=\"width:100%;\">\n <thead>\n <tr>\n <td class=\"calendar-col-0\" colspan=\"3\" style=\"height: {{colHeadHeight}}\">\n {{colHeadLabel}}\n </td>\n </tr>\n </thead>\n <tbody>\n <tr>\n {{#list}} \n {{#isStartOfRow}}\n {{^@first}}\n </tr>\n <tr>\n {{/@first}}\n {{/isStartOfRow}}\n <td class=\"calendar-col-{{col}}\" style=\"{{itemStyles}}\">\n <a class=\"calendar-item-month {{addClass}}\" data-calendar-item-month=\"{{thisMonth}}\">
1049\n <span class=\"addon\"></span>\n {{thisMonthLabel}}\n <span class=\"lunar\"></span>\n </a>\n </td>\n {{/list}}\n </tr>\n </tbody>\n </table>\n "; 1050 }; 1051 var yearTmpl = function yearTmpl(columnKeys) { 1052 return "\n <table data-calendar-table=\"year\" cellpadding=\"0\" cellspacing=\"0\" style=\"width:100%;\">\n <thead>\n <tr>\n <td class=\"calendar-col-0\" colspan=\"4\" style=\"height: {{colHeadHeight}}\">\n {{colHeadLabel}}\n </td>\n </tr>\n </thead>\n <tbody>\n <tr>\n {{#list}} \n {{#isStartOfRow}}\n {{^@first}}\n </tr>\n <tr>\n {{/@first}}\n {{/isStartOfRow}}\n <td class=\"calendar-col-{{col}}\" style=\"{{itemStyles}}\">\n <a class=\"calendar-item-year {{addClass}}\" data-calendar-item-year=\"{{thisYear}}\">\n <span class=\"addon\"></span>\n {{thisYearLabel}}\n <span class=\"lunar\"></span>\n </a>\n </td>\n {{/list}}\n </tr>\n </tbody>\n </table>\n "; 1053 }; 1054 1055 CALENDAR.tmpl = { 1056 "frameTmpl": frameTmpl, 1057 "dayTmpl": dayTmpl, 1058 "monthTmpl": monthTmpl, 1059 "yearTmpl": yearTmpl, 1060 1061 get: function get(tmplName, data, columnKeys) { 1062 return ax5.mustache.render(CALENDAR.tmpl[tmplName].call(this, columnKeys), data); 1063 } 1064 }; 1065})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.