// Documento JavaScript: Comun.js

/*
	- 09/03/2005 abrirVentanaPrincipal(pcUrl)
	- 09/03/2005 cerrarSesion()
	- 09/03/2005 enviarFormulario(poFormulario, pcAction, pcMarcoObjetivo)
	- 09/03/2005 seleccionarComboConValor(poCombo, pcValor)
	- 09/03/2005 devolverValorSeleccionadoCombo(poCombo)
	- 09/03/2005 devolverTextoSeleccionadoCombo(poCombo)
	- 09/03/2005 cambiarTexto(poEtiqueta, pcTexto)
	- 09/03/2005 escribirFechaHoy(poCampoFecha)
	- 05/05/2005 validarFecha(poCampoFecha)
	- 09/03/2005 validarNif()
	- 09/03/2005 validarLetra()
	- 09/03/2005 validarNumero()
	- 09/03/2005 ocultar(poCapa)
	- 09/03/2005 mostrar(poCapa)
	- 09/03/2005 estaVisible(poCapa)
	- 09/03/2005 intercambiarClase(poObjeto, pcClaseAntigua, pcClaseNueva)
	- 09/03/2005 restaurarClase(poObjeto, pcClaseAntigua, pcClaseNueva)
	- 17/08/2005 habilitar(poObjeto)
	- 17/08/2005 deshabilitar(poObjeto)
	- 09/03/2005 botonOnFocus(poBoton)
	- 09/03/2005 trim(poCadena)
	- 09/03/2005 desplegarSubmodulo(poModulo, poClase)
	- 09/03/2005 fechas(poCampo)
	- 09/03/2005 tabulaAtras(poCampo, poDia, poMes)
	- 09/03/2005 validaDiaConMes(poDia, poMes)
	- 09/03/2005 verificaArray(paArray, piIndice)
	- 27/06/2005 addEvento(poElemento,psEvento,poManejador,psBubble)
	- 30/06/2005 controlarFuente()
	- 30/06/2005 calcularAltura(poElemento)
*/
function desplegarSubmodulo(poModulo,poClase){
	if (poClase.className == 'imgAbreCol'){
		mostrar(poModulo);
		intercambiarClase(poClase, 'imgAbreCol', 'imgCierraCol');
	}
	else{
		ocultar(poModulo);
		intercambiarClase(poClase, 'imgCierraCol', 'imgAbreCol');
	}
}
// Variables Globales:
var gcFormatoFecha = 'DD/MM/YYYY';
// Funciones Comunes:
/*	
	Ejecuta una llamada a la url que recibe como par&aacute;metro
	(por defecto la llamada a la primera p&aacute;gina de acceso),
	utilizando todo el espacio popsible para mostrarla

	Versi&oacute;n 1.0 19/08/2003 Alvaro Isorna B&aacute;ez

	param	pcUrl	contiene la direcci&oacute;n (URL) de la p&aacute;gina a mostrar
*/
function abrirVentanaPrincipal(pcUrl){
	// Variables para la ventana:
	var intHeight = 573; // altura de la ventana de la aplicaci&oacute;n
	var intWidth = 800; // anchura de la ventana de la aplicaci&oacute;n
	var intScreenX = 0; // posici&oacute;n en X de la ventana de la aplicaci&oacute;n
	var intScreenY = 0; // posici&oacute;n en Y de la ventana de la aplicaci&oacute;n
	var cName = "winExpa"; // nombre de la ventana de la aplicaci&oacute;n
	// caracter&iacute;sticas de la ventana de la aplicaci&oacute;n:
	var cFeatures = "screenX=" + intScreenX + ",screenY=" + intScreenY + ",height=" + intHeight + ",width=" + intWidth
						+ ",alwaysRaised=yes,dependent=yes,directories=no,menubar=no,resizable=no,scrollbars=no,titlebar=no,toolbar=no";
	var winExpa = window.open(pcUrl, cName, cFeatures);
	
	winExpa.moveTo(intScreenX, intScreenY);
	winExpa.resizeTo(intWidth, intHeight);
	winExpa.focus();
}

