// Archivo:  	wk_funciones.js
// Version :	1.2
// Fecha:	Junio 22 2004
// Autor:	all@wikot.com
// Funcion: 	JavaScript Document
// 		Este archivo reúne un Pool de funciones Javascript útiles a la hora de hacer validaciones de formularios

function IsNumeric(sText, fName, fReq)
// Verifica que una cadena solamente contenga caracteres numéricos
//PARAM1 sText: El texto a validar
//PARAM2 fName: El nombre del campo a validar. Este parámetro se utiliza para mostrar el mensaje de error
//PARAM3 fReq: Se usa para indicar si un campo es requerido o no
//@autor: Nelio

{
	if(fReq&&sText.length==0) {
		alert("El campo " + fName + " es requerido");
		return false;
	} else {
		var ValidChars = "0123456789.,";
		for (i=0;i<sText.length;i++) { 
		  if (ValidChars.indexOf(sText.charAt(i)) == -1) {
			 alert("El campo " + fName + " sólo puede contener caracteres numéricos");
			 return false;
		  }
		}
		return true;
	}
}

function IsAlpha(sText, fName, fReq)
// Verifica que una cadena solamente contenga caracteres alfabeticos
//PARAM1 sText: El texto a validar
//PARAM2 fName: El nombre del campo a validar. Este parámetro se utiliza para mostrar el mensaje de error
//PARAM3 fReq: Se usa para indicar si un campo es requerido o no
//@autor: Nelio
{
	if(fReq&&sText.length==0) {
		alert("El campo " + fName + " es requerido");
		return false;
	} else {
		var ValidChars = " abcdefghijklmnñopqrstuvwxyzABCDEFGHIJKLMNÑOPQRSTUVWXYZáéíóúÁÉÍÓÚÜü";
		for (i=0;i<sText.length;i++) { 
		  if (ValidChars.indexOf(sText.charAt(i)) == -1) {
			 alert("El campo " + fName + " sólo puede contener caracteres alfabéticos");
			 return false;
		  }
		}
		return true;
	}
}

function IsAlphaNumeric(sText, fName, fReq)
// Verifica que una cadena solamente contenga caracteres alfabeticos
//PARAM1 sText: El texto a validar
//PARAM2 fName: El nombre del campo a validar. Este parámetro se utiliza para mostrar el mensaje de error
//PARAM3 fReq: Se usa para indicar si un campo es requerido o no
//@autor: Nelio
{
	if(fReq&&sText.length==0) {
		alert("El campo " + fName + " es requerido");
		return false;
	} else {
		var ValidChars = " .,0123456789abcdefghijklmnñopqrstuvwxyzABCDEFGHIJKLMNÑOPQRSTUVWXYZáéíóúÁÉÍÓÚÜü";
		for (i=0;i<sText.length;i++) { 
		  if (ValidChars.indexOf(sText.charAt(i)) == -1) {
			 alert("El campo " + fName + " sólo puede contener caracteres alfanuméricos");
			 return false;
		  }
		}
		return true;
	}
}

