/********************************************************************************************************************************************************
 * Archivo que permite evaluar si los datos introducidos son de tipo texto, si un campo está vacío, si solo son caracteres, si es un campo de correo    *
 * electronico, si el dato es alphanumerico.                                                                                                            *
 * 16 - 11 - 2001. Version 1.0                                                                                                                          *
 * 27 - 11 - 2001. Anexo de funciones para textArea.                                                                                                    *
 * Necesita de archivo error.js y generic.js                                                                                                            *
 ********************************************************************************************************************************************************/

/********************************************************************************************************************************************************
 * Declaración Global de variables                                                                                                                      *
 ********************************************************************************************************************************************************/

var isChar   = "";
var isAlpha  = "";
var empty    = "";
var value    = "";
var isEmail  = "";
var errorText    = new Array(4);
var logChar  = "";
var logAplha = "";
var logEmpty = "";
var logEmail = "";

/********************************************************************************************************************************************************
 * Es la función principal del archivo, sirve para declarar el "constructor", mismo que servirá para instanciar en otras funciones, su primer letra debe *
 * ser siempre mayúscula. Recibe como parámetro el campo a evaluar.                                                                                     *
 ********************************************************************************************************************************************************/

function Character(field){
    var rt1 = /[^a-zA-Z]/g;
    var rt2 = /[^0-9a-zA-Z]/g;
    var rt3 = /\s/g;
    this.isaChar  = (field.search(rt1) == -1)?true:(setErrorText("El dato introducido tiene caracteres no válidos","0"));
    this.isanAlpha = (field.search(rt2) == -1)?true:(setErrorText("El dato introducido tiene caracteres no válidos","1"));
    this.empty   = (field.replace(rt3,'') != '')?true:(setErrorText("El campo está vacío, verifique sus datos","2"));
    this.isEmail = (getEmail(field));
    this.value = field.replace(rt3,'');
    this.logChar = errorText[0];
    this.logAlpha= errorText[1];
    this.logEmpty= errorText[2];
    this.logEmail= errorText[3];

}

/********************************************************************************************************************************************************
 * Esta función me permite asignar el tipo de error que se está presentando en la evaluación de un campo, recibe como parámetro el texto del error, así *
 * como la posición que éste tendrá dentro del arreglo de logs.                                                                                         *
 ********************************************************************************************************************************************************/

function setErrorText(displayError, pos){
    errorText[pos] = displayError;
    return false;
}

/********************************************************************************************************************************************************
 * Esta función verifica que el valor que se haya ingresado en un campo sea un email, es decir debe contener "@" y al menos el "." del dominio de la    *
 * dirección, de lo contrario asigna el error correspondiente y regresa false                                                                           *
 ********************************************************************************************************************************************************/

function getEmail(field){
    var re = /@/g;
    if (field.search(re) != -1){
        var re1 = /\./g;
		var er_AZ9= /[^a-zA-Z^0-9^\.^\-^\_]/g;
		var log = field.substring(0, eval(field.search(re)));
        var arroba = field.substring(eval(field.search(re) + 1),field.length);		
		if (log.length == 0){
			setErrorText("Error en el e-mail, debe llevar al menos un\n nombre de usuario en su dirección de correo","3");
			return false;
		}
        if (arroba.search(re) != -1){
            setErrorText("Error en el e-mail, no debe llevar mas\n de una '@' su dirección de correo","3");
            return false;
        }else {
            if(arroba.search(re1) == -1){
	            setErrorText("Error en el e-mail, al menos debe llevar un '.' que identifique \n "+
							" el nombre del servidor y dominio de su dirección de correo","3");
		        return false;
            }
			var ser = arroba.substring(0, eval(arroba.search(re1)) ).toUpperCase();
			var dom = arroba.substring(eval(arroba.search(re1) + 1), arroba.length).toUpperCase();
			if((ser.search(er_AZ9) != -1) || (ser.length==0) ){
				setErrorText("Error en el e-mail, al menos debe llevar el nombre\n de un servidor en su dirección de correo","3");
				return false;
			}
			if((dom.search(er_AZ9) != -1) || (dom.length==0) ){
				setErrorText("Error en el e-mail, al menos debe llevar \n un dominio en su dirección de correo","3");
				return false;
			}

        }
    }else{
        setErrorText("Error en el e-mail, por lo menos debe \n llevar una '@' su dirección de correo","3");
        return false;
    }
    return true;
}

