﻿
//Función q identifica si un campo esta vacio
// campo -> es el txtbx que se valida
function esTxbxVacio(campo)
{
	if(campo.value == "" ||	campo.value == null)// ||	!isNaN(campo.value))
	{
		return true;
	}
	else
		return false;
}

/* Funcion q obtiene un el control deseado con parte del Id del mismo
// parent--> padre del elemento q se busca.
// identificador --> parte del Id q se esta buscando, debe ser único para obtener un solo elemento.
// tagname --> nombre del tipo de etiqueta a la cual pertenece el control q se busca.*/
function getControl(parent,identificador, tagname)
{
    //Expresión regular q termina con el nombre del identificador especificado
    var regexCtrl = new RegExp('('+ identificador +'){1,}');
    
    //obtencion de los elementos segun el tagName especificado
    var elemsTagName = parent.getElementsByTagName(tagname);
    
    var i;
    for(i = 0; i< elemsTagName.length; i++)
    {
        if(regexCtrl.test(elemsTagName[i].id))
        {
            return elemsTagName[i];
        }
    }
    return null;
}

//funcion que valida el RFC
function valRFC(campo)
{ 
	var regexRFC = /^[a-zA-z]{1}[aeiouAEIOU]{1}[a-zA-Z]{2}\d{2}([0]{1}[123456789]{1}|[1]{1}[012]{1})([3]{1}[01]{1}|[012]{1}\d{1})(\w{0,3})$/;
	var val = campo.value;
	if(regexRFC.test(val))
		return '';
	else
		return obtieneTexto('fGeneralesMsgRFCNoValido');//***'El RFC no es valido.';
}

//Funcion que regresa una cadena en formato yyyymmdd con la fecha actual
function fechaAct()
{ 
    var diaAct, mesAct, añoAct, resAct, fecha;
    fecha=new Date();
    diaAct = fecha.getDate();
    mesAct = fecha.getMonth() +1;
    añoAct = fecha.getFullYear();
    if (diaAct < 10) diaAct = "0" + diaAct.toString();
    else diaAct = diaAct.toString();
    if (mesAct < 10) mesAct = "0" + mesAct.toString();
    else mesAct = mesAct.toString();
    añoAct = añoAct.toString();
    resAct = añoAct+mesAct+diaAct;
    return resAct;
}

function formatNumber(campo,prefix)
{
    var num;
    num = Math.round(parseFloat(campo.value)*Math.pow(10,2))/Math.pow(10,2)
    prefix = prefix || '';
    num += '';
    var splitStr = num.split('.');
    var splitLeft = splitStr[0];
    var splitRight = splitStr.length > 1 ? '.' + splitStr[1] : '.00';
    splitRight = splitRight + '00';
    splitRight = splitRight.substr(0,3);
    var regx = /(\d+)(\d{3})/;
    while (regx.test(splitLeft)) 
    {
        splitLeft = splitLeft.replace(regx, '$1' + ',' + '$2');
    }
    campo.value = prefix + splitLeft;
}

function edadCURP(campo)
{
    var res, fecAct, difAños, resAct;
    if (campo.value.length > 0)
    {        
        res = parseInt(campo.value.substring(6,10)+campo.value.substring(3,5)+campo.value.substring(0,2));
        resAct = parseInt(fechaAct());
        if (res>resAct) alert(obtieneTexto('fGeneralesMsgRFCNoValido'));
        else 
        {
            difAnios = difFec(res, resAct);
            document.getElementById('txbxSolEdad').value=difAnios;	    
        }
    }
}

//Funcion que determina la edad con el RFC
function edadRFC(campo)
{ 
    var validRFC, año, fecha, res, fecAct, difAños, resAct;
    validRFC = valRFC(campo);
    if (validRFC.length > 0)
		alert(validRFC);
	else
	{
	    anio = parseInt(campo.value.substring(4,6));
	    fecha = parseInt(campo.value.substring(4,10));	    
	    if (anio>18)
	    {
	        año = ((1900) * 10000);
	        res = fecha + año;
	    }
	    else 
	    {
	        if (campo.value.substring(4,5)=="0")
	        {
	            res = parseInt("200" + campo.value.substring(5,10));   
	        }
	        else
	        {
	            año = ((2000) * 10000);
    	        res = fecha + año;
	        }
	    }
	    resAct = parseInt(fechaAct());
	    if (res>resAct) alert(obtieneTexto('fGeneralesMsgRFCNoValido'));//***//alert('RFC no valido');
	    else 
	    {
	        difAnios = difFec(res, resAct);
	        document.getElementById('txbxSolEdad').value=difAnios;	    
	    }
	}		
}

