/** * Función que permite mostrar opciones del submenú vertical */ $(function(){ $(document).ready(function(){ $('ul.dropdown-menu [data-toggle=dropdown]').on('click', function(event) { event.preventDefault(); event.stopPropagation(); $(this).parent().siblings().removeClass('open'); $(this).parent().toggleClass('open'); }); }); }); /** * @brief Función que valida el ingreso de solo números en un campo de texto * * @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve) * @copyright GNU/GPLv2 * @date 18-05-2015 * @param evt Variable de tipo object con el evento de la tecla presionada * @return Retorna verdadero en caso de que el carácter introducido en el campo de texto sea un número, * en caso contrario retorna falso */ function validar_numeros(evt) { evt = (evt) ? evt:event; var tecla = (evt.which) ? evt.which:evt.keyCode; var keychar = String.fromCharCode(tecla); return !!/^([0-9\t\b])$/.test(keychar); } /** * @brief Función que valida el ingreso de solo carácteres alfanuméricos en un campo de texto * * @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve) * @copyright GNU/GPLv2 * @date 18-05-2015 * @param evt Variable de tipo object con el evento de la tecla presionada * @return Retorna verdadero en caso de que el carácter introducido en el campo de texto sea un carácter alfanumérico, * en caso contrario retorna falso */ function validar_letras(evt) { evt = (evt) ? evt:event; var tecla = (evt.which) ? evt.which:evt.keyCode; var keychar = String.fromCharCode(tecla); return !!/^([A-Za-z\s\b])$/.test(keychar); } /** * @brief Función que muestra la fortaleza de la contraseña del usuario * * @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve) * @copyright GNU/GPLv2 * @date 20-05-2015 * @param password Variable de tipo string que contiene los caracteres de la contraseña especificada en el formulario */ function passwordStrength(password) { var desc = new Array(); desc[0] = "Muy Débil"; desc[1] = "Débil"; desc[2] = "Mejor"; desc[3] = "Buena"; desc[4] = "Fuerte"; desc[5] = "Muy Fuerte"; var score = 0; //if password bigger than 6 give 1 point if (password.length > 6) score++; //if password has both lower and uppercase characters give 1 point if ( ( password.match(/[a-z]/) ) && ( password.match(/[A-Z]/) ) ) score++; //if password has at least one number give 1 point if (password.match(/\d+/)) score++; //if password has at least one special caracther give 1 point if ( password.match(/.[!,@,#,$,%,^,&,*,?,_,~,-,(,)]/) ) score++; //if password bigger than 12 give another 1 point if (password.length > 12) score++; document.getElementById("passwordDescription").innerHTML = desc[score]; document.getElementById("passwordStrength").className = "strength" + score; } /** * @brief Función que valida la fortaleza de la contraseña del usuario en el formulario * * @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve) * @copyright GNU/GPLv2 * @date 21-05-2015 * @return Devuelve verdadero si la contraseña es considerada aceptable y permite suministrar los datos del formulario, * en caso contrario retorna falso y muestra un mensaje al usuario */ function validar_form_passwordStrength() { var passStrength = $("#passwordStrength").attr('class'); if (!$.inArray(passStrength, ['strength0', 'strength1', 'strength2'])) { bootbox.alert({ title: 'Aviso', message: 'La nueva contraseña es insegura, intente nuevamente incluyendo símbolos, números y letras' }); return false; } return true; } /** * @brief Funcion que muestra el formulario de consulta de requerimientos de divisas por Unidad Economica y/o por * Producto consultado * * @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve) * @copyright GNU/GPLv2 * @date 04-06-2015 * @param tipo Variable de tipo string que contiene el tipo de consulta a realizar, los valores posibles son * pr = Producto, y ue = Unidad Economica * @param id Variable de tipo string que contiene el id del registro a consultar * @param template Variable de tipo string que contiene la estructura HTML del formulario a utilizar */ function requerimiento_divisas(tipo, id, template) { if (tipo=="ue") { /** Requerimientos de divisas por Unidad Económica */ get_params = {rif: id}; } else if (tipo=="pr") { /** Requerimientos de divisas por producto */ get_params = {pr_id: id}; } var modal = bootbox.dialog({ title: TITLE_BOOTBOX_DIVISAS, message: template, buttons: { success: { label: BTN_CALCULAR, className: "btn btn-primary btn-sm", callback: function () { var divisas_form = $("#divisas-form"); divisas_form.validate({ ignore: 'input[type=hidden]', //Requerido para validar elementos select2 rules: { cambionominal: { required: true, number: true, minlength: 1, min: 1 }, anhoregistro: { date: true, required: true } }, messages: { cambionominal: { required: ERROR_REQUIRED, minlength: ERROR_MINLENGTH, number: ERROR_NUMBER, min: ERROR_MIN , }, anhoregistro: { date: ERROR_YEAR_SELECT, required: ERROR_REQUIRED } }, highlight: function(element) { $(element).closest('.form-group').removeClass('has-success').addClass('has-error'); }, unhighlight: function(element) { $(element).closest('.form-group').removeClass('has-error').addClass('has-success'); }, errorElement: 'span', errorClass: 'help-block', errorPlacement: function(error, element) { if(element.parent('.input-group').length) { error.insertAfter(element.parent()); } else { error.insertAfter(element); } } }); divisas_form.attr('action', URL_REQUERIMIENTO_DIVISAS+"?id="+id+ "&cambio="+$(modal).find("#cambionominal").val()+ "&tipo="+tipo ); divisas_form.submit(); return false; } }, main: { label: BTN_CANCEL, className: "btn btn-warning btn-sm" } } }); $(modal).find('[data-toggle="tooltip"]').tooltip({}); $(modal).find('.select2').select2({}); if (tipo=="ue") { $(modal).find("#rifCalcDivisas").val(id); } else if (tipo=="pr") { $(modal).find("#prodCalcDivisas").val(id); } // Instrucción AJAX que permite obtener los años de registro de productos set_anhos_registro("#anhoregistro", modal, get_params); } /** * @brief Función que muestra el formulario de consulta que permite modelar una cadena productiva * * @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve) * @copyright GNU/GPLv2 * @date 08-06-2015 * @param id Variable de tipo string que contiene el id del producto a modelar * @param template Variable de tipo string que contiene la estructura HTML del formulario a utilizar */ function modelar_producto(id, template, rif) { var modal = bootbox.dialog({ title: TITLE_BOOTBOX_MODELAR_CADENA, message: template, buttons: { success: { label: BTN_ACEPT, className: "btn btn-primary btn-sm", callback: function() { $("#cadenas-form").validate({ ignore: 'input[type=hidden]', //Requerido para validar elementos select2 rules: { nivelesarriba: { minlength: 1, maxlength: 2, required: true, digits: true, min: 1 }, nivelesabajo: { minlength: 1, maxlength: 2, required: true, digits: true, min: 1 }, anhoregistro: { date: true, required: true, min: 0 } }, messages: { nivelesarriba: { required: ERROR_REQUIRED, minlength: ERROR_MINLENGTH, maxlength: ERROR_MAXLENGTH, digits: ERROR_DIGITS, min: ERROR_MIN }, nivelesabajo: { required: ERROR_REQUIRED, minlength: ERROR_MINLENGTH, maxlength: ERROR_MAXLENGTH, digits: ERROR_DIGITS, min: ERROR_MIN , }, anhoregistro: { date: ERROR_YEAR_SELECT, required: ERROR_REQUIRED } }, highlight: function(element) { $(element).closest('.form-group').removeClass('has-success').addClass('has-error'); }, unhighlight: function(element) { $(element).closest('.form-group').removeClass('has-error').addClass('has-success'); }, errorElement: 'span', errorClass: 'help-block', errorPlacement: function(error, element) { if(element.parent('.input-group').length) { error.insertAfter(element.parent()); } else { error.insertAfter(element); } }, submitHandler: function(form) { generar_cadena( URL_GEN_XML_SIGESIC, id, $(modal).find("#nivelesarriba").val(), $(modal).find("#nivelesabajo").val(), $(modal).find(".select2 :selected").text() ); $("#cadenas-form").attr('action', URL_CADENA_PRODUCTIVA+"?ciiu="+id+ "&narriba="+$(modal).find("#nivelesarriba").val()+ "&nabajo="+$(modal).find("#nivelesabajo").val()+ "&anho="+$(modal).find(".select2 :selected").text()+ "&rif="+rif ); form.submit(); } }); bootbox.confirm(MSG_GEN_CADENA, function(result) { if (result) { $("#cadenas-form").submit(); } }); return false; } }, main: { label: BTN_CANCEL, className: "btn btn-warning btn-sm" } } }); $(modal).find('[data-toggle="tooltip"]').tooltip({}); $(modal).find('.select2').select2({}); // Instrucción AJAX que permite obtener los años de registro del producto seleccionado set_anhos_registro("#anhoregistro", modal, {pr_id:id}); } /** * @brief Función que deshabilita los nodos seleccionados para su posterior eliminación de la cadena productiva * * @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve) * @copyright GNU/GPLv2 * @date 31-07-2015 * @param list_pr_id Variable de tipo string que contiene una lista de id a ser eliminados */ function eliminar_nodos_tree(list_pr_id) { var tree = $("#tree"), node_checked = $(".node-checked"); if (tree.length && node_checked.length) { var productos = ''; var lista = list_pr_id.split(","); for (i=0; iNombre"); // Centra la ventana modal verticalmente box.css({ 'top': '50%', 'margin-top': function () { return -(box.height() / 2); } }); } }); // Centra la ventana modal verticalmente confirm.css({ 'top': '50%', 'margin-top': function () { return -(confirm.height() / 2); } }); } /** * @brief Función que muestra una ventana emergente con el listado de cadenas modificadas, permitiendo abrir o comparar * alguna de ellas * * @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve) * @copyright GNU/GPLv2 * @date 07-08-2015 */ function abrir_cadena(template) { var cadena_id = ''; /// Dialogo modal que muestra el listado de cadenas modificadas var modal = bootbox.dialog({ title: TITLE_BOOTBOX_ABRIR_CADENA, message: template, buttons: { success: { label: BTN_OPEN, className: "btn btn-primary btn-sm", callback: function() { /// Verifica cual de los radio options fue seleccionado para asignar el identificador de la cadena modificada $(modal).find("input").attr("name", "sel-cad").each(function() { if ($(this).is(":checked")) { cadena_id = $(this).val(); } }); if (cadena_id=='') { bootbox.alert(MSG_NOT_CHAIN_SELECTED); return false; } // Genera el archivo xml de la cadena para posteriormente ser mostrada en la consulta del modelado gen_new_xml_cadena(cadena_id); return false; } }, "compare": { label: BTN_COMPARE, className: "btn btn-success btn-sm", callback: function() { $(modal).find("input").attr("name", "sel-cad").each(function() { if ($(this).is(":checked")) { cadena_id = $(this).val(); } }); if (cadena_id=='') { bootbox.alert(MSG_NOT_CHAIN_SELECTED); return false; } /// Dialogo modal que muestra la estructura de la cadena original y la cadena modificada seleccionada var modal_compare = bootbox.dialog({ title: TITLE_BOOTBOX_COMPARE_CADENAS, message: $("#compara-cadenas").html(), buttons: { main: { label: BTN_CANCEL, className: "btn btn-warning btn-sm" } } }); // Carga los datos de la cadena original a comparar $(modal_compare).find("#pop-cadena-nombre").text($("#cadena_nombre").text()); $(modal_compare).find("#tree-cadena-original").html($("#tree").html()); $(modal_compare).find("#tree-cadena-original").treeview({ levels: 99, data: tree, color: "#000000", backColor: "#FFFFFF", showIcon: false }); $(modal_compare).find("#tree-cadena-original").treeview('expandAll', { silent: true }); // Carga los datos de la cadena consultada $(modal_compare).find("#cadena_id_consultada").val(cadena_id); var treeSet = get_tree_cadena_modificada(URL_SHOW_COMPARE_CADENA, cadena_id); $(modal_compare).find("#pop-cadena-nombre-consulta").text(treeSet.nombre); $(modal_compare).find("#tree-cadena-consultada").treeview({ levels: 99, data: treeSet.tree, color: "#000000", backColor: "#FFFFFF", selectable: false }); $(modal_compare).find("#tree-cadena-consultada").treeview('expandAll', { silent: true }); return false; } }, main: { label: BTN_CANCEL, className: "btn btn-warning btn-sm" } } }); var dataSet = []; // Configura las peticiones AJAX para que no sean asincronas $.ajaxSetup({ async: false }); // Obtiene un listado de cadenas modificadas, y en caso de error muestra un mensaje al usuario $.getJSON(URL_LIST_CADENAS, {ciiu: $.urlParam('ciiu')}, function(datos) { if (datos.resultado) { i = 0; for (a in datos.dataSet) { dataSet[i] = datos.dataSet[a]; i ++; } } else { bootbox.alert(datos.error); return false; } }).fail(function(jqxhr, textStatus, error) { var err = textStatus + ", " + error; bootbox.alert(ERROR_AJAX_REQUEST + err); return false; }); // Carga los datos en la tabla con los registros de las cadenas modificadas $(modal).find("#table-lista-cadenas").dataTable({ "language": { "url": "http://cdn.datatables.net/plug-ins/9dcbecd42ad/i18n/Spanish.json" }, "lengthMenu": [[5, 10, 25, 50, -1], [5, 10, 25, 50, "All"]], "data": dataSet, "columns": [ { "class": "text-center" }, { "class": "text-left" }, { "class": "text-left" }, { "class": "text-left" } ] }); } /** * @brief Función que ejecuta la accion que permite imprimir la cadena productiva en formato pdf * * @author Ing. Roldan Vargas (rvargas at cenditel.gob.ve) * @copyright GNU/GPLv2 * @date 12-08-2015 */ function print_cadena_productiva(url, tree, nombre_cadena) { var tree_content = tree.treeview('expandAll', { silent: true }).html(); var year = new Date().getFullYear(); var header = "
"; header += "
"+TITLE_REPORT_CADENA+" - "+nombre_cadena+"

"; var footer = "
Centro Nacional de Desarrollo e Investigación en Tecnologías Libres (CENDITEL)
"; footer += "
GPL v2.0 - Copyleft 2015 - "+year+".

"; tree.attr('style', ''); tree.print({ // Use Global styles globalStyles : true, // Add link with attrbute media=print mediaPrint : true, //Custom stylesheet //stylesheet : "http://fonts.googleapis.com/css?family=Inconsolata", //Print in a hidden iframe iframe : true, // Don't print this //noPrintSelector : ".avoid-this", // Add this on bottom append : footer, // Add this at top prepend : header, // Manually add form values manuallyCopyFormValues: true, // resolves after print and restructure the code for better maintainability deferred: $.Deferred() // timeout //timeout: 250 }); tree.treeview('collapseAll', { silent: true }).html(); } /** * @brief Objeto que permite obtener el valor de un parámetro pasado por el GET * @param sParam * @date 17-08-2015 * @returns {boolean} */ var getUrlParameter = function getUrlParameter(sParam) { var sPageURL = decodeURIComponent(window.location.search.substring(1)), sURLVariables = sPageURL.split('&'), sParameterName, i; for (i = 0; i < sURLVariables.length; i++) { sParameterName = sURLVariables[i].split('='); if (sParameterName[0] === sParam) { return sParameterName[1] === undefined ? true : sParameterName[1]; } } }; /** * @brief Función que ejecuta la accion que permite visualizar/ocultar la cadena de la fuente de datos Encuesta en el panel-footer * * @author Ing. Erwin Paredes (eparedes at cenditel.gob.ve) * @copyright GNU/GPLv2 * @date 17-08-2015 */ function ver_ocultar_panel_footer(fuente) { var url_grafico = ''; var rif = getUrlParameter('rif'); var id_prod = getUrlParameter('ciiu'); if($('#panel-al-pie').css('display') == 'none'){ $('#panel-al-pie').show('slow'); $('html, body').animate({scrollTop: $("#panel-al-pie").offset().top},2000); var dt = new Date(); var time = dt.toLocaleTimeString(); if (fuente=='encuesta') { url_grafico = URL_GRAFICAR_ENCUESTA; $("#panel-title-fuentes-diversas").html("Encuesta Industrial"); $("#niveles-arriba-grafico").html("4"); $("#niveles-abajo-grafico").html("4"); $("#panel-matrizip").hide(); $("#panel-composicion-accionaria").hide(); } else if (fuente=='matriz') { url_grafico = URL_GRAFICAR_MATRIZ; $("#panel-title-fuentes-diversas").html("Matriz Insumo / Producto"); $("#niveles-arriba-grafico").html("2"); $("#niveles-abajo-grafico").html("2"); $.getJSON(URL_DATOS_PRODUCCION_MATRIZ, {id_prod: id_prod, rif: rif}, function(datos) { if (datos.resultado) { $("#matrizip-actividad-economica").html(datos.ae_ciiu.codigo+" - "+datos.ae_ciiu.descripcion); var produccion = [], utilizacion = [], importacion = []; for (i=0;i