/********************************************************************************************************************************************************
 * Esta función verifica campo dado tenga valores de solo texto, de lo contrario genera un error. Recibe el nombre del campo.                           *
 ********************************************************************************************************************************************************/

function validateText(field){
    var data = new Character(field);
    if(data.isaChar != true){
        return false;
    }
    return true;
}

/********************************************************************************************************************************************************
 * Esta función verifica campo dado tenga valores de solo texto y/o numeros, de lo contrario genera un error. Recibe el nombre del campo.                           *
 ********************************************************************************************************************************************************/

function validateAlpha(field){
    var data = new Character(field);
    if(!data.isanAlpha){
        return false;
    }
    return true;
}

/********************************************************************************************************************************************************
 * Esta función verifica campo dado tenga una dirección de e-mail correcta, de lo contrario genera un error. Recibe el nombre del campo.                           *
 ********************************************************************************************************************************************************/

function validateEmail(field){
    var data = new Character(field);
    if(!data.isEmail){
        return false;
    }
    return true;
}

/********************************************************************************************************************************************************
 * Esta función verifica campo dado tenga valores, de lo contrario genera un error. Recibe el nombre del campo.                           *
 ********************************************************************************************************************************************************/

function validateEmpty(field){
   var data = new Character(field);
    if(!data.empty){
        return false;
    }
    return true;
}

/*********************************************************************************************************************************************************
 * Esta función verifica que el contenido del campo (recibe el nombre) sea eel valor correcto para una credencial de elector. Recibe el nombre del campo.*
 *********************************************************************************************************************************************************/

function validaCveElect(field){
    var tmp = new Character(field);
    if(tmp.empty){
        credElect = tmp.value;
        var c, msg;
        var er_AZ= /[^a-zA-Z]/g;  //Expresión regular para revisar que solo haya caracteres alfabéticos en mayúscula.
        var er_09= /[^0-9]/g;  //Expresión regular para revisar que solo haya dígitos.
		var er_HM = /[^HM]/g;
        var str1 = credElect.substring(0,6).toUpperCase();   // Subcadena con los primeros 6 caracteres (deben ser alfabéticos)
        var str2 = credElect.substring(6,14);  // Subcadena con 8 caracteres (deben ser solo dígitos)
        var str3 = credElect.substring(12,14); // Subcadena con 2 caracteres (deben ser solo dígitos entre 01 y 32, y no permitiendo el 88)
        var str4 = credElect.substring(14,15).toUpperCase(); // Subcadena con 1 caracter (debe ser solo caracter alfabético)
        var str5 = credElect.substring(15,18); // Subcadena con 3 caracteres (deben ser solo dígitos)

        if (credElect.length != 18) {
           return false;
         }

        if (str1.search(er_AZ) != -1){
           return false;
        }

        if (str2.search(er_09) != -1){
            return false;
        }else if (!checkDayMonth(str2,nameField)){
            return false;
        }

        if ( (str3 < '01' || str3 > '32') && str3 != '87' && str3 != '88'){
            return false;
        }
        if (str4.search(er_HM) != -1){
            return false;
        }

        if (str5.search(er_09) != -1){
            return false;
        }
    }
    return true;
}

function checkDayMonth(str,nameField){
    var mes    = str.substring(2,4);
    var dia    = str.substring(4,6);
    if (eval(mes > 12)){
        return false;
    }
    if ( (dia < '01'  || dia > '29')  && (mes == '02') ){
        return false;
    }else if  ( (dia  < '01'  || dia > '30') && (mes == '04' || mes == '06' || mes == '09' || mes == '11') ){
        return false;
    }else if ( (dia < '01'  || dia > '31') && (mes == '01' || mes == '03' || mes == '05' || mes == '07' || mes == '08' || mes == '10' || mes == '12') ){
        return false;
    }
    return true;

}

/*********************************************************************************************************************************************************
 * Esta función verifica que el contenido del campo (recibe el nombre) sea el valor correcto para una credencial de elector. Recibe el nombre del campo  *
 * sin ser tres campos los que la originan.																												 *
 *********************************************************************************************************************************************************/