function difFec(fecIni, fecAct)
{
    var años;
    años = -1;
    while (fecIni<fecAct)
    {
        fecAct=fecAct-10000;
        años = años + 1;
    }
    return años;
}
//funcion que valida el CURP
function valCURP(campo)
{
	var regexCURP = /^[a-zA-z]{1}[aeiouAEIOU]{1}[a-zA-Z]{2}\d{2}([0]{1}[123456789]{1}|[1]{1}[012]{1})([3]{1}[01]{1}|[012]{1}\d{1})[a-zA-z]{6}\d{2}$/;
	var val = campo.value;
	if(regexCURP.test(val))
		return '';
	else
		return obtieneTexto('fGeneralesMsgCURPNoValido');//***'El CURP no es valido.';
}


/**
 * Función que comprueba a través de expresiones regulares el formato de un campo.
 *
 * @param campo El campo a validar.
 * @param tipo El tipo que es permitido.
 */
function validaFormato(campo, tipo) 
{
    var codigoChar = (event.which) ? event.which : event.keyCode;
    // Reviso que no se comprueben las flechas, para que se puedan mover con ellas, dentro de los campos.
    if (codigoChar != 37 && codigoChar != 38 && codigoChar != 39 && codigoChar != 40) 
    {
        if (tipo == 'numerico' && campo.value.match(/[^\d]+/g)) 
        {
            var indice = campo.value.search(/[^\d]+/g);
            campo.value = campo.value.replace(/[^\d]+/g, '');
			establecerPosicionCursor(campo, indice);
        }
		if (tipo == 'mail' && campo.value.match(/[^\a-z@_\-.0-9]+/g)) 
		{
			var bandera = true;
			var indiceMin = -1982;
			var indiceMinMax = 1;
			if (campo.value.match(/[A-Z]+/g)) 
			{
				bandera = false;
				indiceMin = campo.value.search(/[A-Z]+/g);
				var i = indiceMin + 1;
				while (campo.value.charAt(i).match(/[A-Z@_\-.0-9]+/g)) 
				{
					i++;
				}
				var j = 1;
				while (campo.value.charAt(indiceMin - j).match(/[^\A-Za-z@_\-.0-9]+/g)) 
				{
					i--;
					j++;
				}
				indiceMinMax = i;
				campo.value = campo.value.toLowerCase();
			}
			var indice = campo.value.search(/[^\a-z@_\-.0-9]+/g);
			campo.value = campo.value.replace(/[^\a-z@_\-.0-9]+/g, '');
			if (bandera) 
			{
				establecerPosicionCursor(campo, indice);
			}
			else 
				if (indiceMin >= 0) 
				{
					establecerPosicionCursor(campo, indiceMin + (indiceMinMax - indiceMin));
				}
		} 
    }
}

/**
 * Función que establece la posición del cursor en el indice indicado
 * @param campo El campo a validar.
 * @param indice El indice en el que se requiere el cursor.
 */
function establecerPosicionCursor(campo, indice) {
	var range = campo.createTextRange();
	range.collapse(true);
	range.moveEnd('character', indice);
	range.moveStart('character', indice);
	range.select();
}

//funcion q limpia los controles hijos del padre especificado
//ctrl -> padre cuyos controles hijos seran limpiados
function limpiaCtrls(ctrl)
{
    var inputs = ctrl.getElementsByTagName('input');
    var selects = ctrl.getElementsByTagName('select');
    var txtareas = ctrl.getElementsByTagName('textarea');
    
    var i;
    for( i=0; i<inputs.length; i++)
    {
        switch(inputs[i].type)
        {
            case 'text':
                        {
                            inputs[i].value = '';
                            break;
                        }
            case 'radio':
                        {
                            inputs[i].checked = false;
                            break;
                        }
            case 'checkbox':
                        {
                            inputs[i].checked = false;
                            break;
                        }
            default:
                        {
                            break;
                        }
        }
    }
    
    for( i=0; i<selects.length; i++)
    {
        selects[i].selectedIndex = 0;
    }
    for( i=0; i<txtareas.length; i++)
    {
        txtareas[i].value = '';
    }
}

