text: var Biblioteca = function () {
      return {
          validacionGeneral: function (id, reglas, mensajes) {
              const formulario = $('#' + id);
              formulario.validate({
                  rules: reglas,
                  messages: mensajes,
                  errorElement: 'span', //default input error message container
                  errorClass: 'help-block help-block-error', // default input error message class
                  focusInvalid: false, // do not focus the last invalid input
                  ignore: "", // validate all fields including form hidden input
                  highlight: function (element, errorClass, validClass) { // hightlight error inputs
                      $(element).closest('.form-group').addClass('has-error'); // set error class to the control group
                  },
                  unhighlight: function (element) { // revert the change done by hightlight
                      $(element).closest('.form-group').removeClass('has-error'); // set error class to the control group
                  },
                  success: function (label) {
                      label.closest('.form-group').removeClass('has-error'); // set success class to the control group
                  },
                  errorPlacement: function (error, element) {
                      if ($(element).is('select') && element.hasClass('bs-select')) {//PARA LOS SELECT BOOSTRAP
                          error.insertAfter(element);//element.next().after(error);
                      } else if ($(element).is('select') && element.hasClass('select2-hidden-accessible')) {
                          element.next().after(error);
                      } else if (element.attr("data-error-container")) {
                          error.appendTo(element.attr("data-error-container"));
                      } else {
                          error.insertAfter(element); // default placement for everything else
                      }
                  },
                  invalidHandler: function (event, validator) { //display error alert on form submit
                      
                  },
                  submitHandler: function (form) {
                      return true;
                  }
              });
          },
          notificaciones: function (mensaje, titulo, tipo) {
              toastr.options = {
                  closeButton: true,
                  newestOnTop: true,
                  positionClass: 'toast-top-right',
                  preventDuplicates: true,
                  timeOut: '5000'
              };
              if (tipo == 'error') {
                  toastr.error(mensaje, titulo);
              } else if (tipo == 'success') {
                  toastr.success(mensaje, titulo);
              } else if (tipo == 'info') {
                  toastr.info(mensaje, titulo);
              } else if (tipo == 'warning') {
                  toastr.warning(mensaje, titulo);
              }
          },
      }
  }();
  
  //captura variables de URL
  function parametroURL(_par) {
      var _p = null;
      if (location.search) location.search.substr(1).split("&").forEach(function(pllv) {
        var s = pllv.split("="), //separamos llave/valor
          ll = s[0],
          v = s[1] && decodeURIComponent(s[1]); //valor hacemos encode para prevenir url encode
        if (ll == _par) { //solo nos interesa si es el nombre del parametro a buscar
          if(_p==null){
          _p=v; //si es nula, quiere decir que no tiene valor, solo textual
          }else if(Array.isArray(_p)){
          _p.push(v); //si ya es arreglo, agregamos este valor
          }else{
          _p=[_p,v]; //si no es arreglo, lo convertimos y agregamos este valor
          }
        }
      });
      return _p;
    }
  
  