/*
	Cierra la sesi&oacute;n, haciendo una llamada al servidor para
	registrar la acci&oacute;n, y luego cerrando la ventana, en el
	caso de que confirmase la desconexi&oacute;n (tras &eacute;sto se le
	comunicar&aacute; al usuario el resultado de la desconexi&oacute;n)

	Versi&oacute;n 1.0 19/08/2003 Alvaro Isorna B&aacute;ez
*/
function cerrarSesion(){
	var cMensajeConfirmacion = "Va a cancelar su sesi&oacute;n de usuario,\nżdesea continuar?";	
	
	if(confirm(cMensajeConfirmacion)){
		// Este mensaje debe de venir como respuesta del servidor:
		aceptarventana('../html/aviso3.html','operaci&oacute;n realizada con &eacute;xito');
		window.parent.close();
	}
}

/*
	Env&iacute;a el formulario especificado al Action que se le pasa por par&aacute;metro.
	Opcionalmente puede recibir un tercer par&aacute;metro, especificando el
	marco objetivo del Action.

	Versi&oacute;n 1.0 19/08/2003 Alvaro Isorna B&aacute;ez

	param	poFormulario		objeto de tipo formulario (form)
	param	pcAction			contiene el Action al que enviamos el formulario
	param	pcMarcoObjetivo		contiene el nombre del marco al que enviamos el Action
*/
function enviarFormulario(poFormulario, pcAction, pcMarcoObjetivo){
	var cMarcoObjetivoOriginal = poFormulario.target;	
	
	if((pcMarcoObjetivo) && (pcMarcoObjetivo != null) && (pcMarcoObjetivo != "")){poFormulario.target = pcMarcoObjetivo;}
	if((pcAction) && (pcAction != null) && (pcAction != "")){poFormulario.action = pcAction;}	
	poFormulario.submit();
	if((pcMarcoObjetivo) && (pcMarcoObjetivo != null) && (pcMarcoObjetivo != "")){poFormulario.target = cMarcoObjetivoOriginal;}
}

/*
	Selecciona el elemento <option> de una combo a partir de un valor (value) determinado.
	Si no lo encuentra selecciona el elemento que tenga value="", si existe, 
	o si no el "-1".
	
	versi&oacute;n	1.0	28/08/2003	Alvaro Isorna B&aacute;ez
	
	param	poCombo	objeto <select> que queremos seleccionar
	param	pcValor	valor que buscamos en el "value" de los <option>
*/
function seleccionarComboConValor(poCombo, pcValor){
	var iNOptions = poCombo.options.length;
	var bEncontrado = false;	
	
	for(iBucle = 0; iBucle < iNOptions; iBucle++){
		if(poCombo.options[iBucle].value == pcValor){
			bEncontrado = true;
			poCombo.selectedIndex = iBucle;
		}
	}	
	
	if(!bEncontrado){
		for(iBucle = 0; iBucle < iNOptions; iBucle++){
			if(poCombo.options[iBucle].value == ""){
				bEncontrado = true;
				poCombo.selectedIndex = iBucle;
			}
		}
		if(!bEncontrado){poCombo.selectedIndex = -1;}
	}
}

/*
	Devuelve el valor seleccionado de una combo, o '' si no tiene ninguno seleccionado
	
	versi&oacute;n	1.0	28/08/2003	Alvaro Isorna B&aacute;ez
	
	param	poCombo	objeto <select> que queremos seleccionar
*/
function devolverValorSeleccionadoCombo(poCombo){
	var cValorDevuelto = '';	
	
	if(poCombo.selectedIndex > -1){cValorDevuelto = poCombo.options[poCombo.selectedIndex].value;}
	
	return cValorDevuelto;
}

/*
	Devuelve el texto seleccionado de una combo, o '' si no tiene ninguno seleccionado
	
	versi&oacute;n	1.0	28/08/2003	Alvaro Isorna B&aacute;ez
	
	param	poCombo	objeto <select> que queremos seleccionar
*/
function devolverTextoSeleccionadoCombo(poCombo){
	var cValorDevuelto = '';	
	
	if(poCombo.selectedIndex > -1){cValorDevuelto = poCombo.options[poCombo.selectedIndex].innerText;}
	
	return cValorDevuelto;
}

/*
	Cambia el texto de una etiqueta HTML con el texto que se le pase por par&aacute;metro

	Versi&oacute;n 2.0 04/02/2004 Alvaro Isorna B&aacute;ez

	param	poEtiqueta	etiqueta HTML (label, span, div, textarea, ...)
	param	pcTexto		contiene el texto que se ha de mostrar
*/
function cambiarTexto(poEtiqueta, pcTexto){
	if(poEtiqueta.tagName.toUpperCase() == "LABEL"){
		poEtiqueta.innerText = pcTexto;
	}else{
		poEtiqueta.value = pcTexto;
	}
}

