( function ($) { 
    $(document).ready(function(){

        function api(data,rfn) {
            $.ajax({
                url: cms.api,
                type: 'POST',
                data: data,
                success: function(rdata){
                    if ((rdata.substr(0,1) == '{') || (rdata.substr(0,1) == '[')) rdata = JSON.parse(rdata);
                    if (rfn) {
                        rfn(rdata);
                    }
                },
                error: function(xhr, ajaxOptions, thrownError){
                    if (xhr.status == 0) { rfn({result:'timeout'}); }
                }
            });
        }

        function notify( message, classes, msec ) {
            var el = $('<div class="'+classes+'">'+message+'</div>');
            $('.log-info-box').prepend(el);
            if (msec)
            setTimeout(function(){
                $(el).fadeOut(1000, function(){
                    $(el).remove();
                });
            }, msec);
        }

        /* Translate function */

        function __( str, context = 'pages.mod.php' ) {
            if (!cms) return str;
            if (!cms.locale) return str;
            if (!cms.lang[context]) return str;
            if (!cms.lang[context][cms.locale][str]) return str;
            return cms.lang[context][cms.locale][str];
        }

        function __tr_file( str ) {
            var ext = str.match(/\.[^\.]+$/, '');
            str = str.replace(/\.[^\.]+$/g, '');
            cms.tr[" "] = "_";
            for (var i in cms.tr) {
                var re = new RegExp(i,'g');
                str = str.replace(re,cms.tr[i]);
            }
            str = str.replace(/[^-A-Za-z0-9_]+/g,'');
            if (ext[0]) {
                str = str+ext[0];
            }
            str = str.toLowerCase();
            return str;
        }

        function update_pages_list() {
            api({fn:'get_pages_list'},set_pages_list);
        }
        if ( $('body').hasClass('logged') ) {
            update_pages_list();
        }
        function set_pages_list(r) {
            // Заполняем список страниц
            $('[data-pages-list]').html(r.list);

            /* Добавляем в выпадающий список родительские */
            $('[data-page-parent]').each(function(i,el){
                var parent = $(el).attr('data-page-parent');
                var self   = $(el).attr('data-page-id');
                $(el).append(r.parents);
                /* Удаляем себя из списка чтобы не назначить себя родителем */
                $(el).find('[value="'+self+'"]').remove();
                $(el).val(parent);
            });

            /* Выставляем шаблоны */
            $('[data-page-template]').each(function(i,el){
                var tpl = $(el).attr('data-page-template');
                if ( $(el).find('option[value="'+tpl+'"]').length == 0 ) {
                    $(el).prepend('<option value="'+tpl+'">'+tpl+'</option>');
                }
                $(el).val(tpl);
            });

            /* Добавляем поиск в выпадающий список */
            $("[data-page-parent]").select2();
            
            /* Call Mobile Menu */
            $('[data-page-menu]').click(function(){
                var id = $(this).attr('data-page-menu');
                $('[data-page-item='+id+'] .page-buttons').addClass('open');
            });
            
            /* Close Mobile Menu */
            $('[data-settings="pages"] .page-buttons').click(function(){
                $(this).removeClass('open');
            });

            /* Открыть свойства */
            $('[data-page-prop-open]').click(function(){
                var id = $(this).attr('data-page-prop-open');
                $('[data-page-prop='+id+']').removeClass('hidden').addClass('openhot');
                $('[data-page-item='+id+']').addClass('hidden');
                $('[data-page-item='+id+'] .page-buttons').removeClass('open');
                return false;
            });

            /* Скрыть свойства (Отменить) */
            $('[data-page-prop-cancel]').click(function(){
                var id = $(this).attr('data-page-prop-cancel');
                $('[data-page-prop='+id+']').addClass('hidden').removeClass('openhot');
                $('[data-page-item='+id+']').removeClass('hidden');
                return false;
            });

            /* Сохранить свойства (Сохранить) */
            $('[data-page-prop-save]').click(function(){
                var id      = $(this).attr('data-page-prop-save');
                var selector =  '[data-page-id='+id+']';
                var data = {
                    fn:          'save_prop',
                    id:          id,
                    title:       $(selector+'[name=title]').val(),
                    seo_title:   $(selector+'[name=seo_title]').val(),
                    type_url:    $(selector+'[name=url]').attr('data-page-url-type'),
                    url:         $(selector+'[name=url]').val(),
                    date:        $(selector+'[name=date]').val(),
                    time:        $(selector+'[name=time]').val(),
                    pid:         $(selector+'[name=pid]').val(),
                    template:    $(selector+'[name=template]').val(),
                    sort:        $(selector+'[name=sort]').val(),
                    description: $(selector+'[name=description]').val()
                }
                api(data, function(r){
                    if (r.result == 'timeout') {
                        notify( __("Connection lost"), 'info-error', 10000 );
                    } else if (r.info_text) {
                        notify( r.info_text, r.info_class, r.info_time );
                        if ( r.list ) {
                            set_pages_list(r);
                        }
                        if ( r.info_class == 'info-success' ) {
                            /* Свернуть свойства */
                            $('[data-page-prop='+data.id+']').addClass('hidden').removeClass('openhot');
                            $('[data-page-item='+data.id+']').removeClass('hidden');
                            /* Маркер последнего редактирования */
                            $('[data-page-item]').removeClass('last-edited');
                            $('[data-page-item='+data.id+']').addClass('last-edited');
                            // Обновить Title и URL
                            $('[data-page-item-link='+data.id+']').html(r.title);
                            $('[data-page-item-link='+data.id+']').attr('href', r.new_url);
                            $('[data-page-id='+data.id+'][name=url]').val(r.short_url);
                        }
                        sendUpdateEvent();
                    }
                });
                return false;
            });

            /* Редактировать страницу */
            $('[data-page-edit-btn]').click(function(){
                var id = $(this).attr('data-page-edit-btn');
                $('[data-page-item='+id+'] .page-buttons').removeClass('open');
                /* Очищаем поля редактора */
                $('[data-page-title]').text('');
                $('[data-page-title]').attr('href', '');
                $('[data-page-text]').val('');
                $('[data-page-text]').attr('data-page-text','');
                $('[data-page-save-btn]').attr('data-page-save-btn', '');
                $('[data-upload-form] input[name=id]').val('');
                $('[data-link-file]').html('');
                /* Запрашиваем данные о странице с сервера */
                api({fn:'get_page',id:id},function(r){
                    if (r.result == 'ok') {
                        /* Сброс чекбоксов при обновлении страницы */
                        $('[data-files-container] input[type=checkbox]').prop('checked',false);
                        $('[data-media-del]').addClass('disabled');

                        /* Заполняем поля редактора */
                        $('[data-page-title]').text(r.page.title);
                        $('[data-page-title]').attr('href', r.page.url);
                        $('[data-page-text]').val(r.page.text);
                        if (r.page.modified != null) /* значение null удаляет атрибут, чтобы не удалять - этот фикс */ {
                            $('[data-page-text]').attr('data-page-text', r.page.modified);
                        }
                        $('[data-page-save-btn]').attr('data-page-save-btn', r.page.id);
                        $('[data-upload-form] input[name=id]').val(r.page.id);
                        /* Images */
                        $('[data-files-container]').html(r.flist);
                        $('[data-files-container] input[type=checkbox]').unbind( "change" );
                        $('[data-files-container] input[type=checkbox]').change(img_rechecked);
                        $('[data-page-editor-files] .filesblocks').unbind( "click" );
                        $('[data-page-editor-files] .filesblocks').click(img_click);
                        $('[data-files-container] img').unbind('dblclick');
                        $('[data-files-container] img').dblclick(img_lbox);

                        /* Prevent reload Window when clicking Refresh Cache */
                        window.prevent_reload = true;
                        /* Отображаем редактор */
                        $('[data-page-editor]').removeClass('hidden');
                        /* Выбираем тему */
                        var n = $.cookie('theme');
                        var theme = admin_styles[n][1];
                        /* Подключаем редактор */
                        var txtarea = $('[data-page-text]')[0];
                        window.codemirror_editor = CodeMirror.fromTextArea(txtarea, {
                            mode: "htmlmixed",
                            styleActiveLine: true,
                            lineNumbers: true,
                            lineWrapping: true,
                            matchBrackets: true,
                            theme: theme,
                            phrases: {
                                "Search:":__("Search:"),
                                "(Use /re/ syntax for regexp search)":__("(Use /re/ syntax for regexp search)"),
                                "Replace all:":__("Replace all:"),
                                "With:":__("With:"),
                                "Replace:":__("Replace:"),
                                "Replace?":__("Replace?"),
                                "Yes":__("Yes"),
                                "No":__("No"),
                                "All":__("All"),
                                "Stop":__("Stop"),
                            }
                        });
                    }
                    if (r.result == 'timeout') {
                        notify( __("Connection lost"), 'info-error', 10000 );
                    }
                });
                return false;
            });

            /* Кнопка копирования ссылки */
            $('[data-link-file-copy]').click(function(){
                var img = $('[data-link-file]').text();
                var tmp = $("<textarea>");
                $("body").append(tmp);
                tmp.val(img).select();
                var r = document.execCommand("copy");
                tmp.remove();
                if ( r ) {
                    if ( img ) {
                        notify( __("Copyed"), 'info-success', 3000 );
                    } else {
                        notify( __("Please select file"), 'info-error', 3000 );
                    }
                } else {
                    notify( __("Copy Error"), 'info-error', 3000 );
                }
            });

            /* Отмена редактирования страницы */
            $('[data-page-cancel-btn]').unbind( "click" );
            $('[data-page-cancel-btn]').click(function(){
                /* Отключить редактор */
                window.codemirror_editor.toTextArea();
                /* Скрываем редактор */
                $('[data-page-editor]').addClass('hidden');
                /* Скрыть медиа файлы */
                $('[data-page-editor-files-close]').click();
                window.prevent_reload = false;
                return false;
            });

            /* Сохранить страницу */
            $('[data-page-save-btn],[data-page-save-close-btn]').unbind( "click" );
            $('[data-page-save-btn],[data-page-save-close-btn]').click(function(){
                /* Сбросить изменения в textarea */
                window.codemirror_editor.save();
                var data = {
                    fn:'save_page',
                    id: $('[data-page-save-btn]').attr('data-page-save-btn'),
                    modified: $('[data-page-text]').attr('data-page-text'),
                    text: $('[data-page-text]').val(),
                    url: $('[data-page-title]').attr('href'), /* delete old page */
                    close: $(this)[0].hasAttribute('data-page-save-close-btn')
                }
                api(data,function(r){
                    if (r.info_text) {
                        notify( r.info_text, r.info_class, r.info_time );
                        /* Маркер последнего редактирования */
                        $('[data-page-item]').removeClass('last-edited');
                        $('[data-page-item='+data.id+']').addClass('last-edited');
                        if ( r.modified ) {
                            $('[data-page-text]').attr('data-page-text', r.modified);
                        }
                        /* Закрыть редактор */
                        if (data.close) {
                            $('[data-page-cancel-btn]').click();
                        }
                    }
                    if (r.result == 'timeout') {
                        notify( __("Connection lost"), 'info-error', 10000 );
                    }
                });
                return false;
            });
            $('[data-page-editor]').keydown(function(e){
                if ( e.key == "s" && e.ctrlKey == true ) {
                    e.preventDefault();
                    $('[data-page-save-btn]').click();
                }
            });

            // Создать страницу
            $('[data-page-create=0]').unbind( "click" );
            $('[data-page-create]').click(function(){
                var pid = $(this).attr('data-page-create');
                var sort = $(this).attr('data-page-sort');
                var sort2 = $(this).parents('[data-page-box]');
                sort2 = $(sort2[0]).next().find('[data-page-sort]').attr('data-page-sort');
                api({fn:'create_page',pid:pid,sort:sort,sort2:sort2},function(r){
                    if (r.result == 'timeout') {
                        notify( __("Connection lost"), 'info-error', 10000 );
                    } else if (r.info_text) {
                        notify( r.info_text, r.info_class, r.info_time );
                        if ( r.info_class == 'info-success' ) {
                            set_pages_list(r);
                        }
                    }
                });
                return false;
            });

            // Удалить страницу
            $('[data-page-del]').click(function(e){
                var id = $(this).attr('data-page-del');
                $('[data-page-item='+id+'] .page-buttons').removeClass('open');
                e.preventDefault();
                if ( !confirm( __("Delete page? All attached files will be deleted.") ) ) return;
                var data = {
                    fn:'del_page',
                    id:id
                };
                api(data, function(r){
                    if (r.result == 'timeout') {
                        notify( __("Connection lost"), 'info-error', 10000 );
                    } else if (r.info_text) {
                        notify( r.info_text, r.info_class, r.info_time );
                        if ( r.info_class == 'info-success' ) {
                            set_pages_list(r);
                        }
                    }
                });
            });

            /* Отфильтровать, подергав поиск */
            var v = $("[data-page-search]").val();
            $("[data-page-search]").val('').trigger('change').val(v).trigger('change');

            sendUpdateEvent();

        }

        /* Send Update event to Menu module */
        function sendUpdateEvent() {
            if (!document.skipFirstEvent) document.skipFirstEvent = [];
            if ( document.skipFirstEvent['pages'] ) {
                let event = new Event("updated");
                $('[data-settings=pages]')[0].dispatchEvent(event);
            } else {
                document.skipFirstEvent['pages'] = true;
            }
        }
        
        /* Поиск */
        $("[data-pages-list]").searcher({
            itemSelector: "[data-page-box]",
            textSelector: "[data-page-item-link]",
            inputSelector: "[data-page-search]"
        });

        /* Показать медиатеку */

        $('[data-page-editor-files-btn]').click(function(){
            $('[data-page-editor-buttons]').addClass('hidden');
            $('[data-page-editor-files]').removeClass('hidden');
        });

        /* Скрыть медиатеку */

        $('[data-page-editor-files-close]').click(function(){
            $('[data-page-editor-files]').addClass('hidden');
            $('[data-page-editor-buttons]').removeClass('hidden');
        });

        /* Активный файл медиатеки */

        $('[data-page-editor-files] .filesblocks').click(img_click);
        function img_click(){
            $('[data-page-editor-files] .filesblocks').removeClass('active-file');
            $(this).addClass('active-file');
            var t = $(this).find('img').attr('data-type');
            var l = $(this).find('img').attr('data-src');
            var w = $(this).find('img').attr('width');
            var h = $(this).find('img').attr('height');
            var e = l.replace(/.*\./, '');
            var img = ['webp','tiff','jpeg','jpg','png','svg','gif','bmp','ico'];
            var mus = ['mp3','ogg','m4a','flac'];
            var vid = ['mp4','mkv'];
            var a = '<a href="'+l+'" target=_blank>'+l+'</a>';
            if (img.indexOf(e) >= 0) {
                l = '&lt;img alt="" src="'+a+'"';
                if ( w ) {
                    l += ' width="'+w+'"';
                }
                if ( h ) {
                    l += ' height="'+h+'"';
                }
                l += '&gt;';
                $('[data-link-file]').html(l);
            } else if (mus.indexOf(e) >= 0) {
                l = '&lt;audio src="'+a+'" controls>&lt;/audio>';
                $('[data-link-file]').html(l);
            } else if (vid.indexOf(e) >= 0) {
                l = '&lt;video src="'+a+'" controls>&lt;/video>';
                $('[data-link-file]').html(l);
            } else {
                l = '&lt;a href="'+a+'"&gt;TEXT&lt;/a&gt;';
                $('[data-link-file]').html(l);
            }
        }

        /* Установка чекбоксов */

        $('[data-files-container] input[type=checkbox]').change(img_rechecked);
        function img_rechecked(){
            if ($('[data-files-container] input[type=checkbox]:checked').length) {
                $('[data-media-del]').removeClass('disabled');
            } else {
                $('[data-media-del]').addClass('disabled');
            }
        }
        
        /* Просмотр в лайтбоксе */

        $('[data-files-container] img').dblclick(img_lbox);
        function img_lbox(){
            var src = $(this).attr('data-src');
            var e = src.replace(/.*\./, '');
            var img = ['webp','tiff','jpeg','jpg','png','svg','gif','bmp','ico'];
            var mus = ['mp3','ogg','m4a','flac'];
            var vid = ['mp4','mkv'];
            if ( $('#lbox-window').length == 0 ) {
                if (img.indexOf(e) >= 0) {
                    var src = $(this).attr('data-src');
                    $('body').append('<div id=lbox-window><img src="'+src+'"></div>');
                    $('#lbox-window').click(function(){
                        $(this).remove();
                    });
                } else if (mus.indexOf(e) >= 0) {
                    $('body').append('<div id=lbox-window><audio src="'+src+'" controls></audio></div>');
                    $('#lbox-window').click(function(){
                        $(this).remove();
                    });
                } else if (vid.indexOf(e) >= 0) {
                    $('body').append('<div id=lbox-window><video src="'+src+'" controls></video></div>');
                    $('#lbox-window').click(function(){
                        $(this).remove();
                    });
                }
                
            }
        }

        /* Загрузка файлов */

        $('[data-upload-form] input[type=file]').change(function(){
            var bar = $('[data-settings="pages"] .bar');
            $('[data-upload-form]').ajaxSubmit({
                beforeSubmit: function(formData, jqForm, options) {
                    var id = $('[data-upload-form] input[name=id]').val();
                    var n = 0;
                    $(formData).each(function(i,v){
                        if (v.name == 'myfile[]') {
                            var f = __tr_file(v.value.name);
                            f = '/uploads/'+id+'/'+f;
                            n += $('[data-page-editor-files] .filesblocks [data-src="'+f+'"]').length;
                        }
                    });
                    if (n)  {
                        var c = confirm(__("Files with the same names found on the server")+' - '+n+' '+__("pc.")+'\n'+__("Overwrite them or cancel the upload?"));
                        if (!c) {
                            $('[data-upload-form] input[type=file]').val(''); /* cancel fix */
                        }
                        return c;
                    }
                },
                beforeSend: function() {
                    var percentVal = '0%';
                    bar.width(percentVal);
                },
                uploadProgress: function(event, position, total, percentComplete) {
                    var percentVal = percentComplete + '%';
                    bar.width(percentVal);
                },
                success: function() {
                    var percentVal = '0%';
                    bar.width(percentVal);
                },
                complete: function(xhr) {
                    if ( xhr.status == 200 ) {
                        if ((xhr.responseText.substr(0,1) == '{') || (xhr.responseText.substr(0,1) == '[')) {
                            r = JSON.parse(xhr.responseText);
                        }
                        if ( r.info_text ) {
                            notify( r.info_text, r.info_class, r.info_time );
                            if ( r.info_class == 'info-success' ) {
                                $('[data-page-editor-files] .filesblocks').removeClass('active-file');
                                $(r.flist).find('img').each(function(i,el){
                                    var file = $(el).attr('data-src');
                                    $('[data-page-editor-files] .filesblocks [data-src="'+file+'"]').parent().remove();
                                });
                                $('[data-files-container]').prepend(r.flist);
                                $('[data-files-container] input[type=checkbox]').unbind( "change" );
                                $('[data-files-container] input[type=checkbox]').change(img_rechecked);
                                $('[data-page-editor-files] .filesblocks').unbind( "click" );
                                $('[data-page-editor-files] .filesblocks').click(img_click);
                                $('[data-files-container] img').unbind('dblclick');
                                $('[data-files-container] img').dblclick(img_lbox);
                            }
                            $('[data-upload-form] input[type=file]').val(''); /* chrome fix */
                        }
                    } else {
                        if ( xhr.responseText ) {
                            notify( xhr.responseText, 'info-error', 10000 );
                        } else {
                            notify( __('Files too big. Check server config.'), 'info-error', 10000 );
                            $('.bar').width('0%');
                            $('[data-upload-form] input[type=file]').val(''); /* fix after error */
                        }
                    }
                }
            });
            return false;
        });

        /* Удаление файлов */

        $('[data-media-del]').click(function(){
            if (!$(this).hasClass('disabled')) {
                var flist = [];
                $('[data-files-container] input[type=checkbox]:checked').each(function(i,e){
                    var f = $(e).parents('.filesblocks').find('img').attr('data-src');
                    flist.push(f);
                });
                var data = {
                    fn:'del_files',
                    flist:flist
                };
                api(data, function(r){
                    if (r.result == 'timeout') {
                        notify( __("Connection lost"), 'info-error', 10000 );
                    } else if (r.info_text) {
                        $('[data-link-file]').html('');
                        notify( r.info_text, r.info_class, r.info_time );
                        if ( r.info_class == 'info-success' ) {
                            for (var f in flist) {
                                $('[data-files-container] img[data-src="'+flist[f]+'"]').parent().remove();
                            }
                            $('[data-media-del]').addClass('disabled');
                        }
                    }
                });
            }
        });

    });
})( jQuery );
