/**
CfgXcoding.class.js

Descripcion:
    Maneja la creacion de configuraciones de transcodificacion

Dependencias:
    Ninguna

Versión:
    1.0.0 - 27/04/2015 - EAG - Primera versión.
**/

var CfgXcoding = {
    formatos: {},
    marca_defecto: 'multimedia_video1',
    prefijo_marca: 'multimedia_video',

    dirCgi: '/' + Admin.dir_cgi_cpn + '/xcoding/',
    cgiCargaformatos: 'prontus_xcoding_getformatos.cgi',
    cgiGuardaformatos: 'prontus_xcoding_guardarformatos.cgi',
    cgiVerificaFFmpeg: 'prontus_check_ffmpeg.cgi',


    init: function () {
        CfgXcoding.dirCgi = '/' + Admin.dir_cgi_cpn + '/xcoding/';
        CfgXcoding.cargaCfg();
        $('.xcoding_param').keyup(CfgXcoding.actualizaformatos);
        $('.xcoding_param').on("click", function () {
            CfgXcoding.actualizaformatos();
        });
        CfgXcoding.soloNumeros('.xc_numero');
        CfgXcoding.soloLetras('.xc_letra');

        $('#marca_prontus').on('click blur change', CfgXcoding.cargaformatos);
        $('#borrarMarca').on('click', CfgXcoding.borrarMarca);
        $('#format').on('click blur change', CfgXcoding.cargaParametros);
        $('#borrarformato').on('click', CfgXcoding.borrarformato);
        $('#agregarMarca').on('click', CfgXcoding.agregarMarca);
        $('#agregarformato').on('click', CfgXcoding.agregarformato);
        $('.descartar_xcoding').on('click', CfgXcoding.cargaCfg);
        $('.guardar_xcoding').on('click', CfgXcoding.guardar);

        Utiles.showAlert($('input[name=GEN_HLS]:checked')[0]);
        Utiles.showAlert($('input[name=MODO_PARALELO]:checked')[0]);

        $('.test_ffmpeg').on('click', function () {
            CfgXcoding.testFFmpeg();
            return false;
        });
        $('input[name=GEN_HLS],input[name=MODO_PARALELO]').on('change', function() {
            Utiles.showAlert(this);
        });
    },

    /**
     * Carga las configuraciones de transcodificaciones
     * @param
     */
    cargaCfg: function () {
        $('#modal-loading').modal();
        $.ajax({
            url: CfgXcoding.dirCgi + CfgXcoding.cgiCargaformatos,
            data: {
                _prontus_id: Admin.prontus_id
            },
            type: 'POST',
            dataType: 'json',
            success: function (json) {
                $("#modal-loading").one("hidden.bs.modal", function () {
                    if (typeof json.status !== 'undefined') {
                        if (json.status === 1) {
                            CfgXcoding.formatos = json.data;
                            var marcas = [];
                            marcas[0] = CfgXcoding.marca_defecto;
                            var nombre;
                            for (let marca in CfgXcoding.formatos) {
                                nombre = marca.split('.');
                                if (marcas.indexOf(nombre[0]) < 0) {
                                    marcas.push(nombre[0]);
                                }
                            }
                            marcas.sort();
                            var largo = marcas.length;
                            var combo_marca = document.getElementById('marca_prontus');
                            combo_marca.options.length = 0;
                            for (var j = 0; j < largo; j++) {
                                combo_marca.options[j] = new Option(marcas[j], marcas[j]);
                            }
                            CfgXcoding.cargaformatos();
                            $('#msg-xcoding').hide();

                        } else if (json.status === 2) {
                            $('#msg-xcoding').html(json.msg);
                            $('#msg-xcoding').show();
                        } else {
                            showModalAlert({
                                title: 'Información',
                                type: 'blue',
                                msg: json.msg
                            });
                        }
                    }
                })
                $('#modal-loading').modal('hide');

            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                $('#modal-loading').modal('hide');
                showModalAlert({
                    title: 'Error',
                    type: 'red',
                    msg: 'Ha ocurrido un error al cargar los formatos: ' + errorThrown
                });
            }
        });
    },

    /**
     * Carga la combo de formatos con los valores de formatos adicionales
     */

    cargaformatos: function () {
        var marca_seleccionada = document.getElementById('marca_prontus').value;
        var marca = '';
        var marcas = [];
        var nombre;
        var combo_formatos = document.getElementById('format');
        var i = 0;
        for (marca in CfgXcoding.formatos) {
            nombre = marca.split('.');
            if (marca_seleccionada == nombre[0] && nombre.length > 1) {
                marcas[i] = marca;
                i++;
            }
        }
        marcas.sort();

        combo_formatos.options.length = 0;
        combo_formatos.options[0] = new Option('Por defecto', '');
        combo_formatos.options[0].selected = true;
        for (var j = 0; j < i; j++) {
            nombre = marcas[j].split('.');
            combo_formatos.options[j + 1] = new Option(nombre[1], nombre[1]);
        }
        CfgXcoding.cargaParametros();
    },

    /**
     * Carga los parametros del formato seleccionado
     */

    cargaParametros: function () {
        CfgXcoding.limpiaParametros();
        var marca_seleccionada = document.getElementById('marca_prontus').value;
        var formato_seleccionado = document.getElementById('format').value;
        var formato = '';
        if (formato_seleccionado == '') {
            formato = marca_seleccionada;
        } else {
            formato = marca_seleccionada + '.' + formato_seleccionado;
        }
        if (typeof CfgXcoding.formatos[formato] !== 'undefined') {
            var campo;
            for (campo in CfgXcoding.formatos[formato]) {
                if (document.getElementById(campo) != null) {
                    document.getElementById(campo).value = CfgXcoding.formatos[formato][campo];
                }
            }
        }
        return true;
    },

    actualizaformatos: function () {
        var marca_seleccionada = document.getElementById('marca_prontus').value;
        var formato_seleccionado = document.getElementById('format').value;
        var formato = '';
        if (formato_seleccionado == '') {
            formato = marca_seleccionada;
        } else {
            formato = marca_seleccionada + '.' + formato_seleccionado;
        }
        if (typeof CfgXcoding.formatos[formato] === 'undefined') {
            CfgXcoding.formatos[formato] = {};
        }
        CfgXcoding.formatos[formato].videobitrate = document.getElementById('videobitrate').value;
        CfgXcoding.formatos[formato].h264profile = document.getElementById('h264profile').value;
        CfgXcoding.formatos[formato].videosize = document.getElementById('videosize').value;
        CfgXcoding.formatos[formato].x264 = document.getElementById('x264').value;
        CfgXcoding.formatos[formato].audiobitrate = document.getElementById('audiobitrate').value;
        CfgXcoding.formatos[formato].audiochannels = document.getElementById('audiochannels').value;
        CfgXcoding.formatos[formato].audiosampling = document.getElementById('audiosampling').value;
    },

    /**
     * limpia los campos antes de cargar datos nuevos
     */
    limpiaParametros: function () {
        document.getElementById('videobitrate').value = '';
        document.getElementById('h264profile').value = '';
        document.getElementById('videosize').value = '';
        document.getElementById('x264').value = '';
        document.getElementById('audiobitrate').value = '';
        document.getElementById('audiochannels').value = '';
        document.getElementById('audiosampling').value = '';
    },

    /**
     * agrega un nuevo formato a la lista
     */
    agregarformato: function () {
        var nuevo_formato = document.getElementById('nuevo_formato_xcoding').value;
        if (/\S+/.test(nuevo_formato)) {
            nuevo_formato = nuevo_formato.toUpperCase();
            if (/^[a-zA-Z]+$/.test(nuevo_formato)) {
                var combo_formato = document.getElementById('format');
                var combo_marca = document.getElementById('marca_prontus');
                if (typeof CfgXcoding.formatos[combo_marca.value + '.' + nuevo_formato] !== 'undefined') {
                    showModalAlert({
                        title: 'Error',
                        type: 'red',
                        msg: 'Este formato ya existe.'
                    });
                    return false;
                }

                CfgXcoding.actualizaformatos();
                combo_formato.options[combo_formato.options.length] = new Option(nuevo_formato, nuevo_formato);
                combo_formato.options[combo_formato.options.length - 1].selected = true;
                document.getElementById('nuevo_formato_xcoding').value = '';
                CfgXcoding.limpiaParametros();
            } else {
                showModalAlert({
                    title: 'Error',
                    type: 'red',
                    msg: 'Sólo se pueden ingresar letras. No se permite Ñ, espacios, números, letras con tilde o símbolos'
                });
            }
        } else {
            showModalAlert({
                title: 'Error',
                type: 'red',
                msg: 'Debes ingresar un identificador para el formato'
            });

        }
    },

    /**
     * agrega una nueva marca prontus a la lista
     */
    agregarMarca: function () {
        var nuevo_id = document.getElementById('nueva_marca_xcoding').value;
        if (/\d+/.test(nuevo_id)) {
            if (/^[0-9]+$/.test(nuevo_id)) {
                var combo_marca = document.getElementById('marca_prontus');
                var nueva_marca = CfgXcoding.prefijo_marca + nuevo_id;
                var nombre;
                for (var marca in CfgXcoding.formatos) {
                    nombre = marca.split('.');
                    if (nueva_marca == nombre[0] && nombre.length > 1) {
                        showModalAlert({
                            title: 'Error',
                            type: 'red',
                            msg: 'Esta marca ya existe'
                        });
                        return false;
                    }
                }
                CfgXcoding.actualizaformatos();
                combo_marca.options[combo_marca.options.length] = new Option(nueva_marca, nueva_marca);
                combo_marca.options[combo_marca.options.length - 1].selected = true;
                CfgXcoding.cargaformatos();
                document.getElementById('nueva_marca_xcoding').value = '';
                CfgXcoding.limpiaParametros();
            } else {
                showModalAlert({
                    title: 'Error',
                    type: 'red',
                    msg: 'Sólo se pueden ingresar números.'
                });
            }
        } else {
            showModalAlert({
                title: 'Error',
                type: 'red',
                msg: 'Debes ingresar un id'
            });
        }
    },

    /**
     * Ejecuta una verificacion de la configuracion del directorio y de ffmpeg si lo encuentra
     */
    borrarMarca: function () {
        var msg = "¿Estás seguro de eliminar la marca de transcodificación?\nSe eliminarán todos los formatos asociados. Esta acción no se puede deshacer.";
        showModalConfirm({
            'title': 'Borrar Marcas',
            'msg': msg,
            type: "orange",
            icon: "glyphicon glyphicon-exclamation-sign",
            btnClassOk: 'hovwhite radius15 noborder txtnextwhite pad-top-bot7 pad-lef-rig20 int-nextred nextred',
            okTitle: 'Borrar',
            cbBtnOK: function () {
                var marca_seleccionada = document.getElementById('marca_prontus').value;
                var nombre;
                for (let marca in CfgXcoding.formatos) {
                    nombre = marca.split('.');
                    if (marca_seleccionada == nombre[0]) {
                        delete CfgXcoding.formatos[marca];
                    }
                }
                CfgXcoding.guardarServidor();
            }
        });
    },

    /**
     * Ejecuta una verificacion de la configuracion del directorio y de ffmpeg si lo encuentra
     */
    borrarformato: function () {
        var formato_seleccionado = document.getElementById('format').value;
        var marca_seleccionada = document.getElementById('marca_prontus').value;
        var msg = "¿Estás seguro de eliminar el formato de transcodificación?. Esta acción no se puede deshacer.";
        if (formato_seleccionado == '') {
            showModalAlert({
                title: 'Error',
                type: 'red',
                msg: 'Este formato no se puede eliminar'
            });
        } else {
            showModalConfirm({
                'title': 'Borrar formato de transcodificación',
                'msg': msg,
                type: "orange",
                icon: "glyphicon glyphicon-exclamation-sign",
                btnClassOk: 'hovwhite radius15 noborder txtnextwhite pad-top-bot7 pad-lef-rig20 int-nextred nextred',
                okTitle: 'Borrar',
                cbBtnOK: function () {
                    if (typeof CfgXcoding.formatos[marca_seleccionada + '.' + formato_seleccionado] !== 'undefined') {
                        delete CfgXcoding.formatos[marca_seleccionada + '.' + formato_seleccionado];
                        CfgXcoding.guardarServidor();
                    }
                }
            });
        }
        return false;
    },

    /**
     * confirma el guardado y llama el almacenamiento definitivo
     */
    guardar: function () {
        for (var marca in CfgXcoding.formatos) {
            if (typeof CfgXcoding.formatos[marca]['videosize'] != undefined) {
                if (CfgXcoding.formatos[marca]['videosize'] % 2 == 1) {
                    showModalAlert({
                        title: 'Error',
                        type: 'red',
                        msg: 'El parametro videosize no puede ser impar, formato incorrecto:\n' + marca
                    });
                    return false;
                }
            }
        }
        var msg = "¿Estás seguro de modificar los formatos de transcodificación?";
        showModalConfirm({
            'title': 'Modificar formatos de transcodificación',
            'msg': msg,
            type: "orange",
            icon: "glyphicon glyphicon-exclamation-sign",
            btnClassOk: 'hovwhite radius15 noborder txtnextwhite pad-top-bot7 pad-lef-rig20 int-nextyellow nextyellow',
            okTitle: 'Guardar Cambios',
            cbBtnOK: function() {
                CfgXcoding.guardarServidor();
            }
        });

    },

    /**
     * guarda la configuracion editada en el servidor
     */
    guardarServidor: function () {
        $('#modal-loading-mensaje').html('Por favor espera mientras se guarda la configuración.');
        $('#modal-loading').modal({backdrop: 'static', keyboard: false});
        $.ajax({
            url: CfgXcoding.dirCgi + CfgXcoding.cgiGuardaformatos,
            data: {
                _prontus_id: Admin.prontus_id,
                formatos: JSON.stringify(CfgXcoding.formatos)
            },
            type: 'POST',
            dataType: 'json',
            success: function (json) {
                $("#modal-loading").one("hidden.bs.modal", function () {
                    if (typeof json.status !== 'undefined') {
                        if (json.status === 1) {
                            showModalAlert({
                                title: 'Terminado',
                                type: 'green',
                                msg: 'Se han guardado correctamente los formatos'
                            });
                        } else {
                            showModalAlert({
                                title: 'Procesando',
                                type: 'green',
                                msg: json.msg
                            });
                        }
                    }
                    CfgXcoding.cargaCfg();
                });
                $('#modal-loading').modal('hide');
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                $("#modal-loading").one("hidden.bs.modal", function () {
                    showModalAlert({
                        title: 'Error',
                        type: 'red',
                        msg: 'Ha ocurrido un error al guardar los formatos: ' + errorThrown
                    });
                });
                $('#modal-loading').modal('hide');
            }
        });
    },

    soloNumeros: function (selector) {
        // Por teclado solo se puede ingresar números
        $(selector).keydown(function (event) {
            if (event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 37 || event.keyCode == 39) {
                //se permiten estas teclas
            } else {
                if (event.keyCode < 95) {
                    if (event.keyCode < 48 || event.keyCode > 57) event.preventDefault();
                } else {
                    if (event.keyCode < 96 || event.keyCode > 105) event.preventDefault();
                }
            }
        });
    },

    soloLetras: function (selector) {
        // Por teclado solo se puede ingresar números
        $(selector).keydown(function (event) {
            if (event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 37 || event.keyCode == 39) {
                //se permiten estas teclas
            } else {
                if (event.keyCode < 65 || event.keyCode > 90) event.preventDefault();

            }
        });
    },

    /**
     * Ejecuta una verificacion de la configuracion del directorio y de ffmpeg si lo encuentra
     */
    testFFmpeg: function () {
        var path = $('#DIR_FFMPEG').val();
        if (path != '') {
            var linkCfgXcoding = CfgXcoding.dirCgi + CfgXcoding.cgiVerificaFFmpeg;
            linkCfgXcoding += '?_prontus_id=' + Admin.prontus_id;
            linkCfgXcoding += '&path=' + path;
            $("#modal_ffmpeg div.modal-body").html('');
            $("#modal_ffmpeg div.modal-body").load(linkCfgXcoding);
            $("#modal_ffmpeg").modal();
        }
    }
};

$(document).ready(function() {
    CfgXcoding.init();
});