/*
	Copia la fecha del d&iacute;a actual en el campo de fecha
	seleccionado.
	
	versi&oacute;n	2.0	11/11/2003	Alvaro Isorna B&aacute;ez
	param	poCampoFecha	campo de tipo fecha en el que escribimos
*/
function escribirFechaHoy(poCampoFecha){
	var dFechaHoy = new Date();
	var cFechaHoy = cFechaHoy = dFechaHoy.getDate() + '/' + (dFechaHoy.getMonth() + 1) + '/' + dFechaHoy.getYear();
	
	if(poCampoFecha.tagName.toUpperCase() == "LABEL"){
		poCampoFecha.innerText = cFechaHoy;
	}else{
		poCampoFecha.value = cFechaHoy;
	}
}

/*
	Valida que la fecha introducida en un campo posea un formato correcto
	(proveniente de la variable global gcFormatoFecha).
	En caso de que sea err&oacute;neo proporciona un mensaje de alerta y no deja
	salir del campo hasta que se cambie.
	Permite valores en blanco y en 'dd/mm/yyyy'.
	
	versi&oacute;n	1.0	05/05/2005	Alvaro Isorna B&aacute;ez
	param	poCampoFecha	campo que contiene en su "value" la fecha a
						comprobar
	return	bCorrecto	true/false
*/
function validarFecha(poCampoFecha){
	var cValorFecha = poCampoFecha.value;
	var cFormatoFecha = gcFormatoFecha;
	var bCorrecto = false;
	var cMensaje = 'Fecha incorrecta, por favor revise su formato (DD/MM/AAAA)';
	var arrDM = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
	var y = 0;
	var m = -1;
	var d = 0;
	var a = cValorFecha.split(/\W+/);
	var b = cFormatoFecha.split(/\W+/);
	var i = 0, j = 0; var c = '';
	
	if(cValorFecha != '' && cValorFecha != 'dd/mm/yyyy'){
		for(i = 0; i < a.length; ++i){
			c = b[i].toUpperCase();
			if(c == "D" || c == "DD"){d = parseInt(a[i], 10);}
			if(c == "M" || c == "MM"){m = parseInt(a[i], 10) - 1;}
			if(c == "Y" || c == "YY" || c == "YYYY"){y = parseInt(a[i], 10);}
		}
		// si alguno de los campos no es num&eacute;rico:
		if(isNaN(d) || isNaN(m) || isNaN(y)){
			bCorrecto = false;
		}else{
			// mes de febrero (a&ntilde;os bisiestos):
			if((y % 400) == 0 || (((y % 4) == 0) && ((y % 100) != 0))){arrDM[1] = 29;}
			if(y != 0 && (m != -1 && m < 12) && (d != 0 && d <= arrDM[m])){bCorrecto = true;}
		}
	}else{// (cValorFecha != '')
		bCorrecto = true;
	}
	if(!bCorrecto){
		
		
		aceptarventana('../html/aviso3.html',cMensaje);
		}
	
	return bCorrecto;
}

/*
	Se controla que s&oacute;lo se introduzcan los caracteres A-Z y 0-9.
	Se emplea para la introducci&oacute;n del NIF/CIF. Evento onkeyDown.

	versi&oacute;n	1.0	Alvaro Isorna
*/
function validarNif(){	
	// Caracteres v&aacute;lidos:
	var iKeyCode_Borrar = 8;
	var iKeyCode_Tabulador = 9;
	var iKeyCode_Seleccionar = 16;
	var iKeyCode_Ctrl = 17;
	var iKeyCode_Alt = 18;
	var iKeyCode_Inicio = 35;
	var iKeyCode_Fin = 36;
	var iKeyCode_Izquierda = 37;
	var iKeyCode_Arriba = 38;
	var iKeyCode_Derecha = 39;
	var iKeyCode_Abajo = 40;
	var iKeyCode_Suprimir = 46;
	var iKeyCode_0 = 48;
	var iKeyCode_9 = 57;
	var iKeyCode_A = 65;
	var iKeyCode_Z = 90;
	var iKeyCode_a = 97;
	var iKeyCode_z = 122;
	// Caracter recibido:
	var cKeyCodeRecibido = event.keyCode;
	
//	document.getElementById('nif').value = cKeyCodeRecibido;
	if(!(cKeyCodeRecibido >= iKeyCode_0 && cKeyCodeRecibido <= iKeyCode_9)
		&& !(cKeyCodeRecibido >= iKeyCode_A && cKeyCodeRecibido <= iKeyCode_Z)
		&& !(cKeyCodeRecibido >= iKeyCode_a && cKeyCodeRecibido <= iKeyCode_z)
		&& !(cKeyCodeRecibido >= iKeyCode_Izquierda && cKeyCodeRecibido <= iKeyCode_Abajo)
		&& (cKeyCodeRecibido != iKeyCode_Borrar)
		&& (cKeyCodeRecibido != iKeyCode_Tabulador)
		&& (cKeyCodeRecibido != iKeyCode_Suprimir)
		&& (cKeyCodeRecibido != iKeyCode_Inicio)
		&& (cKeyCodeRecibido != iKeyCode_Fin)){
		// Si no existe no se permite la escritura:
		event.returnValue = false;
	}
}

