theexplay
10/19/2016 - 4:14 PM

md->html

md->html

var Vacancies = {

        $tpl: elem.content,
        $item_changed: 'changed',
        $time: 800,

        init: function () {
            this.getData();
        },

        // Получаем данные
        getData: function () {
            $.ajax({
                url: 'vacancies_src.md',
                success: function (res) {
                    this.parseData(res);
                }.bind(this)
            });
        },

        // Обрабатываем данные
        parseData: function (data) {
            var items = data.split('<!-- cut -->'),
                    arr = [];

            for (var i = 0; i < items.length; i++) {
                var tpl = this.$tpl.cloneNode(true);
                tpl.querySelector('input').value = /^##\s(.+)/gm.exec(items[i])[1];
                tpl.querySelector('textarea').value = /^##\s(.+)([\s\S]+)$/gm.exec(items[i])[2].replace(/^###/gm, '#').replace(/^\s/g, '');
                arr.push(tpl)
            }
            this.renderData(arr);
        },

        // Отображаем данные
        renderData: function (arr) {
            var wrapper = document.createElement('ul');

            wrapper.className = 'list';

            for (var i = 0; i < arr.length; i++) {
                wrapper.appendChild(arr[i]);
            }

            Sortable.create(wrapper, {
                handle: ".item__drag",
                onSort: function () {
                    Vacancies.stringifyData();
                }
            });

            document.querySelector('.vacancies-tool').appendChild(wrapper);
        },

        // Готовим к отправке на сервер
        stringifyData: function (el) {
            var _this = this;
            window.removeEventListener('beforeunload', this.beforeUnload);

            if (el) {
                var cb = function () {
                    el.closest('.item').classList.add('saved');

                    setTimeout(function () {
                        el.closest('.item').classList.remove('saved')
                    }, _this.$time);
                };
            }

            var items = document.querySelectorAll('.list .item'),
                    content = '',
                    layout = '';

            for (var i = 0; i < items.length; i++) {
                var title = items[i].querySelector('input').value,
                    text = items[i].querySelector('textarea').value.replace(/^\s/g, '');

                if (items[i].classList.contains(_this.$item_changed)) {
                    items[i].classList.remove(_this.$item_changed);
                    _this.textAreaAdjust().collapse(items[i].querySelector('textarea'));
                }

                content += title.replace(/^/, '## ') + '\n' + text.replace(/^#\s/gm, '### ') + (i + 1 >= items.length ? '' : '<!-- cut -->');

                var tempLayout = '* \n\t' + title.replace(/^/, '## ') + '\n' + text.replace(/^#\s/gm, '### ').replace(/^/gm, '\t') + '\n\tРезюме присылайте на hr@ivi.ru с темой «' + items[i].querySelector('input').value + '».\t';
                layout += tempLayout + '\n';
            }

            this.saveData({
                content: content,
                layout: layout
            }, cb)
        },

        // Сохраняем на сервере
        saveData: function (data, callback) {
            $.ajax({
                method: "POST",
                url: 'vacancies.php',
                data: {
                    data: data.content,
                    layout: data.layout
                },
                error: function (err) {
                    alert('Произошла неизвестная ошибка на сервере.');
                    console.log(err);
                },
                success: function (res) {
                    console.log(res);
                    if (callback) {
                        callback();
                    }
                }
            })
        },

        addItem: function () {
            var list = document.querySelector('.vacancies-tool .list');

            list.insertBefore(this.$tpl, list.childNodes[0]);
            list.children[0].querySelector('.item input').focus();
        },

        removeItem: function (event) {
            var result = confirm('Вы уверены?');
            if (result) {
                event.target.closest('.item').remove();
                this.stringifyData();
            }
        },

        // Предупреждаем пользователя, что данные поменялись, но не были сохранены
        onDataChange: function (el) {
            window.addEventListener("beforeunload", this.beforeUnload);

            var $item = el.closest('.item');

            if (!$item.classList.contains(this.$item_changed)) {
                $item.classList.add(this.$item_changed)
            }
        },

        // Не даём покинуть страницу, если внесены изменения
        beforeUnload: function (e) {
            var confirmationMessage = "Данные не сохранены. Точно перейти?";

            (e || window.event).returnValue = confirmationMessage; //Gecko + IE
            return confirmationMessage;
        },

        // Работаем с высотой textarea
        textAreaAdjust: function (el) {
            var _this = this;

            var fn = {};

            fn.open = function (el) {
                el.style.height = (el.scrollHeight) + "px";
            };

            fn.collapse = function (el) {
                if (!el.closest('.item').classList.contains(_this.$item_changed)) {
                    el.style.height = '';
                }
            };

            return fn;
        }
    };