 $(() => {
    var calenderTpl = `
		<div id="calTitle">
          <div id="monthYear"></div>
          <div id="calTitle_month">
			<button type="button" class="month-mover prev">
			</button>
			<button type="button" class="month-mover next">
			</button>
          </div>
		</div>
		<div id="full_calender">
			<div id="calThead"></div>
			<div id="calTbody"></div>
		</div>
		<div id="calTFooter_event">
			<h3 id="eventTitle_today"></h3>
			<div id="calTFooter_today"><p></p></div>
			<div id="calTFooter">
                <h3 id="eventTitle"></h3>
				<a href="javascript:void(0);" id="calLink">Все события</a>
			</div>
		</div>
	`;
    var weekDaysFromSunday = '<div>S</div><div>M</div><div>T</div><div>W</div><div>T</div><div>F</div><div>S</div>';
    var weekDaysFromMonday = '<div>Пн</div><div>Вт</div><div>Ср</div><div>Чт</div><div>Пт</div><div>Сб</div><div>Вс</div>';
    var shortMonths = ["Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек"];
    var fullMonths = ["января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря"];
    var fullMonths_names = ["январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь"];
    var weekDays = ["воскресенье", "понедельник", "вторник", "среда", "четверг", "пятница", "суббота"];
    let courseMonths = [];
    let dates = [];
    

    $.fn.miniEventCalendar = $.fn.MEC = function(options) {
        var settings = $.extend({
            calendar_link: "",
            events: [],
            from_monday: false,
            onMonthChanged: null
        }, options);

        var miniCalendar = this;

        miniCalendar.addClass('mini-cal').html(calenderTpl);

        var thead = miniCalendar.find("#calThead");
        var tbody = miniCalendar.find("#calTbody");
        var calTitle = miniCalendar.find("#monthYear");
        var calFooter = miniCalendar.find("#calTFooter");
        var calTFooter_today = miniCalendar.find("#calTFooter_today");
        var eventTitle = miniCalendar.find("#eventTitle");
        var eventTitle_today = miniCalendar.find("#eventTitle_today");
        var eventsLink = miniCalendar.find("#calLink");

        var today = new Date();
        var curMonth = today.getMonth();
        var curYear = today.getFullYear();

        eventTitle.text("No events today.");
        eventsLink.text("Все события");
        eventsLink.attr("href", settings.calendar_link);

        if (settings.from_monday)
            thead.html(weekDaysFromMonday);
        else
            thead.html(weekDaysFromSunday);

        if (!settings.calendar_link.length && !settings.events.length)
            calFooter.css("display", "none");

        miniCalendar.find(".month-mover").each(function() {
            var mover = $(this);
            mover.bind("click", function(e) {
                e.preventDefault();
                if (mover.hasClass("next")) {

                    if (!$('.month-mover.next').hasClass('month-mover_disabled')) {
                        viewNextMonth();
                    }
                } else {
                    if (!$('.month-mover.prev').hasClass('month-mover_disabled')) {
                        viewPrevMonth();
                    }
                }
            });
        });

        miniCalendar.on("click touchstart", ".a-date", function(e) {
            e.preventDefault();
            $(".a-date").removeClass('focused');
            if (!$(this).hasClass('blurred')) {
                //$(".a-date.current").addClass('notoday');
                showEvent($(this).data('event'));
                $(this).focus();
                $(this).addClass('focused');
                calThisMonth = $('.current-month').text();
                calThisDay = $('.focused').text();

                let chooseDay = Number(calThisDay);
                let chooseMonth = shortMonths.indexOf(calThisMonth);
                let chooseDate = new Date(curYear, chooseMonth, chooseDay);
                let chooseWeekDay = chooseDate.getDay();
                calTitle.html("<span class='todayDay'>" + calThisDay + "</span><span class='current-month'>" + calThisMonth + "</span><span class='fullMonths_names'>" + fullMonths_names[chooseMonth] + "</span>" + "<span class='current-day'>" + weekDays[chooseWeekDay] + "</span>" + "<span class='current-year'>" + curYear + "</span>");
                calTFooter_today.html("<span class='todayDay'>" + calThisDay + "</span><span>" + fullMonths[chooseMonth] + "</span><span class='current-year'>" + curYear + "</span>");
            }
        });

        
        function populateCalendar(month, year, onInit) {
            curMonth = month;
            curYear = year;

            var ldate = new Date(year, month);
            var dt = new Date(ldate);
            var weekDay = dt.getDay();


            tbody.html("");

            eventTitle.text("");
            eventsLink.text("Все события");
            eventsLink.attr("href", "#");

            if (settings.from_monday)
                weekDay = dt.getDay() > 0 ? dt.getDay() - 1 : 6;

            if (ldate.getDate() === 1) {
                tbody.append(lastDaysOfPrevMonth(weekDay));
			}
            while (ldate.getMonth() === month) {
                dt = new Date(ldate);	
                var isToday = areSameDate(ldate, new Date());
                var event = null;
                let dayEvents = [];

                settings.events.forEach(function(item, index) {
                    if (areSameDate(dt, new Date(item.date))) {
                        dayEvents.push(index);
                    }
                });

                var eventIndex = settings.events.findIndex(function(ev) {
                    return areSameDate(dt, new Date(ev.date));
                });

                let arrEvent = [];
                if (eventIndex != -1) {
                    dayEvents.forEach(function(el) {
                        arrEvent.push(settings.events[el]);
                    });
                    if (onInit && isToday) {
                        showEvent(arrEvent)
                    }
                } else if (onInit && isToday) {
                	showEvent(arrEvent);
                }

                tbody.append(dateTpl(false, ldate.getDate(), isToday, arrEvent, onInit && isToday));

                ldate.setDate(ldate.getDate() + 1);

                var bufferDays = 43 - miniCalendar.find(".a-date").length;

                if (ldate.getMonth() != month) {
                    for (var i = 1; i < bufferDays; i++) {
                        tbody.append(dateTpl(true, i));
                    }
                }
            }

            if (settings.onMonthChanged) {
                settings.onMonthChanged(month, year);
            }

            let userDate = new Date();
            let todayDay = userDate.getDate();
            let chooseWeekDay = userDate.getDay();


            if ($('.a-date.current').length > 0) {
            	$('.a-date.current').addClass('focused');
                calTitle.html("<span class='todayDay'>" + todayDay + "</span><span class='current-month'>" + shortMonths[month] + "</span><span class='fullMonths_names'>" + fullMonths_names[month] + "</span>" + "<span class='current-day'>" + weekDays[chooseWeekDay] + "</span><span class='current-year'>" + curYear + "</span>");
                calTFooter_today.html("<span class='todayDay'>" + todayDay + "</span><span>" + fullMonths[month] + "</span><span class='current-year'>" + curYear + "</span>");
               } else if ($('.a-date.focused').length > 0) {
                calTitle.html("<span class='current-day'>" + weekDays[chooseWeekDay] + "</span>, " + $('.a-date.focused').text() + " <span class='current-month'>" + shortMonths[month] + "</span><span class='fullMonths_names'>" + fullMonths_names[month]+ "</span><span class='current-year'>" + curYear + "</span>");
                calTFooter_today.html("<span>" + fullMonths[month]+ "</span><span class='current-year'>" + curYear + "</span>");
             } else {
                calTitle.html("<span class='current-month'>" + shortMonths[month] + "</span><span class='fullMonths_names'>" + fullMonths_names[month]+ "</span><span class='current-year'>" + curYear + "</span>");
               // calTFooter_today.html("<span>" + fullMonths[month]+ "</span><span class='current-year'>" + curYear + "</span>");
             }

            const firstMonth = $('.month-mover.prev').data('month');
            const lastMonth = $('.month-mover.next').data('month');

            if ($('.current-month').text() == firstMonth) {
                $('.month-mover.prev').addClass('month-mover_disabled');
            } else {
                $('.month-mover.prev').removeClass('month-mover_disabled');
            }

            if ($('.current-month').text() == lastMonth) {
                $('.month-mover.next').addClass('month-mover_disabled');
            } else {
                $('.month-mover.next').removeClass('month-mover_disabled');
            }
            
        }

        function lastDaysOfPrevMonth(day) {
            if (curMonth > 0) {
                var monthIdx = curMonth - 1;
                var yearIdx = curYear;
            } else {
                if (curMonth < 11) {
                    var monthIdx = 0;
                    var yearIdx = curYear + 1;
                } else {
                    var monthIdx = 11;
                    var yearIdx = curYear - 1;
                }
            }

            var prevMonth = getMonthDays(monthIdx, yearIdx);
            var lastDays = "";
            for (var i = day; i > 0; i--)
                lastDays += dateTpl(true, prevMonth[prevMonth.length - i]);

            return lastDays;
        }

        function dateTpl(blurred, date, isToday, event, isSelected) {


            var tpl = "<div class='a-date blurred'><span>" + date + "</span></div>";


            if (!blurred) {
                var hasEvent = event.length > 0 && event !== null;
                var cls = isToday ? "current " : "";
                //cls += hasEvent && isSelected ? "focused " : "";
                cls += hasEvent ? "event " : "";
			
            var tpl = "<button type='button' class='a-date " + cls + "' data-event='" + JSON.stringify(event) + "' data-span=''><span>" + date + "</span></button>";




               // var tpl = "<button type='button' class='a-date " + cls + "' data-event='" + JSON.stringify(event) + "'><span>" + date + "</span></button>";
            }

            return tpl;
        }

        function showEvent(event) {
            if (event.length > 0) {
                eventHTML = '';

                event.forEach(function(item) {
                    eventHTML += `<a href="${item.link}" class="day-event-item ${item.class}"><h3 class="eventTitle"><span class="eventTimes">${item.times}</span><span class="eventTitle">${item.title}</span></h3></a>`;
                });
                eventTitle_today.text("События в этот день");
                $('#calTFooter').html(eventHTML);
            } else {
                eventTitle_today.text("События в этот день");
                eventHTML = `<div class="day-event-item"><h3 class="eventTitle">Нет событий в этот день</h3></div>`;
                eventsLink.attr("href", settings.calendar_link);
                $('#calTFooter').html(eventHTML);
            }
        }

        function viewNextMonth() {
            var nextMonth = curMonth < 11 ? curMonth + 1 : 0;
            var nextYear = curMonth < 11 ? curYear : curYear + 1;

            populateCalendar(nextMonth, nextYear);
        }

        function viewPrevMonth() {
            var prevMonth = curMonth > 0 ? curMonth - 1 : 11;
            var prevYear = curMonth > 0 ? curYear : curYear - 1;

            populateCalendar(prevMonth, prevYear);
        }

        function areSameDate(d1, d2) {
            return d1.getFullYear() == d2.getFullYear() &&
                d1.getMonth() == d2.getMonth() &&
                d1.getDate() == d2.getDate();
        }

        function getMonthDays(month, year) {
            var date = new Date(year, month, 1);
            var days = [];
            while (date.getMonth() === month) {
                days.push(date.getDate());
                date.setDate(date.getDate() + 1);
            }
            return days;
        }

        populateCalendar(curMonth, curYear, true);

        return miniCalendar;
    };


    JSinjection('https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.0/moment.min.js', function() {
        JSinjection('https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.0/locale/ru.min.js', function() {
            JSinjection('https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.23/moment-timezone-with-data-2012-2022.min.js', function() {
                moment.fn.fromString = function(param, value) {
                    if (param === 'завтра') return this.clone().add(1, 'day');
                    else if (param === 'вчера') return this.clone().subtract(1, 'day');
                    else if (param === 'минут назад') return this.clone().subtract(value, 'minutes');
                    return this;
                }

                function parseHumanReadableDate(timestring) {
                    if (/вчера \d\d:\d\d/.test(timestring)) {
                        var time = /\d\d:\d\d/.exec(timestring)[0];
                        return moment(time, "HH:mm").fromString('вчера');
                    } else if (/завтра \d\d:\d\d/.test(timestring)) {
                        var time = /\d\d:\d\d/.exec(timestring)[0];
                        return moment(time, "HH:mm").fromString('завтра');
                    } else if (/сегодня \d\d:\d\d/.test(timestring)) {
                        var time = /\d\d:\d\d/.exec(timestring)[0];
                        return moment(time, "HH:mm");
                    } else if (/\d{1,2} минут[ыу]? назад/.test(timestring)) {
                        var minutes = /\d{1,2}/.exec(timestring)[0];
                        return moment().fromString('минут назад', minutes);
                    } else if (/только что/.test(timestring)) {
                        return moment().subtract(1, 'minutes');
                    } else {
                        let m_date = moment(timestring, 'dd D MMM HH:mm');
                        if (m_date.format() != 'Invalid date') {
                            return m_date;
                        } else {
                            return moment(timestring, 'dd D MMM YYYY');
                        }
                    }
                }


            
                const months = ["Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек"];

                //Добавление классов к событиям при смене месяц
                $(document).on('click', '.month-mover', function() {
                    addClassToEvent()
                });

                //Добавление классов к событиям
                function addClassToEvent() {
                    $('button.a-date').each(function() {
                        if ($(this).data('event') !== null) {
                            let event = $(this).data('event');
                            for (key in event[0]) {
  								if(key === "class") {
                                	$(this).addClass(event[0][key]);
                                }
							}
                        }
                    });
                }
				

                //Основной урок
                $('.lesson-list li').each((i, el) => {
                    let $DateEl = $(el).find('.user-state-label.lesson-date');
                    if (!$DateEl.length) return;
                    let mainLessonTitle = $(el).find('.link.title').text().replace(/просмотрено/g, '').trim();
                    let mainLessonDateText = $DateEl.text().replace("Дата и время начала", "").replace("Недоступен до", "").trim();
                    let momentDate = parseHumanReadableDate(mainLessonDateText);
                    let mainLessonDate = momentDate.toDate();
                    let timeEvent = momentDate.format('HH:mm');
                    let mainLessonLink = $(el).find('.item-main-td .link.title').attr('href');
                    dates.push({
                        title: mainLessonTitle,
                        times: timeEvent,
                        date: mainLessonDate,
                        link: mainLessonLink,
                        class: "main-lesson",
                    });
                });



                //События из карточки пользователя
                let pageString = $('.current-page-events').text().trim();
                if(pageString) {
                    let pageEvents = pageString.split('\n');
                    pageEvents.forEach(function(item) {
                          let event = item.split(',');
                            let pageEventTitle = event[2];
                            let pageEventLink = event[3];
                            let pageEventDateText = event[0].split('.');
                            let pageEventDay = Number(pageEventDateText[0]);
                            let pageEventMonth = Number(pageEventDateText[1]) - 1;
                            let pageEventYear = Number(pageEventDateText[2]);
                            let pageEventDate = new Date(pageEventYear, pageEventMonth, pageEventDay);
                            let timeEvent = event[1];
                            dates.push({
                                    title: pageEventTitle,
                                    date: pageEventDate,
                                    times: timeEvent,
                                    link: pageEventLink,
                                    class: "other-page"
                            });
                        showCelendar();      
                	});
                 }    
                
                
                //События с другой страницы
                let EventOtherPage = "/calendar";
                fetch(EventOtherPage).then(function(response) { 
                    response.text().then(function(text) {
                        let parser = new DOMParser(); 
                        let sku_document = parser.parseFromString(text, "text/html");
                        let pageOtherString = $(sku_document).find('.other-page-content p').text().trim();    
                        let pageOtherEvents = pageOtherString.split(';');

                        pageOtherEvents.forEach(function(item){
                            let event = item.split(',');
                            let pageEventTitle = event[2];
                            let pageEventLink = event[3];
                            let pageEventDateText = event[0].split('.');
                            let pageEventDay = Number(pageEventDateText[0]);
                            let pageEventMonth = Number(pageEventDateText[1]) - 1;
                            let pageEventYear = Number(pageEventDateText[2]);
                            let pageEventDate = new Date(pageEventYear, pageEventMonth, pageEventDay);
                            let timeEvent = event[1];
                            dates.push({
                                    title: pageEventTitle,
                                    date: pageEventDate,
                                    times: timeEvent,
                                    link: pageEventLink,
                                    class: "other-page"
                            });
                            showCelendar();
                        });

                    });
                });
                

                 //Обратиться к главной странице с любой другой
                let wait_calendar = setInterval(() => {
                    if (!$('#calendar').length) return false;
                    clearInterval(wait_calendar);
                    let classes = $('#calendar').attr('class').split(/\s+/);
                    let trainingID = 0;
                    $.each(classes, (i, one_class) => {
                        if (one_class.indexOf('training') > -1) trainingID = one_class.replace(/\D+/g, '');
                    });
                    function parseLessons(href) {
                      $.get(href, function(data) {
                        var PageDom = $('<xxx></xxx>').append($.parseHTML(data));
                        PageDom.find('.lesson-list li').each((i, el) => {
                          let $DateEl = $(el).find('.user-state-label.lesson-date');
                          if (!$DateEl.length) return;
                          let mainLessonTitle = $(el).find('.link.title').text().replace(/просмотрено/g, '').trim();
                          let mainLessonDateText = $DateEl.text().replace("Дата и время начала", "").replace("Недоступен до", "").trim();
                          let momentDate = parseHumanReadableDate(mainLessonDateText);
                          let mainLessonDate = momentDate.toDate();
                          let timeEvent = momentDate.format('HH:mm');
                          let mainLessonLink = $(el).find('.item-main-td .link.title').attr('href');
                          dates.push({
                            title: mainLessonTitle,
                            times: timeEvent,
                            date: mainLessonDate,
                            link: mainLessonLink,
                            class: "sublesson",
                          });
                        });
                        var training = PageDom.find('.stream-table tr a');
                        if(training.length) {
                          training.each(function(){
                            parseLessons($(this).attr("href"));
                          });
                        } else {
                          showCelendar();
                        }
                      });
                    }
                    parseLessons('/teach/control/stream/view/id/' + trainingID);
                }, 10);


                //Вывод календаря
                function showCelendar() {

					dates.forEach(function(item) {
                        for (let learn in item) {
                            if (learn == "date") {
                                let learnDate = new Date(item[learn]);
                                
                                if (!isNaN(learnDate.getMonth())) {
                                    courseMonths.push(learnDate.getMonth());
                                }
                            }    
                        }
                    });
                    
                    $("#calendar").MEC({
                        from_monday: true,
                        events: dates
                    });

                    setTimeout(() => {
                        addClassToEvent();
                    });
                }
            })
        })
    });
	
	


    
    setTimeout( () => {
    
    	const firstMonth = shortMonths[Math.min.apply(null, courseMonths)];
        const lastMonth = shortMonths[Math.max.apply(null, courseMonths)];
        
        console.log(lastMonth);
    
    	$('.month-mover.prev').attr('data-month', firstMonth);
        if ($('.current-month').text() === firstMonth) {
            $('.month-mover.prev').addClass('month-mover_disabled');
        } else $('.month-mover.prev').removeClass('month-mover_disabled');

    	$('.month-mover.next').attr('data-month', lastMonth);
    	if ($('.current-month').text() === lastMonth) {
    		$('.month-mover.next').addClass('month-mover_disabled');
    	} else $('.month-mover.next').removeClass('month-mover_disabled');
    	
	
    },3000);

    function JSinjection(fileName, callback) {
        var script = document.createElement("script")
        script.type = "text/javascript";
        if (script.readyState) { // only required for IE <9
            script.onreadystatechange = function() {
                if (script.readyState === "loaded" || script.readyState === "complete") {
                    script.onreadystatechange = null;
                    callback();
                }
            };
        } else { //Others
            script.onload = function() {
                callback();
            };
        }
        script.src = fileName;
        document.getElementsByTagName("head")[0].appendChild(script);
    }

				

});