function validarLetra(){
	// Caracteres v&aacute;lidos:
	var iKeyCode_Borrar = 8;
	var iKeyCode_Tabulador = 9;
	var iKeyCode_Seleccionar = 16;
	var iKeyCode_Ctrl = 17;
	var iKeyCode_Alt = 18;
	var iKeyCode_Inicio = 35;
	var iKeyCode_Fin = 36;
	var iKeyCode_Izquierda = 37;
	var iKeyCode_Arriba = 38;
	var iKeyCode_Derecha = 39;
	var iKeyCode_Abajo = 40;
	var iKeyCode_Suprimir = 46;
	var iKeyCode_A = 65;
	var iKeyCode_Z = 90;
	/* 	los caracteres "a" a "z" coinciden con parte de los numeros recibidos por el teclado numerico,
		ademas, su KeyCode es el mismo q las mayusculas pero si esta presionado el SHIFT, o activado
		el ShiftLock teniendo el mismo KeyCode escribira en mayusculas.		*/
	// Caracter recibido:
	var cKeyCodeRecibido = event.keyCode;
	
	if (!(cKeyCodeRecibido >= iKeyCode_A && cKeyCodeRecibido <= iKeyCode_Z)
		&& 	!(cKeyCodeRecibido >= iKeyCode_Izquierda && cKeyCodeRecibido <= iKeyCode_Abajo)
		&& 	(cKeyCodeRecibido != iKeyCode_Borrar)
		&& 	(cKeyCodeRecibido != iKeyCode_Tabulador)
		&& 	(cKeyCodeRecibido != iKeyCode_Suprimir)
		&& 	(cKeyCodeRecibido != iKeyCode_Inicio)
		&& 	(cKeyCodeRecibido != iKeyCode_Fin)){
		// Si no existe no se permite la escritura:
		event.returnValue = false;
	} 
}

function validarNumero(){	
	// Caracteres v&aacute;lidos:
	var iKeyCode_Borrar = 8;
	var iKeyCode_Tabulador = 9;
	var iKeyCode_Seleccionar = 16;
	var iKeyCode_Ctrl = 17;
	var iKeyCode_Alt = 18;
	var iKeyCode_Inicio = 35;
	var iKeyCode_Fin = 36;
	var iKeyCode_Izquierda = 37;
	var iKeyCode_Arriba = 38;
	var iKeyCode_Derecha = 39;
	var iKeyCode_Abajo = 40;
	var iKeyCode_Suprimir = 46;
	var iKeyCode_0 = 48;
	var iKeyCode_9 = 57;
	var iKeyCode_0_TeclNum = 96;
	var iKeyCode_9_TeclNum = 105;
	// Caracter recibido:
	var cKeyCodeRecibido = event.keyCode;
	
	if (!(cKeyCodeRecibido >= iKeyCode_0 && cKeyCodeRecibido <= iKeyCode_9)
		&& 	!(cKeyCodeRecibido >= iKeyCode_Izquierda && cKeyCodeRecibido <= iKeyCode_Abajo)
		&& 	!(cKeyCodeRecibido >= iKeyCode_0_TeclNum && cKeyCodeRecibido <= iKeyCode_9_TeclNum)
		&& 	(cKeyCodeRecibido != iKeyCode_Borrar)
		&& 	(cKeyCodeRecibido != iKeyCode_Tabulador)
		&& 	(cKeyCodeRecibido != iKeyCode_Suprimir)
		&& 	(cKeyCodeRecibido != iKeyCode_Inicio)
		&& 	(cKeyCodeRecibido != iKeyCode_Fin)){
		// Si no existe no se permite la escritura:
		event.returnValue = false;
	}
}