//función para verificar Emails mostrando un alert, regresa true/false
function emailCheck (emailStr) 
{

	/* The following variable tells the rest of the function whether or not
	to verify that the address ends in a two-letter country or well-known
	TLD.  1 means check it, 0 means don't. */
	var checkTLD=1;
	var knownDomsPat=/^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$/;
	var emailPat=/^(.+)@(.+)$/;
	var specialChars="\\(\\)><@,;:\\\\\\\"\\.\\[\\]";
	var validChars="\[^\\s" + specialChars + "\]";
	var quotedUser="(\"[^\"]*\")";
	var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
	var atom=validChars + '+';
	var word="(" + atom + "|" + quotedUser + ")";
	var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
	var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");
	var matchArray=emailStr.match(emailPat);

	if (matchArray==null) 
	{
		alert(obtieneTexto('fGeneralesMsgMailNoValido'));//***"La direccion de correo es incorrecta (verifique @ y .'s)");
		return false;
	}
	var user=matchArray[1];
	var domain=matchArray[2];

	for (i=0; i<user.length; i++) 
	{
		if (user.charCodeAt(i)>127) 
		{
			alert(obtieneTexto('fGeneralesMsgUsuarioCaracteresInvalidos'));//***"El nombre de Usuario contiene caracteres invalidos");
			return false;
		}
	}
	for (i=0; i<domain.length; i++) 
	{
		if (domain.charCodeAt(i)>127) 
		{
			alert(obtieneTexto('fGeneralesMsgDominioCaracteresInvalidos'))//***"El dominio contiene caracteres invalidos");
			return false;
		}
	}

	if (user.match(userPat)==null) 
	{
		alert(obtieneTexto('fGeneralesMsgNombreUsuarioNoValido'));//***"El nombre de usuario no es valido.");
		return false;
	}

	var IPArray=domain.match(ipDomainPat);
	if (IPArray!=null) 
	{
		for (var i=1;i<=4;i++) 
		{
			if (IPArray[i]>255) 
			{
				alert(obtieneTexto('fGeneralesIPNoValida'));//***"La IP destino no es valida");
				return false;
		    }
		}
		return true;
	}

	var atomPat=new RegExp("^" + atom + "$");
	var domArr=domain.split(".");
	var len=domArr.length;
	for (i=0;i<len;i++) 
	{
		if (domArr[i].search(atomPat)==-1) 
		{
			alert(obtieneTexto('fGeneralesMsgDominioInvalido'));//***"El nombre del dominio parece ser invalido");
			return false;
		}
	}

	if (checkTLD && domArr[domArr.length-1].length!=2 && 
	domArr[domArr.length-1].search(knownDomsPat)==-1) 
	{
		alert(obtieneTexto('fGeneralesMsgDominioConicido'));//***"La direccion debe terminar con un dominio conocido o dos letras de pais");
		return false;
	}
	if (len<2) 
	{
		alert(obtieneTexto('fGeneralesMsgNoHostName'));//***"La direccion no posee hostname");
		return false;
	}
	return true;
}

//función para verificar Emails regresando el string del error en caso de ser requerido
function emailCheck2 (emailStr) 
{

	/* The following variable tells the rest of the function whether or not
	to verify that the address ends in a two-letter country or well-known
	TLD.  1 means check it, 0 means don't. */
	var checkTLD=1;
	var knownDomsPat=/^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$/;
	var emailPat=/^(.+)@(.+)$/;
	var specialChars="\\(\\)><@,;:\\\\\\\"\\.\\[\\]";
	var validChars="\[^\\s" + specialChars + "\]";
	var quotedUser="(\"[^\"]*\")";
	var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
	var atom=validChars + '+';
	var word="(" + atom + "|" + quotedUser + ")";
	var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
	var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");
	var matchArray=emailStr.match(emailPat);

	if (matchArray==null) 
	{
		return obtieneTexto('fGeneralesMsgMailIncorrecto')  + "\n";//***"La direccion de correo es incorrecta (verifique @ y puntos)";
	}
	var user=matchArray[1];
	var domain=matchArray[2];

	for (i=0; i<user.length; i++) 
	{
		if (user.charCodeAt(i)>127) 
		{
			return obtieneTexto('fGeneralesMsgUsuarioCaracteresInvalidos') + "\n";//***"El nombre de Usuario contiene caracteres invalidos";
		}
	}
	for (i=0; i<domain.length; i++) 
	{
		if (domain.charCodeAt(i)>127) 
		{
			return obtieneTexto('fGeneralesMsgDominioCaracteresInvalidos') + "\n";//***"El dominio contiene caracteres invalidos";
		}
	}

	if (user.match(userPat)==null) 
	{
		return obtieneTexto('fGeneralesMsgNombreUsuarioNoValido') + "\n";//***"El nombre de usuario no es valido.";
	}

	var IPArray=domain.match(ipDomainPat);
	if (IPArray!=null) 
	{
		for (var i=1;i<=4;i++) 
		{
			if (IPArray[i]>255) 
			{
				return obtieneTexto('fGeneralesMsgIPNoValida') + "\n";//***"La IP destino no es valida";
		    }
		}
		return "";
	}

	var atomPat=new RegExp("^" + atom + "$");
	var domArr=domain.split(".");
	var len=domArr.length;
	for (i=0;i<len;i++) 
	{
		if (domArr[i].search(atomPat)==-1) 
		{
			return obtieneTexto('fGeneralesMsgDominioInvalido') + "\n";//***"El nombre del dominio parece ser invalido";
		}
	}

	if (checkTLD && domArr[domArr.length-1].length!=2 && 
	domArr[domArr.length-1].search(knownDomsPat)==-1) 
	{
		return obtieneTexto('fGeneralesMsgDominioConocido') + "\n";//***"La direccion debe terminar con un dominio conocido o dos letras de pais";
	}
	if (len<2) 
	{
		return obtieneTexto('fGeneralesMsgNoHostName') + "\n";//***"La direccion no posee hostname";
	}
	return "";
}

