

; (function (win, undefined) {
    let _this = null;

    let dateMultiFunc = function (options) {
        _this = this;
        this.options = {
            type: 0,
            position: "bottom",
            radius: 0,
            color: "#333333",
            background: "#ffffff",
            opacity: 0.7,
            selectBg: "#F00",
            selectColor: "#ffffff",
            selectRadius: 100,
            tranBg: "#ffe5e5",
            tranColor: "#333333",
            title: "",
            title2: "",
            isCancel: true,
            cancelText: "Cancel",
            cancelFunc: () => { },
            confirmText: "Submit",
            confirmFunc: () => { },
            backFormat: ".",
            isShow: false,

            // 
            appointTime: [],//
            appointOn: [],//
            minTime: "",//
            maxTime: "",//
            defaultYears: "",//
            ...options
        };



        this.currYears = {};//
        this.appointTimeArr = [];//
        this.appointOnArr = [];//
        this.minTimeJson = {};//  
        this.maxTimeJson = {};//  
        this.dateMultiEles = {};//  

        this.selectTimes = [];//
        this.selectObj = [];//
        this.selectPeriod = [];//

        //
        this.init();
    };

    dateMultiFunc.prototype = {
       
        init() {
            
            this.transformOptionaTime();

            
            this.create();
        },
        
        create() {
            // 
            let date_multi_popup = document.createElement("div");
            date_multi_popup.className = "date_multi_popup";
            // 
            let date_multi_bg = document.createElement("div");
            date_multi_bg.className = "date_multi_bg";
            date_multi_popup.appendChild(date_multi_bg);

            // 
            let date_multi_inner = document.createElement("div");
            date_multi_inner.className = "date_multi_inner";
            // 
            let date_multi_title = document.createElement("div");
            date_multi_title.className = "date_multi_title";
            // 
           
		   // 
            let tp = document.createElement("p");
			tp.className = "t1";
            tp.innerHTML = this.options.title;
            date_multi_title.appendChild(tp);

			let tp2 = document.createElement("p");
			tp2.className = "t2";
            tp2.innerHTML = this.options.title2;
            date_multi_title.appendChild(tp2);

			date_multi_inner.appendChild(date_multi_title);

            //
            let date_multi_time = document.createElement("div");
            date_multi_time.className = "date_multi_title date_multi_time";
            //
            let time_tit = document.createElement("p");
            //
            let time = this.getYearsDay(this.options.defaultYears, true);

			if(time.month < 10){
				time_tit.innerHTML = time.year + "-0" + time.month;
			}else{
				time_tit.innerHTML = time.year + "-" + time.month;
			}
            //time_tit.innerHTML = time.year + "-" + time.month;
            //
            let prev_month = document.createElement("span");//
            let next_month = document.createElement("span");//

			prev_month.innerHTML = '<i class="xi-angle-left"></i>';
			next_month.innerHTML = '<i class="xi-angle-right"></i>';

            date_multi_time.appendChild(prev_month);
            date_multi_time.appendChild(time_tit);
            date_multi_time.appendChild(next_month);
            //
            date_multi_inner.appendChild(date_multi_time);

            //
            let date_multi_con = document.createElement("div");
            date_multi_con.className = "date_multi_con";
            //
            date_multi_con.appendChild(this.createDateWeek());
            //
            date_multi_inner.appendChild(date_multi_con);


			let date_multi_bottom = document.createElement("div");
            date_multi_bottom.className = "date_multi_bottom";

			let cancel_btn = "";
            if (this.options.isCancel) {
                cancel_btn = document.createElement("span");
                cancel_btn.innerHTML = this.options.cancelText;
                date_multi_bottom.appendChild(cancel_btn);
            };
            // 
            let confirm_btn = document.createElement("span");
            confirm_btn.innerHTML = this.options.confirmText;
            date_multi_bottom.appendChild(confirm_btn);
            // 
            date_multi_inner.appendChild(date_multi_bottom);


            date_multi_popup.appendChild(date_multi_inner);
            document.body.appendChild(date_multi_popup);

            //
            let dateMultiEles = {
                date_multi_popup,//
                date_multi_bg,//
                cancel_btn,//
                date_multi_title,//
                date_multi_bottom,//
                confirm_btn,//
                time_tit,//
                prev_month,//
                next_month,//
                date_multi_con,//
            };
            // 
            this.dateMultiEles = Object.assign(this.dateMultiEles, dateMultiEles);

            // 
            this.createdCss();
            //
            if (this.options.isShow) {
                this.show();
            };

            //
            this.initEvent();
        },
        //
        show() {
            if (this.dateMultiEles.date_list) {
                //
                if (this.isIEOrIE11()) {
                    this.dateMultiEles.date_list.removeNode(true);
                } else {
                    this.dateMultiEles.date_list.remove();//
                }
            };
            //
            this.createDateList();

            setTimeout(() => {
                this.options.isShow = true;
                if (this.dateMultiEles['date_multi_popup']) {
                    this.dateMultiEles['date_multi_popup'].classList.add("date_multi_show");
                    document.body.style.overflow = "hidden";
                }
            }, 0);
        },
        //
        close() {
            this.options.isShow = false;
            if (this.dateMultiEles['date_multi_popup']) {
                this.dateMultiEles['date_multi_popup'].classList.remove("date_multi_show");
            };
            document.body.style.overflow = "visible";
            //
            this.clear();
        },
        //
        clear() {
            this.selectTimes = [];//
            this.selectObj = [];//
            this.selectPeriod = [];//
        },
        //
        destroy() {
            try {
                // 
                let date_multi_func_css = document.getElementById("date_multi_func_css");
                // 
                if (this.isIEOrIE11()) {
                    // 
                    this.dateMultiEles.date_multi_popup.removeNode(true);
                    // 
                    date_multi_func_css.removeNode(true);
                } else {
                    // 
                    this.dateMultiEles.date_multi_popup.remove();
                    //
                    date_multi_func_css.remove();
                };

                // 
                this.removeEvent();

                dateFuncObj = null;
            } catch (err) { }
        },
        // 
        modifyCssRadius() {
            //
            if (this.options.selectRadius > 10) {
                this.options.selectRadius = 10;
            }
        },
        //
        createdCss() {
            let css = `
                :root {
                    --date_multi_func-selectBg: ${this.options.selectBg};
                    --date_multi_func-selectColor: ${this.options.selectColor};
                    --date_multi_func-tranBg: ${this.options.tranBg};
                    --date_multi_func-tranColor: ${this.options.tranColor};
                    --date_multi_func-selectRadius:${this.options.selectRadius}%;
                    --date_multi_func-color:${this.options.color};
                    --date_multi_func-background:${this.options.background};
                    --date_multi_func-opacity:${this.options.opacity};
                }
                .date_multi_popup,.date_multi_popup *{
                    margin: 0;
                    padding: 0;
                }
                .date_multi_popup{
                    position: fixed;
                    z-index: 2000;
                    width: 100%;
                    height: 100%;
                    font-size: 13px;
                    top: 0;
                    left: 0;
                    display: -webkit-box;
                    display: -moz-box;
                    display: -ms-flexbox;
                    display: flex;
                    -webkit-box-direction: normal;
                    -webkit-box-orient: vertical;
                    -moz-flex-direction: column;
                    -webkit-flex-direction: column;
                    flex-direction: column;
                    -webkit-box-pack: end;
                    -moz-justify-content: flex-end;
                    -webkit-justify-content: flex-end;
                    justify-content: flex-end;
                    -webkit-box-align: center;
                    -moz-align-items: center;
                    -webkit-align-items: center;
                    align-items: center;
                    transition: all 0.2s;
                    opacity: 0;
                    visibility: hidden;
                    color: ${this.options.color};
                    color: var(--date_multi_func-color);
                }
                .date_multi_show{
                    opacity: 1;
                    visibility: visible;
                }
                .date_multi_popup .date_multi_bg{
                    position: absolute;
                    z-index: 1;
                    top: 0;
                    left: 0;
                    width: 100%;
                    height: 100%;
                    background: #000;
                    opacity: ${this.options.opacity};
                    opacity: var(--date_multi_func-opacity);
                }
                .date_multi_popup .date_multi_inner{
                    position: relative;
                    z-index: 5;
                    width: 95%;
					max-width:400px;
                    min-height: 20%;
                    padding-top: 6px;
                    box-shadow: 0px 0px 3px -1px #999;
                    transition: all 0.3s 0.2s;
                    transform: translateY(100%);
                    opacity: 0;
                    background-color: ${this.options.background};
                    background-color: var(--date_multi_func-background);
                }
                .date_multi_show .date_multi_inner{
                    transform: translateY(0);
                    opacity: 1;
                }
                .date_multi_popup .date_multi_title{
                    width: 100%;
                    position: relative;
                    line-height: 2.4;
                }
                .date_multi_popup .date_multi_title p{
                    font-size: 16px;
                    text-align: center;
                }
				.date_multi_popup .date_multi_title .t1{
					margin: 25px 0 0 0;
                    font-size: 30px;
					font-family: 'TourEasyT';
                }
				.date_multi_popup .date_multi_title .t2{
					font-size: 16px;
					color: #999;
					margin: 10px 0 25px 0;
                }
                .date_multi_popup .date_multi_title span{
                    display:block;
                    height: 100%;
                    position: absolute;
                    font-size: 14px;
                    left: 0;
                    top: 0;
                    padding: 0 20px;
                }
                .date_multi_popup .date_multi_title span:last-child{
                    left: auto;
                    right: 0;
                }
                .date_multi_popup .date_multi_time{
                    line-height: 2.4;
					margin:0 0 25px 0;
                }
                .date_multi_popup .date_multi_time p{
                    font-weight: bold;
					line-height: 30px;
					font-size: 25px;
                }
                .date_multi_popup .date_multi_time span:first-child{
                    display: flex !important;
					justify-content: center;
					align-items: center;
					position: absolute;
					top: 0;
					left: 30px;
					width: 40px;
					height: 40px;
					border-radius: 50%;
					border: 1px solid #CCC;
					cursor: pointer;
                }
				.date_multi_popup .date_multi_time span:last-child{
                    display: flex !important;
					justify-content: center;
					align-items: center;
					position: absolute;
					top: 0;
					right: 30px;
					width: 40px;
					height: 40px;
					border-radius: 50%;
					border: 1px solid #CCC;
					cursor: pointer;
                }
				.date_multi_popup .date_multi_time i{
                    font-size: 18px;
                }
                /*.date_multi_popup .date_multi_time span::after{
                    position: absolute;
                    content: "";
                    display: block;
                    width: 0;
                    height: 0;
                    border-left: 6px solid transparent;
                    border-top: 4px solid transparent;
                    border-bottom: 4px solid transparent;
                    left: 50%;
                    margin-left: -4px;
                    top: 50%;
                    margin-top: -6px;
                    border-right: 6px solid ${this.options.color};
                    border-right: 6px solid var(--date_multi_func-color);
                }*/
                .date_multi_popup .date_multi_time span:last-child::after{
                    border-right: 6px solid transparent;
                    border-left: 6px solid ${this.options.color};
                    border-left: 6px solid var(--date_multi_func-color);
                }
                
                .date_multi_popup .date_multi_con{
                    width: 100%;
                    padding: 0 10px 10px 10px;
                    box-sizing: border-box;
                }
				.date_multi_popup .date_multi_bottom{
					width: 100%;
					display: flex;
					justify-content: center;
					margin: 0 0 0 0;
					padding: 0 15px 15px 15px;
				}
				.date_multi_popup .date_multi_bottom span {
					display: flex;
					justify-content: center;
					align-items: center;
					margin: 0 5px;
					width: 20%;
					height: 40px;
					border: 1px solid #000;
					cursor: pointer;
				}
				.date_multi_popup .date_multi_bottom span:last-child {
					background: #000;
					color: #FFF;
				}
                
                .date_multi_popup .date_week{
                    width: 100%;
                    overflow: hidden;
                    margin-bottom: 8px;
                    margin-top: 5px;
                    pointer-events: none;
                    display: -webkit-box;
                    display: -moz-box;
                    display: -ms-flexbox;
                    display: flex;
                }
                .date_multi_popup .date_week span{
                    display:block;
                    width: 14.28%;
                    text-align: center;
                    font-size: 13px;
                    line-height: 2.1;
                }
				.date_multi_popup .date_week span:first-child{
                    color:#F00;
                }
				.date_multi_popup .date_week span:last-child{
                    color:#8acc7d;
                }
                .date_multi_popup .date_list{
                    width: 100%;
                    height:calc(2.8em * 6);
                    overflow: hidden;
                    font-size: 14px;
                    display: -webkit-box;
                    display: -moz-box;
                    display: -ms-flexbox;
                    display: flex;
                    -webkit-flex-wrap: wrap;
                    -ms-flex-wrap: wrap;
                    flex-wrap: wrap;
                    -moz-align-content: flex-start;
                    -webkit-align-content: flex-start;
                    align-content:flex-start;
                }
                .date_multi_popup .date_list div{
                    display: block;
                    width: 14.28%;
                    overflow: hidden;
                    text-align: center;
                    line-height: 2.8em;
                    height: 2.8em;
                    position: relative;
                    z-index: 2;
                    transition: all 0.1s;
                }
                .date_multi_popup .date_list p{
                    display: block;
                    width: 100%;
                    overflow: hidden;
                    text-align: center;
                    line-height: inherit;
                    height: 100%;
                    position: relative;
                    z-index: 2;
                }
				.date_multi_popup .date_list div:nth-child(1) p{ color: #F00;}
				.date_multi_popup .date_list div:nth-child(8) p{ color: #F00;}
				.date_multi_popup .date_list div:nth-child(15) p{ color: #F00;}
				.date_multi_popup .date_list div:nth-child(22) p{ color: #F00;}
				.date_multi_popup .date_list div:nth-child(29) p{ color: #F00;}
				.date_multi_popup .date_list div:nth-child(36) p{ color: #F00;}
				.date_multi_popup .date_list div:nth-child(43) p{ color: #F00;}
				.date_multi_popup .date_list div:nth-child(7) p{ color: #8acc7d;}
				.date_multi_popup .date_list div:nth-child(14) p{ color: #8acc7d;}
				.date_multi_popup .date_list div:nth-child(21) p{ color: #8acc7d;}
				.date_multi_popup .date_list div:nth-child(28) p{ color: #8acc7d;}
				.date_multi_popup .date_list div:nth-child(35) p{ color: #8acc7d;}
				.date_multi_popup .date_list div:nth-child(42) p{ color: #8acc7d;}
				.date_multi_popup .date_list div:nth-child(49) p{ color: #8acc7d;}
                .date_multi_popup .date_list div span{
                    display:block;
                    position: absolute;
                    bottom: 2px;
                    left: 0;
                    width: 100%;
                    text-align: center;
                    font-size: 12px;
                    line-height: 1;
                    z-index: 3;
                    transform: scale(0.7);
                }
                .date_multi_popup .date_list div.on_select{
                    opacity: 0.3;
                    pointer-events: none;
                }
                .date_multi_popup .date_list .select_firstlast p:before{
                    position: absolute;
                    content: "";
                    width: 60%;
                    height: 0;
                    padding-top: 60%;
                    top: 50%;
                    transform: translateY(-50%);
                    left: 20%;
                    z-index: -1;
                    border-radius: ${this.options.selectRadius}%;
                    background-color: ${this.options.selectBg};
                    border-radius: var(--date_multi_func-selectRadius);
                    background-color: var(--date_multi_func-selectBg);
                }
				.date_multi_popup .date_list .select_firstlast p {
					color:#fff !important;
				}
                .date_multi_popup .date_list .select_firstlast{
                    color: ${this.options.selectColor};
                    color: var(--date_multi_func-selectColor);
                }
                .date_multi_popup .date_list .select_period{
                    color: ${this.options.tranColor};
                    color: var(--date_multi_func-tranColor);
                }
                .date_multi_popup .date_list .select_period p::after,
                .date_multi_popup .date_list .select_firstlast p::after
                {
                    position: absolute;
                    content: "";
                    width: 100%;
                    height: 0;
                    padding-top: 60%;
                    top: 50%;
                    transform: translateY(-50%);
                    left: 0;
                    z-index: -2;
                    background-color: ${this.options.tranBg};
                    background-color: var(--date_multi_func-tranBg);
                }
                .date_multi_popup .date_list .select_firstlast p::after{
                    width: 50%;
                    opacity: 0;
                }
                .date_multi_popup .date_list .select_first p::after,
                .date_multi_popup .date_list .select_last p::after{
                    opacity: 1;
                }
                .date_multi_popup .date_list .select_first p::after{
                    right:0;
                    left:auto;
                }
            `;

           
            let optionsCss = `
              
                .date_multi_popup .date_multi_inner{
                    border-radius:${this.options.radius.length ? `${this.options.radius.join("px ")}px` : `${this.options.radius}px`};
                }
               
                .date_multi_popup{
                    ${this.options.position == "top" ? `justify-content: flex-start` :
                    this.options.position == "center" ? `justify-content: center` : ''}
                }
                .date_multi_popup .date_multi_inner{
                    transform: translateY(${this.options.position == "top" ? `-100%` : this.options.position == "center" ? '50%' : '100%'});
                }
                .date_multi_show .date_multi_inner{
                    transform: translateY(0);
                }
            `;

            css = css + optionsCss;


            let style = document.createElement('style');
            style.type = 'text/css';
            style.id = "date_multi_func_css";
            if (style.styleSheet) {
                style.styleSheet.cssText = css;
            } else {
                style.appendChild(document.createTextNode(css));
            };
            document.head.appendChild(style);
        },
       
        transformOptionaTime() {
            
            let defaultYears = this.getYearsDay(this.options.defaultYears);
           
            let minTimeJson = this.options.minTime;
            let maxTimeJson = this.options.maxTime;


           
            minTimeJson = this.getMaxMinTime(minTimeJson, 0);
            maxTimeJson = this.getMaxMinTime(maxTimeJson, 1);

            
            if (maxTimeJson.timestamp < minTimeJson.timestamp) {
                throw "마지막시간이 처음시간보다 커야 됩니다."
            };
            
            if (defaultYears.timestamp > maxTimeJson.timestamp || defaultYears.timestamp < minTimeJson.timestamp) {
                
                this.options.defaultYears = minTimeJson.timestamp;
            };

           
            try {
                
                if (this.options.type != 2) {
                    let isModifyCss = false;
                    if (this.options.appointTime.length) {
                        let list = [];
                        
                        this.options.appointTime.forEach(item => {
                            let appjson = {};
                            if (item.date) {
                                appjson = this.getYearsDay(item.date);
                            } else {
                                appjson = this.getYearsDay(item);
                            };

                            if (item.text) {
                                appjson['text'] = item.text;
                                isModifyCss = true;
                            } else {
                                appjson['text'] = "";
                            };
                            list.push(appjson);
                        });
                        
                        list.sort((a, b) => {
                            return a.timestamp - b.timestamp;
                        });
                        this.appointTimeArr = list;

                        
                        if (list.length) {
                            let min = list[0];
                            let max = "";
                            
                            list.length >= 2 ? max = list[list.length - 1] : max = min;

                            
                            if (min.timestamp < minTimeJson.timestamp) {
                                minTimeJson = min;
                                
                                this.options.defaultYears = min.year + "/" + min.month + "/" + min.today
                            };
                            
                            if (max.timestamp > maxTimeJson.timestamp) {
                                maxTimeJson = max;
                            };
                        };
                    } else if (this.options.appointOn.length) {
                        
                        let list = [];
                        
                        this.options.appointOn.forEach(item => {
                            let nojson = {};
                            if (item.date) {
                                nojson = this.getYearsDay(item.date);
                            } else {
                                nojson = this.getYearsDay(item);
                            };
                            if (item.text) {
                                nojson['text'] = item.text;
                                isModifyCss = true;
                            } else {
                                nojson['text'] = "";
                            };
                            list.push(nojson);
                        });
                       
                        list.sort((a, b) => {
                            return a.timestamp - b.timestamp;
                        });
                        this.appointOnArr = list;
                    };
               
                    if (isModifyCss) {
                        this.modifyCssRadius()
                    };
                };
            } catch (err) { }
        
            this.minTimeJson = minTimeJson;
            this.maxTimeJson = maxTimeJson;
        },

        getMaxMinTime(time, type) {
       
            let defaultYears = this.getYearsDay(this.options.defaultYears);
            try {
                switch (typeof time) {
                    case "string":
                      
                        if (time === "") {
                            
                            if (type) {
                                
                                defaultYears.year = defaultYears.year + 100;
                            } else {
                                
                                defaultYears.year = defaultYears.year - 100;
                            }
                            time = this.getYearsDay(`${defaultYears.year}/${defaultYears.month}/${defaultYears.today}`);
                        } else {
             
                            time = this.getYearsDay(time);
                        };
                        break;
                    case "number":
                        
                        if (time % 1 === 0) {
                            time = Math.abs(time);
                            
                            if (type) {
                                
                                defaultYears.year = defaultYears.year + time;
                            } else {
                                
                                defaultYears.year = defaultYears.year - time;
                            };
                            time = this.getYearsDay(`${defaultYears.year}/${defaultYears.month}/${defaultYears.today}`);
                        } else {
                            
                            throw "수자는 정수여야 됩니다!";
                        };
                        break;
                    default:
                        throw "시간규격이 틀렸습니다！";
                }
            } catch (err) {
                throw err;
            };

            return time;
        },
        
        getYearsDay(time, isSave) {
           
            let showTiem = new Date();

            
            if (time) {
                try {
                    
                    if (typeof time == 'string') {
                        time = time.replace(/\-/g, "/");
                        time = time.replace(/\./g, "/");
                    };
                    time = new Date(time);
                    if (time == "Invalid Date") {
                        
                        throw err;
                    } else {
                        showTiem = time
                    }
                } catch (err) {
                    throw "시간규격이 틀렸습니다！"
                };
            };

            let year = showTiem.getFullYear(); 
            let month = showTiem.getMonth() + 1; 
            let today = showTiem.getDate(); 
            let currweek = showTiem.getDay(); 
            let timestamp = new Date(`${year}/${month}/${today}`).getTime();

            
            let days = new Date(year, month, 0).getDate();
            let oneweek = new Date(year, month - 1, 1).getDay();

            
            if (isSave) {
                this.currYears = { year, month, today, currweek, days, oneweek, timestamp };
            };
            return { year, month, today, currweek, days, oneweek, timestamp }
        },
        
        createDateWeek() {
            let date_week = document.createElement("div");
            date_week.className = "date_week";
            for (let i = 1; i <= 7; i++) {
                let p = document.createElement("span");
                let inner = "Su";
                switch (i) {
                    case 1:
                        inner = "Su";
                        break;
                    case 2:
                        inner = "Mo";
                        break;
                    case 3:
                        inner = "Tu";
                        break;
                    case 4:
                        inner = "We";
                        break;
                    case 5:
                        inner = "Th";
                        break;
                    case 6:
                        inner = "Fr";
                        break;
                    case 7:
                        inner = "Sa";
                        break;
                }
                p.innerHTML = inner;
                date_week.appendChild(p);
            };
            return date_week;
        },

        createDateList() {
            let date_list = document.createElement("div");
            date_list.className = "date_list";

    
            let { year, month, days, oneweek } = this.currYears;

   
            let minTimeJson = this.minTimeJson;
            let maxTimeJson = this.maxTimeJson;
    
            if (year == minTimeJson.year && month == minTimeJson.month) {
   
                this.dateMultiEles.prev_month.style.display = "none";
            } else {
                this.dateMultiEles.prev_month.style.display = "block";
            };
            if (year == maxTimeJson.year && month == maxTimeJson.month) {

                this.dateMultiEles.next_month.style.display = "none";
            } else {
                this.dateMultiEles.next_month.style.display = "block";
            };


 
            let arrList = this.getNoSelectDate();
 
            let onSelects = arrList.onSelects;

            let apppintDate = arrList.apppintDate;



            let num = days + oneweek;
            for (let i = 0; i < num; i++) {
                let div = document.createElement("div");
                let p = document.createElement("p");
   
                if (i >= oneweek) {
                    let today = i - oneweek + 1;
                    p.innerHTML = today;
        
                    let isFind = onSelects.filter(item => (item == today || item.today == today))[0];
                    if (isFind) {
     
                        div.classList.add("on_select");
                    } else {

                        div.onclick = function () {
                            _this.dateClick(this)
                        };

                        isFind = apppintDate.filter(item => (item == today || item.today == today))[0]
                    };

                    if (isFind && isFind.text) {
                        let span = document.createElement("span");
                        span.innerHTML = isFind.text;
                        div.appendChild(span)
                    };
                };

                div.setAttribute("index", i);
                div.appendChild(p);
                date_list.appendChild(div);
            }
     
            this.dateMultiEles.date_multi_con.appendChild(date_list);
            this.dateMultiEles['date_list'] = date_list;

            this.setSelectStyle();

            this.setSectionStyle();
        },

        getNoSelectDate() {

            let { year, month, days } = this.currYears;

            let onSelects = [];
    
            let apppintDate = [];

            if (this.options.type != 2 && this.appointTimeArr.length) {
      
                apppintDate = this.appointTimeArr.filter(item => item.year == year && item.month == month);

  
                for (let i = 1; i <= days; i++) {
                    let isFind = apppintDate.some(item => item.today == i);

                    if (!isFind) onSelects.push(i);
                }
            } else {
             
                let minTimeJson = this.minTimeJson;
                let maxTimeJson = this.maxTimeJson;

          
                if (this.options.type != 2 && this.appointOnArr.length) {
       
                    let list = this.appointOnArr.filter(item => item.year == year && item.month == month);
                    onSelects.push(...list);
                }

     
                if (year == minTimeJson.year && month == minTimeJson.month) {
        
                    for (let i = 1; i < minTimeJson.today; i++) {
            
                        if (!onSelects.some(item => (item.today == i))) {

                            onSelects.push(i);
                        }
                    }
                }

                if (year == maxTimeJson.year && month == maxTimeJson.month) {
      
                    for (let i = maxTimeJson.today + 1; i <= days; i++) {
    
                        if (!onSelects.some(item => (item.today == i))) {

                            onSelects.push(i);
                        }
                    }
                }
            }

            return { onSelects, apppintDate };
        },



        initEvent() {
    
            this.dateMultiEles.date_multi_bg.addEventListener("click", this.cancelFunc, false);
   
            this.dateMultiEles.cancel_btn.addEventListener("click", this.cancelFunc, false);
           
            this.dateMultiEles.confirm_btn.addEventListener("click", this.confirmFunc, false);

           
            this.dateMultiEles.prev_month.addEventListener("click", this.prevMonthClick, false);
            
            this.dateMultiEles.next_month.addEventListener("click", this.nextMonthClick, false);
        },
   
        removeEvent() {
            
            this.dateMultiEles.date_multi_bg.removeEventListener("click", this.cancelFunc, false);
            
            this.dateMultiEles.cancel_btn.removeEventListener("click", this.cancelFunc, false);
            
            this.dateMultiEles.confirm_btn.removeEventListener("click", this.confirmFunc, false);

           
            this.dateMultiEles.prev_month.removeEventListener("click", this.prevMonthClick, false);
          
            this.dateMultiEles.next_month.removeEventListener("click", this.nextMonthClick, false);
        },
      
        cancelFunc() {
            _this.close();
            
            _this.options.cancelFunc();
        },

        confirmFunc() {
  
            if (!_this.selectTimes.length) return;

        
            let res = _this.selectTimes;


        
            if (_this.options.type == 2) {
                if (!_this.selectTimes[1]) {
                   
                    _this.selectTimes[1] = _this.selectTimes[0];
                };
                res = {
                    statrTime: _this.selectTimes[0],
                    endTime: _this.selectTimes[1],
                };
            }

           
            _this.options.confirmFunc(res);
        
            _this.close();
        },
    
        prevMonthClick() {
            _this.prevNextMonthFunc();
        },
      
        nextMonthClick() {
            _this.prevNextMonthFunc(true);
        },

        prevNextMonthFunc(type) {
         
            let { year, month } = _this.currYears;

   
            if (type) {
         
                month++;
                if (month > 12) {
                    month = 1;
                    year++;
                };
            } else {
          
                month--;
                if (month <= 0) {
                    month = 12;
                    year--;
                };
            };

   
            _this.getYearsDay(`${year}/${month}/1`, true);

            if (this.isIEOrIE11()) {
                _this.dateMultiEles.date_list.removeNode(true);
            } else {
                _this.dateMultiEles.date_list.remove();
            };
            _this.createDateList();
      
	  		if(month < 10){
				_this.dateMultiEles.time_tit.innerHTML = year + "-0" + month;
			}else{
				_this.dateMultiEles.time_tit.innerHTML = year + "-" + month;
			}
        },

        dateClick(e) {
       
            this.clearSelectPeriod();

            let p = e.getElementsByTagName("p")[0];
            let text = e.getElementsByTagName("span")[0] ? e.getElementsByTagName("span")[0].innerText : "";

       
            let { year, month } = this.currYears;
            let today = Number(p.innerText);
            let timeJson = {
                year: year,
                month: month,
                today: today,//
                time: year + this.options.backFormat + month + this.options.backFormat + today,//
                timestamp: new Date(`${year}/${month}/${today}`).getTime(),//
                text: text,//
            };
            // 
            e.classList.add("select_firstlast");

            // 
            if (this.options.type == 0) {
                // 
                let index = this.selectTimes.findIndex((v) => { return v.timestamp == timeJson.timestamp })
                // 
                this.selectTimes = [];
                // 
                if (this.selectObj.length) this.selectObj[0].classList.remove("select_firstlast");
                this.selectObj = [];
                if (index >= 0) return;//
                // 
                this.selectObj = [e];
                // 
                this.selectTimes = [timeJson];
                return;
            };

            // 
            if (this.options.type == 1) {

                let index = -1;
                if (this.isIEOrIE11()) {
                    for (let i = 0; i < this.selectTimes.length; i++) {
                        if (this.selectTimes[i].timestamp == timeJson.timestamp) {
                            index = i;
                            break;
                        }
                    }
                } else {
                    index = this.selectTimes.findIndex((v) => { return v.timestamp == timeJson.timestamp })
                };
                if (index >= 0) {

                    this.selectObj[index].classList.remove("select_firstlast");

                    this.selectObj.splice(index, 1);
                    this.selectTimes.splice(index, 1);
                } else {
                    // 
                    this.selectObj.push(e);

                    this.selectTimes.push(timeJson);
                }
                return;
            }



            if (this.options.type == 2) {
                if (this.selectTimes.length != 1) {


                    let index = this.selectObj.indexOf(e);
                    for (let i = 0; i < this.selectObj.length; i++) {

                        if (index == i) continue;
                        this.selectObj[i].classList.remove("select_firstlast");
                    }
                    this.claerFirstLast();

                    // 
                    this.selectTimes = [timeJson];
                    this.selectObj = [e];
                } else {

                    this.selectObj.push(e);
                    this.selectTimes.push(timeJson);

					//14일 초과시 선택불가
					if(this.selectTimes.length == 2){
						let startTime = this.selectTimes[0].timestamp;
						let endTime = this.selectTimes[1].timestamp;
						let allDay = Math.floor((endTime - startTime) / 1000 / 60 / 60 / 24);
						
						if(allDay >= 14){
							this.selectTimes = [];

							for (let i = 0; i < this.selectObj.length; i++) {
								this.selectObj[i].classList.remove("select_firstlast");
							}

							return ;
						}
					}

                    this.isTimeReverse();
                }
            }

        },


        isTimeReverse() {
      
            if (this.selectTimes[0].timestamp > this.selectTimes[1].timestamp) {

                let item = this.selectTimes[0];
                this.selectTimes[0] = this.selectTimes[1];
                this.selectTimes[1] = item;


                item = this.selectObj[0];
                this.selectObj[0] = this.selectObj[1];
                this.selectObj[1] = item;
            }

            this.setSectionStyle();
        },

        setSelectStyle() {

            if (!this.selectTimes.length || !this.selectObj.length) return;

            let { year, month } = this.currYears;


            let currSelectTimes = [];
            this.selectTimes.forEach((v, index) => {
                if (v.year == year && v.month == month) {

                    v["selectObjIndex"] = index;
                    currSelectTimes.push(v);
                }
            });

            if (!currSelectTimes.length) return;


            let list = this.dateMultiEles.date_list.children;

            let num = 0;
            for (let i = 0; i < list.length; i++) {
                let today = list[i].getElementsByTagName("p")[0].innerText;
                today = today ? Number(today) : "";

                let obj = currSelectTimes.filter(v => (today > 0 && v.today == today))[0];
                if (obj) {

                    list[i].classList.add("select_firstlast");

                    this.selectObj[obj.selectObjIndex] = list[i];

                    num++;
                }

                if (num >= currSelectTimes.length) return;
            }
        },

        setSectionStyle() {
            this.clearSelectPeriod();
            if (this.options.type !== 2) return;


            if (!(this.selectTimes.length >= 2)) return;


            if (this.selectTimes[0].timestamp == this.selectTimes[1].timestamp) return;

            let firstIndex = -1;
            let lastIndex = -1;
            let { year, month, days, oneweek } = this.currYears;


            if (year == this.selectTimes[0].year && month == this.selectTimes[0].month) {

                firstIndex = Number(this.selectObj[0].getAttribute("index"));
            }

            if (year == this.selectTimes[1].year && month == this.selectTimes[1].month) {

                lastIndex = Number(this.selectObj[1].getAttribute("index"));
            }


            let forIndex = 0;//
            let objele = "";//


            if (firstIndex >= 0 && lastIndex >= 0) {

                forIndex = lastIndex - firstIndex - 1;
                objele = this.selectObj[0].nextSibling;//
            }

            if (firstIndex >= 0 && lastIndex < 0) {

                forIndex = days + oneweek - firstIndex - 1;
                objele = this.selectObj[0].nextSibling;//
            }

            if (firstIndex < 0 && lastIndex >= 0) {

                forIndex = lastIndex - oneweek;
                objele = this.dateMultiEles.date_list.children[oneweek];//
            }

            if (firstIndex == -1 && lastIndex == -1) {

                if (year >= this.selectTimes[0].year && year <= this.selectTimes[1].year && month >= this.selectTimes[0].month && month <= this.selectTimes[1].month) {

                    forIndex = days;

                    objele = this.dateMultiEles.date_list.children[oneweek];
                }
            }

            for (let i = 0; i < forIndex; i++) {

                objele.className = "select_period";
                // 
                this.selectPeriod.push(objele);
                objele = objele.nextSibling;
            }


            this.selectObj[0].classList.add("select_first");
            this.selectObj[1].classList.add("select_last");
        },

        clearSelectPeriod() {

            if (this.selectPeriod.length) {

                for (let i = 0; i < this.selectPeriod.length; i++) {
                    this.selectPeriod[i].className = "";
                }

                this.selectPeriod = [];
            }
        },

        claerFirstLast() {
            if (this.selectObj.length) {

                this.selectObj[0].classList.remove("select_first");
                this.selectObj[0].classList.remove("select_last");
                this.selectObj[1].classList.remove("select_last");
                this.selectObj[1].classList.remove("select_first");
            }
        },

        isIEOrIE11() {
            if (!!window.ActiveXobject || "ActiveXObject" in window || (/Trident\/7\./).test(navigator.userAgent)) {
                return true;
            } else {
                return false;
            }
        }
    };


    let dateFuncObj = null;

    let dateMulti = function (options) {

        if (typeof options == "undefined") {
            options = {};
        }

        if (typeof options != "object") {
            throw "error！";
        }
        if (dateFuncObj) {

            dateFuncObj.destroy();
        }

        dateFuncObj = new dateMultiFunc(options);
    };


    dateMulti.prototype.show = function () {
        if (dateFuncObj) {
            dateFuncObj.show();
        } else {
            throw "error！";
        }
    };

    dateMulti.prototype.destroy = function () {
        if (dateFuncObj) {
            dateFuncObj.destroy();
        }
    };


    win.dateMultiFunc = dateMulti;
}(window))