/*
	Oculta una Capa de la pantalla.
	
	versi&oacute;n	2.0	13/01/2004	Alvaro Isorna B&aacute;ez
	param	poCapa		elemento que queremos ocultar
*/
function ocultar(poCapa){
	var acClases = poCapa.className.split(' ');
	var bEncontrado = false;
	
	if(acClases.length && acClases.length > 0){
		for(var iBucle = 0; iBucle < acClases.length; iBucle++){
			if(acClases[iBucle] == 'Visible' ||acClases[iBucle] == 'Inline'){
				acClases[iBucle] = 'Oculto';
				bEncontrado = true;
			}
		}
		poCapa.className = acClases.join(' ');
		if(!bEncontrado){poCapa.className += ' Oculto';}
	}else{
		poCapa.className = 'Oculto';
	}
}


/*
	Muestra una Capa de la pantalla.
	
	versi&oacute;n	2.0	13/01/2004	Alvaro Isorna B&aacute;ez
	param	poCapa		elemento que queremos mostar
*/
function mostrar(poCapa,estado){
	if (!estado) {
		var estado = 'Visible'
	}
	var acClases = poCapa.className.split(' ');
	var bEncontrado = false;
	
	if(acClases.length && acClases.length > 0){
		for(var iBucle = 0; iBucle < acClases.length; iBucle++){
			if(acClases[iBucle] == 'Oculto'){
				acClases[iBucle] = estado;
				bEncontrado = true;
			}
		}
		poCapa.className = acClases.join(' ');
		if(!bEncontrado){poCapa.className += estado;}
	}else{
		poCapa.className = 'Visible';
	}
}

/*
	Devuelve true si un objeto de la pantalla est&aacute; visible (que no posea la clase css 'Oculto').
	
	versi&oacute;n	2.0	11/12/2003	Alvaro Isorna B&aacute;ez
	param	poCapa			elemento del que queremos ver si est&aacute; visible.
	return	bReturnValue	boolean
*/
function estaVisible(poCapa){
	var acClases = poCapa.className.split(' ');
	var bReturnValue = true;
	
	if(acClases.length && acClases.length > 0){
		for(var iBucle = 0; iBucle < acClases.length; iBucle++){
			if(acClases[iBucle] == 'Oculto'){
				bReturnValue = false;
			}
		}
	}else{
		if(poCapa.className == 'Oculto'){
			bReturnValue = false;
		}
	}
	
	return bReturnValue;
}

/*
	Intercambia dos clases en un mismo objeto
	
	versi&oacute;n	1.0	09/02/2004	Alvaro Isorna B&aacute;ez
	par&aacute;metros:
	poObjeto
	pcClaseAntigua
	pcClaseNueva
*/
function intercambiarClase(poObjeto, pcClaseAntigua, pcClaseNueva){
	poObjeto.className = poObjeto.className.replace(pcClaseAntigua, pcClaseNueva);
}

/*
	Restura a las clases de la cabecera de listados
	
	versi&oacute;n	1.0	07/10/2004	Beatriz Gonzalez Mayoral
	par&aacute;metros:
	poObjeto
	pcClaseAntigua
	pcClaseNueva
*/
function restaurarClase(poObjeto, pcClaseAntigua, pcClaseNueva){
	poObjeto.className = poObjeto.className.replace(pcClaseAntigua, pcClaseNueva);
}

/*
	Habilita un objeto, respetando el tipo de elemento (como por ejemplo un bot&oacute;n de la barra de acci&oacute;n)
	
	versi&oacute;n	2.1	17/08/2005	Alvaro Isorna B&aacute;ez
	par&aacute;metros:
	poObjeto
*/
function habilitar(poObjeto){
	poObjeto.disabled = false
	intercambiarClase(poObjeto, 'deshabilitado', '');
}

/*
	Deshabilita un objeto, respetando el tipo de elemento (como por ejemplo un bot&oacute;n de la barra de acci&oacute;n)
	
	versi&oacute;n	2.1	17/08/2005	Alvaro Isorna B&aacute;ez
	par&aacute;metros:
	poObjeto
*/
function deshabilitar(poObjeto){
	poObjeto.disabled = true
	poObjeto.className += ' deshabilitado'
}

