var sNUMERO = 'numero'; var sFECHA = 'fecha'; var sHORA = 'hora'; var sEMAIL = 'email'; var sTEXTO = 'texto'; var sVALUE = 'value'; var sNIF = 'nif'; function vGetItemValue ( sParCampo, sParValor, oParForm, sParSeparador ) { // Número de parámetros recibidos por la función var nNumPar = arguments.length; // Se comprueban que los parámetros pasados a la función sean del tipo correcto if ( nNumPar < 1 || nNumPar > 4 || typeof( sParCampo ) != "string" ) { return( null ); } // Si no se pasa el nombre del formulario, se utilizará el primer formulario que exista en el documento // en el caso de que no haya ninguno o no exista el formulario especificado, se retorna null var oForm; if (nNumPar == 1 || nNumPar == 2 || oParForm == null) { oForm = document.forms[ 0 ] } else if ( typeof( oParForm ) == "string") { oForm = document.forms[ oParForm ]; } else { oForm = oParForm; } if( typeof( oForm ) != "object" ) { return( null ); } // Se instancia el campo, en caso de que no exista, se retorna null var oCampo = oForm.elements[ sParCampo ]; if( typeof( oCampo ) != "object" ) { return( null ); } var i, vRet, sValor, sCampoTipo = oCampo.type; if( sCampoTipo == "text" || sCampoTipo == "textarea" || sCampoTipo == "password" || sCampoTipo == "hidden" ) { // Para campos Notes de tipo: Texto, Texto enriquecido, Fecha/Hora, Números, Autores, Nombres, Lectores, // Contraseña, Fórmula, Todos los Ocultos (con propiedad Generar HTML para todos los campos activa) if ( sParSeparador != null && sParSeparador != "") { var re = new RegExp(sParSeparador + " ", "g"); vRet = oCampo.value.replace(re, sParSeparador); vRet = vRet.split (sParSeparador.replace (/ /g, "")); } else { vRet = oCampo.value; } } else if( sCampoTipo == "select-one" || sCampoTipo == "select-multiple" ) { // Para campos Notes de tipo: Cuadro de diálogo (uno o varios valores), Cuadro de lista (uno o varios valores) // Cuadro de lista desplegable sValor = ""; for( i = 0; i < oCampo.options.length; i++ ) { if( oCampo.options[ i ].selected ) { if( sValor == "" ) { if (sParValor == sVALUE) sValor = oCampo.options[ i ].value; else sValor = oCampo.options[ i ].text; } else { if (sParValor == sVALUE) sValor1 = oCampo.options[ i ].value; else sValor1 = oCampo.options[ i ].text; sValor += ";" + sValor1 } } } if( sCampoTipo == "select-one") { vRet = sValor; } else { vRet = new Array(); vRet = sValor.split (';'); } } else if( sCampoTipo == "checkbox" || sCampoTipo == "radio" ) { // Para campos Notes de tipo: Casilla de verificación, Botón radial (UNO) vRet = ( oCampo.checked ) ? oCampo.value : ""; } else if ( ( "" + sCampoTipo ) == "undefined" ) { // Para campos Notes de tipo: Casillas de verificación, Botones radiales (MULTIPLES) if ( oCampo.length > 0 ) { sCampoTipo = oCampo[0].type; sValor = ""; var cMarcado; if ( sCampoTipo == "checkbox" || sCampoTipo == "radio" ) { for( i = 0; i < oCampo.length; i++ ) { cMarcado = ( oCampo[ i ].checked) ? oCampo[i].value : ""; if( sValor == "" ) { sValor = cMarcado; } else if (cMarcado != "") { sValor += ";" + cMarcado; } } } else { for( i = 0; i < oCampo.length; i++ ) { cMarcado = oCampo[i].value; if( sValor == "" ) { sValor = cMarcado; } else { sValor += ";" + cMarcado; } } } vRet = new Array(); vRet = sValor.split(';'); } else { vRet = null; } } else { // Para objetos que no son campos vRet = null; } return( vRet ); } function bValidarFecha ( sParCampo, bParSoloTipo, sParSeparador ) { if (bParSoloTipo == null) bParSoloTipo = false; else if (arguments.length > 3 || arguments.length < 1) return false; var bRet = false; var vValor = vGetItemValue ( sParCampo, null, null, sParSeparador ); if ( vValor != null) { var nLSup = 1; if (typeof (vValor) == "object" && vValor.length > 0) nLSup = vValor.length; for (var i = 0; i < nLSup; i++) { if (bParSoloTipo && vValor == "") return true; var re = /\d+(\/|-)\d+(\/|-)\d+/g // Cuadra con 'd+/d+/d+' var sFecha = new String ( vValor ); var sMatch = sFecha.match ( re ); if (sMatch != null && sMatch.toString() == sFecha) { var nPosAnio = sFecha.lastIndexOf ("/") + 1 + sFecha.lastIndexOf ("-") + 1; var nPosMes = sFecha.indexOf ("/") + 1 + sFecha.indexOf ("-") + 1; var nAnio = parseInt ( sFecha.substring ( nPosAnio, sFecha.length ) ); var nMes = parseInt ( sFecha.substring ( nPosMes, nPosAnio ), 10 ) - 1; var nDia = parseInt ( sFecha.substring ( 0, nPosMes ), 10); if ( nAnio < 50 ) nAnio = nAnio + 2000; else if ( nAnio < 100 ) nAnio = nAnio + 1900; var vFecha = new Date ( nAnio, nMes, nDia ); bRet = ( vFecha.getDate() == nDia && vFecha.getMonth() == nMes && vFecha.getFullYear() == nAnio && vFecha != "Invalid Date" ); } } } return ( bRet ); } function bValidarHora ( sParCampo, bParSoloTipo, sParSeparador ) { if (bParSoloTipo == null) bParSoloTipo = false; else if (arguments.length > 3 || arguments.length < 1) return false; var bRet = false; var vValor = vGetItemValue ( sParCampo, null, null, sParSeparador ); if( vValor != null ) { var nLSup = 1; if (typeof (vValor) == "object" && vValor.length > 0) nLSup = vValor.length; for (var i = 0; i < nLSup; i++) { var reTime = /^(\d{1,2}):(\d{2})(.*)/; var matchedTime = vValor.match( reTime ); if( matchedTime == null ) return ( null ); var date = new Date( '01/01/2000' ); date.setHours( parseInt( matchedTime[1], 10 ) ); date.setMinutes( parseInt( matchedTime[2], 10 ) ); bRet = ( matchedTime[1] == date.getHours() && matchedTime[2] == date.getMinutes() ) } } return ( bRet ); } function bValidarNumero ( sParCampo, bParSoloTipo, sParSeparador ) { if (bParSoloTipo == null) bParSoloTipo = false; else if (arguments.length > 3 || arguments.length < 1) return false; var bRet = false; var vValor = vGetItemValue ( sParCampo, null, null, sParSeparador ); if ( vValor != null ) { var nLSup = 1; if (typeof (vValor) == "object" && vValor.length > 0) nLSup = vValor.length; for (var i = 0; i < nLSup; i++) { if (bParSoloTipo && vValor == "") return true; vValor = vValor.replace( /,/g, '.' ); var nNum = parseFloat ( vValor ); bRet = ( ! isNaN ( nNum ) ) && ( vValor == nNum ); } } return ( bRet ); } function bValidarNIF (sParCampo, bParSoloTipo, sParSeparador) { if (bParSoloTipo == null) bParSoloTipo = false; else if (arguments.length > 3 || arguments.length < 1) return false; var bRet = false; var vValor = vGetItemValue ( sParCampo, null, null, sParSeparador ); if ( vValor != null ) { var nLSup = 1; if (typeof (vValor) == "object" && vValor.length > 0) nLSup = vValor.length; for (var i = 0; i < nLSup; i++) { if (bParSoloTipo && vValor == "") return true; if (vValor.length != 9) return false; var sDNI = vValor.substring(0, 8); var sLetra = sDNILetra(sDNI); bRet = ( sLetra == vValor.substring(8, 9).toUpperCase() ); } } return ( bRet ); } function bValidarEMail( oParCampo, bParSoloTipo, sParSeparador ) { if (bParSoloTipo == null) bParSoloTipo = false; else if (arguments.length > 3 || arguments.length < 1) return false; // Se admite una cadena de texto o el campo como Objeto var sEmail = vGetItemValue( oParCampo, null, null, sParSeparador ); if (sEmail == null) return false; // Si sólo quiero comprobar el tipo, y el EMail está vacío, devuelvo true if (bParSoloTipo && sEmail.length < 1) { return( true ); } //El patrón siguiente es usado para chequear si la dirección de e-mail cumple el formato usuario@dominio //También es usado para separar el nombre de usuario del dominio var sEmailPatron = /^(.+)@(.+)$/; // La cadena siguiente representa el patrón para controlar todos los caracteres especiales. //No se permiten los siguientes caracteres especiales en la dirección: ( ) < > @ , ; : \ " . [ ] var sCaracteresEspeciales = "\\(\\)<>@,;:\\\\\\\"\\.\\[\\]"; //La cadena siguiente representa el rango de caracteres permitidos en el nombre de usuario o dominio. var sCaracteresValidos = "\[^\\s" + sCaracteresEspeciales + "\]"; //El siguiente patrón se aplica si el usuario está entre comillas: "usuario"@dominio.es var sComillasUsuario = "(\"[^\"]*\")"; //El siguiente patrón se aplica para dominios que son direcciones IP: usuario@[120.120.120.5] //NOTA: en este caso los paréntesis son requeridos. var sIpDominioPatron = /^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/; // La siguiente cadena representa una serie ( básicamente una serie de caracteres no especiales.) var sSerie = sCaracteresValidos + '+'; //La siguiente cadena representa una palabra en el nombre de usuario típico: nombre.apellido@dominio.es //donde nombre y apellidos son palabras. Básicamente, una palabra es una serie o palabra entre comillas. var sPalabra = "(" + sSerie + "|" + sComillasUsuario + ")"; //El siguiente patrón describe la estructura del usuario var sUsuarioPatron = new RegExp( "^" + sPalabra + "(\\." + sPalabra + ")*$" ); //El siguiente patrón describe la estructura de un nombre de dominio, como opuesto a sIpDominioPatron var sDominioPatron = new RegExp( "^" + sSerie + "(\\." + sSerie +")*$" ); //Comienza con el primer patrón para simplificar el usuario@dominio en diferentes piezas para un fácil análisis var asEmail = sEmail.match( sEmailPatron ); if( asEmail == null) { //Demasiadas o ninguna @; no tiene el formato adecuado de una dirección de e-mail return( false ); } var sUsuario = asEmail[ 1 ]; var sDominio = asEmail[ 2 ]; //Comprueba si el usuario es correcto if( sUsuario.match( sUsuarioPatron ) == null ) { return( false ); } //Comprueba la validez del dominio, si este es una dirección IP var asIpDominio = sDominio.match( sIpDominioPatron ); if( asIpDominio != null ) { for ( var i = 1; i <= 4; i++ ) { if ( asIpDominio[i] >255 ) { return( false ); } } return( true ); } //Comprueba la validez del nombre de dominio var asDominio = sDominio.match( sDominioPatron ); if( asDominio == null ) { return( false ); } //Comprueba si el nombre de dominio es válido, si termina en una palabra de tres caracteres ( com, edu, gov ) o // una de dos caracteres, representando el pais ( es, uk, nl ) y si hay un nombre de host precediendo al nombre //del país. //Se divide el nombre de dominio en diferentes series var sSeriePatron = new RegExp( sSerie, "g" ); var asDominioPartes = sDominio.match( sSeriePatron ); var nLen = asDominioPartes.length; if( asDominioPartes[ nLen-1 ].length < 2 || asDominioPartes[ nLen - 1 ].length > 3 ) { //La dirección debe terminar en una palabra de dos o tres letras return( false ); } //Comprueba si el nombre de host está precediendo el dominio. if( nLen < 2 ) { return( false ); } //Si se llega hasta aquí, es que la dirección es válida return( true ); } function bValidarTexto ( sParCampo, sParValor, sParSeparador ) { var vValor = vGetItemValue ( sParCampo, sParValor, null, sParSeparador ); return ( vValor != null && vValor != ""); } function vValidarCampo ( sParCampo, sParEtiqueta, sParTipo, bParSoloTipo, sParSeparador ) { var vRet; if (arguments.length < 2) return false; if (bParSoloTipo == null) bParSoloTipo = false; if (sParTipo == null) sParTipo = ''; if (sParTipo == sNUMERO) { vRet = bValidarNumero (sParCampo, bParSoloTipo, sParSeparador ); if ( ! vRet ) vRet = ' · El campo "' + sParEtiqueta + '" debe ser numérico.'; } else if (sParTipo == sFECHA) { vRet = bValidarFecha ( sParCampo, bParSoloTipo, sParSeparador ); if ( ! vRet ) vRet = ' · El campo "' + sParEtiqueta + '" debe ser de tipo fecha (dd/mm/aa).'; } else if (sParTipo == sHORA) { vRet = bValidarHora ( sParCampo, bParSoloTipo, sParSeparador ); if ( ! vRet ) vRet = ' · El campo "' + sParEtiqueta + '" debe ser de tipo hora (hh:mm).'; } else if (sParTipo == sNIF) { vRet = bValidarNIF (sParCampo, bParSoloTipo, sParSeparador); if ( ! vRet ) vRet = ' · El campo "' + sParEtiqueta + '" no contiene un NIF válido'; } else if (sParTipo == sEMAIL) { vRet = bValidarEMail ( sParCampo, bParSoloTipo, sParSeparador ); if ( ! vRet ) vRet = ' · El campo "' + sParEtiqueta + '" no tiene el formato correcto'; } else if (sParTipo == sVALUE) { vRet = bValidarTexto ( sParCampo, sVALUE, sParSeparador ); if ( ! vRet ) vRet = ' · El campo "' + sParEtiqueta + '" no puede estar vacío.'; } else { vRet = bValidarTexto ( sParCampo, null, sParSeparador ); if ( ! vRet ) vRet = ' · El campo "' + sParEtiqueta + '" no puede estar vacío.'; } return vRet; } function bValidar ( asParCampos, asParEtiquetas, asParTipos, abParSoloTipos, asParSeparadores ) { var n = asParCampos.length; if ( n != asParEtiquetas.length ) return ( false ); if (arguments.length < 2) return ( false ); if (asParSeparadores == null) { var asParSeparadores = new Array(); for (var i = 0; i < n; i++) asParSeparadores[ i ] = null; } if (abParSoloTipos == null) { var abParSoloTipos = new Array(); for (var i = 0; i < n; i++) abParSoloTipos[ i ] = false; } if (asParTipos == null) { var asParTipos = new Array(); for (var i = 0; i < n; i++) asParTipos[ i ] = ''; } var bRet = true; var vOK; var k = 0; var sMensaje = 'Se han hallado los siguientes errores: \n\n'; for ( var i = 0; i < n; i++ ) { vOK = vValidarCampo ( asParCampos [ i ], asParEtiquetas [ i ], asParTipos [ i ], abParSoloTipos [ i ], asParSeparadores [ i ]); if ( typeof ( vOK ) != "boolean" ) { sMensaje += vOK + ' \n'; bRet = false; } else bRet = bRet && vOK; } if ( ! bRet ) alert ( sMensaje, 'Error' ); return bRet; } function sDNILetra( sParDNI ) { var asLetras = new Array( "T", "R", "W", "A", "G", "M", "Y", "F", "P", "D", "X", "B", "N", "J", "Z", "S", "Q", "V", "H", "L", "C", "K", "E", "U"); var nDNI, sLetra; nDNI = parseFloat ( sParDNI ); if ( ! isNaN ( nDNI ) && nDNI == sParDNI ) sLetra = asLetras[ nDNI % 23 ]; else sLetra = ""; return( sLetra ); } function submitOnPressEnter(e) { var keyCode = (e.keyCode) ? e.keyCode : e.charCode; var keyEnter = String.fromCharCode( keyCode ) if( keyCode == '13' ) { if (f.onsubmit()) f.submit(); } else { return true; } } var attachs = new Array(); /* ----------------------- * Función: update * Descripción: Guarda el documento actual y lo vuelve poner en modo edición */ function update() { var oGuardar = document.getElementById( "guardar" ); oGuardar.onclick(); } /* ---------------------------- * Función: loadAttachs * Parámetros: - * Descripción: Si estoy editando el documento, caga en el array attachs los campos checkbox que genera Domino * con los nombres de los anexos del documento, para luego controlar la forma de mostrarlos y su eliminación */ function bLoadAttachs() { if (location.href.toLowerCase().indexOf ('?edit') < 0) return true; var bFound = false; for (var i = f.elements.length-1; i >= 0; i--) { if (f.elements[i].name.substring (0, 8) == '%%Detach') { attachs[attachs.length] = f.elements[i]; bFound = true; } else { if (bFound) break; } } return true; } /* ----------------------------------- * Función: deleteAttachment * Parámetros: sAtt - El nombre del archivo anexo * Descripción: Marca para eliminar el anexo cuyo nombre pasamos como parámetro. * Esto se consigue aprovechando los campos tipo checkbox que genera Domino con los anexos del documento * que tengo acultos. Lo busco en el array attach que previamente he cargado. * Por último actualizo el documento (guardo y vuelvo a editar, llamando a la función update) para que el anexo * se elimine definitivamente. */ function deleteAttachment (sParAttach) { if (confirm ('Esta acción eliminará el anexo. ¿Está seguro de continuar?')) { for (var i=0; i < attachs.length; i++) { if (attachs[i].value == sParAttach) { attachs[i].checked = true; break; } } update(); } }