//Funcion q muestra/oculta el campo de Especifique para el Tipo de Telefono
//ctrl->dropdownlist del q se selecciona la opcion
function selTipoTel(ctrl)
{
    var padre = ctrl.parentNode;
    var spanEspecifique;
    regexCtrl = new RegExp('telTipoEsp{1,}$');
    var i;
    for( i=0; i<padre.childNodes.length; i++)
    {
        if(regexCtrl.test(padre.childNodes[i].id))
        {
            spanEspecifique = padre.childNodes[i];
        }
    }
    switch(ctrl.options[ctrl.selectedIndex].text)
	{
		case 'Seleccione':
		case 'Select':
					{
						spanEspecifique.style.display = 'none';
						getControl(spanEspecifique, 'txbxTelTipoEsp', 'input').value = "";
						break;
					}
		case 'Otro':
		case 'Other':
					{
						spanEspecifique.style.display = '';
						break;
					}
		default:
		        {
						spanEspecifique.style.display = 'none';
						getControl(spanEspecifique, 'txbxTelTipoEsp', 'input').value = "";
						break;
		        }			
	}
}

//funcion q muestra/oculta el campo de Clave Internacional
//ctrl -> radiobutton sobre el cual se evalua el comportamiento
function telCveInt(ctrl)
{
    var spanTel = ctrl.parentNode.parentNode;
    var spanCveInt, rdbtnSi, rdbtnNo, txbxEsp;

    rdbtnSi = getControl(spanTel, 'rdbtnTelSi', 'input');
    rdbtnNo = getControl(spanTel, 'rdbtnTelNo', 'input');
    spanCveInt = getControl(spanTel, 'telCveInt', 'span');
    txbxEsp = getControl(spanTel, 'txbxTelCveInt', 'input');
    
    if(!rdbtnSi.checked && !rdbtnNo.checked)
    {
        spanCveInt.style.display = 'none';
    }
    if(rdbtnSi.checked)
	{
		if(rdbtnNo.checked == false )
			spanCveInt.style.display = 'none';
	}
	if(rdbtnNo.checked)
	{
		spanCveInt.style.display = '';
		txbxEsp.value = '';
	}
}

//funcion q indica el comportamiento de los controles segun la seleccion del pais p/domicilio
//ctrl -> radiobutton sobre el cual se evalua el comportamiento
function selDomPais(ctrl)
{
    var padre = ctrl.parentNode;
    var spanPaisEsp, btnRefresh;
    
    spanPaisEsp = getControl(padre, 'paisEsp', 'span');
    btnRefresh = getControl(padre, 'btnUpdateEdos', 'input');
    
    btnRefresh.click();
    
    switch(ctrl.options[ctrl.selectedIndex].text)
	{
		case 'Mexico':
		case 'México':
					{
						spanPaisEsp.style.display = 'none';
						getControl(padre, 'colonia', 'span').style.display = '';
						getControl(padre, 'txbxDomCol', 'input').value = '';
						break;
					}
		case 'Otro':
		case 'Other':
					{
						spanPaisEsp.style.display = '';
						getControl(padre, 'txbxDomPaisEsp', 'input').value = '';
						getControl(padre, 'colonia', 'span').style.display = 'none';
						break;
					}
		default:
		        {
						spanPaisEsp.style.display = 'none';
						getControl(padre, 'colonia', 'span').style.display = 'none';
						break;
		        }			
	}
}