/* pone el foco en los botones (contextuales y de barra de accion) */
function botonOnFocus(poBoton){
	var oaBotones = poBoton.getElementsByTagName('button');
	
	if (oaBotones){
		for (var iBucle = 0; iBucle < oaBotones.length; iBucle++){
			if (!oaBotones[iBucle].disabled){
				try{oaBotones[iBucle].focus();}catch(er){};
				break;
			}
		}
	}
}

/* elimina espacios de principio y final de una cadena (BEA) */
function trim(poCadena){
      for(x=0; x<poCadena.length; )
      {
            if(poCadena.charAt(x)==" ")
                  poCadena=poCadena.substring(x+1, poCadena.length);
            else
                  break;
      }
     
	 for(x=poCadena.length-1; x>=0; x=poCadena.length-1)
      {
            if(poCadena.charAt(x)==" ")
                  poCadena=poCadena.substring(0,x);
            else
                  break;
      }
	  
      return(poCadena);
}

/*
	despliega o pliega el colapsador de los submodulos de agrupacion de datos
*/
function desplegarSubmodulo(poModulo,poClase){
	if (poClase.className == 'imgAbreCol'){
		mostrar(poModulo);
		intercambiarClase(poClase, 'imgAbreCol', 'imgCierraCol');
	}
	else{
		ocultar(poModulo);
		intercambiarClase(poClase, 'imgCierraCol', 'imgAbreCol');
	}
}

/* 
	campos fecha
*/
function fechas(poCampo, poDia, poMes, poAnio){
	if (poCampo.value.length==2 && (event.keyCode != 39 && event.keyCode != 37)){
		if (poCampo.id == poDia.id){
			poMes.focus();
			validaDiaConMes(poDia,poMes);
			
		}
		else{poDia.focus();}
		
		if (poCampo.id == poMes.id){
			poAnio.focus();
			validaDiaConMes(poDia,poMes);			
		}
	}	
	else{
	}
	tabulaAtras(poCampo,poDia,poMes);
}

/*
	pone el foco en el campo de fecha correspondiente
*/
function tabulaAtras(poCampo, poDia, poMes){
	if ((event.keyCode == 9 || event.keyCode == 16)  && poCampo.id == poMes.id) {
		poMes.focus();		
	}
	if ((event.keyCode == 9 || event.keyCode == 16) && poCampo.id == poDia.id) {
		poDia.focus();		
	}	
}

/* 
	valida el campo dia con el campo mes
*/
// el mes de febrero necesita del a&ntilde;o para validarse correctamente, as&iacute; que le dejamos en 29 y luego validamos correctamente al salir del campo
function validaDiaConMes(poDia,poMes){
	var oDiasMes = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

	meses = parseInt(poMes.value);
	meses = oDiasMes[meses-1];

	if (poMes.value != "" && poMes.value != "mm" && (isNaN(poMes.value) || poMes.value > 12 || poMes.value < 1)){
		aceptarventana('../html/aviso3.html','error en el mes');
		poMes.focus();
	} 
	else {
		if (poDia.value != "" && poDia.value != "dd" && (isNaN(poDia.value) || poDia.value < 1 || poDia.value > meses) ){ 
			aceptarventana('../html/aviso3.html','error en el d&iacute;a');
			poDia.focus();
		}
	}
}

/*
	verifica si existe un array de elementos
*/
function verificaArray(paArray, piIndice){
	var oRV = new Object();
	
	if (paArray.length){
		oRV = paArray[piIndice];
	}
	else{
		oRV = paArray;
	}
	
	return oRV;
}
function validar (Formulario,etiqueta) {
	var validado = true;
	for(i = 0; i < Formulario.length;i++) {
		if (Formulario[i].getAttribute(etiqueta) == "true" && Formulario[i].value == "") {
			//En caso de ser un select
			if(Formulario[i].children.length > 1 && Formulario[i][0].selected != true) {
				validado = true;
			}
			else {
			i = Formulario.length;
			validado = false;
			}
			
		}
		
	}
	if(validado == true) {
		ventana('confirmacion.htm','Los cambios han sido guardados correctamente')
		cerrar('true');
	}
	else
	{
		ventana('error.html','Debe rellenar todos los campos obligatorios');
	}	
	
}

/**
 * Agrega un comportamiento a un elemento de la pantalla.
 * poElemento -> Referencia al objeto al que se le aplicar&aacute; el comportamiento.
 * psEvento -> Evento a escuchar.(load,click,unload,change)
 * poManejador -> funci&oacute;n que va manejar el evento(se puede declarar en l&iacute;nea una funci&oacute;n an&oacute;nima)
 * psBubble -> Solo para W3C, poner true para IE 
 */ 