function validaCveElectUnCampo(nameField){
    var tmp = new Character(nameField);
    if(tmp.empty){
        credElect = tmp.value;
        var c, msg;
        var er_AZ= /[^a-zA-Z]/g;  //Expresión regular para revisar que solo haya caracteres alfabéticos en mayúscula.
        var er_09= /[^0-9]/g;  //Expresión regular para revisar que solo haya dígitos.
		var er_HM = /[^HM]/g;
        var str1 = credElect.substring(0,6).toUpperCase();   // Subcadena con los primeros 6 caracteres (deben ser alfabéticos)
        var str2 = credElect.substring(6,14);  // Subcadena con 8 caracteres (deben ser solo dígitos)
        var str3 = credElect.substring(12,14); // Subcadena con 2 caracteres (deben ser solo dígitos entre 01 y 32, y no permitiendo el 88)
        var str4 = credElect.substring(14,15).toUpperCase(); // Subcadena con 1 caracter (debe ser solo caracter alfabético)
        var str5 = credElect.substring(15,18); // Subcadena con 3 caracteres (deben ser solo dígitos)

        if (credElect.length != 18) {
           return false;
         }

        if (str1.search(er_AZ) != -1){
           return false;
        }

        if (str2.search(er_09) != -1){
            return false;
        }else if (!checkDayMonthUnCampo(str2)){
            return false;
        }

        if ( (str3 < '01' || str3 > '32') && str3 != '87' && str3 != '88'){
            return false;
        }
        if (str4.search(er_HM) != -1){
             return false;
        }

        if (str5.search(er_09) != -1){
            return false;
        }
    }
    return true;
}

function checkDayMonthUnCampo(str){
    var mes    = str.substring(2,4);
    var dia    = str.substring(4,6);
    if (eval(mes > 12)){
        return false;
    }
    if ( (dia < '01'  || dia > '29')  && (mes == '02') ){
        return false;
    }else if  ( (dia  < '01'  || dia > '30') && (mes == '04' || mes == '06' || mes == '09' || mes == '11') ){
        return false;
    }else if ( (dia < '01'  || dia > '31') && (mes == '01' || mes == '03' || mes == '05' || mes == '07' || mes == '08' || mes == '10' || mes == '12') ){
        return false;
    }
    return true;

}


/*********************************************************************************************************************************************************
 * Esta función verifica que el contenido del campo textarea (recibe el nombre) sea de la longuitud deseada. Recibe el nombre del campo a evaluar y la   *
 * longitud que el mismo debe contener, despliega una caja de confirmación donde el usuario decida si quiere cortar el texto que introdució hasta los    *
 * caracteres permitidos (eligiendo 'SI') o que cambie la redacción de su contenido sin que el sistema haga ninguna modificación (eligiendo 'NO').       *
 *********************************************************************************************************************************************************/

function longTextArea(fieldName, longField, desc){

    var object = new Character(fieldName.value);
    if (object.value.length > longField){
		
	if (confirm('No puede exederse de '+longField+' caracteres en la redaccion \n '+desc+', desea se acorte su descripcion?')) {
          fieldName.value = fieldName.value.substring(0,(longField));
      }else {
        return false;
      }
    }
    return true;
}

function replaceData(field ){
    var re = /[\'\"\\]/g;
	var re1 = /[\r]/g;
    var re2 = /[\|]/g;
    var nv = field.replace(re2,' ').replace(re1,'\\\r').replace(re,'´');
    return nv;
}

function credElectPart(field1, field2, field3){
	var checkCred = checkCredElect(field1, field2, field3);
	if (!checkCred){
		return  false;
	}
	var credential = field1+field2+field3;
	if(credential.length != 18){
		return  false;
	}
	return credential;
}

function compCredElect(cred1, cred2, foco){
	if (cred1 != cred2){
		return false;
	}
	return true;
}

function checkCredElect(initial, date, edosex){
    var cred = initial+date+edosex;
    if(cred.length == 18 ){ 
        if (!validaCveElect(cred)){
             return false;
		}
    }
    return true;
}
function contarText(entrada,salida,texto,caracteres) {
	var entradaObj=document.forms[0][entrada];  
	var salidaObj=document.getElementById(salida);  
	var longitud=caracteres - entradaObj.value.length;
	if(longitud <= 0) {	
		  longitud=0;	
		  texto='<span class="disable"> '+texto+' </span>';	
		  entradaObj.value=entradaObj.value.substr(0,caracteres);  
	}
	salidaObj.innerHTML = texto.replace("{CHAR}",longitud);  
}