//funcion q indica el comportamiento de los controles segun la seleccion del Estado p/domicilio
//ctrl -> radiobutton sobre el cual se evalua el comportamiento
function selDomEstado(ctrl)
{
    var padre = ctrl.parentNode.parentNode.parentNode;
    var spanEdoEsp, btnRefresh;
    
    spanEdoEsp = getControl(padre, 'edoEsp', 'span');
    btnRefresh = getControl(padre, 'btnUpdateDels', 'input');
    
    btnRefresh.click();
    
    switch(ctrl.options[ctrl.selectedIndex].text)
	{
		case 'Otro':
		case 'Other':
					{
						spanEdoEsp.style.display = '';
						getControl(padre, 'txbxDomEdoEsp', 'input').value = '';
						break;
					}
		default:
		        {
						spanEdoEsp.style.display = 'none';
						break;
		        }			
	}
}

//funcion q indica el comportamiento de los controles segun la seleccion de Del/Mun p/domicilio
//ctrl -> radiobutton sobre el cual se evalua el comportamiento
function selDomDel(ctrl)
{
    var padre = ctrl.parentNode.parentNode.parentNode;
    var spanDelEsp;
    
    spanDelEsp = getControl(padre, 'delEsp', 'span');
    
    switch(ctrl.options[ctrl.selectedIndex].text)
	{
		case 'Otro':
		case 'Other':
					{
						spanDelEsp.style.display = '';
						getControl(padre, 'txbxDomDelEsp', 'input').value = '';
						break;
					}
		default:
		        {
						spanDelEsp.style.display = 'none';
						break;
		        }			
	}
}

//funcion para validar Telefono
// padre -> span contenedor de telefono
// regresa una cadena con la validacion de cada uno de los campos de telefono
function valTel(padre)
{
    var errTel = "";
    var ctrlPregSi = getControl(padre, 'rdbtnTelSi', 'input');
    var ctrlPregNo = getControl(padre, 'rdbtnTelNo', 'input');
    
    if(ctrlPregSi.checked == false && ctrlPregNo.checked == false)
    {
        errTel += " - " + obtieneTexto('Pregunta') + "\n";//***" - Pregunta \n";
    }
    
    if(ctrlPregSi.checked == false && ctrlPregNo.checked == true)
    {
        ctrlTmp = getControl(padre, 'txbxTelCveInt', 'input');
        if(esTxbxVacio(ctrlTmp))
            errTel += " - " + obtieneTexto('fGeneralesTelClaveIternacional') + "\n";//***" - Clave Internacional \n";
    }
    
    ctrlTmp = getControl(padre, 'txbxTelLada', 'input');
    if(esTxbxVacio(ctrlTmp))
        errTel += " - " + obtieneTexto('fGeneralesTelClaveLada') + "\n";//***" - Lada \n";
    
    ctrlTmp = getControl(padre, 'txbxTelTel', 'input');
    if(esTxbxVacio(ctrlTmp))
        errTel += " - " + obtieneTexto('Telefono') + "\n";//***" - Telefono \n";
        
    ctrlTmp = getControl(padre, 'ddlTelTipo', 'select');
    if(ctrlTmp.options[ctrlTmp.selectedIndex].text == 'Seleccione'||
        ctrlTmp.options[ctrlTmp.selectedIndex].text == 'Select')
    {
        errTel += " - " + obtieneTexto('fGeneralesTipoTel') + "\n";//***" - Tipo Telefono \n";
    }
    
    if(ctrlTmp.options[ctrlTmp.selectedIndex].text == 'Otro' ||
        ctrlTmp.options[ctrlTmp.selectedIndex].text == 'Other')
    {
        ctrlTmp = getControl(padre, 'txbxTelTipoEsp','input');
        if(esTxbxVacio(ctrlTmp))
            errTel += " - " + obtieneTexto('Especifique') + " " + obtieneTexto('fGeneralesTipoTel') + "\n";//***" - Especifique Tipo Telefono \n";
    }
    
    return errTel;
}

//funcion para validar Email
// padre -> span contenedor de email
// regresa una cadena con la validacion de cada uno de los campos de email
function valMail(padre)
{
    var errMail = "";
    
    ctrlTmp = getControl(padre, 'txbxMailMail', 'input');
    if(esTxbxVacio(ctrlTmp))
        errMail += " - " + obtieneTexto('Mail') + "\n";//***" - E-mail \n";
    else
    {
        var _err = emailCheck2(ctrlTmp.value);
        if(_err.length >0)
            errMail += " - " + obtieneTexto('Mail') + _err + "\n";//***" - E-mail: " + _err + "\n";
    }
        
    ctrlTmp = getControl(padre, 'ddlMailTipo', 'select');
    if(ctrlTmp.options[ctrlTmp.selectedIndex].text == 'Seleccione' || 
        ctrlTmp.options[ctrlTmp.selectedIndex].text == 'Select')
    {
        errMail += " - " + obtieneTexto('fGeneralesTipoMail')+"\n";//***" - Tipo E-mail \n";
    }
    
    if(ctrlTmp.options[ctrlTmp.selectedIndex].text == 'Otro' ||
        ctrlTmp.options[ctrlTmp.selectedIndex].text == 'Other')
    {
        ctrlTmp = getControl(padre, 'txbxMailTipoEsp','input');
        if(esTxbxVacio(ctrlTmp))
            errMail += " - " + obtieneTexto('Especifique') + " " + obtieneTexto('fGeneralesTipoMail')+"\n";//***" - Especifique Tipo E-mail \n";
    }
    
    
    
    return errMail;
}