function isMailAddress(sText, fName, fReq) 
// NOTA: SE RECOMIENDA USAR LA NUEVA FUNCIÓN checkEmailAddress
// Verifica que una cadena sea una dirección de correo electrónico válida
//PARAM1 sText: El texto a validar
//PARAM2 fName: El nombre del campo a validar. Este parámetro se utiliza para mostrar el mensaje de error
//PARAM3 fReq: Se usa para indicar si un campo es requerido o no
//@autor: Nelio
{
	if(fReq&&sText.length==0) {
		alert("El campo " + fName + " es requerido");
	  
		return false;
	} else {
		if(sText.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) == -1) {
			alert("El campo " + fName + " no contiene una dirección de correo electrónico válida");
			return false;
		}
	}
	return true;
}
	function checkEmailAddress(emailStr, fieldName, required){
	// Verifica que una cadena sea una dirección de correo electrónico válida. Tambien verifica el final de la dirección para comprobaar 
	// si el usuario coloco una extesion valida (.com, .net, .museum, etc) o una extension de pais (.ve, .br, .es) aprobadas por el IANA
	// (www.inana.com)
	//PARAM1 emailStr: El texto a validar
	//PARAM2 fieldName: El nombre del campo a validar. Este parámetro se utiliza para mostrar el mensaje de error
	//PARAM3 required: Se usa para indicar si un campo es requerido o no
	// version 1.0
	// fecha 12-05-2005
	//@autor: Marcos H
		var validCountryDomains = new Array('ac','ad','ae','af','ag','ai','al','am','an','ao','aq','ar','as','at','au','aw','az','ax','ba','bb','bd',
											'be','bf','bg','bh','bi','bj','bm','bn','bo','br','bs','bt','bv','bw','by','bz','ca','cc','cd','cf','cg',
											'ch','ci','ck','cl','cm','cn','co','cr','cs','cu','cv','cx','cy','cz','de','dj','dk','dm','do','dz','ec',
											'ee','eg','eh','er','es','et','eu','fi','fj','fk','fm','fo','fr','ga','gb','gd','ge','gf','gg','gh','gi',
											'gl','gm','gn','gp','gq','gr','gs','gt','gu','gw','gy','hk','hm','hn','hr','ht','hu','id','ie','il','im',
											'in','io','iq','ir','is','it','je','jm','jo','jp','ke','kg','kh','ki','km','kn','kp','kr','kw','ky','kz',
											'la','lb','lc','li','lk','lr','ls','lt','lu','lv','ly','ma','mc','md','mg','mh','mk','ml','mm','mn','mo',
											'mp','mq','mr','ms','mt','mu','mv','mw','mx','my','mz','na','nc','ne','nf','ng','ni','nl','no','np','nr',
											'nu','nz','om','pa','pe','pf','pg','ph','pk','pl','pm','pn','pr','ps','pt','pw','py','qa','re','ro','ru',
											'rw','sa','sb','sc','sd','se','sg','sh','si','sj','sk','sl','sm','sn','so','sr','st','sv','sy','sz','tc',
											'td','tf','tg','th','tj','tk','tl','tm','tn','to','tp','tr','tt','tv','tw','tz','ua','ug','uk','um','us',
											'uy','uz','va','vc','ve','vg','vi','vn','vu','wf','ws','ye','yt','yu','za','zm','zw'
										);	
		var validTopLevelDomains = new Array('aero','biz','com','coop','info','museum','name','net','org','pro','gov','edu','mil','int');
		var filter=/^(\w+(?:\.\w+)*)@((?:\w+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i  //  <----- para que es esta 'i'?
		if(required && emailStr.length==0){
			alert("El campo [" + fieldName + '] es requerido');
			return false;
		}else if (!filter.test(emailStr)){
			alert('La dirección en el campo [' + fieldName + '] es inválida');
			return false;
		}else{
			var fullAddress=emailStr.split("@");
			fullDomain=fullAddress[1].split(".");
			domainEnding=fullDomain[fullDomain.length-1];
			if(domainEnding.length==2){		//si la dirección termina en DOS caracteres, se verifica si es un dominio de país válido
				testresults = false;
				for (i=0;i<validCountryDomains.length;i++)	{
					if (domainEnding==validCountryDomains[i]){
						testresults= testresults || true;
						break;
					}
				}
				if(!testresults){
					alert("La dirección de e-mail del campo [" + fieldName + "] termina en un dominio del pais inválido (\'." + domainEnding + "\')");
					return false;
				}
			}else{							//si la dirección termina en TRES caracteres, se verifica si es un dominio de primer nivel válido (Top level domain)
				testresults = false;
				for (i=0;i<validTopLevelDomains.length;i++)	{
					testresults= testresults || (domainEnding==validTopLevelDomains[i]);
				}
				if(!testresults){
					alert("La dirección de e-mail del campo [" + fieldName + "] termina en un dominio inválido (\'." + domainEnding + "\')");
					return false;
				}
			}
		}
		return true;
	} //end checkEmailAddress function

function isRequired(FieldControl, fName) 
// Verifica que un campo (cualquiera que sea tipo Radio, Text, Select, etc) tenga algún valor distinto de ""
//PARAM1 FieldControl: El nombre del campo HTML
//PARAM2 fName: El nombre del campo a validar. Este parámetro se utiliza para mostrar el mensaje de error
//@autor: Nelio
{
	if(FieldControl!=undefined){
		switch (FieldControl.type) {
			case "radio": 
							for(i=0;i<FieldControl.length;i++) {
								if(FieldControl[i].checked) return true;
							}
							alert("El campo " + fName + " es requerido");
							FieldControl.focus();
							return false;
							break;
						
			case "checkbox":
							mn=false;
							f=FieldControl.form;
							for (i = 0; i < f.elements.length; i++) {   
								if (f.elements[i].type=='checkbox')
									if (f.elements[i].name==FieldControl.name)		
										if (f.elements[i].checked) mn=true;
							}
							if (mn==false){	
								alert(fName);	
								return(mn);
							}else{
								return(true);
							}
							break;
							/*alert("len="+FieldControl);
							for(i=0;i<FieldControl.length;i++) {
								if(FieldControl[i].checked) alert("true");//return true;
							}
							alert(fName);						
							return false;
							break;*/	
			case "hidden":
							if (FieldControl.value.length==0) {
								alert("El campo " + fName + " es requerido");	
								return false;
							}
							break;
			
						
			case "text":
			
			case "password":
			
			case "textarea":
			
			case "file":
							if (FieldControl.value.length==0) {
								alert("El campo " + fName + " es requerido");	
								FieldControl.focus();
								return false;
							}
							break;
			case "select-one":
			case "select-multiple":
							if (FieldControl[FieldControl.selectedIndex].value=="") {
								FieldControl.focus();
								alert("El campo " + fName + " es requerido");	
								return false;
							}
							break;
		}
		return true;
	}else{
		alert("El campo " + fName + " es requerido");
		return false;
	}		
}

function checkPassword(pass, repass, fName) {
	if(pass.length==0) {
		alert("El campo " + fName + " es requerido");
		return false;
	} else if (repass.length==0) {
		alert("Debe introducir la confirmación del password"); 
		return false;
	} else if (pass!=repass) {
		alert("La contraseña y la confirmación no cinciden");
		return false;
	}
	return true;
}

/*function validar_usuario(f) {
//ejemplo de cómo usar las funciones para validar un usuario
	return (IsAlpha(f.str_name.value, "Nombre", true)&&IsAlpha(f.str_last_name.value, "Apellido", true));
}*/

function validar_elearning(f){
	if (f.nombre.value==""){
		alert("Debe especificar un nombre de Curso");
		return false;
	}
}

// Fecha:	Junio de 2004
// Funcion Desplegar. Menús
function desplegar(id,titulo,iconOff, iconOn) {
// Parametros: 	id:	 	id del element en el documento html
//				titulo:	titulo del item
//				iconOff: icono a utilizar cuando no esta desplegada la informacion pueden ser rutas de imagenes
//				iconOn:	 icono a utilizar cuando este desplegada la informacion
					
   // Busqueda del elemento
   obj=document.getElementById(id);
   // Chequea el despliegue
   visible=(obj.style.display!="none");
   text = "";
   if (visible) { 	
   	obj.style.display="none"; 	text = iconOff +" "+ titulo;      
   } else {  
   	obj.style.display="block";    text = iconOn +" "+ titulo;
   }
  // Reescribe el context del <a></a>
  document.getElementById("x" + id).innerHTML = text;
  
// Ejemplo de uso
// <tr>
//	<td><a id="x3" href="#" onclick="desplegar('3','Título','<img src=\'images\\pic_ico_flech_entrar.gif\' border=\'0\'>','<img src=\'images\\pic_ico_flech_up.gif\' border=\'0\'>')"><img src="images/pic_ico_flech_entrar.gif" border="0"> Título</a></td>
//	</tr>
// <tr id="3" style="display:none"> -- Importante esta sentencia --
//		<td>
//				<table>
//					<tr><td>Link 1</td></tr>
//					<tr><td>Link 2</td></tr>
//					<tr><td>Link 3</td></tr>
//				</table>
//		</td>
//	</tr>
}// function desplegar

// Fecha:	Junio de 2004
// Funcion Element. Registro

function Element(codPadre,codHijo,nombreHijo){
	this.codPadre = codPadre;
	this.codHijo = codHijo;
	this.nombreHijo = nombreHijo;
}//function Element

// Fecha:	Junio de 2004
// Funcion onLoadCombo. Selects

function onLoadCombo(cmbOrigen, cmbDestino, aInfo){
// Precondicion: 	cmbOrigen guarda alguna relacion con cmbDestino esta se tienen en el 
//					arreglo aInfo con la informacion de carga para el cmbDestino
//Parametros:		cmbOrigen - Select con la informacion de Origen al cambiar cambia la informacion del
//					cmbDestino - Select
//					aInfo:	arreglo de registrod de la forma Element definida anteriormente					

var i = 0;
var j = 0;

	cmbDestino.length = aInfo.length;
	cmbDestino.options[j] = new Option ('Seleccione.', '-1');
	cmbDestino.options[j].selected=true;
	
	//cmbDestino.options[j].selected=true;
	idToFind = cmbOrigen.options[cmbOrigen.selectedIndex].value;
	while(i<aInfo.length){
		if(idToFind==aInfo[i].codPadre){
			j++; cmbDestino.options[j] = new Option (aInfo[i].nombreHijo, aInfo[i].codHijo);
		}
	i++;
	}	
	cmbDestino.length = j+1;
	

}//function onLoadCombo

// Fecha:	Junio de 2004
// Funcion redimensionarCombo. Selects
function redimensionarCombo(cmb){
//Redimensiona los selects que se cargan de modo dinamico
//Parametros: cmb:	Select a redimensionar
	cmb.length = 1;
	cmb.options[0] = new Option ('Seleccione.', -1);
	
}//function redimensionarCombo


function trim(inputString){
// Elimina los espacios en blanco al principio y al final de un string
// PARAM1	inputString = El String a recortar
//
// version 2.0
//fecha 10/05/2005
//@autor: DreamweaverMX snippet code
//@editor: Marcos Hernandez
	if (inputString.length){
		while(''+inputString.charAt(0)==' ') inputString=inputString.substring(1,inputString.length);
		while(''+inputString.charAt(inputString.length-1)==' ')	inputString=inputString.substring(0,inputString.length-1);
	}
	return inputString;
}
function confirmar_multiple(f, nombreObjetoSingular, nombreObjetoPlural, sexo, accion, mensajeAdicional){
// Envia un alert al usuario indicandole que se va a eliminar una información
// Discrimina si se quieren eliminar o agregar uno o varios datos y presenta una notificación
// si no ha sido seleccionado ningun elemento.
// Ejemplo: 	confirmar_multiple(this, 'automovil', 'automoviles', 'm','eliminar');
// Ejemplo2:	confirmar_multiple(this, 'ciudad', 'ciudades', 'f','agregar');
// PARAM1 f					   	= el objeto form del formulario
// PARAM2 nombreObjetoSingular 	= String del nombre en singular
// PARAM3 nombreObjetoPlural   	= String del nombre en plural
// PARAM4 sexo					= indica si el objeto debe ser tratado como "la" o "el", Valores posibles: 'm' o 'f' 
// PARAM5 acción				= indica si se trata de un mensaje de 'eliminar', 'agregar', o alguna otra acción.
// PARAM6 mensajeAdicional		= Texto que se añadira al final de la pregunta, luego de un retorno de carro \n
// Version :	1.0
// Fecha: 10/05/2005
//@autor: Marcos Hernandez
	var checkboxes = f.elements['ids[]']; //esto es necesario para referirse al elemento ids[] ya que contiene corchetes en el nombre.
	nombreObjetoSingular = trim(nombreObjetoSingular.toLowerCase(),true);
	nombreObjetoPlural = trim(nombreObjetoPlural.toLowerCase(),true);
	var chequeados = 0;
	var mensaje = "¿Está seguro que desea " + accion;
	for(i=0;i<checkboxes.length;i++) chequeados += checkboxes[i].checked ;
	if(chequeados==0) {
		alert('No hay ningún elemento seleccionado');
		return false;	
	}else if(chequeados==1) {
		if(sexo=='f')			mensaje += " la " + nombreObjetoSingular +" seleccionada?";	//femenino singular
		else				 	mensaje += " el " + nombreObjetoSingular +" seleccionado?";	//masculino singular
	}else{
		if(sexo=='f')			mensaje += " las " + nombreObjetoPlural +" seleccionadas?";	//femenino plural
		else				 	mensaje += " los " + nombreObjetoPlural +" seleccionados?";	//masculino plural
	}
	if (!mensajeAdicional) mensajeAdicional = ' ';
	else mensajeAdicional = '\n' + mensajeAdicional;
	return confirm(mensaje + mensajeAdicional);
}

function confirmar_eliminar(texto){
// Envia un alert al usuario indicandole que se va a eliminar una información
// PARAM1 text indica en el mensaje que es lo que se va a eliminar ejemplo: Usuario(s)
// Version :	1.0
// Fecha: 19/08/2004		
	return(confirm(texto));
}

function validar_password(fPassword1,fPassword2,Nombre1,Nombre2,Caracteres){
// Verifica que una cadena solamente contenga una cantidad de caracteres especifica
// PARAM1 fPassword1: El texto a validar (STRING)
// PARAM2 fPassword2: El texto a validar (STRING)
// PARAM3 Nombre1: El nombre del campo a validar. Este parámetro se utiliza para mostrar el mensaje de error (STRING)
// PARAM4 Nombre2: El nombre del campo a validar. Este parámetro se utiliza para mostrar el mensaje de error (STRING)
// PARAM5 Caracteres: Cantidad de Caracteres (STRING)
// Version :	1.0
// Fecha: 19/08/2004
// @autor: Tonny Goncalves
	if (fPassword1.length < Caracteres){
		alert("El campo "+Nombre1+" debe ser mayor o igual a "+Caracteres);
		return false;
	}
	if (fPassword1!=fPassword2){
		alert("El campo "+Nombre1+" y "+Nombre2+" deben ser iguales");
		return false;
	}
	return true;
}

function validar_fechas(date_one,date_two,mensaje){
// Verifica Entre dos Timestamps, uno inicial sea menor a uno final
// PARAM1 $date_one (TIMESTAMP)
// PARAM2 $date_two (TIMESTAMP)
// PARAM3 $mensaje  (STRING)
// Version :	1.0
// Fecha: 19/08/2004
// @autor: Tonny Goncalves       
    anoi=parseInt(date_one.substr(0,4),10);
	anof=parseInt(date_two.substr(0,4),10);
	
	mesi=parseInt(date_one.substr(4,2),10);
	mesf=parseInt(date_two.substr(4,2),10);
	
	diai=parseInt(date_one.substr(6,2),10);
	diaf=parseInt(date_two.substr(6,2),10);

	if (mesi<10){ mesi="0"+mesi; }
	if (mesf<10){ mesf="0"+mesf; }
	if (diai<10){ diai="0"+diai; }
	if (diaf<10){ diaf="0"+diaf; }
	vari=String(anoi)+String(mesi)+String(diai);
	varf=String(anof)+String(mesf)+String(diaf);
   	if (parseInt(vari)>parseInt(varf)){	 
		alert(mensaje);       
		return false;
	}else{
		return true;//true
	}	
}

function FechaValida(date,mensaje) {
// Verifica un Timestamps que sea una fecha valida ejem: 31-02-2004
// PARAM1 $date (TIMESTAMP)
// PARAM3 $mensaje  (STRING)
// Version :	1.0
// Fecha: 26/08/2004
// @autor: Tonny Goncalves - Amora
	
  var fecha=parseInt(date,10)
	
	if ((isNaN(fecha))||(date.length<6)){  
	
		alert(mensaje);
	 	return false;
	} else { 

  
	aaaa = parseInt(date.substr(0,4),10);
	mm   = parseInt(date.substr(4,2),10);
	dd   = parseInt(date.substr(6,2),10);	
	var feb = 29;
	if((parseInt(aaaa)%4)!=0) feb=28; 
		
	var meses = new Array(31,feb,31,30,31,30,31,31,30,31,30,31); 

	if(parseInt(dd) > meses[parseInt(mm)-1]){
	  
		alert(mensaje);
	 	return false;
	}else{
		return true;			
	}
	}
}//function FechaValida

function changeDate(parte,valor, destino){
// Construye el valor de la fecha en formato yyyymmddhhmmss
// Param: parte = parte de la fecha a tratar
// Param: valor = valor asignado a esa parte de la fecha
// Param destino = campo ocultop donde se almacena la fecha con el formato
// Autor : Amora 

switch(parte.toUpperCase()){
	
	case "YYYY" :    
				destino.value = valor.value + destino.value.substring(4);	
		  	break;    
		  
	case "MM" :    
		  		destino.value = destino.value.substring(0,4) + valor.value + destino.value.substring(6);		//here
				//alert(destino.value);
		  	break;    

	case "DD" :    
		  		destino.value = destino.value.substring(0,6) + valor.value + destino.value.substring(8);
				//alert(destino.value);		
			break;    
	
	case "HH" :    
				destino.value = destino.value.substring(0,8) + valor.value + destino.value.substring(10);
		  	break;    
		  
	case "MIN" :  
				destino.value = destino.value.substring(0,10) + valor.value + destino.value.substring(12);  
		  break;    

	case "SS" :    
				destino.value = destino.value.substring(0,12) + valor.value ;
		  break;    

	
}//fswitch

}//function changeDate