function addEvento(poElemento, psEvento, poManejador, psBubble){
	if (poElemento.addEventListener){ //W3C
	 	poElemento.addEventListener(psEvento, poManejador,psBubble);
	}else if(poElemento.attachEvent){ //IE
		poElemento.attachEvent("on" + psEvento, poManejador);
	}
}
//Funci&oacute;n para controlar el redimensionado de los elementos de la pantalla cuando se cambia el tama&ntilde;o de la fuente
/**********************************************************************
	Funci&oacute;n que se lanza al cambiar la fuente por medio de la tecla Ctrl
	y la rueda del raton.
	Maximiza y minimiza la ventana 10px y llama a la funcion de 
	Versi&oacute;n 1.0 17-05-2005 Beatriz Gonz&aacute;lez Mayoral
**********************************************************************/
function controlarFuente (){
	if(event.ctrlKey) {
		// 8 y 34 son las medidas del marco exterior del navegador
		window.setTimeout('top.resizeTo(top.document.body.offsetWidth + (8+10), top.document.body.offsetHeight + (34 + 10))', 500);
		window.setTimeout('top.resizeTo(top.document.body.offsetWidth + (8-14), top.document.body.offsetHeight + (34 - 14))', 600);

	}
}
//Evento que captura el movimiento de la rueda del rat&oacute;n
//document.onmousewheel = controlarFuente;
addEvento(document, 'mousewheel', controlarFuente);

// calcula la altura exacta (en ejecuci&oacute;n) de un elemento, incluyendo bordes, m&aacute;rgenes y padding
function calcularAltura(poElemento){
	var oElementStyle = poElemento.currentStyle || window.getComputedStyle(poElemento, null);
	var iAltura = 0;
	
	iAltura += (isNaN(oElementStyle.borderTopWidth.replace('px', ''))) ? 0 : Number(oElementStyle.borderTopWidth.replace('px', ''));
	iAltura += (isNaN(oElementStyle.borderBottomWidth.replace('px', ''))) ? 0 : Number(oElementStyle.borderBottomWidth.replace('px', ''));
	iAltura += (isNaN(oElementStyle.marginTop.replace('px', ''))) ? 0 : Number(oElementStyle.marginTop.replace('px', ''));
	iAltura += (isNaN(oElementStyle.marginBottom.replace('px', ''))) ? 0 : Number(oElementStyle.marginBottom.replace('px', ''));
	iAltura += (isNaN(oElementStyle.paddingTop.replace('px', ''))) ? 0 : Number(oElementStyle.paddingTop.replace('px', ''));
	iAltura += (isNaN(oElementStyle.paddingBottom.replace('px', ''))) ? 0 : Number(oElementStyle.paddingBottom.replace('px', ''));
	if(poElemento.clientHeight>0){
	iAltura += poElemento.clientHeight;
	}
	else{
	iAltura += poElemento.scrollHeight;
	}
	return iAltura;
}

// Controlar la seleccion multiple de checkboxes

function CheckBoxGroup() {
	this.controlBox=null;
	this.controlBoxChecked=null;
	this.maxAllowed=null;
	this.maxAllowedMessage=null;
	this.masterBehavior=null;
	this.formRef=null;
	this.checkboxWildcardNames=new Array();
	this.checkboxNames=new Array();
	this.totalBoxes=0;
	this.totalSelected=0;
	// Public methods
	this.setControlBox=CBG_setControlBox;
	this.setMaxAllowed=CBG_setMaxAllowed;
	this.setMasterBehavior=CBG_setMasterBehavior;	// all, some
	this.addToGroup=CBG_addToGroup;
	// Private methods
	this.expandWildcards=CBG_expandWildcards;
	this.addWildcardCheckboxes=CBG_addWildcardCheckboxes;
	this.addArrayCheckboxes=CBG_addArrayCheckboxes;
	this.addSingleCheckbox=CBG_addSingleCheckbox;
	this.check=CBG_check;
	}

// Set the master control checkbox name
function CBG_setControlBox(name) { this.controlBox=name; }

// Set the maximum number of checked boxes in the set, and optionally
// the message to popup when the max is reached.
function CBG_setMaxAllowed(num,msg) {
	this.maxAllowed=num;
	if (msg!=null&&msg!="") { this.maxAllowedMessage=msg; }
	}