//funcion para validar Domicilio
// ctrl -> span contenedor de domicilio
// regresa una cadena con la validacion de cada uno de los campos de domicilio
function valDomicilio(ctrl)
{
    var ctrlTmp, err = "", ctrlPais;
    
    ctrlPais = getControl(ctrl, 'ddlDomPais', 'select');
    if(ctrlPais.options[ctrlPais.selectedIndex].text == 'Seleccione'||
        ctrlPais.options[ctrlPais.selectedIndex].text == 'Select')
    {
        err += " - " + obtieneTexto('fGeneralesPais')+"\n";//***" - Pais \n";
    }
    if(ctrlPais.options[ctrlPais.selectedIndex].text == 'Otro' ||
        ctrlPais.options[ctrlPais.selectedIndex].text == 'Other')
    {
        ctrlTmp = getControl(ctrl, 'txbxDomPaisEsp', 'input');
        if(esTxbxVacio(ctrlTmp))
            err += " - " + obtieneTexto('Especifique') + " " +obtieneTexto('fGeneralesPais')+"\n";//***" - Especifique Pais \n";
    }
    
    ctrlTmp = getControl(ctrl, 'txbxDomCalle', 'input');
    if(esTxbxVacio(ctrlTmp))
        err += " - " + obtieneTexto('fGeneralesCalle')+"\n";//***" - Calle \n";
    
    ctrlTmp = getControl(ctrl, 'txbxDomNumExt', 'input');
    if(esTxbxVacio(ctrlTmp))
        err += " - " + obtieneTexto('fGeneralesNumeroExt')+"\n";//***" - Numero Exterior \n";
    
//    ctrlTmp = getControl(ctrl, 'txbxDomNumInt', 'input');
//    if(esTxbxVacio(ctrlTmp))
//        err += " - Numero Interior \n";
    
    if(ctrlPais.options[ctrlPais.selectedIndex].text == 'Mexico')
    {
        ctrlTmp = getControl(ctrl, 'txbxDomCol', 'input');
        if(esTxbxVacio(ctrlTmp))
            err += " - " + obtieneTexto('fGeneralesColonia')+"\n";//***" - Colonia \n";
    }
    
    ctrlTmp = getControl(ctrl, 'txbxDomCd', 'input');
    if(esTxbxVacio(ctrlTmp))
        err += " - " + obtieneTexto('fGeneralesCiudad')+"\n";//***" - Ciudad \n";
    
    ctrlTmp = getControl(ctrl, 'ddlDomEdo', 'select');
    if(ctrlTmp.options[ctrlTmp.selectedIndex].text == 'Seleccione'||
        ctrlTmp.options[ctrlTmp.selectedIndex].text == 'Select')
    {
        err += " - " + obtieneTexto('fGeneralesEstado')+"\n";//***" - Estado \n";
    }
    if(ctrlTmp.options[ctrlTmp.selectedIndex].text == 'Otro' ||
        ctrlTmp.options[ctrlTmp.selectedIndex].text == 'Other')
    {
        ctrlTmp = getControl(ctrl, 'txbxDomEdoEsp', 'input');
        if(esTxbxVacio(ctrlTmp))
            err += " - " + obtieneTexto('Especifique') + " " + obtieneTexto('fGeneralesEstado')+"\n";//***" - Especifique Estado \n";
    }
    
    ctrlTmp = getControl(ctrl, 'ddlDomDel', 'select');
    if(ctrlTmp.options[ctrlTmp.selectedIndex].text == 'Seleccione'||
        ctrlTmp.options[ctrlTmp.selectedIndex].text == 'Select')
    {
        err += " - " + obtieneTexto('fGeneralesDelegacion')+"\n";//***" - Delegacion \n";
    }
    if(ctrlTmp.options[ctrlTmp.selectedIndex].text == 'Otro' || 
        ctrlTmp.options[ctrlTmp.selectedIndex].text == 'Other')
    {
        ctrlTmp = getControl(ctrl, 'txbxDomDelEsp', 'input');
        if(esTxbxVacio(ctrlTmp))
            err += " - " + obtieneTexto('Especifique') + " " + obtieneTexto('fGeneralesDelegacion')+"\n";//***" - Especifique Delegacion \n";
    }
    
    ctrlTmp = getControl(ctrl, 'txbxDomCP', 'input');
    if(esTxbxVacio(ctrlTmp))
        err += " - " + obtieneTexto('fGeneralesCodigoPostal')+"\n";//***" - Codigo Postal \n";
    
    
    return err;
}

