PageSourceSearch

https://www.renthome.go.kr/resources/plugin/ax5ui/ax5ui-calendar/ax5calendar.js

js renthome.go.kr collected 2026-10-05 10:45:39 UTC 48,980 bytes, 1,065 lines download raw bytes

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.