// Set the behavior for the checkbox group master checkbox
//	All: all boxes must be checked for the master to be checked
//	Some: one or more of the boxes can be checked for the master to be checked
function CBG_setMasterBehavior(b) { this.masterBehavior = b.toLowerCase(); }

// Add checkbox wildcards to the checkboxes array
function CBG_addToGroup() {
	if (arguments.length>0) {
		for (var i=0;i<arguments.length;i++) {
			this.checkboxWildcardNames[this.checkboxWildcardNames.length]=arguments[i];
			}
		}
	}

// Expand the wildcard checkbox names given in the addToGroup method
function CBG_expandWildcards() {
	if (this.formRef==null) {alert("ERROR: No form element has been passed.  Cannot extract form name!"); return false; }
	for (var i=0; i<this.checkboxWildcardNames.length;i++) {
		var n = this.checkboxWildcardNames[i];
		var el = this.formRef[n];
		if (n.indexOf("*")!=-1) { this.addWildcardCheckboxes(n); }
		else if(CBG_nameIsArray(el)) { this.addArrayCheckboxes(n); }
		else { this.addSingleCheckbox(el); }
		}
	}


// Add checkboxes to the group which match a pattern
function CBG_addWildcardCheckboxes(name) {
	var i=name.indexOf("*");
	if ((i==0) || (i==name.length-1)) {
		searchString= (i)?name.substring(0,name.length-1):name.substring(1,name.length);
		for (var j=0;j<this.formRef.length;j++) {
			currentElement = this.formRef.elements[j];
			currentElementName=currentElement.name;
			var partialName = (i)?currentElementName.substring(0,searchString.length) : currentElementName.substring(currentElementName.length-searchString.length,currentElementName.length);
			if (partialName==searchString) {
				if(CBG_nameIsArray(currentElement)) this.addArrayCheckboxes(currentElement);
				else this.addSingleCheckbox(currentElement);
				}
			}
		}
	}

// Add checkboxes to the group which all have the same name
function CBG_addArrayCheckboxes(name) {
	if((CBG_nameIsArray(this.formRef[name])) && (this.formRef[name].length>0)) {
		for (var i=0; i<this.formRef[name].length; i++) { this.addSingleCheckbox(this.formRef[name][i]); }
		}
	}

function CBG_addSingleCheckbox(obj) {
	if (obj != this.formRef[this.controlBox]) {
		this.checkboxNames[this.checkboxNames.length]=obj;
		this.totalBoxes++;
		if (obj.checked) {
			this.totalSelected++;
			}
		}
	}

// Runs whenever a checkbox in the group is clicked
function CBG_check(obj) {
	var checked=obj.checked;
	if (this.formRef==null) {
		this.formRef=obj.form;
		this.expandWildcards();
		if (this.controlBox==null || obj.name!=this.controlBox) {
			this.totalSelected += (checked)?-1:1;
			}
		}
	if (this.controlBox!=null&&obj.name==this.controlBox) {
		if (this.masterBehavior=="all") {
			for (i=0;i<this.checkboxNames.length;i++) { this.checkboxNames[i].checked=checked; }
			this.totalSelected=(checked)?this.checkboxNames.length:0;
			}
		else {
			if (!checked) {
				obj.checked = (this.totalSelected>0)?true:false;
				obj.blur();
				}
			}
		}
	else {
		if (this.masterBehavior=="all") {
			if (!checked) {
				this.formRef[this.controlBox].checked=false;
				this.totalSelected--;
				}
			else { this.totalSelected++; }
			if (this.controlBox!=null) {
				this.formRef[this.controlBox].checked=(this.totalSelected==this.totalBoxes)?true:false;
				}
			}
		else {
			if (!obj.checked) { this.totalSelected--; }	
			else { this.totalSelected++; }
			if (this.controlBox!=null) {
				this.formRef[this.controlBox].checked=(this.totalSelected>0)?true:false;
				}
			if (this.maxAllowed!=null) {
				if (this.totalSelected>this.maxAllowed) {
					obj.checked=false;
					this.totalSelected--;
					if (this.maxAllowedMessage!=null) { alert(this.maxAllowedMessage); }
					return false;
					}
				}
			}
		}
	}

function CBG_nameIsArray(obj) {
	return ((typeof obj.type!="string")&&(obj.length>0)&&(obj[0]!=null)&&(obj[0].type=="checkbox"));
	}




////////////////////////////////////////////////////////////////////////////////////////