//funcion para validar Nombre
// ctrl -> span contenedor de Nombre
// fecNacVisible -> parámetro para validar o no la fecha de Nacimiento: 
//                  0[no validar FecNac] y 1[validar FecNac]
// regresa una cadena con la validacion de cada uno de los campos de Nombre
function valNomb(ctrl, fecNacVisible)
{
    var ctrlTmp, err = "";
    
    ctrlTmp = getControl(ctrl, 'txbxApPaterno', 'input');
    if(esTxbxVacio(ctrlTmp))
        err += " - " + obtieneTexto('ApPaterno')+"\n";//***" - Apellido Paterno \n";
    
    ctrlTmp = getControl(ctrl, 'txbxApMaterno', 'input');
    if(esTxbxVacio(ctrlTmp))
        err += " - " + obtieneTexto('ApMaterno')+"\n";//***" - Apellido Materno \n";
    
    ctrlTmp = getControl(ctrl, 'txbxNombre', 'input');
    if(esTxbxVacio(ctrlTmp))
        err += " - " + obtieneTexto('Nombre')+"\n";//***" - Nombre(s) \n";
        
    if( fecNacVisible == 1)
    {
        ctrlTmp = getControl(ctrl, 'txbxFecNac', 'input');
        if(esTxbxVacio(ctrlTmp))
            err += " - " + obtieneTexto('FechaDeNacimiento')+"\n";//***" - Fecha de Nacimiento \n";
    }
    
    
    return err;
}
//funcion para inicializar Domicilios
//ctrl -> span contenedor de domicilio
function initDomicilio(ctrl)
{
    selDomPais(getControl(ctrl, 'ddlDomPais', 'select'));
}
function alertar(txt)
{
    alert(txt);
    
}
// funcion q agrega telefono
// padre -> span contenedor de wucTelefono
function addTel(padre)
{
    var i=0;
    var tels = new Array();
    var telId = new RegExp('(WucTel){1,}');
    
    for(i=0; i<padre.childNodes.length; i++)
    {
        if(padre.childNodes[i].tagName == "SPAN" &&
            telId.test(padre.childNodes[i].id))
        {
            tels.push(padre.childNodes[i]);
        }
    }
    
    for(i=0; i<tels.length; i++)
    {
        if(tels[i].style.display == "" || 
            tels[i].style.display == "block" )
        {
            continue;
        }
        else
        {
            tels[i].style.display = "";
            getControl(padre, 'TelAdd', 'input').disabled = i < 4 ? false:true;
            getControl(padre, 'TelRem', 'input').disabled = i < 1 ? true:false;
            break;
        }
    }
    return false;
}

// funcion q elimina telefono
// padre -> span contenedor de wucTelefono
function remTel(padre)
{
    var i=0;
    var tels = new Array();
    var telId = new RegExp('(WucTel){1,}');
    
    for(i=0; i<padre.childNodes.length; i++)
    {
        if(padre.childNodes[i].tagName == "SPAN" &&
            telId.test(padre.childNodes[i].id))
        {
            tels.push(padre.childNodes[i]);
        }
    }
    
    for(i=tels.length-1; i>=0; i--)
    {
        if(tels[i].style.display == "none")
        {
            continue;
        }
        else
        {
            tels[i].style.display = "none";
            initTel(tels[i]);
            getControl(padre, 'TelAdd', 'input').disabled = i < 5 ? false:true;
            getControl(padre, 'TelRem', 'input').disabled = i <= 1 ? true:false;
            break;
            
        }
    }
    return false;
}

// funcion q inicializa un wucTelefono
// padre -> span contenedor de wuc
function initTel(padre)
{
    limpiaCtrls(padre);
    selTipoTel(getControl(padre, 'ddlTelTipo', 'select'));
    telCveInt(getControl(padre, 'rdbtnTelSi', 'input'));
}

