//******************************************************************************************************************* //FUNCIONES DE NAVEGADOR //******************************************************************************************************************* /* TITULO: oNavegador() DESCRIPCION: Esta clase crea un nuevo objeto con propiedades que describen el navegador web que se está utilizando. EJEMPLO DE USO: var oNavegador= new oNavegador(); ARGUMENTOS: VALOR DE LA FUNCION: SUB/FUNCIONES USADAS: EXPLICACION DETALLADA: Al instanciar esta clase, creamos un nuevo objeto con las propiedades del navegador que se está utilizando: oNavegador.sNombre Nombre completo oNavegador.sNombreAbrev Nombre abreviado oNavegador.sPlataforma Plataforma desde la que se está navegando oNavegador.nVersion Número de la versión oNavegador.bEsNS Verdadero si es Netscape, en caso contrario contiene Falso oNavegador.bEsNS4 Verdadero si es Netscape versión 4 oNavegador.bEsNS5 Verdadero si es Netscape versión 5 oNavegador.bEsNS6 Verdadero si es Netscape versión 6 oNavegador.bEsIE Verdadero si es Microsoft Internet Explorer, en caso contrario contiene Falso oNavegador.bEsIE4 Verdadero si es Microsoft Internet Explorer versión 4 oNavegador.bEsIE5; //Verdadero si es Microsoft Internet Explorer versión 5 */ function oNavegador() { // Determina el nombre del Navegador this.sNombre = navigator.appName; if( this.sNombre == "Netscape" ) { this.sNombreAbrev = "ns"; } else { if( this.sNombre == "Microsoft Internet Explorer" ) { this.sNombreAbrev = "ie"; } else { this.sNombreAbrev = this.sNombre; } } //Determina la plataforma desde la que se está navegando this.sPlataforma = navigator.platform; // Determina la versión del Navegador this.nVersion = parseInt( navigator.appVersion ); this.bEsNS = ( this.sNombreAbrev == "ns" && this.nVersion >= 4 ); this.bEsNS4 = ( this.sNombreAbrev == "ns" && this.nVersion == 4 ); this.bEsNS5 = ( this.sNombreAbrev == "ns" && this.nVersion == 5 ); this.bEsNS6 = ( this.sNombreAbrev == "ns" && this.nVersion == 6 ); this.bEsIE = ( this.sNombreAbrev == "ie" && this.nVersion >= 4 ); this.bEsIE4 = ( this.sNombreAbrev == "ie" && navigator.userAgent.indexOf( 'MSIE 4' ) > 0 ); this.bEsIE5 = ( this.sNombreAbrev == "ie" && navigator.userAgent.indexOf( 'MSIE 5' ) > 0 ); if( this.bEsIE5 ) this.nVersion = 5; } //Se declara el objeto Navegador para que esté disponible para todas las funciones que lo necesiten var oNavegador = new oNavegador(); /* TITULO: bAyudaEnBarraEstado( sMensaje, oVentana ) DESCRIPCION: Función que muestra un texto de ayuda en la barra de estado del navegador. EJEMPLO DE USO: bAyudaBarraEstado( "Seleccione el país donde vive", window ); ARGUMENTOS: sMensaje Cadena de texto que se mostrará en la barra de estado, si se omite, se eliminará el mensaje que actualmente aparece. oVentana Objeto que indica la ventana sobre la que se mostrará/eliminará el mensaje, si se omite, se realizará la acción sobre la ventana actual. VALOR DE LA FUNCION: true Siempre retorna verdadero. SUB/FUNCIONES USADAS: EXPLICACION DETALLADA: */ function bAyudaEnBarraEstado( sMensaje, oVentana ) { //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 || typeof( sMensaje ) != "string" ) { sMensaje = " "; } if( nNumPar < 2 || typeof( oVentana ) != "object" ) { oVentana = self; } //Común para Microsoft Internet Explorer y Netscape oVentana.status = sMensaje; return( true ); } /* TITULO: bAyudaEnVentana( sUrlPagina, nPosIzq, nPosSup, nAncho, nAlto, bAutoCerrar ) DESCRIPCION: Función que muestra una página web en una nueva ventana de navegador, en la posición y con el tamaño especificado. EJEMPLO DE USO: AyudaEnVentana( "http://servidor/BaseDatos/wPagAyuda", 460, 100, 250, 400, false ); ARGUMENTOS: sUrlPagina Url de la página de Ayuda que se desea mostrar. nPosIzq Junto a nPosSub definen las coordenadas del vertice superior izquierdo de la nueva ventana. nPosSup nAncho Define el ancho de la ventana. nAlto Define la altura de la ventana. bAutoCerrar Si se especifica true, cuando se cierra la ventana desde la que emergió la de ayuda, esta se cerrará automáticamente, en caso contrario, false, permanecerá abierta hasta que el usuario la cierre. VALOR DE LA FUNCION: true Si se puede construir sin problemas la ventana de ayuda. false Si no se pasan los parámetros correctamente. SUB/FUNCIONES USADAS: EXPLICACION DETALLADA: */ function bAyudaEnVentana( sUrlPagina, nPosIzq, nPosSup, nAncho, nAlto, bAutoCerrar ) { //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 || typeof( sUrlPagina ) != "string" ) { return( false ); } if( nNumPar < 2 || typeof( nPosIzq ) != "number" ) { nPosIzq = 460; } if( nNumPar < 3 || typeof( nPosSup ) != "number" ) { nPosSup = 100; } if( nNumPar < 4 || typeof( nAncho ) != "number" ) { nAncho = 250; } if( nNumPar < 5 || typeof( nAlto ) != "number" ) { nAlto = 400; } if( nNumPar < 6 || typeof( bAutoCerrar ) != "boolean" ) { bAutoCerrar = false; } var oVentanaAyuda; var sParVentana = "scrollbars=yes,width=" + nAncho + ",height=" + nAlto; if( typeof( oNavegador) == "object" && oNavegador.bEsNS ) { //Para Netscape sParVentana += ",screenX=" + nPosIzq + ",screenY=" + nPosSup; } else if( typeof( oNavegador) == "object" && oNavegador.bEsIE ) { //Para Microsoft Internet Explorer sParVentana += ",left=" + nPosIzq + ",top=" + nPosSup; } //Creación de la ventana oVentanaAyuda = window.open( sUrlPagina, "_ventanaAyuda", sParVentana ); if( bAutoCerrar ) { window.onunload = function() { oVentanaAyuda.close(); } } oVentanaAyuda.focus(); return( true ); } //******************************************************************************************************************* // FUNCIONES DE CAMPOS //******************************************************************************************************************* /* TITULO: bEsCampoVacio( sCampoNombre, sFormNombre ) DESCRIPCION: Función que comprueba si un campo de un formulario web está vacío. EJEMPLO DE USO: bEsCampoVacio( "Nombre", "_Empleado" ) ARGUMENTOS: sCampoNombre Nombre del campo cuyo valor se desea comprobar. sFormNombre Nombre del formulario donde está situado el campo, si no se especifica, se utilizará el primer formulario que exista en el documento o página web. VALOR DE LA FUNCION: True o False SUB/FUNCIONES USADAS: EXPLICACION DETALLADA: */ function bEsCampoVacio( sCampoNombre, sFormNombre ) { //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 var nNumPar = arguments.length; if( nNumPar < 1 || typeof( sCampoNombre ) != "string" ) { return( true ); } //Si no se pasa nombre a la función, 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 true var oForm = ( nNumPar < 2 || typeof( sFormNombre ) != "string" ) ? document.forms[ 0 ] : document.forms[ sFormNombre ]; if( typeof( oForm ) != "object" ) { return( true ); } //Se instancia el campo, en caso de que no exista, se retorna true var oCampo = oForm.elements[ sCampoNombre ]; if( typeof( oCampo ) != "object" ) { return( true ); } var i, xCampoValor, sCampoTipo = oCampo.type; //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( sCampoTipo == "text" || sCampoTipo == "textarea" || sCampoTipo == "password" || sCampoTipo == "hidden" ) { xCampoValor = ( oCampo.value == "" ) ? true : false; } //Para campos Notes de tipo: Cuadro de diálogo (uno o varios valores), Cuadro de lista (uno o varios valores) //Cuadro de lista desplegable else if( sCampoTipo == "select-one" || sCampoTipo == "select-multiple" ) { xCampoValor = true; for( i = 0; i < oCampo.options.length; i++ ) { if( oCampo.options[ i ].selected ) { xCampoValor = false; } } } //Para campos Notes de tipo: Casilla de verificación, Botón radial (UNO) else if( sCampoTipo == "checkbox" || sCampoTipo == "radio" ) { xCampoValor = ( oCampo.checked ) ? false : true; } //Para campos Notes de tipo: Casillas de verificación, Botones radiales (MULTIPLES) else if ( ( "" + sCampoTipo ) == "undefined" ) { if( oCampo.value == null ) { xCampoValor = true; for( i = 0; i < oCampo.length; i++ ) { if( oCampo[ i ].checked ) { xCampoValor = false; } } } else { xCampoValor = true; } } //Para objetos que no son campos else { xCampoValor = true; } return( xCampoValor ); } /* TITULO: bEsFechaCorrecta( oCampo ) DESCRIPCION: Función que comprueba si la cadena de texto o el valor del campo pasado como argumento, es una fecha en formato correcto. EJEMPLO DE USO: bEsFechaCorrecta( "1/1/2001" ) bEsFechaCorrecta( document.formAlumno.FechaAlta ) ARGUMENTOS: oCampo Campo de fecha o cadena de texto que represente una fecha. VALOR DE LA FUNCION: true Si la fecha es correcta. false Si la fecha es incorrecta. SUB/FUNCIONES USADAS: bEsAnioBisiesto( nAnio ) EXPLICACION DETALLADA: */ function bEsFechaCorrecta( oCampo ) { //Se comprueba que hay un parámetro if( arguments.length < 1 ) { return( false ); } //Se admite una cadena de texto o el campo como Objeto var sFecha; if( typeof( oCampo ) == "string" ) { sFecha = oCampo; } else if( typeof( oCampo ) == "object" ) { sFecha = oCampo.value; if ( "" + sFecha == "undefined" ) { return( false ) } } else { return( false ); } //Si la fecha es vacia if( sFecha.length < 1) { return( true ); } //Se obtienen las diferentes partes de la fecha según los separadores var asSeparadores = new Array( "-", "/" ); var asFecha, sDia, sMes, sAnio, bSeparadores = false; for( i = 0; i < asSeparadores.length; i++ ) { if( sFecha.indexOf( asSeparadores[ i ] ) != -1 ) { asFecha = sFecha.split( asSeparadores[ i ] ); if( asFecha.length != 3 ) { return( false ); } else { sDia = asFecha[0]; sMes = asFecha[1]; sAnio = asFecha[2]; } bSeparadores = true; } } //Si ha fallado la operación anterior if( bSeparadores == false ) { if( sFecha.length > 5 ) { sDia = sFecha.substr( 0, 2 ); sMes = sFecha.substr( 2, 2 ); sAnio = sFecha.substr( 4 ); } } //Comprobación del año var nAnio = parseInt( sAnio, 10 ); if( isNaN( nAnio ) ) { return( false ); } if( nAnio > 9999 ) { return( false ); } if( nAnio < 50 ) { nAnio = nAnio + 2000; } else if( nAnio < 100 ) { nAnio = nAnio + 1900; } //Primera comprobación del día var nDia = parseInt( sDia, 10 ); if( isNaN( nDia ) || nDia >31 || nDia < 1 ) { return false; } //Comprobación del mes y los días de este var nMes = parseInt( sMes, 10 ); if( isNaN( nMes ) ) { return( false ); } if( nMes >12 || nMes < 1 ) { return( false ); } if( ( nMes == 1 || nMes == 3 || nMes == 5 || nMes == 7 || nMes == 8 || nMes == 10 || nMes == 12 ) && ( nDia > 31 || nDia < 1 ) ) { return( false ); } if( ( nMes == 4 || nMes == 6 || nMes == 9 || nMes == 11 ) && ( nDia > 30 || nDia < 1 ) ) { return( false ); } if( nMes == 2 ) { if( nDia < 1 ) { return( false ); } if( bEsAnioBisiesto( nAnio ) == true ) { if( nDia > 29 ) { return( false ); } } else { if( nDia > 28 ) { return( false ); } } } return true; } /* TITULO: bEsAnioBisiesto( nAnio ) DESCRIPCION: Función que comprueba si un año es bisiesto. EJEMPLO DE USO: bEsAnioBisiesto( 2001 ) ARGUMENTOS: nAnio Año que se desea comprobar si es bisiesto. VALOR DE LA FUNCION: true Si el año es bisiesto. false Si el año no es bisiesto. SUB/FUNCIONES USADAS: EXPLICACION DETALLADA: */ function bEsAnioBisiesto( nAnio ) { //Se comprueba que hay un parámetro y el tipo es correcto if( arguments.length < 1 || typeof( nAnio ) != "number" ) { return( false ); } if( nAnio % 100 == 0 ) { if( nAnio % 400 == 0 ) { return( true ); } } else { if( ( nAnio % 4 ) == 0 ) { return( true ); } } return( false ); } /* TITULO: bEsNumeroCorrecto( oCampo, sSepMiles, sSepComa ) DESCRIPCION: Función que comprueba si la cadena de texto o el valor del campo pasado como argumento, es un número en formato correcto. EJEMPLO DE USO: bEsNumeroCorrecto( "1.452,45" ) bEsNumeroCorrecto( document.formAlumno.ImpMatricula, '.', ',' ) ARGUMENTOS: oCampo Campo de número o cadena de texto que represente un número. sSepMiles Cadena que representa el separador de miles que se utiliza, por defecto el punto -> "." sSepComa Cadena que representa el separador de coma decimal que se utiliza, por defecto la coma -> "," VALOR DE LA FUNCION: true Si el número es correcto. false Si el número es correcto. SUB/FUNCIONES USADAS: bEsCadenaNumeros( cNumero ) EXPLICACION DETALLADA: */ function bEsNumeroCorrecto( oCampo, sSepMiles, sSepComa ) { //Número de parámetros recibidos por la función var nNumPar = arguments.length; //Se comprueba que hay un parámetro if( nNumPar < 1 ) { return( false ); } //Se admite una cadena de texto o el campo como Objeto var sNumero; if( typeof( oCampo ) == "string" ) { sNumero = oCampo; } else if( typeof( oCampo ) == "object" ) { sNumero = oCampo.value; if ( "" + sNumero == "undefined" ) { return( false ) } } else { return( false ); } if( nNumPar < 2 || typeof( sSepMiles ) != "string" ) { sSepMiles = "."; } if( nNumPar < 3 || typeof( sSepComa ) != "string" ) { sSepComa = ","; } if( sNumero.length = 0 ) { return( true ); } else { //Localizar la posición de la Coma var nPosComa = sNumero.indexOf( sSepComa ); //Dividir el número en parte entera y parte decimal var sParteEntera, sParteDecimal; if( nPosComa != -1 ) { sParteEntera = sNumero.substring( 0, nPosComa ); sParteDecimal = sNumero.substring( sNumero.length, nPosComa + 1 ); } else { sParteEntera = sNumero; sParteDecimal = ""; } //Comprobar si la parte decimal es sólo números if( !bEsCadenaNumeros( sParteDecimal ) ) { return( false ); } //Comprobar si la parte entera es sólo números y está en grupos de tres dígitos var asParteEntera = sParteEntera.split( sSepMiles ), i; if( asParteEntera.length == 1 ){ if( !bEsCadenaNumeros( asParteEntera[ 0 ] ) ) { return( false ); } } else { for( i = 0; i < asParteEntera.length; i++ ) { if( !bEsCadenaNumeros( asParteEntera[ i ] ) ) { return( false ); } if( i == 0 ) { if( asParteEntera[ i ].length > 3 ) { return( false ); } } else { if( asParteEntera[ i ].length != 3 ) { return( false ); } } } } return( true ); } } /* TITULO: bEsCadenaNumeros( sNumero ) DESCRIPCION: Función que comprueba si una cadena está compuesta unicamente por números. EJEMPLO DE USO: bEsCadenaNumeros( "2045987238" ) -> retorna: true bEsCadenaNumeros( "2727Asd&@erdDFG" ) -> retorna: false ARGUMENTOS: sNumero Cadena que se vá a comprobar. VALOR DE LA FUNCION: true Si la cadena contiene unicamente números. false En el caso contrario. SUB/FUNCIONES USADAS: EXPLICACION DETALLADA: */ function bEsCadenaNumeros( sNumero ) { var sNumeros = "0123456789", sCaracter, i; for( i = 0; i < sNumero.length; i++ ) { sCaracter = sNumero.substring( i, i+1 ); if( sNumeros.indexOf( sCaracter ) == "-1") { return( false ); } } return( true ); } /* TITULO: sValorCampo( sCampoNombre, sFormNombre ) DESCRIPCION: Función que retorno valor de un campo de un formulario web. EJEMPLO DE USO: sValorCampo( "Nombre", "_Empleado" ) ARGUMENTOS: sCampoNombre Nombre del campo cuyo valor se desea retornar. sFormNombre Nombre del formulario donde está situado el campo, si no se especifica, se utilizará el primer formulario que exista en el documento o página web. VALOR DE LA FUNCION: True o False SUB/FUNCIONES USADAS: EXPLICACION DETALLADA: */ function sValorCampo( sCampoNombre, sFormNombre ) { //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 || typeof( sCampoNombre ) != "string" ) { return( "" ); } //Si no se pasa nombre a la función, 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 "" var oForm = ( nNumPar < 2 || typeof( sFormNombre ) != "string" ) ? document.forms[ 0 ] : document.forms[ sFormNombre ]; if( typeof( oForm ) != "object" ) { return( "" ); } //Se instancia el campo, en caso de que no exista, se retorna "" var oCampo = oForm.elements[ sCampoNombre ]; if( typeof( oCampo ) != "object" ) { return( "" ); } var i, xCampoValor, sCampoTipo = oCampo.type; //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( sCampoTipo == "text" || sCampoTipo == "textarea" || sCampoTipo == "password" || sCampoTipo == "hidden" ) { xCampoValor = oCampo.value; } //Para campos Notes de tipo: Cuadro de diálogo (uno o varios valores), Cuadro de lista (uno o varios valores) //Cuadro de lista desplegable else if( sCampoTipo == "select-one" || sCampoTipo == "select-multiple" ) { xCampoValor = ""; for( i = 0; i < oCampo.options.length; i++ ) { if( oCampo.options[ i ].selected ) { xCampoValor = oCampo.options[ i ].value; } } } //Para campos Notes de tipo: Casilla de verificación, Botón radial (UNO) else if( sCampoTipo == "checkbox" || sCampoTipo == "radio" ) { if( oCampo.checked ) { xCampoValor = oCampo.value } else { xCampoValor ="" }; } //Para campos Notes de tipo: Casillas de verificación, Botones radiales (MULTIPLES) else if ( ( "" + sCampoTipo ) == "undefined" ) { if( oCampo.value == null ) { xCampoValor = ""; for( i = 0; i < oCampo.length; i++ ) { if( oCampo[ i ].checked ) { xCampoValor = oCampo[ i ].value; } } } else { xCampoValor = ""; } } //Para objetos que no son campos else { xCampoValor = ""; } return( xCampoValor ); } /* TITULO: bEmailCorrecto( smailStr ) DESCRIPCION: Función que comprueba si una cadena contiene una dirección de email correcta. EJEMPLO DE USO: bEmailCorrecto( "nombre@dominio.es" ) ARGUMENTOS: smailStr Cadena que contiene una dirección de email. VALOR DE LA FUNCION: True o False SUB/FUNCIONES USADAS: EXPLICACION DETALLADA: */ function bEmailCorrecto(emailStr) { /* El patrón siguiente es usado para chequear si la dirección de e-email completa cumple el formato user@domain. También es utilizada para separar el nombre de usuario del dominio */ var emailPat=/^(.+)@(.+)$/ /* La siguiente cadena representa el patrón para encajar todos los caracteres especiales. No permitiremos carácteres especiales en la dirección. Estos caracteres incluyen ( ) < > @ , ; : \ " . [ ] */ var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]" // La siguiente cadena representa el rango de caracteres permitidos en el nombre de usuario o dominio. var validChars="\[^\\s" + specialChars + "\]" /* El siguiente patrón se aplica si el "usuario" es una cadena entre comillas (en cuyo caso, no hay reglas sobre que caracteres son permitidos y cuales no; cualquier cosa) */ var quotedUser="(\"[^\"]*\")" /* El siguiente patrón se aplica para dominios que son direcciones IP, en lugar de nombres. Ej.: usuario@[121.122.222.2] es una dirección de email legal. NOTA: Los corchetes son requeridos. */ var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/ // La siguiente cadena representa un átomo (basicamente una serie de caracteres no especiales.) var atom=validChars + '+' /* La siguiente cadena representa una palabra en un nombre de usuario típico. Por ejemplo, en juan.ramos@dominio.com, juan y ramos son palabras. Básicamente, una palabra es cada uno de los átomos o cadenas entre comillas. */ var word="(" + atom + "|" + quotedUser + ")" // El siguiente patrón describre la estructura del usuario var userPat=new RegExp("^" + word + "(\\." + word + ")*$") // El siguiente patrón describre la estructura de un símbolo normal de dominio, como oposición al ipDomainPatrón var domainPat= new RegExp("^" + atom + "(\\." + atom +")*$") var domainPat= new RegExp("^" + atom + "(\\." + atom +")*$") // Finalmente, se sugiere comenzar con una prueba para figurar la salida si la dirección suministrada es válida. // Comenzamos con el patrón vulgar para simplificar y dividir usario@dominio en diferentes partes para facilitar el análisis. var matchArray=emailStr.match(emailPat) if (matchArray==null) { // Demasiadas/pocas @ o algo; básicamente, la dirección no se ajusta al molde de una dirección de e-mail válida return false } var user=matchArray[1] var domain=matchArray[2] // Mirar si el "usuario" es válido if (user.match(userPat)==null) { // usuario no válido return false } // si la dirección de e-mail es una dirección IP (en vez de un nombre de host) nos aseguramos que es válida var IPArray=domain.match(ipDomainPat) if (IPArray!=null) { // es una dirección IP for (var i=1;i<=4;i++) { if (IPArray[i]>255) { return false } } return true } // Dominio es un nombre simbólico var domainArray=domain.match(domainPat) if (domainArray==null) { return false } /* Nombre de domino parece válido, pero ahora hay que asegurarse que finaliza en una palabra de tres letras (com, edu, gov) o una palbra de dos letras, representando el país (es, uk, nl), y hay un nombre de host precediendo al dominio o país */ // Ahora necesitamos dividir el dominio para obtener un cálculo del número de átomos que lo componen var atomPat=new RegExp(atom,"g") var domArr=domain.match(atomPat) var len=domArr.length if (domArr[domArr.length-1].length<2 || domArr[domArr.length-1].length>3) { // la dirección debe finalizar en una palabra de dos o tres letras. return false } // Nos aseguramos de que hay un nombre de host precediendo al dominio. if (len<2) { // La dirección omite el nombre de host. return false } // La dirección de e-mail tiene un formato correcto return true; } //******************************************************************************************************************* // FUNCIONES DE IMAGENES //******************************************************************************************************************* function MM_swapImgRestore() { //v3.0 var i,x,a=document.MM_sr; for(i=0;a&&i0&&parent.frames.length) { d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);} if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i= 0; indx-- ) if( document.images[ indx ].src.indexOf( 'ImgIndex' ) != -1 ) { img = document.images[ indx ]; break; } if (img != null) { if( img.src.indexOf( 'ImgIndex=1' ) > -1 ) { //Collapse... document.write( '' + sParCategory + '' ); img.alt = 'Ocultar detalles para ' + sParALT; } else { //Expand... document.write( '' + sParCategory + '' ); img.alt = 'Mostrar detalles para ' + sParALT; } } } /* TITULO: ModificarEnlace( sParContenido, sParCapa, sParAncla ) DESCRIPCION: Función que hace que al plegar o desplegar una categoria de una vista el cursor se posicione en una determinada posición ya dada. EJEMPLO DE USO: ModificarENlace( Categoria, Categoria, "Ancla" ); ARGUMENTOS: sParContenido Campo contenido a mostrar sParCapa Id de la capa que se genera para mostrar el contenido sParAncla Nombre del ancla en la que se posicionará el cursor cuando relice el plegado o desplegado de la categoria VALOR DE LA FUNCION: SUB/FUNCIONES USADAS: EXPLICACION DETALLADA: */ function ModificarEnlace( sParContenido, sParCapa, sParAncla ) { document.write( '' + sParContenido + '' ); var s; var oc = document.getElementById( sParCapa ); var o = oc.parentNode.firstChild; o.href += '#' +sParAncla; }