Показать сообщение отдельно
  #87 (permalink)  
Старый 01.08.2019, 19:14
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,138

Блондинка,
Date.prototype.reduce = function(callback, value) {
                var year = this.getFullYear();
                var month = this.getMonth();
                var step = new Date(year, month, 1);
                var last = new Date(year, month + 1, 0);
                step.setHours(24 * (0 - ((step.getDay() + 6) % 7)));
                last.setHours(24 * (6 - ((last.getDay() + 6) % 7)));
                for (var i = 0; step <= last; i++) {
                    value = callback(value, new Date(+step), i, this);
                    step.setHours(24);
                }
                return value;
            };
            var data = new Date();
            var selectMonth = document.querySelector('#calendar_month');
            var monthNames = [
                'Январь',
                'Февраль',
                'Март',
                'Апрель',
                'Май',
                'Июнь',
                'Июль',
                'Август',
                'Сентябрь',
                'Октябрь',
                'Ноябрь',
                'Декабрь',
            ];
            monthNames.forEach(function(monthName, i) {
                selectMonth.options[i] = new Option(monthName, i);
            });
            selectMonth.addEventListener('change', function() {
                data.setMonth(this.value);
                createCalendar(data);
            });
            var minusMonth = document.querySelector('.month_minus');
            minusMonth.addEventListener('click', function() {
                data.setMonth(data.getMonth() - 1);
                createCalendar(data);
            });
            var plusMonth = document.querySelector('.month_plus');
            plusMonth.addEventListener('click', function() {
                data.setMonth(data.getMonth() + 1);
                createCalendar(data);
            });
            var minusYear = document.querySelector('.year_minus');
            minusYear.addEventListener('click', function() {
                data.setYear(data.getFullYear() - 1);
                createCalendar(data);
            });
            var plusYear = document.querySelector('.year_plus');
            plusYear.addEventListener('click', function() {
                data.setYear(data.getFullYear() + 1);
                createCalendar(data);
            });
            var inputYear = document.querySelector('#calendar_year');
            inputYear.addEventListener('input', function() {
                if (/^\d{4}$/.test(this.value)) {
                    data.setYear(this.value);
                    createCalendar(data);
                }
            });
            var currentButton = document.querySelector('#presently');
            currentButton.addEventListener('click', function() {
                data = new Date();
                createCalendar(data);
            });

            var daysTd = document.querySelectorAll('.week-day');
            function createCalendar(data) {
                var now = new Date().setHours(0, 0, 0, 0);
                var year = data.getFullYear();
                inputYear.value = year;
                var month = data.getMonth();
                selectMonth.selectedIndex = month;
                currentButton.classList.remove('hide');
                var dayTd = document.querySelector('.week-day.curDay');
                if (dayTd) dayTd.classList.remove('curDay');

                var cls = ['prevMonth', 'curMonth', 'nextMonth'],
                    indexCls = 0;
                var html = data.reduce(function(value, current, index, source) {
                    var date = current.getDate();
                    if (date == 1) indexCls++;
                    var className = cls[indexCls];

                    if (+now == +current && indexCls == 1) {
                        className += ' curDay';
                        currentButton.classList.add('hide');
                        daysTd[index % 7].classList.add('curDay');
                    }
                    if (current.getDay() == 1) value += '<tr>';
                    return value + '<td class="' + className + '">' + date;
                }, '');
                document.querySelector('#table tbody').innerHTML = html;
            }
            createCalendar(data);
            var timer;
            function refresh() {
                window.clearTimeout(timer);
                var finish = new Date().setHours(24, 0, 0, 0);
                finish -= data;
                timer = window.setTimeout(function() {
                    createCalendar(data);
                    refresh();
                }, finish);
            }

            refresh();
Ответить с цитированием