// Funcion q muestra/oculta el campo de Especifique para el Tipo de Telefono
// ctrl->dropdownlist del q se selecciona la opcion
function selTipoMail(ctrl)
{
    var padre = ctrl.parentNode;
    var spanEspecifique;
    regexCtrl = new RegExp('mailTipoEsp{1,}$');
    var i;
    for( i=0; i<padre.childNodes.length; i++)
    {
        if(regexCtrl.test(padre.childNodes[i].id))
        {
            spanEspecifique = padre.childNodes[i];
        }
    }
    switch(ctrl.options[ctrl.selectedIndex].text)
	{
		case 'Seleccione':
		case 'Select':
					{
						spanEspecifique.style.display = 'none';
						getControl(spanEspecifique, 'txbxMailTipoEsp', 'input').value = "";
						break;
					}
		case 'Otro':
		case 'Other':
					{
						spanEspecifique.style.display = '';
						break;
					}
		default:
		        {
						spanEspecifique.style.display = 'none';
						getControl(spanEspecifique, 'txbxMailTipoEsp', 'input').value = "";
						break;
		        }			
	}
}

// funcion q agrega mail
// padre -> span contenedor de wucMail
function addMail(padre)
{
    var i=0;
    var mails = new Array();
    var mailId = new RegExp('(WucMail){1,}');
    
    for(i=0; i<padre.childNodes.length; i++)
    {
        if(padre.childNodes[i].tagName == "SPAN" &&
            mailId.test(padre.childNodes[i].id))
        {
            mails.push(padre.childNodes[i]);
        }
    }
    
    for(i=0; i<mails.length; i++)
    {
        if(mails[i].style.display == "" || 
            mails[i].style.display == "block" )
        {
            continue;
        }
        else
        {
            mails[i].style.display = "";
            getControl(padre, 'MailAdd', 'input').disabled = i < 4 ? false:true;
            getControl(padre, 'MailRem', 'input').disabled = i < 1 ? true:false;
            break;
        }
    }
    return false;
}

// funcion q elimina mail
// padre -> span contenedor de wucMail
function remMail(padre)
{
    var i=0;
    var mails = new Array();
    var mailId = new RegExp('(WucMail){1,}');
    
    for(i=0; i<padre.childNodes.length; i++)
    {
        if(padre.childNodes[i].tagName == "SPAN" &&
            mailId.test(padre.childNodes[i].id))
        {
            mails.push(padre.childNodes[i]);
        }
    }
    
    for(i=mails.length-1; i>=0; i--)
    {
        if(mails[i].style.display == "none")
        {
            continue;
        }
        else
        {
            mails[i].style.display = "none";
            initMail(mails[i]);
            getControl(padre, 'MailAdd', 'input').disabled = i < 5 ? false:true;
            getControl(padre, 'MailRem', 'input').disabled = i <= 1 ? true:false;
            break;
            
        }
    }
    return false;
}

// funcion q inicializa un wucMail
// padre -> span contenedor de wucMail
function initMail(padre)
{
    limpiaCtrls(padre);
    selTipoMail(getControl(padre, 'ddlMailTipo', 'select'));
}

// funcion q agrega Hijo
// padre -> span contenedor de wucPersona
function addHijo(padre)
{
    var i=0;
    var hijos = new Array();
    var hijoId = new RegExp('(WucHijo){1,}');
    
    for(i=0; i<padre.childNodes.length; i++)
    {
        if(padre.childNodes[i].tagName == "SPAN" &&
            hijoId.test(padre.childNodes[i].id))
        {
            hijos.push(padre.childNodes[i]);
        }
    }
    
    for(i=0; i<hijos.length; i++)
    {
        if(hijos[i].style.display == "" || 
            hijos[i].style.display == "block" )
        {
            continue;
        }
        else
        {
            hijos[i].style.display = "";
            getControl(padre, 'HijosAdd', 'input').disabled = i < 9 ? false:true;
            getControl(padre, 'HijosRem', 'input').disabled = i < 1 ? true:false;
            break;
        }
    }
    return false;
}

// funcion q elimina hijo
// padre -> span contenedor de wucPersona
function remHijo(padre)
{
    var i=0;
    var hijos = new Array();
    var hijoId = new RegExp('(WucHijo){1,}');
    
    for(i=0; i<padre.childNodes.length; i++)
    {
        if(padre.childNodes[i].tagName == "SPAN" &&
            hijoId.test(padre.childNodes[i].id))
        {
            hijos.push(padre.childNodes[i]);
        }
    }
    
    for(i=hijos.length-1; i>=0; i--)
    {
        if(hijos[i].style.display == "none")
        {
            continue;
        }
        else
        {
            hijos[i].style.display = "none";
            limpiaCtrls(hijos[i]);
            getControl(padre, 'HijosAdd', 'input').disabled = i < 10 ? false:true;
            getControl(padre, 'HijosRem', 'input').disabled = i <= 1 ? true:false;
            break;
            
        }
    }
    return false;
}