var Fid = {
    friendlyVer: 0,
    vtxtImageSizeLimit: 0,

    objFormFid: null,
    isGecko: navigator.userAgent.indexOf('Gecko') !== -1,
    isMac: navigator.userAgent.indexOf('Macintosh') !== -1,
    animationSlideSpeed: 500,

    types: { 'tax': 'Taxonómica','tag': 'Tagonómica','list': 'Lista','port': 'Portada'},
    waitingProntusForm: 0,
    tooltipId: null,
    tooltipTime: 800,
    disablePing: false,
    previewCurrentZoom: 80,
    validatorProntusForm: null,
    tinyConfig: {
        // ----- General
        language: "es",
        mode: "textareas",
        menubar: false,
        selector: ".VTXT_EDITOR",
        entity_encoding: "raw",

        branding: false, // To disable "Powered by TinyMCE"
        theme: "modern",
        media_live_embeds: true,

        autoresize_max_height: 500,
        autoresize_min_height: 150,

        toolbar1: 'formatselect bold italic underline strikethrough | alignleft aligncenter alignright alignjustify | bullist numlist | indent outdent | hr blockquote charmap | version_control',
        toolbar2: 'styleselect searchreplace pastetext spellchecker | undo redo removeformat | link unlink | image media table | html_insert prontus_insert template | prontus_cards code toc | help',
        contextmenu: "cut copy paste | link openlink image inserttable | cell row column deletetable",

        // clases para imagenes
        image_class_list: [{title: 'Ninguna', value: ''},{title: 'Imagen Responsiva', value: 'responsive-img'},{title: 'Imagen No Responsiva', value: 'no-responsive-img'}],
        // clases de tabla, celda, fila
        table_class_list: [{title: 'Ninguna', value: ''}],
        table_row_class_list: [{title: 'Ninguna', value: ''}],
        table_cell_class_list: [{title: 'Ninguna', value: ''}],

        table_responsive_class: 'table-responsive',
        // sin estilo por defecto
        table_default_styles: {},
        plugins: "autoresize preview spellchecker searchreplace autolink visualchars image imagetools link media table_responsive hr charmap pagebreak anchor toc lists textcolor imagetools contextmenu textpattern code paste help template prontus_insert html_insert version_control prontus_cards",
        height: 400,
        // ----- URL
        convert_urls: false,

        // ----- Plugins
        spellchecker_languages: "Español=es,Inglés=en",
        spellchecker_rpc_url: 'spellchecker.php',
        // ----- Cleanup/Output
        valid_children: "+body[prontus_insert],+body[html_insert]",
        valid_elements: '*[*]',
        extended_valid_elements: 'prontus_insert,html_insert[data-code]',
        custom_elements: 'prontus_insert,html_insert[data-code]',
        fix_list_elements: true,
        convert_fonts_to_spans: true,
        forced_root_block: 'p',
        paste_data_images: true,
        image_advtab:true,
        image_caption:true,
        tabfocus_elements: '',
        // html o xthml, indica el formato de los tags del editor.
        element_format: 'html',
        rel_list: [
            {title: 'Ninguno', value: ''},
            {title: 'No Follow', value: 'nofollow'}
        ],

        // Estilos del artículo
        content_css: "/prontus/cpan/vtxt/editor/plugins/prontus_insert/css/content.min.css,/prontus/cpan/vtxt/editor/plugins/html_insert/css/content.min.css,/prontus/cpan/css/vtxt_extras.css",
        style_formats_merge: true,
        style_formats: [
            {title:"Estructura y Código", items: [
                {title: 'Pre', block: 'pre'}, {title: 'Code', inline: 'code'}, {title: 'H2 - subtit1', block:'h2', classes:'subtit1'}, {title: 'H3 - subtit2', block:'h3', classes:'subtit2'}, {title: 'H4 - subtit3', block:'h4', classes:'subtit3'}
            ]}
        ]
    },

    init: function() {
        // Se revisa si el articulo es nuevo o no
        if (mainFidJs.TS !== '') {
            // Muestra los elementos con class hide-new-artic, cuando el artículo no es nuevo
            $('.hide-new-artic').css('display', 'inline-block');
            Fid.pingRecurso();
            document.title = 'Editar ' + document.title;
        } else {
            document.title = 'Nuevo ' + document.title;
            // Si el articulo es nuevo, se intenta recargar el titular
            var titular = mainFidJs.SAVED_TITULAR;
            if (titular !== '') {
                $('#_txt_titular').val(titular);
            }
        }

        $('ul.nav li.dropdown ul.dropdown-menu li a').click(function () {
            $(this).parents('.dropdown-menu').dropdown('toggle');
        });

        $('#fid-menu a').click(function () {
            var href = this.href.split('#');
            if (href[1] !=='') {
                var menuHeight = document.getElementById('fid-menu').getBoundingClientRect().height;
                var navHeight = document.getElementById('main-nav').getBoundingClientRect().height;
                $('html:not(:animated), body:not(:animated)').animate({
                    scrollTop: ($("#"+ href[1]).parent().offset().top - navHeight - menuHeight - 2)
                }, 500);
                $('.dropdown.open .dropdown-toggle').dropdown('toggle');
                return false;
            }

        });

        $(window).resize(function() {
            var fidMenu = document.getElementById('fid-menu');
            if (fidMenu != null) {
                $('#fid').css('margin-top', (fidMenu.getBoundingClientRect().height + 4) +'px');
            }
            if (window.innerWidth > 767) {
                var buttons = document.getElementById('action-buttons');
                $('#right-sidebar-menu').css('margin-top', buttons.getBoundingClientRect().height +'px');
                var paddingBbottom = document.getElementById('main-nav').getBoundingClientRect().height;
                $('#padding-right-sidebar-menu').css('padding-bottom', parseInt(paddingBbottom) + buttons.getBoundingClientRect().height +'px');
            } else {
                $('#right-sidebar-menu').css('margin-top', '0px');
                $('#padding-right-sidebar-menu').css('padding-bottom', '0px');
            }
        });
        $(window).resize();

        // Inicializa selectores para fechas y horas
        // inputs que usan clase campo_fecha y campo_hora
        $('.campo_hora').datetimepicker({
            format: 'HH:mm',
            locale: 'es',
            useCurrent: false,
        }).on('dp.show', Fid.datetimefixer);

        $('.campo_hora_seg').datetimepicker({
            format: 'HH:mm:ss',
            locale: 'es',
            useCurrent: true,
        }).on('dp.show', Fid.datetimefixer);

        // para cualquier campo fecha del fid
        $('.campo_fecha').datetimepicker({
            format: 'L', //dd/mm/yyyy
            locale: 'es',
            useCurrent: false
        }).on('dp.show', Fid.datetimefixer);

        if (mainFidJs.MODTIME !== '' && mainFidJs.MODTIME > 0) {
            Fid.setLastMod(mainFidJs.MODTIME);
        }

        // Propaga el nombre del form ppal del fid
        Fid.objFormFid = document._mainFidForm;
        Fechas.objFormFid = document._mainFidForm;
        CombosTax.objFormFid = document._mainFidForm;

        // LLena campos fecha
        Fechas.fillfechashrt();
        Fechas.fillHora();
        $('#div-fechas').show();

        // Taxonomia
        CombosTax.init();

        // Para la transcodificación
        if (typeof Transcoding !== 'undefined') {
            Transcoding.init();
        }

        // Publicacion directa
        Fid.setPublicacionDirecta();

        /* seteamos las validaciones del prontus form */
        Fid.validacionesProntusForm();

        /* evento para abrir el listado de datos recibidos */
        $('#verBackupDatos').on('click', function() {
            Fid.listadoDatos();
            return false;
        });

        Fid.setGUIProcesando(false);

        Fid.instalaClipboard();

        // Para la edicion de friendly v4
        if (Fid.friendlyVer == 4) {
            Fid.iniciaSlugF4();
            $('#_txt_titular').on('blur', function() { Fid.validaTitularF4('check-titular'); });
            $('#_slug').on('blur', function() { Fid.validaTitularF4('check-slug');});
            $('#_slug').click(function() { Fid.slugEditableF4(true);} );
            $('#_resetslug').click(function() { Fid.slugEditableF4(false); } );
        }

        // Para la edicion de friendly v5
        if (Fid.friendlyVer == 5  && !mainFidJs.TS) {
            FidConfig.f5_edit = false;
            Fid.f5Editable(false);
            $('#_txt_titular').on('blur', function() {
                if (!FidConfig.f5_edit) {
                    Fid.urlf5.actions.makeUrl();
                }
            });
            $('#_url').click(function() { Fid.f5Editable(true);} );
        }

        // Inicializa acciones de los botones
        $('#_fid-selector').on('change', Fid.cambiarTipoFid);
        $('#save_self').click(function() { Fid.submitArt('save', '_self'); return false; });
        $('#save_new').click(function() { Fid.submitArt('save_new', '_self'); return false; });
        $('#copy_art').click(function() { Fid.copyArtic(mainFidJs.TS); return false; });
        $('#actualizar-pub').click(function() { Fid.actualizaFechaHora('pub'); return false; });
        $('#actualizar-exp').click(function() { Fid.actualizaFechaHora('exp'); return false; });
        $('#art_preview').click(Fid.showArtPreview);
        $('#art_preview_refresh').click(Fid.artPreviewRefresh);
        $('#art_preview_zoom_in').click(Fid.artPreviewZoomIn);
        $('#art_preview_zoom_out').click(Fid.artPreviewZoomOut);
        $('#art_preview_newwin').click(Fid.artPreviewNewWin);
        $('#preview_vista').change(Fid.artPreviewChangeVista);
        $('#art_view').click(function() { Fid.verArtActual(this); return false; });
        $('#_txt_titular').click(Fid.limpiaTitular);
        $('#_txt_titular').on('keyup', function() { Fid.validaLargoTitular(); });

        $('#_xmlart').click(Fid.verXML);
        $('#copy-artic-url').tooltip({trigger: 'hover', placement: 'top'});

        // valida al iniciar
        Fid.validaLargoTitular();

        if (typeof postear_a_youtube !== 'undefined' && postear_a_youtube == 'si' && mainFidJs.TS && typeof PostingYoutube !== 'undefined') {
            $('#posting_youtube_si').show();
            $('#posting_youtube_no').hide();
            PostingYoutube.init(mainFidJs.TS, Admin.prontus_id);
        } else if (! mainFidJs.TS) {
            $('#posting_youtube_no p.msg').html(
                "El posting a Youtube no está habilitado para artículos nuevos. Guarda el artículo para poder publicarlo."
            );
        }

        if (typeof postear_a_twitter !== 'undefined' && postear_a_twitter == 'si' && mainFidJs.TS && typeof PostingTwitter !== 'undefined') {
            $('#posting_twitter_si').show();
            $('#posting_twitter_no').hide();
            PostingTwitter.init(mainFidJs.TS, Admin.prontus_id);

            $('#titularTwitter').keyup(function() {
                PostingTwitter.updateCount();
            }).keydown(function() {
                PostingTwitter.updateCount();
            });

        } else if (! mainFidJs.TS) {
            $('#posting_twitter_no p.msg').html("El posting a Twitter no está habilitado para artículos nuevos. Guarda el artículo para poder publicarlo.");
        }

        // acciones relacionadas con el posting a FB.
        if (typeof postear_a_facebook !== 'undefined' && postear_a_facebook == 'si' && mainFidJs.TS && typeof PostingFacebook !== 'undefined') {
            $('#posting_fb_si').show();
            $('#posting_fb_no').hide();
            // mostramos la última respuesta de la API si existe.
            if ($('#facebookResponse').val()) {
                $('#fb_last_response').show();
            }
            PostingFacebook.init(mainFidJs.TS, Admin.prontus_id);
        } else if (! mainFidJs.TS) {
            $('#posting_fb_no p.msg').html("El posting a Facebook no está habilitado para artículos nuevos. Guarda el artículo para poder publicarlo.");
        }
        Fid.initSnpApp();
        Fid.initInfoCharts();
        Fid.urlf5.init();
    },

    initInfoCharts: function () {
        let chartArticSpace = document.getElementById('chart-artic-space');
        let chartS3Space = document.getElementById('chart-s3-space');
        let chartArticS3Space = document.getElementById('chart-artic-s3-space');

        if (chartArticSpace) {
            let ctxArticSpace = chartArticSpace.getContext('2d');
            let articSpaceMediaSize = parseInt(chartArticSpace.getAttribute("data-media-size"));
            let articSpaceAssetSize = parseInt(chartArticSpace.getAttribute("data-asset-size"));
            let articSpaceImagSize = parseInt(chartArticSpace.getAttribute("data-imag-size"));
            let configChartArticSpace = {
                type: "pie",
                data: {
                    labels: [
                        "Multimedia: " + Fid.formatBytes(articSpaceMediaSize),
                        "Adjuntos: " + Fid.formatBytes(articSpaceAssetSize),
                        "Imágenes: " + Fid.formatBytes(articSpaceImagSize)
                    ],
                    datasets: [{
                        data: [
                            articSpaceMediaSize,
                            articSpaceAssetSize,
                            articSpaceImagSize
                        ],
                        backgroundColor: [
                            window.chartJsColors["media_size"],
                            window.chartJsColors["asset_size"],
                            window.chartJsColors["imag_size"]
                        ],
                        borderWidth: 0
                    }]
                },
                options: {
                    responsive: true,
                    plugins: {
                        tooltip: {
                            enabled: false,
                            callbacks: {
                                label: function(context) {
                                    return context.label + ": " + Fid.formatBytes(context.raw);
                                }
                            }
                        },
                        datalabels: {
                            formatter: function (value) {
                                // return  Fid.formatBytes(value);
                                return  "";
                            },
                            color: "#fff",
                        }
                    }
                }
            };

            Chart.register(ChartDataLabels);
            new Chart(ctxArticSpace, configChartArticSpace);
        }

        if (chartS3Space) {
            let ctxS3Space = chartS3Space.getContext('2d');
            let s3SpaceMediaSize = parseInt(chartS3Space.getAttribute("data-s3-media-size"));
            let s3SpaceAssetSize = parseInt(chartS3Space.getAttribute("data-s3-asset-size"));
            let configChartS3Space = {
                type: "pie",
                data: {
                    labels: [
                        "Multimedia S3: " + Fid.formatBytes(s3SpaceMediaSize),
                        "Adjuntos S3: " + Fid.formatBytes(s3SpaceAssetSize),
                    ],
                    datasets: [{
                        data: [
                            s3SpaceMediaSize,
                            s3SpaceAssetSize,
                        ],
                        backgroundColor: [
                            window.chartJsColors["s3_media_size"],
                            window.chartJsColors["s3_asset_size"]
                        ],
                        borderWidth: 0
                    }]
                },
                options: {
                    responsive: true,
                    plugins: {
                        tooltip: {
                            enabled: false,
                            callbacks: {
                                label: function(context) {
                                    return context.label + ": " + Fid.formatBytes(context.raw);
                                }
                            }
                        },
                        datalabels: {
                            formatter: function (value) {
                                // return  Fid.formatBytes(value);
                                return  "";
                            },
                            color: "#fff",
                        }
                    }
                }
            };

            new Chart(ctxS3Space, configChartS3Space);
        }

        if (chartArticS3Space) {
            let ctxArticS3Space = chartArticS3Space.getContext('2d');
            let s3Size = parseInt(chartArticS3Space.getAttribute("data-s3-size"));
            let totalSize = parseInt(chartArticS3Space.getAttribute("data-total-size"));
            let configChartArticS3Space = {
                type: "pie",
                data: {
                    labels: [
                        "Disco local: " + Fid.formatBytes(totalSize),
                        "Almacenamiento S3: " + Fid.formatBytes(s3Size)
                    ],
                    datasets: [{
                        data: [
                            totalSize,
                            s3Size
                        ],
                        backgroundColor: [
                            window.chartJsColors["total_size"],
                            window.chartJsColors["s3_size"]
                        ],
                        borderWidth: 0
                    }]
                },
                options: {
                    responsive: true,
                    plugins: {
                        tooltip: {
                            enabled: false,
                            callbacks: {
                                label: function(context) {
                                    return context.label + ": " + Fid.formatBytes(context.raw);
                                }
                            }
                        },
                        datalabels: {
                            formatter: function (value) {
                                // return  Fid.formatBytes(value);
                                return  "";
                            },
                            color: "#fff",
                        }
                    }
                }
            };

            Chart.register(ChartDataLabels);
            new Chart(ctxArticS3Space, configChartArticS3Space);
        }

    },
    formatBytes: function (bytes) {
        if (bytes === 0) return '0 Bytes';

        const k = 1024;
        const dm = 2 < 0 ? 0 : 2;
        const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];

        const i = Math.floor(Math.log(bytes) / Math.log(k));

        return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
    },
    initSnpApp: function () {
        $('#send_push_notif').on('click', function (e) {
            e.preventDefault();
            var fotofija = $(this).attr("data-fotofija");

            if (!document.getElementById('snp_web').checked &&
                !document.getElementById('snp_android').checked &&
                !document.getElementById('snp_ios').checked) {
                showModalAlert({
                    title: 'Error',
                    type: "orange",
                    msg: "No se ha seleccionado ninguna opción de envío"
                });
                return false;
            }

            showModalConfirm({
                msg: "Se enviará una notificación push a todos los suscriptores. <br>¿Deseas continuar?",
                okTitle: 'Enviar notificación',
                btnClassOk: 'hovwhite radius15 noborder txtnextwhite pad-top-bot7 pad-lef-rig20 int-nextred nextred',
                cbBtnOK: function () {
                    if(FidConfig.cargando) {
                        showModalAlert({
                            title: 'Error de servidor',
                            type: "red",
                            msg: FidConfig.msgCargando
                        });
                        return false;
                    }

                    var url = '/' + Admin.dir_cgi_cpn + '/prontus_snp_send_artic_push.cgi';

                    $.ajax({
                        type: "POST",
                        dataType: 'json',
                        url: url,
                        data: {
                            _prontus_id: Admin.prontus_id,
                            _ts: mainFidJs.TS,
                            _fotofija: fotofija,
                            web: document.getElementById('snp_web').checked,
                            android: document.getElementById('snp_android').checked,
                            ios: document.getElementById('snp_ios').checked
                        },
                        success: function (resp) {
                            if (resp.status == 1) {
                                showModalAlert({
                                    title: 'Notificación push',
                                    type: 'green',
                                    msg: 'Notificación enviada con éxito.'
                                });
                            } else {
                                showModalAlert({
                                    title: 'Notificación push',
                                    type: 'red',
                                    msg: 'Error en el envío: ' + resp.msg
                                });
                            }
                        },
                        error: function(XMLHttpRequest, textStatus) {
                            showModalAlert({
                                title: 'Notificación push',
                                type: 'red',
                                msg: 'Error en el envío: ' + textStatus
                            });
                        }
                    });
                },
                cbBtnCancel: function () {
                    return false;
                }
            });
        })
    },

    setLastMod: function (modtime) {
        var str = "Sin información";
        modtime = modtime * 1000;

        if (modtime) {
            var mod = new Date(modtime);
            var dnow = new Date();
            var now = dnow.getTime();

            if (modtime > now) {
                // La fecha de ahora es mas antigua
                return;
            }

            var diff = (now - modtime) / 1000;

            if (diff < 60) {
                str = "Modificado hace unos segundos";
            } else if(diff < 3600) {
                diff = Math.round(diff/60);

                if (diff == 1) {
                    str = "Modificado hace un minuto";
                } else {
                    str = "Modificado hace {0} minutos".format(diff);
                }
            } else {
                var dnow2 = dnow;
                dnow2.setTime(dnow2.getTime() - 86400);
                var fechamod = mod.getYear() + '-' + mod.getMonth() + '-' + mod.getDate();
                var fechahoy = dnow.getYear() + '-' + dnow.getMonth() + '-' + dnow.getDate();
                var fechaayer = dnow2.getYear() + '-' + dnow2.getMonth() + '-' + dnow2.getDate();
                var hora;

                if (fechamod == fechahoy) {
                    hora = Fid.helper.getHora(modtime, true);
                    str = "Modificado hoy a las {0} hrs.".format(hora);

                } else if(fechamod == fechaayer) {
                    hora = Fid.helper.getHora(modtime, true);
                    str = "Modificado ayer a las {0} hrs.".format(hora);
                } else {
                    hora = Fid.helper.getHora(modtime, true);
                    var fecha = Fid.helper.getFecha(modtime, true);

                    str = "Modificado el {0} a las {1}".format(fecha, hora);
                }
            }
        }

        $('#lastmod').text(str);
        setTimeout(Fid.setLastMod, 5000, mainFidJs.MODTIME);
    },

    // corrige posicion de datepicker
    datetimefixer: function() {
        // https://github.com/Eonasdan/bootstrap-datetimepicker/issues/790#issuecomment-234652413
        var datepicker = $('body').find('.bootstrap-datetimepicker-widget:last'),
            position = datepicker.offset(),
            parent = datepicker.parent(),
            parentPos = parent.offset(),
            width = datepicker.width(),
            parentWid = parent.width();

        // move datepicker to the exact same place it was but attached to body
        datepicker.appendTo('body');
        datepicker.css({
            position: 'absolute',
            top: position.top,
            bottom: 'auto',
            left: position.left,
            right: 'auto'
        });

        // if datepicker is wider than the thing it is attached to then move it so the centers line up
        if (parentPos.left + parentWid < position.left + width) {
            var newLeft = parentPos.left;
            newLeft += parentWid / 2;
            newLeft -= width / 2;
            datepicker.css({left: newLeft});
        }
    },

    sbmitArtPreview: function () {
        // Si se está usando el .prontusSubmit en vez de .submit se setea e callback.
        if (prontus.prontusSubmit) {
            // Setea callback que se ejecuta despues de la funcion del submit.
            prontus.setCallback('attachEndCallbackSubmit', function (e, returned) {
                if (returned === false) {
                    Fid.setGUIProcesando(false);
                } else {
                    $('#modal_art_preview').modal('show');
                }
            });
        } else { // se utiliza .submit, se muestra el modal de inmediato.
            $('#modal_art_preview').modal('show');
        }

        $('#_accion').val('preview'); // save | preview | save_new
        $(Fid.objFormFid).attr('action', 'prontus_art_sbmit.cgi');
        $(Fid.objFormFid).attr('target', 'iframe_art_preview');

        Fechas.fillfecha();
        CombosTax.fillSeccTemStem(); // Taxonomia
        Fid.procesarTags();

        // se envia el formulario
        var totalfsize = Fid.getTotalFileSize();
        if (Admin.maxFileSizeB && totalfsize > Admin.maxFileSizeB) {
            showModalAlert({
                title: "Error al intentar guardar",
                type: "orange",
                msg: "Los archivos que intentas subir pesan en total " + Math.round(totalfsize / (1024 * 1024)) + "MB. El tamaño máximo es " + Admin.maxFileSizeM + "MB. Por favor descarta algunos archivos y reintenta, o contacta al administrador del sistema."
            });
            Fid.setGUIProcesando(false);
            $('#modal_art_preview').modal('hide');
        } else {
            $('#_mainFidForm').trigger('submit');
        }
    },

    artPreviewNewWin: function () {
        Fid.submitArt('preview', '_blank');
    },

    showArtPreview: function () {
        Fid.artPreviewIframeLoad();

        $("#modal_art_preview").on("show.bs.modal", function () {
            $("#iframe_art_preview").hide();
        });

        $("#modal_art_preview").on("hidden.bs.modal", function () {
            $("#iframe_art_preview").off('load');
            $("#iframe_art_preview").attr("src", "about:blank").attr("style", "");
            $("#modal_art_preview .loading").show();
        });

        Fid.sbmitArtPreview();
    },

    artPreviewIframeLoad: function () {
        $("#iframe_art_preview").off('load').on("load", function () {
            $("#modal_art_preview .loading").hide();
            $("#iframe_art_preview").show();

            var zoom_factor = Fid.previewCurrentZoom / 100;
            iframe_art_preview.document.body.style.zoom = zoom_factor;
            var body = iframe_art_preview.document.body;
            var html = iframe_art_preview.document.documentElement;
            var h = Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);

            $(this).height(h * zoom_factor);
            Fid.makeResizable('#resizable_art_preview', '#iframe_art_preview');
            $(this).show();
        });
    },

    artPreviewRefresh: function () {
        Fid.artPreviewChangeVista();
    },

    artPreviewZoomIn: function () {
        if (Fid.previewCurrentZoom >= 100) {
            Fid.previewCurrentZoom = 100;
            return;
        }

        Fid.previewCurrentZoom += 10;
        var zoom_factor = Fid.previewCurrentZoom / 100;
        iframe_art_preview.document.body.style.zoom = zoom_factor;
    },

    artPreviewZoomOut: function () {
        if (Fid.previewCurrentZoom <= 20) {
            Fid.previewCurrentZoom = 20;
            return;
        }

        Fid.previewCurrentZoom -= 10;
        var zoom_factor = Fid.previewCurrentZoom / 100;
        iframe_art_preview.document.body.style.zoom = zoom_factor;
    },

    artPreviewChangeVista: function () {
        var nombre_vista = $('#preview_vista').val();
        $('#_MV').val(nombre_vista);
        $("#iframe_art_preview").off('load');
        $("#iframe_art_preview").attr("src", "about:blank").attr("style", "");
        $("#iframe_art_preview").hide();
        Fid.makeResizable('#resizable_art_preview', '#iframe_art_preview');

        $("#modal_art_preview .loading").show();

        setTimeout(function () {
            Fid.artPreviewIframeLoad();
            Fid.sbmitArtPreview();
        }, 500);
    },

    makeResizable: function(resizable_container, resizable_iframe) {
        //si ya existe, reinicio.
        if ($(resizable_container).resizable('instance')) {
            $(resizable_container).resizable('destroy');
        }

        $(resizable_container).resizable({
            handles:'e', // solo se puede redimensionar en horizontal
            maxWidth: $(resizable_container).parent().width(),
            start: function() {
                // el drag debe evitar caer del iframe, ya que no hay bubbling dentro del iframe y se pierde el mouse.
                // por eso agregamos un div superpuesto transparente, y por las dudas bloqueamos los eventos dentro del iframe.
                $(resizable_iframe).css('pointer-events','none');
            },
            stop: function() {
                // cancelamos lo hecho.
                $(resizable_iframe).css('pointer-events','auto');
            }
        });
    },

    setIframeSize: function(iframe_selector) {
        var f = $(iframe_selector);
        f[0].setAttribute("width", f.parent().width());
        f[0].setAttribute("height", f.parent().height());
    },

    instalaClipboard: function() {
        $('#copy-artic-url').popover({
                trigger: 'manual',
                content:'La URL ha sido copiada',
                template: '<div class="popover" role="tooltip"><div class="arrow"></div><div class="popover-content"></div></div>',
                placement:'bottom',
                delay: { "show": 500, "hide": 100 }});
        var clipboard = new ClipboardJS(document.getElementById('copy-artic-url'),{
                text: function() {
                    return $('#copy-artic-url').attr('data-href-art');
                }
            });
        clipboard.on('success', function() {
            $('#copy-artic-url').popover('show')
            clearTimeout(Fid.tooltipId);
            Fid.tooltipId = setTimeout(function() {
                $('#copy-artic-url').popover('hide')
            }, Fid.tooltipTime);
        });
    },

    procesarTags: function() {
        var tags4fid = $('#_tags4fid').val();
        if(typeof tags4fid === 'undefined') {
            return;
        }
        var _tags = '';
        if(tags4fid !== '') {
            var arr = tags4fid.split(',');
            var x;
            for(x in arr) {
                if(arr[x] !== '') {
                    var arr2 = arr[x].split('|');
                    if(arr2.length === 2) {
                        _tags = _tags + arr2[0] + ',';
                    }
                }
            }
        }
        if(_tags.length > 0) {
            _tags = _tags.substr(0, _tags.length-1);
        }
        $('#_tags').val(_tags);
    },

    verArtActual: function(obj) {
        if (mainFidJs.TS == '') {
            return false;
        }
        var url = $(obj).attr('href');
        window.open(url);
    },

    copyArtic: function(ts) {
        if (ts == '') {
            return false;
        }
        showModalConfirm({
            msg: "Este artículo será copiado. Se perderán los datos que no hayas guardado.<br>¿Deseas continuar?",
            okTitle: 'Copiar Artículo',
            btnClassOk: 'hovwhite radius15 noborder txtnextwhite pad-top-bot7 pad-lef-rig20 int-nextred nextred',
            cbBtnOK: function () {
                if(FidConfig.cargando) {
                    showModalAlert({
                        title: 'Error de servidor',
                        type: "red",
                        msg: FidConfig.msgCargando
                    });
                    return false;
                }

                Fid.setGUIProcesando(true);
                var actionURL = '/' + Admin.dir_cgi_cpn + '/prontus_art_copy.cgi';
                $.ajax({
                    type: "GET",
                    dataType: 'json',
                    url: actionURL,
                    data: {
                        _prontus_id: Admin.prontus_id,
                        _ts: ts
                    },
                    success: function (resp) {
                        if (resp.status == '1') {
                            window.location.href =  '/' + Admin.dir_cgi_cpn + '/prontus_art_ficha.cgi?_prontus_id='+Admin.prontus_id+'&_file='+resp.file+'&_fid='+resp.fid;
                        } else {
                            Fid.setGUIProcesando(false);
                            showModalAlert({
                                title: 'Error de servidor',
                                type: "red",
                                msg: resp.msg
                            });
                        }
                    },
                    error: function(XMLHttpRequest, textStatus, errorThrown) {
                        SubmitForm.handleError(actionURL, XMLHttpRequest, textStatus, errorThrown);
                        Fid.setGUIProcesando(false);
                    }
                });
            },
            cbBtnCancel: function () {
                return false;
            }
        });
    },

    // Compara la fecha y hora pasadas con la fecha y hora actual, devuelve True si la fecha y hora pasadas son futuras.
    // Espera fecha en formato aaaammdd y hora en formato hhmm.
    // Compara fechas y horas como strings (necesario porque una fecha que Prontus usa es '99999999')
    esFechaHoraFutura: function(fecha, hora) {
        // revisamos si la fecha/hora de expiración es anterior a la actual, en ese caso avisamos.

        if (fecha == '99999999' || !fecha) {
            return true;
        }

        var objFecha = new Date();

        var fechaActual = objFecha.getFullYear();

        var mes = objFecha.getMonth() + 1;
        if (mes < 10) { mes = '0' + mes; }
        fechaActual += mes;

        var dia = objFecha.getDate();
        if (dia < 10) { dia = '0' + dia; }
        fechaActual += dia;

        if (fecha > fechaActual) {
            return true;
        }

        hora = hora.replace(':', '');
        var horaActual = objFecha.getHours();
        if (horaActual < 10) { horaActual = '0' + horaActual; }
        var minutos = objFecha.getMinutes();
        if (minutos < 10) { minutos = '0' + minutos; }
        horaActual = horaActual + minutos;

        if (hora > horaActual) {
            return true;
        }

        return false;
    },

    // Validacion y submit del formulario.
    submitArt: function(bot_press, target, force) {
        if (FidConfig.cargando) {
            showModalAlert({
                title: 'Error de servidor',
                type: 'red',
                msg: FidConfig.msgCargando
            });
            return false;
        }

        Fid.setGUIProcesando(true);

        // Si se está usando el .prontusSubmit en vez de .submit se setea el callback.
        if (prontus.prontusSubmit && !force) {
            // Setea callback que se ejecuta despues de la funcion del submit.
            prontus.setCallback('attachEndCallbackSubmit', function (e, returned) {
                if (returned === false) {
                    Fid.setGUIProcesando(false);
                }
            });
        }

        $('#_accion').val(bot_press); // save | preview | save_new
        $(Fid.objFormFid).attr('action', '/' + Admin.dir_cgi_cpn + '/prontus_art_sbmit.cgi');
        $(Fid.objFormFid).attr('target', target);

        Fechas.fillfecha();
        CombosTax.fillSeccTemStem(); // Taxonomia
        Fid.procesarTags();

        // validamos prontus form si existe
        if (Fid.validatorProntusForm != null && !force) {
            if ($('#form_msg_auto_html').val() == '' && $('#form_msg_auto').val() == '') {
                Fid.setGUIProcesando(false);
                showModalAlert({
                    title: "Error al guardar",
                    type: 'orange',
                    msg: "Debe ingresar el campo [Mensaje de autorrespuesta (e-mail)] o el campo [Mensaje de autorrespuesta (html)]."
                });
                return false;
            } else if (!Fid.validatorProntusForm.validar()) {
                Fid.setGUIProcesando(false);
                return false;
            }
        }

        if (typeof PostingYoutube !== 'undefined' && !PostingYoutube.validaCampos()) {
            Fid.setGUIProcesando(false); // oculta reloj y habilita botonera
            $('#modal-loading').modal('hide');
            return false;                // aborta submit del formulario
        }

        // si friendly 4 esta activada
        // el guardado se hace acá y no se ejecuta el codigo siguiente (presente en la etapa de guardado);
        if (Fid.friendlyVer == 4 && (bot_press == 'save' || bot_press == 'save_new')) {
            Fid.validaTitularF4(bot_press);
            return false;
        }

        // si friendly 5 esta activada
        // el guardado se hace acá y no se ejecuta el codigo siguiente (presente en la etapa de guardado);
        if (Fid.friendlyVer == 5 && document.getElementById('_url') && (bot_press == 'save' || bot_press == 'save_new')) {
            Fid.urlf5.actions.checkFriendlyUrl(function (response) {
                if (response.res > 0) {
                    // url en conflicto
                    if (response.type == 'artic') {
                        $('#artic_conflict').show();
                        $('#port_conflict').hide();

                        $('#info_url_conflict_label').html('Se ha encontrado un artículo que tiene la misma url');
                        $('#url_art_ts').html(response.ts);
                        $('#url_art_id').html(response.id);
                        $('#url_art_titu').html(response.titular);
                        let ts = response.ts.toString();
                        var link = '/' + Admin.dir_cgi_cpn + '/prontus_art_ficha.cgi?_prontus_id='+ Admin.prontus_id+'&_file='+ts + '.' + response.ext+'&_fid='+response.fid;
                        $('#url_art_editar').attr("href", link);
                        var path = '/' + Admin.prontus_id + '/site/artic/' + ts.substr(0,8) + '/pags/' + ts + '.' + response.ext;
                        $('#url_art_path').html(path);
                        $('#url_art_slug').html(response.uri_titular);
                        $('#info_url_conflict').modal('show');
                        $("#info_url_conflict").on("hidden.bs.modal", function () {
                            $('#_url').focus();
                        });
                    } else {
                        //tax|tag|list|port
                        $('#artic_conflict').hide();
                        $('#port_conflict').show();

                        $('#info_url_conflict_label').html('Se ha encontrado un portada que tiene la misma url');
                        $('#url_type').html(Fid.types[response.type]);
                        $('#url_path').html(response.url);
                        $('#url_path').attr('href', response.url);
                        $('#url_file').html(response.file);
                        $('#url_file').attr('href', response.file);

                        $('#info_url_conflict').modal('show');
                        $("#info_url_conflict").on("hidden.bs.modal", function () {
                            $('#_url').focus();
                        });
                    }
                    Fid.setGUIProcesando(false);
                } else {
                    // url correcta se puede guardar
                    // chequeamos el tamaño total de los archivos a subir
                    let totalfsize1 = Fid.getTotalFileSize();
                    let nueva_alta = document.getElementById('_alta').checked | 0;
                    if (Admin.maxFileSizeB && totalfsize1 > Admin.maxFileSizeB) {
                        showModalAlert({
                            title: "Error al intentar guardar",
                            type: "orange",
                            msg: "Los archivos que intentas subir pesan en total " + Math.round(totalfsize1 / (1024 * 1024)) + "MB. El tamaño máximo es " + Admin.maxFileSizeM + "MB. Por favor descarta algunos archivos y reintenta, o contacta al administrador del sistema."
                        });
                        Fid.setGUIProcesando(false);
                    }
                    // el articulo no es nuevo, se va a guardar con alta publicada
                    // el articulo tenia alta antes y se va a guardar con alta
                    // la url nueva es distinta de la antigua
                    else if (nueva_alta != 0 && mainFidJs.TS && mainFidJs.ALTA == nueva_alta &&
                        document.getElementById('_last_url').value != document.getElementById('_url').value) {
                        // si la url anterior es distinta se avisa para dar la opcion de crear un redirect
                        showModalConfirm({
                            title:'La url del artículo ha cambiado',
                            msg: '¿Estás seguro de continuar?, La antigua url responderá con un error 404. Esto se puede resolver creando una redirección para la url antigua.',
                            type: "orange",
                            okTitle: 'Crear redirección para la url antigua',
                            cancelTitle: 'Continuar guardado sin hacer nada',
                            btnClassOk: 'hovwhite radius15 noborder txtnextwhite pad-top-bot7 pad-lef-rig20 int-nextgreen nextgreen',
                            cbBtnOK: function () {
                                document.getElementById('_redirect_url').value = 'true';
                                $('#_mainFidForm').trigger('submit');
                            },
                            cbBtnCancel: function () {
                                $('#_mainFidForm').trigger('submit');
                            }
                        });
                    } else {
                        $('#_mainFidForm').trigger('submit');
                    }
                }
            });
            return false;
        }

        // guardado sin friendly en el artículo
        // chequeamos el tamaño total de los archivos a subir
        let totalfsize = Fid.getTotalFileSize();
        if (Admin.maxFileSizeB && totalfsize > Admin.maxFileSizeB) {
            showModalAlert({
                title: "Error al intentar guardar",
                type: "orange",
                msg: "Los archivos que intentas subir pesan en total " + Math.round(totalfsize / (1024 * 1024)) + "MB. El tamaño máximo es " + Admin.maxFileSizeM + "MB. Por favor descarta algunos archivos y reintenta, o contacta al administrador del sistema."
            });
            Fid.setGUIProcesando(false);
        } else {
            $('#_mainFidForm').trigger('submit');
            if (bot_press == 'preview') {
                Fid.setGUIProcesando(false);
            }
        }
    },

    // habilita la edicion manual del campo de url
    f5Editable: function(editar) {
        FidConfig.f5_edit = editar;
        if (editar) {
            $("#_url").attr("readonly", false);
            $("#_url").removeClass('inactive');
        } else {
            $("#_url").attr("readonly", true);
            $("#_url").addClass('inactive');
        }
    },

    // habilita la edicion manual del campo de url
    slugEditableF4: function(editar) {
        if (editar == true) {
            $('#_custom_slug').val('SI');
            $("#_slug").attr("readonly", false);
            $("#_slug").removeClass('inactive');
        } else {
            $('#_custom_slug').val('NO');
            $("#_slug").attr("readonly", true);
            $("#_slug").addClass('inactive');
            Fid.validaTitularF4('check');
        }
    },

    // Inicia el valor del slug y comportamiento del fid al cargar el articulo
    iniciaSlugF4: function() {
        // en articulos nuevos el slug se genera en base al titular hasta que el usuario lo cambia
        if (mainFidJs.TS == '') {
            $('#_custom_slug').val('NO');
            Fid.slugEditableF4(false);
        } else if ($('#_custom_slug').val() == 'SI') {
            Fid.slugEditableF4(true);
            // setea slug custom para articulos que no lo tenian asignado
            if ($("#_slug").val() == ''){
                Fid.validaTitularF4('check');
            }
        }
    },

    // Para SEO, notifica si el titular ingresado supera los 60 caracteres, ya que Google cortará el texto posterior
    // dejando una elipsis.
    validaLargoTitular: function() {
        var largo = $('#_txt_titular').val().length;
        document.getElementById('char-count').innerHTML = largo;
        if (largo > 60) {
            Fid.alertaTitular('El titular contiene más de 60 caracteres ('+largo+'), es probable que aparezca abreviado en los resultados de búsqueda en Google.');
            return false;
        }
        Fid.alertaTitular();
        return true;
    },

    // Valida si la url friendly correspondiente a este articulo ya existe
    // ejecuta guardado del articulo si corresponde
    // save y save_new, ejecutan guardado, check solo verifica y genera alerta
    validaTitularF4: function(bot_press) {
        if (Fid.friendlyVer == 4) {
            if (bot_press == 'check-slug' && $('#_custom_slug').val() == 'NO') {
                return;
            }
            if (bot_press == 'check-titular' && $('#_custom_slug').val() == 'SI') {
                return;
            }
            $('#url_art_ts').html('');
            $('#url_art_id').html('');
            $('#url_art_titu').html('');
            $('#url_art_editar').attr("href", '#');
            $('#url_art_path').html('');
            $('#url_art_slug').html('');

            var element_id = '#_txt_titular';
            // si el campo slug esta vacio usamos el titular como base
            if ($('#_custom_slug').val() == 'SI' && $("#_slug").val() != '') {
                element_id = '#_slug';
            }

            $.ajax({
                type: 'POST',
                url: '/' + Admin.dir_cgi_cpn + '/prontus_art_check_url.cgi',
                data: { _txt_titular: $(element_id).val(),
                        _ts: mainFidJs.TS,
                        _prontus_id: Admin.prontus_id
                    },
                dataType: 'json',
                success: function (data) {
                    if (data.status) {
                        $('#_slug').val(data.uri_titular);
                        Fid.alertaTitular();
                        if (bot_press == 'save' || bot_press == 'save_new') {
                            // chequeamos el tamaño total de los archivos a subir
                            var totalfsize = Fid.getTotalFileSize();
                            if (Admin.maxFileSizeB && totalfsize > Admin.maxFileSizeB) {
                                showModalAlert({
                                    title: "Error al intentar guardar",
                                    type: "orange",
                                    msg: "Los archivos que intentas subir pesan en total " + Math.round(totalfsize / (1024 * 1024)) + "MB. El tamaño máximo es " + Admin.maxFileSizeM + "MB. Por favor descarta algunos archivos y reintenta, o contacta al administrador del sistema."
                                });
                                Fid.setGUIProcesando(false);
                            } else {
                                // setea slug como custom para que no dependa de los cambios del titular en siguientes ediciones del articulo
                                Fid.slugEditableF4(true);
                                $('#_mainFidForm').trigger('submit');
                            }
                        }
                    } else {
                        // si hay conflicto con la url, seteamos el slug como editable y el usuario lo debe cambiar
                        Fid.slugEditableF4(true);
                        if (typeof data.ts === 'undefined' || data.ts == '') {
                            Fid.alertaTitular(data.msg);
                            $('#_slug').focus();
                        } else {
                            $('#info_url_conflict_label').html('Se ha encontrado un artículo que tiene la misma url');
                            $('#url_art_ts').html(data.ts);
                            $('#url_art_id').html(data.id);
                            $('#url_art_titu').html(data.titular);
                            var link = '/' + Admin.dir_cgi_cpn + '/prontus_art_ficha.cgi?_prontus_id='+ Admin.prontus_id+'&_file='+data.ts + '.' + data.ext+'&_fid='+data.fid;
                            $('#url_art_editar').attr("href", link);
                            var path = '/' + Admin.prontus_id + '/site/artic/' + data.ts.substr(0,8) + '/pags/' + data.ts + '.' + data.ext;
                            $('#url_art_path').html(path);
                            $('#url_art_slug').html(data.uri_titular);

                            $('#info_url_conflict').modal('show');
                            $("#info_url_conflict").on("hidden.bs.modal", function () {
                                $('#_slug').focus();
                            });
                        }
                        Fid.setGUIProcesando(false);
                    }
                }
            });
        }
    },

    // Funcion usada para vaciar el titular en caso que sea "sin titulo \d+"
    limpiaTitular: function(event) {
        if (/^Sin título \d+$/i.test($(event.currentTarget).val())) {
            $(event.currentTarget).val('');
        }
    },

    // alerta para indicar que el titular o slug estan incorrectos
    alertaTitular: function(msg) {
        if(typeof msg !== 'undefined' && msg !== '') {
            var str = '<span class="glyphicon glyphicon-alert btn_ticket_red" aria-hidden="true"></span><span> ' + msg + '</span>';
            $('#slug-alert .message').html(str);
            $('#slug-alert').fadeIn();
        } else {
            $('#slug-alert').hide();
        }
    },

    //Funcion usada en los formularios p ara eliminar archivos de respaldos
    eliminarArchivo: function() {
        showModalConfirm({
            title:'Confirmar Borrado',
            msg: FidConfig.msgConfirmRemoveBackup,
            type: "red",
            okTitle: 'Borrar Todos los Datos',
            cancelTitle: 'Cancelar',
            btnClassOk: 'hovwhite radius15 noborder txtnextwhite pad-top-bot7 pad-lef-rig20 int-nextred nextred',
            cbBtnOK: function () {
                showModalConfirm({
                    title:'Confirmar Operación Irreversible',
                    msg: '¿Estás seguro de continuar con el borrado?, los datos borrados no se podrán recuperar. Esta acción es irreversible.',
                    type: "red",
                    okTitle: 'Borrar Todos los Datos',
                    cancelTitle: 'Cancelar',
                    btnClassOk: 'hovwhite radius15 noborder txtnextwhite pad-top-bot7 pad-lef-rig20 int-nextred nextred',
                    cbBtnOK: function () {
                        var config = {
                            formSelector: '#backupDatos'
                        };
                        var opts = {
                            success:   function(json) {   // post-submit callback
                                if (json.status == 0) {
                                    showModalAlert({
                                        title: 'Error de servidor',
                                        type: "red",
                                        msg: json.msg
                                    });
                                } else {
                                    if (json.msg !== '') {
                                        showModalAlert({
                                            title: 'Borrado de datos',
                                            type: 'blue',
                                            msg: json.msg
                                        });
                                        parent.$('#cboxClose').trigger('click');
                                    }
                                }
                                parent.Fid.listadoDatos();
                                return false;
                            }
                        };

                        SubmitForm.submitGenericAjax(config, opts);
                    },
                    cbBtnCancel: function () {
                        return false;
                    }
                });
            },
            cbBtnCancel: function () {
                return false;
            }
        });
    },

    //Funcion usada en los formularios para descargar el archivo de respaldo
    generarArchivoForm: function() {
        $('#msg-link').hide();
        $('#msg-error').hide();

        showModalConfirm({
            title: "Tipo de codificación",
            type: "green",
            msg: "Elige qué tipo de codificación de caracteres tendrá el archivo CSV a generar.",
            buttons: {
                utf8: {
                    btnClass: 'hovwhite radius15 noborder txtnextwhite pad-top-bot7 pad-lef-rig20 int-nextgray4 nextgray4',
                    text: "UTF-8",
                    action: function () {
                        $('#_encoding').val('utf-8');
                        Fid.generarArchivoFormReal();
                    }
                },
                iso: {
                    btnClass: 'hovwhite radius15 noborder txtnextwhite pad-top-bot7 pad-lef-rig20 int-nextgray4 nextgray4',
                    text: "ISO-8859-1",
                    action: function () {
                        $('#_encoding').val('iso-8859-1');
                        Fid.generarArchivoFormReal();
                    }
                },
                byDefault: {
                    btnClass: 'hovwhite radius15 noborder txtnextwhite pad-top-bot7 pad-lef-rig20 int-nextgray4 nextgray4',
                    text: "POR DEFECTO",
                    action: function () {
                        $('#_encoding').val('utf-8');
                        Fid.generarArchivoFormReal();
                    }
                },
                cancel: {
                    text: "Cancelar"
                }
            }
        });
    },

    generarArchivoFormReal: function () {
        if (Fid.waitingProntusForm == 0) {
            if (document.getElementById('_usar_rangos').checked) {
                document.getElementById('_date_filter').value = 1;
                document.getElementById('_date_start').value = document.getElementById('_form_fecha_ini').value;
                document.getElementById('_date_end').value = document.getElementById('_form_fecha_fin').value;
            } else {
                document.getElementById('_date_filter').value = 0;
            }
            var data = {
                _prontus_id : $('#prontus').val(),
                _ts : $('#ts').val(),
                _format : $('#_format').val(),
                _encoding : $('#_encoding').val(),
                _date_filter : $('#_date_filter').val(),
                _date_start : $('#_date_start').val(),
                _date_end : $('#_date_end').val()
            }
            var actionURL = '/' + Admin.dir_cgi_cpn + '/prontus_form_download.cgi';
            $.ajax({
                type: "POST",
                dataType: 'json',
                data: data,
                url: actionURL,
                success: function (resp) {
                    if (resp.status == '1') {
                        $('#msg-loading').show();
                        Fid.waitingProntusForm = setTimeout(function(){ Fid.chequeaDescargaForm(); }, 5000);
                    } else {
                        $('#msg-error').show();
                        $('#error-data').html("Ha ocurrido un error al procesar la solicitud: " + resp.msg);
                    }
                },
                error: function() {
                    $('#msg-error').show();
                    $('#error-data').html("Ha ocurrido un error al procesar la solicitud");
                }
            });
        }
    },

    chequeaDescargaForm: function() {
        Fid.waitingProntusForm = 0;
        var actionURL = '/' + Admin.prontus_id + '/cpan/procs/form/' + mainFidJs.TS + '/status.json';
        $.ajax({
            type: "GET",
            dataType: 'json',
            url: actionURL,
            cache: false,
            success: function (resp) {
                if (resp.status == '1') {
                    Fid.waitingProntusForm = setTimeout(function(){ Fid.chequeaDescargaForm(); }, 5000);
                } else if (resp.status == '0') {
                    $('#msg-link').show();
                    $('#msg-loading').hide();
                    $('#link-csv')[0].href = resp.path;
                } else {
                    $('#msg-error').show();
                    $('#error-data').html("Ha ocurrido un error al procesar la solicitud: "  + resp.msg);
                    $('#msg-link').show();
                    $('#msg-loading').hide();
                }
            },
            error: function() {
                $('#msg-error').show();
                $('#error-data').html("Ha ocurrido un error al procesar la solicitud.");
                $('#msg-link').hide();
                $('#msg-loading').hide();
            }
        });
    },

    //Funcion usada en los formularios para abrir el administrador de archivos adjuntos
    listadoDatos: function() {
        var url = '/' + Admin.dir_cgi_cpn + '/prontus_form_list.cgi?_prontus_id=' + Admin.prontus_id +  '&_ts=' + mainFidJs.TS;
        $("#modalDatosBackup").on("show.bs.modal", function () {
            // para cualquier campo fecha del fid
            $('.campo_fecha_form').datetimepicker({
                format: 'L', //dd/mm/yyyy
                locale: 'es',
                useCurrent: false
            }).on('dp.show', Fid.datetimefixer);
        });
        $('#modalDatosBackupContenido').load(
            url,
            function() {
                $('#modalDatosBackup').modal();
            }
        );
    },

    // Bloquea controles mientras se procesa
    setGUIProcesando: function(signal) {
        if (signal) {
            $('.botones .actions').hide();
            $('.botones .loading-action').fadeIn();
        } else {
            $('.botones .loading-action').hide();
            $('.botones .actions').fadeIn();
        }
        return false;
    },

    mostrarInfoMedia: function (obj, mediaId) {
        if (!$('#moreinfo-' + mediaId).is(':visible')) {
            $(obj).text('Ver menos [-]');
            $('#moreinfo-' + mediaId).slideDown();
        } else {
            $('#moreinfo-' + mediaId).slideUp();
            $(obj).text('Ver más [+]');
        }
    },

    actualizaFechaHora: function(tipo) {
        var fecha;
        var hora;

        if(tipo === 'pub') {
            fecha = $('input[name="_FECHAPSHRT"]');
            hora  = $('input[name="_HORAP"]');
        } else if(tipo === 'exp') {
            fecha = $('input[name="_FECHAESHRT"]');
            hora  = $('input[name="_HORAE"]');
        } else {
            showModalAlert({
                title: 'Error de servidor',
                type: 'red',
                msg: 'tipo desconocido: ' + tipo
            });
            return;
        }

        var now = new Date();
        var normaliza2Digitos = function(val) {
            if(val < 10 && val >= 0) {
                val = '0'+val;
            }
            return val;
        };
        if(hora) {
            var minu = now.getMinutes();
            var hors = now.getHours();
            hora.val(normaliza2Digitos(hors)+':'+normaliza2Digitos(minu));
        }
        if(fecha) {
            var dia = now.getDate();
            var mes = now.getMonth() + 1;
            var anio = now.getYear();
            if (anio < 1000) {
                anio = anio + 1900;
            }
            fecha.val(normaliza2Digitos(dia)+'/'+normaliza2Digitos(mes)+'/'+normaliza2Digitos(anio));
        }
    },

    // Autochequea los campos indicados por params, separados por coma
    // acepta una string con una lista separada por comas de atributos name de elementos input tipo checkbox.
    autocheckNewArtic: function(params) {
        if(mainFidJs.TS !== '') {
            return;
        }
        if(typeof params !== 'undefined' && params !== null && params !== '') {
            params = params.replace(/"/g, '');
            params = params.replace(/\'/g, '');
            var arr = params.split(',');
            if(arr !== null) {
                var len = arr.length;
                for(var i = 0; i < len; i++) {
                    $('input[name^="'+ arr[i] +'"]:checkbox').prop('checked', true);
                    $('input[name^="'+ arr[i].toLowerCase() +'"]:checkbox').prop('checked', true);
                }
            }
        }
    },

    // Busca en la página los inputs de tipo checkbox o radio indicados en el objeto params_obj, y marca como checked los valores indicados.
    // ejemplo: params_obj = {'CHK_prueba':['valor 1', 'valor 2'], 'CHK_prueba_2': 'valor 1', 'RDO_prueba_1': 'valor 1'}
    // solo opera en artículos nuevos.
    autocheckNewArticValues: function(params_obj) {
        if(mainFidJs.TS !== '') {
            return;
        }
        for (const elem of Object.keys(params_obj)) {
            if (params_obj[elem].constructor === Array ) {
                for (const sub_elem of params_obj[elem]) {
                    $('input[name^="'+elem+'"][value^="'+sub_elem+'"]:checkbox').prop('checked', true);
                }
            } else {
                if ($('input[name^="'+elem+'"]:checkbox').val() == params_obj[elem]) {
                    $('input[name^="'+elem+'"]:checkbox').prop('checked', true);
                }
                if ($('input[name^="'+elem+'"]:radio').val() == params_obj[elem]) {
                    $('input[name^="'+elem+'"]:radio').prop('checked', true);
                }
            }
        }
    },

    // Busca en la página los tags select indicados en el objeto params_obj, y marca como selected el valor indicado.
    // ejemplo: params_obj = {'CMB_prueba':'opcion 1', 'CMB_prueba_2':['opcion 1', 'opcion 2']}
    // Permite pasar múltiples values a un select si este tiene el attr "multiple"
    // solo opera en artículos nuevos.
    autoselectNewArticValues: function(params_obj) {
        if(mainFidJs.TS !== '') {
            return;
        }
        for (const elem of Object.keys(params_obj)) {
            $('select[name^="'+elem+'"]').val(params_obj[elem]).change();
        }
    },

    // Hace un ping al servidor para indicar
    pingRecurso: function() {
        if(mainFidJs.TS === '') {
            return;
        }

        if (Fid.disablePing == true) {
            return;
        }

        Admin.pingRecurso('art', mainFidJs.TS, Fid.pingRecurso);
    },

    // Abre el XML desde el CPAN
    verXML: function() {
        var url = '/' + Admin.dir_cgi_cpn + '/prontus_art_view_xml.cgi?_prontus_id='+Admin.prontus_id+'&_ts='+mainFidJs.TS;
        var nom = "verXML"+Admin.prontus_id+mainFidJs.TS;
        Utiles.subWin(url, nom, 800, 500, 50, 50);
    },

    cambiarTipoFid: function () {
        $('#modal-loading-mensaje').html('Por favor espera mientras Prontus carga el nuevo tipo de artículo.');
        $('#modal-loading').modal({backdrop: 'static', keyboard: false});
        // guardamos a localstorage el fid elegido para poder recuperarlo de otro modo que no sea mediante la URL.
        Fid.helper.setValueLS('_last_fid_selected', $('#_fid-selector').val());

        Fid.objFormFid.action = '/' + Admin.dir_cgi_cpn + '/prontus_art_ficha.cgi?_prontus_id=' + Admin.prontus_id;
        Fid.objFormFid.target = '_self';

        Fid.objFormFid.submit();
    },

    setPublicacionDirecta: function() {
        var _edic = $('#_edic').val();
        var _port = $('#_port').val();
        var _area = $('#_area').val();
        if (_edic != '' && _port != '' && _area != '') {
            var msg = 'Publicación directa en ';
            if (_edic != 'base') {
                var date_parts = _edic.split('_');
                msg += "Edición '" + date_parts[2] + '/' + date_parts[1] + '/' + date_parts[0] + "' - ";
            }
            var temp = _port.split('.');
            msg += "Portada '" + temp[0] + "' - Área " + _area;
            $('#pub-direct .message').html(msg);
            $('#pub-direct').fadeIn();
        }
    },

    validacionesProntusForm: function() {
        // si hay prontus form se validan campos necesarios
        if ($('.prontus-form').length > 0) {
            // Validacion  para campos criticos del formulario.
            Fid.validatorProntusForm = new Validador('_mainFidForm', 'one', 'FDF8C1');
            Fid.validatorProntusForm.addconstraint('form_subject', 'obligatorio', '', 'Campo [Asunto] no puede ser vacío.');

            if (document.getElementById('form_subject_auto').type != 'hidden') {
                Fid.validatorProntusForm.addconstraint('form_subject_auto', 'obligatorio', '', 'Campo [Asunto para el remitente] no puede ser vacío.');
            }

            $('#form_admin').on('keyup', function () {
                this.value = this.value.replace(/[ ]+/g, '');
            });
            $('#form_from').on('keyup', function () {
                this.value = this.value.replace(/[ ]+/g, '');
            });
            $('#form_ext').on('keyup', function () {
                this.value = this.value.replace(/[^a-z,]+/g, '');
            });

            Fid.validatorProntusForm.addconstraint('form_admin', 'obligatorio', '', 'El campo [E-mail de destino] no puede ser vacío.');
            Fid.validatorProntusForm.addconstraint('form_admin', 'regex', new RegExp(
                /^(?:(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,}),?)+$/i
            ), 'El campo [E-mail de destino] debe contener uno o más email válidos, separados por comas.');

            Fid.validatorProntusForm.addconstraint('form_from', 'obligatorio', '', 'El campo [E-mail para la respuesta] no puede ser vacío.');
            Fid.validatorProntusForm.addconstraint('form_from', 'regex', new RegExp(
                /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i
            ), 'El campo [E-mail para la respuesta] debe ser un email válido.');

            Fid.validatorProntusForm.addconstraint('form_msg_exito', 'obligatorio', '', 'El campo [Mensaje de éxito] no puede ser vacío.');
            Fid.validatorProntusForm.addconstraint('form_msg_error', 'obligatorio', '', 'El campo [Mensaje de error] no puede ser vacío.');
        }
    },

    getTotalFileSize: function() {
        var totalfsize = 0;
        $("#_mainFidForm").find("input[type='file']").each(function (index, field) {
            for (var fileinmultiple = 0; fileinmultiple < field.files.length; fileinmultiple++) {
                var file = field.files[fileinmultiple];
                totalfsize += file.size;
            }
        });
        return totalfsize;
    },

    clearS3Status: function () {
        document.getElementById('_s3').value = 0;
    },

    showVersions: function(editor) {
        Fid.versions = null;
        $.ajax({
            type: "GET",
            dataType: 'json',
            url: '/' + Admin.dir_cgi_cpn + '/prontus_art_get_versions.cgi',
            data: {
                _prontus_id: Admin.prontus_id,
                _ts: mainFidJs.TS,
                _tag: editor.id
            },
            success: function (response) {
                if (response.status == '1') {
                    Fid.initCompareDiffs(editor, response.data);
                } else {
                    showModalAlert({
                        title: 'Error de servidor',
                        type: "red",
                        msg: response.msg
                    });
                }
            },
            error: function(XMLHttpRequest, textStatus, errorThrown) {
                SubmitForm.handleError(actionURL, XMLHttpRequest, textStatus, errorThrown);
                Fid.setGUIProcesando(false);
            }
        });
    },

    initCompareDiffs: function(editor, data) {
        let currentVtxt = editor.getContent();
        // cambia retornos de carro CRLF a LF
        currentVtxt = currentVtxt.replaceAll(/\r\n/g, "\n");
        var combo_lista = document.getElementById('old-versions-list');
        combo_lista.options.length = 0;

        data = data.sort(function(a,b){
            return (b.modtime - a.modtime);
        })

        Fid.versions = new Object();
        let first = '';
        let counter = 0;
        for (let i = 0; i < data.length; i++) {
            // cambia retornos de carro CRLF a LF
            data[i].tag = data[i].tag.replaceAll(/\r\n/g, "\n");
            Fid.versions[data[i].modtime] = data[i].tag;
            if (first == '') {
                first = data[i].tag;
            }
            combo_lista.options[counter] = new Option(Fid.helper.getFecha(data[i].modtime*1000, 1)+ ', ' + Fid.helper.getHora(data[i].modtime*1000), data[i].modtime);
            counter++;
        }
        if (counter == 0) {
            showModalAlert({
                title: 'No se encontró información ',
                type: "orange",
                msg: 'No hay versiones anteriores para este campo y artículo'
            });
            return;
        }

        $('#old-version-tag').modal('show');
        $('#old-version-tag').on('shown.bs.modal', function () {
            var target2 = document.getElementById("old-version-tag-compare");
            target2.innerHTML = "";
            Fid.mergeview = CodeMirror.MergeView(target2, {
                value: currentVtxt,
                origRight: first,
                lineNumbers: true,
                lineWrapping: true,
                mode: "htmlmixed",
                readOnly: true,
                highlightDifferences: true,
                revertButtons: false,
                connect: "align",
                foldGutter: true,
                gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"],
                collapseIdentical: false
            });
        });

        $('#old-versions-list').off('change').on('change', Fid.changeDiff);

        $('#prev-diff').off('click').on('click', function(evt) {
            evt.stopPropagation();
            evt.preventDefault();
            Fid.mergeview.edit.execCommand('goPrevDiff');
        });
        $('#next-diff').off('click').on('click', function(evt) {
            evt.stopPropagation();
            evt.preventDefault();
            Fid.mergeview.edit.execCommand('goNextDiff');
        });

        $('#apply-prev-version').off('click').on('click', function(evt) {
            evt.stopPropagation();
            evt.preventDefault();
            let modtime = document.getElementById('old-versions-list').value;
            $('#old-version-tag').modal('hide');
            editor.setContent(Fid.versions[modtime]);
        });
    },
    changeDiff: function(e){
        Fid.mergeview.right.orig.setValue(Fid.versions[e.target.value]);
    },
    urlf5: {
        ajax_request: null,
        timeout: 0,
        init: function () {
            Fid.urlf5.methods.bindEvents();

            // Al iniciar se sugiere una url siempre si es que no existe nada en el input.
            if ($('#_url').val() == '') {
                Fid.urlf5.actions.makeUrl();
            } else {
                $('#_url').removeAttr("readonly");
            }
        },
        methods:  {
            bindEvents: function () {
                $('#_reseturlf5').on('click', function (e) {
                    e.preventDefault();
                    e.stopPropagation();
                    Fid.urlf5.actions.makeUrl();
                });
                $('.urlf5-input').off('keyup').on('keyup', function () {
                    // quitar caracteres no validos
                    document.getElementById('_url').value = document.getElementById('_url').value.replace(/[^a-zA-Z0-9\-\/_.]+/g, '');
                    // chequear url despues de que se termino de escribir
                    clearTimeout(Fid.urlf5.timeout);
                    if (Fid.urlf5.ajax_request != null) {
                        Fid.urlf5.ajax_request.abort();
                    }
                    Fid.urlf5.timeout = setTimeout(Fid.urlf5.actions.checkFriendlyUrl, 1000, Fid.urlf5.actions.showUrlStatus);
                });
            }
        },
        actions: {
            showUrlStatus: function(response) {
                if (response.res > 0) {
                    $('#f5-alert .message').html('<span class="glyphicon glyphicon-alert btn_ticket_red"></span> La URL ya esta en uso.');
                    $('#f5-alert').fadeIn();
                } else {
                    document.getElementById('_url').value = response.url;
                    if (response.type == 'artic' && response.ts == mainFidJs.TS) {
                        // articulo y mismo ts, oculta mensaje
                        $('#f5-alert').fadeOut();
                        return;
                    }
                    if (response.prefix != '') {
                        $('#f5-alert .message').html('La URL es correcta y se puede usar. (<span class="glyphicon glyphicon-exclamation-sign"></span> Prefijo de url activado. Todas las url comenzarán con "' + response.prefix + '" ).');
                    } else {
                        $('#f5-alert .message').html('La URL es correcta y se puede usar.');
                    }
                    $('#f5-alert').fadeIn();
                }
            },
            makeUrl: function () {
                $('#_url').attr("readonly", "readonly");
                var titular = $('#_txt_titular').val();
                var seccion1_id = $('select[name="_SECCION1"] option:selected').val();
                var seccion1 = $('select[name="_SECCION1"] option:selected').text();
                var tema1 = $('select[name="_TEMA1"] option:selected').text();
                var tema1_id = $('select[name="_TEMA1"] option:selected').val();
                var subtema1 = $('select[name="_SUBTEMA1"] option:selected').text();
                var subtema1_id = $('select[name="_SUBTEMA1"] option:selected').val();

                if (seccion1_id == '0') seccion1 = '';
                if (tema1_id == '0') tema1 = '';
                if (subtema1_id == '0') subtema1 = '';

                var data = {
                    _prontus_id: Admin.prontus_id,
                    _titular: titular,
                    _seccion: seccion1,
                    _tema: tema1,
                    _subtema: subtema1,
                    _ts: mainFidJs.TS
                };

                $.ajax({
                    url: '/' + Admin.dir_cgi_cpn + '/urlf5/prontus_urlf5_make_art_url.cgi',
                    type: 'POST',
                    dataType: 'json',
                    data: data,
                    success: function (response) {
                        if (response.status == 1) {
                            var old_url = $('#_url').val();
                            $('#_url').val(response.msg);

                            if (response.msg != old_url) {
                                $('#_url').trigger('keyup');
                            }
                        }

                        $('#_url').removeAttr("readonly");
                    },
                    error: function(xhr, ajaxOptions, thrownError) {
                        console.log(xhr, ajaxOptions, thrownError);
                    }
                });

            },
            checkFriendlyUrl: function (callback) {
                var url = document.getElementById('_url').value;
                var data = {
                    url: url,
                    _ts: mainFidJs.TS,
                    _prontus_id: Admin.prontus_id
                };

                Fid.urlf5.ajax_request = $.ajax({
                    url: '/' + Admin.dir_cgi_cpn + '/prontus_check_friendly.cgi',
                    type: 'POST',
                    dataType: 'json',
                    data: data,
                    beforeSend: function () {
                        if (Fid.urlf5.ajax_request != null) {
                            Fid.urlf5.ajax_request.abort();
                        }
                    },
                    success: function (response) {
                        if (response.status == 0) {
                            showModalAlert({
                                title: 'Error',
                                type: 'red',
                                msg: response.msg
                            });
                        } else {
                            callback(response);
                        }
                    },
                    error: function(xhr, ajaxOptions, thrownError) {
                        console.log(xhr, ajaxOptions, thrownError);
                        if (thrownError != 'abort') {
                            showModalAlert({
                                title: 'Error',
                                type: 'red',
                                msg: thrownError
                            });
                        }
                    }
                });
            }
        }
    },
    helper: {
        // thetime en milisegundos
        getFecha: function(thetime, human) {
            var date = new Date(thetime*1);
            var d = date.getDate();
            var m = date.getMonth();
            var y = date.getFullYear();
            var fecha;

            if (human) {
                var arr = ['enero', 'febrero', 'marzo', 'abril','mayo','junio','julio','agosto','septiembre','octubre','noviembre','diciembre'];
                fecha = d + " de " + arr[m] + ' de ' + y;

            } else {
                d = (d <= 9 ? '0' + d : d);
                m = m + 1;
                m = (m <= 9 ? '0' + m : m);
                fecha = d + '/' + m + '/' + y;
            }
            return fecha;
        },
        // thetime en milisegundos
        getHora: function(thetime, sinsegundos) {
            var date = new Date(thetime*1);
            var h = date.getHours();

            h = (h <= 9 ? '0' + h : h);

            var m = date.getMinutes() + 1;
            m = (m <= 9 ? '0' + m : m);

            var s = date.getSeconds();
            s = (s <= 9 ? '0' + s : s);

            if (sinsegundos) {
                return h + ':' + m;
            } else {
                return h + ':' + m + ':' + s;
            }
        },
        setValueLS: function (name, value) {
            localStorage.setItem(name, value);
        },

        getValueLS: function (name) {
            return localStorage.getItem(name);
        }
    }
};
