// ---------------------------------------------------------------------- //
//           FormCheq.js (c) ChaTo 1998,1999 [www.chato.cl]
//                           Basado en:
//           FormChek.js (c) Eric Krock (c) 1997 Netscape
// ---------------------------------------------------------------------- //
// 18 Feb 97 creado por Eric Krock (c) 1997
//   Netscape Communications Corporation
// 18 Ago 98 modificado por Carlos Castillo (c) 1998 ChaTo
//   Los principales cambios son: esta version es simplificada, para
//   propositos de ensennanza y validacion basica de formularios, y esta
//   adaptada para recibir caracteres del alfabeto espannol (acentos, etc.)
// 20 Oct 99 modificado por Carlos Castillo (c) 1999 ChaTo
//   Se agrega la funcion isNice que ayuda a evitar comillas simples
//   o dobles que causan problemas con muchos CGIs
//
// ---------------------------------------------------------------------- //
//                             RESUMEN                                    //
// ---------------------------------------------------------------------- //
//
// El objetivo de las siguientes funciones en JavaScript es
// validar los ingresos del usuario en un formulario antes
// de que estos datos vayan al servidor.
//
// Varias de ellas toman un parametro opcional E.O.K (eok) (emptyOK
// - true si se acepta que el valor este vacio, false si no
// se acepta). El valor por omision es el que indique la
// variable global defaultEmptyOK definida mas abajo.
//
// ---------------------------------------------------------------------- //
//                      SINTAXIS DE LAS FUNCIONES                         //
// ---------------------------------------------------------------------- //
//
// FUNCION PARA CHEQUEAR UN CAMPO DE INGRESO:
//
// checkField (theField, theFunction, [, s] [,eok])
//        verifica que el campo de ingreso theField cumpla con la
//        condicion indicada en la funcion theFunction (que puede ser
//        una de las descritas en "FUNCIONES DE VALIDACION" o cualquier
//        otra provista por el usuario). En caso contrario despliega el
//        string "s" (opcional, hay mensajes por default para las
//        funciones de validacion provistas aqui).
//
// FUNCIONES DE VALIDACION:
//
// isInteger (s [,eok])                s representa un entero
// isNumber (s [,eok])                 s es entero o tiene punto decimal
// isAlphabetic (s [,eok])             s tiene solo letras
// isAlphanumeric (s [,eok])           s tiene solo letras y/o numeros
// isPhoneNumber (s [,eok])            s tiene solo numeros, (,),-
// isEmail (s [,eok])                  s es una direccion de e-mail
//
// FUNCIONES INTERNAS:
//
// isWhitespace (s)                    s es vacio o solo son espacios
// isLetter (c)                        c es una letra
// isDigit (c)                         c es un digito
// isLetterOrDigit (c)                 c es letra o digito
//
// FUNCIONES PARA REFORMATEAR DATOS:
//
// stripCharsInBag (s, bag)            quita de s los caracteres en bag
// stripCharsNotInBag (s, bag)         quita de s los caracteres NO en bag
// stripWhitespace (s)                 quita el espacio dentro de s
// stripInitialWhitespace (s)          quita el espacio al principio de s
//
// FUNCIONES PARA PREGUNTARLE AL USUARIO:
//
// statBar (s)                         pone s en la barra de estado
// warnEmpty (theField, s)             indica que theField esta vacio
// warnInvalid (theField, s)           indica que theField es invalido
//
// ---------------------------------------------------------------------- //
//                                VARIABLES                               //
// ---------------------------------------------------------------------- //


// Esta variable indica si está bien dejar las casillas
// en blanco como regla general
var defaultEmptyOK = false;
var n6=(navigator.userAgent.indexOf("Gecko")!=-1)?true:false

// Esta variable indica si se debe verificar la presencia de comillas
// u otros símbolos extraños en un campo, por omisión no, porque
// siempre crea problemas con las bases de datos o programas CGI
var checkNiceness = true;

// listas de caracteres
var digits = "0123456789";
var lowercaseLetters = "abcdefghijklmnopqrstuvwxyzáéíóúñü";
var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZÁÉÍÓÚÑ";
var whitespace = " \t\n\r";

// caracteres admitidos en nos de telefono
var phoneChars = "()-+ ";

// ---------------------------------------------------------------------- //
//                     TEXTOS PARA LOS MENSAJES                           //
// ---------------------------------------------------------------------- //

// m abrevia "missing" (faltante)
var mMessage = "Dato obligatorio: no puede dejarlo en blanco";

// p abrevia "prompt"
var pPrompt = "Error: ";
var pAlphanumeric = "ingrese un texto que contenga solo letras y/o numeros";
var pAlphabetic   = "ingrese un texto que contenga solo letras";
var pInteger = "ingrese un numero entero";
var pNumber = "inserte un numero válido";
var pPhoneNumber = "ingrese un número de teléfono";
var pEmail = "ingrese una dirección de correo electrónico válida";
var pName = "ingrese un texto que contenga solo letras, numeros o espacios";
var pNice = "no puede utilizar comillas aqui";
var pDate = "la fecha es incorrecta o no tiene el formato dd/mm/yyyy";

// ---------------------------------------------------------------------- //
//                FUNCIONES PARA MANEJO DE ARREGLOS                       //
// ---------------------------------------------------------------------- //

// JavaScript 1.0 (Netscape 2.0) no tenia un constructor para arreglos,
// asi que ellos tenian que ser hechos a mano. Desde JavaScript 1.1
// (Netscape 3.0) en adelante, las funciones de manejo de arreglos no
// son necesarias.

function makeArray(n) {
//*** BUG: If I put this line in, I get two error messages:
//(1) Window.length can't be set by assignment
//(2) daysInMonth has no property indexed by 4
//If I leave it out, the code works fine.
//   this.length = n;
   for (var i = 1; i <= n; i++) {
      this[i] = 0;
   }
   return this;
}

// ---------------------------------------------------------------------- //
//                  CODIGO PARA FUNCIONES BASICAS                         //
// ---------------------------------------------------------------------- //


// s es vacio
function isEmpty(s)
{   return ((s == null) || (s.length == 0));
}

// s es vacio o solo caracteres de espacio
function isWhitespace (s)
{   var i;
    if (isEmpty(s)) return true;
    for (i = 0; i < s.length; i++)
    {
        var c = s.charAt(i);
        // si el caracter en que estoy no aparece en whitespace,
        // entonces retornar falso
        if (whitespace.indexOf(c) == -1) return false;
    }
    return true;
}

// Quita todos los caracteres que estan en "bag" del string "s" s.
function stripCharsInBag (s, bag)
{   var i;
    var returnString = "";

    // Buscar por el string, si el caracter no esta en "bag",
    // agregarlo a returnString

    for (i = 0; i < s.length; i++)
    {   var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }

    return returnString;
}

// Lo contrario, quitar todos los caracteres que no estan en "bag" de "s"
function stripCharsNotInBag (s, bag)
{   var i;
    var returnString = "";
    for (i = 0; i < s.length; i++)
    {
        var c = s.charAt(i);
        if (bag.indexOf(c) != -1) returnString += c;
    }

    return returnString;
}

// Quitar todos los espacios en blanco de un string
function stripWhitespace (s)
{   return stripCharsInBag (s, whitespace);
}

// La rutina siguiente es para cubrir un bug en Netscape
// 2.0.2 - seria mejor usar indexOf, pero si se hace
// asi stripInitialWhitespace() no funcionaria

function charInString (c, s)
{   for (i = 0; i < s.length; i++)
    {   if (s.charAt(i) == c) return true;
    }
    return false;
}

// Quita todos los espacios que antecedan al string
function stripInitialWhitespace (s)
{   var i = 0;
    while ((i < s.length) && charInString (s.charAt(i), whitespace))
       i++;
    return s.substring (i, s.length);
}

// c es una letra del alfabeto espanol
function isLetter (c)
{
    return( ( uppercaseLetters.indexOf( c ) != -1 ) ||
            ( lowercaseLetters.indexOf( c ) != -1 ) );
}

// c es un digito
function isDigit (c)
{   return ((c >= "0") && (c <= "9"));
}

// c es letra o digito
function isLetterOrDigit (c)
{   return (isLetter(c) || isDigit(c));
}

// ---------------------------------------------------------------------- //
//                          NUMEROS                                       //
// ---------------------------------------------------------------------- //

// s es un numero entero (con o sin signo)
function isInteger (s)
{   var i;
    if (isEmpty(s))
       if (isInteger.arguments.length == 1) return defaultEmptyOK;
       else return (isInteger.arguments[1] == true);

    for (i = 0; i < s.length; i++)
    {
        var c = s.charAt(i);
        if( i != 0 ) {
            if (!isDigit(c)) return false;
        } else {
            if (!isDigit(c) && (c != "-") || (c == "+")) return false;
        }
    }
    return true;
}

// s es un numero (entero o flotante, con o sin signo)
function isNumber (s)
{   var i;
    var dotAppeared;
    dotAppeared = false;
    if (isEmpty(s))
       if (isNumber.arguments.length == 1) return defaultEmptyOK;
       else return (isNumber.arguments[1] == true);

    for (i = 0; i < s.length; i++)
    {
        var c = s.charAt(i);
        if( i != 0 ) {
            if ( c == "." ) {
                if( !dotAppeared )
                    dotAppeared = true;
                else
                    return false;
            } else
                if (!isDigit(c)) return false;
        } else {
            if ( c == "." ) {
                if( !dotAppeared )
                    dotAppeared = true;
                else
                    return false;
            } else
                if (!isDigit(c) && (c != "-") || (c == "+")) return false;
        }
    }
    return true;
}

// ---------------------------------------------------------------------- //
//                        STRINGS SIMPLES                                 //
// ---------------------------------------------------------------------- //

// s tiene solo letras
function isAlphabetic (s)
{   var i;

    if (isEmpty(s))
       if (isAlphabetic.arguments.length == 1) return defaultEmptyOK;
       else return (isAlphabetic.arguments[1] == true);
    for (i = 0; i < s.length; i++)
    {
        // Check that current character is letter.
        var c = s.charAt(i);

        if (!isLetter(c))
        return false;
    }
    return true;
}


// s tiene solo letras y numeros
function isAlphanumeric (s)
{   var i;

    if (isEmpty(s))
       if (isAlphanumeric.arguments.length == 1) return defaultEmptyOK;
       else return (isAlphanumeric.arguments[1] == true);

    for (i = 0; i < s.length; i++)
    {
        var c = s.charAt(i);
        if (! (isLetter(c) || isDigit(c) ) )
        return false;
    }

    return true;
}

// s tiene solo letras, numeros o espacios en blanco
function isName (s)
{
    if (isEmpty(s))
       if (isName.arguments.length == 1) return defaultEmptyOK;
       else return (isAlphanumeric.arguments[1] == true);

    return( isAlphanumeric( stripCharsInBag( s, whitespace ) ) );
}

// ---------------------------------------------------------------------- //
//                           FONO o EMAIL                                 //
// ---------------------------------------------------------------------- //

// s es numero de telefono valido
function isPhoneNumber (s)
{   var modString;
    if (isEmpty(s))
       if (isPhoneNumber.arguments.length == 1) return defaultEmptyOK;
       else return (isPhoneNumber.arguments[1] == true);
    modString = stripCharsInBag( s, phoneChars );
    return (isInteger(modString));
}

// s es una direccion de correo valida
function isEmail (s)
{
    if (isEmpty(s))
       if (isEmail.arguments.length == 1) return defaultEmptyOK;
       else return (isEmail.arguments[1] == true);
    if (isWhitespace(s)) return false;
    var i = 1;
    var sLength = s.length;
    while ((i < sLength) && (s.charAt(i) != "@"))
    { i++;
    }

    if ((i >= sLength) || (s.charAt(i) != "@")) return false;
    else i += 2;

    while ((i < sLength) && (s.charAt(i) != "."))
    { i++;
    }

    if ((i >= sLength - 1) || (s.charAt(i) != ".")) return false;
    else return true;
}

function isNice(s)
{
        var i = 1;
        var sLength = s.length;
        var b = 1;
        while(i<sLength) {
                if( (s.charAt(i) == "\"") || (s.charAt(i) == "'" ) ) b = 0;
                i++;
        }
        return b;
}

// ---------------------------------------------------------------------- //
//                  FUNCIONES PARA FECHA				                  //
// ---------------------------------------------------------------------- //
   // Determina si un año es bisiesto
   function es_bisiesto(anio)
   {
   if (((anio % 4 == 0) && anio % 100 != 0) || anio % 400 == 0) return true;
   return false;
   }

   function isDate(theField)
   {
   var separador_fecha="/";
   var numero_separadores=0;
   var caracter="";

   if ((theField.length == 0))
//      return error.rellenar("Campo vacío no contiene ningún valor ",1);
		return false;

   // Comprobación de la sintáxis de una fecha
   for (var i=0; i < theField.length; i++)
      {
	  caracter=theField.charAt(i);
      if (!isInteger(caracter) && caracter != separador_fecha)
//         return error.rellenar("Carácter ilegal en una fecha",i+1);
		return false;
	  if (caracter == separador_fecha)
        numero_separadores++;
      }
   if (numero_separadores != 2)
//      return error.rellenar("Faltan separadores en una fecha",i+1);
   		return false;

   // Comprobación de la semántica de una fecha
   var posicion_separador_1=theField.indexOf(separador_fecha);
   var dia=theField.substring(0,posicion_separador_1);
   var posicion_separador_2=theField.indexOf(separador_fecha,posicion_separador_1+1);
   var mes=theField.substring(posicion_separador_1+1,posicion_separador_2);
   var anio=theField.substring(posicion_separador_2+1,10);
   if (anio.length != 4)
//      return error.rellenar("Año incorrecto en una fecha",6);
   		return false;
   if (mes < 1 || mes > 12)
//      return error.rellenar("Mes incorrecto en una fecha",4);
   		return false;
   if ((dia < 1 || dia > 31) || (mes == 4 && dia > 30) ||
       (mes == 6 && dia > 30) || (mes == 9 && dia > 30) ||
       (mes == 11 && dia > 30) || (mes == 2 && es_bisiesto(anio) && dia > 29) ||
       (mes == 2 && !es_bisiesto(anio) && dia > 28))
//      return error.rellenar("Día incorrecto en una fecha",2);
		return false;
   return true;
   }



// ---------------------------------------------------------------------- //
//                  FUNCIONES PARA RECLAMARLE AL USUARIO                  //
// ---------------------------------------------------------------------- //

// pone el string s en la barra de estado
function statBar(s)
{
	window.status = s;
}

// notificar que el campo theField esta vacio
function warnEmpty (theField)
{   theField.focus();
    alert(mMessage);
   // statBar(mMessage);
    return false;
}

// notificar que el campo theField es invalido
function warnInvalid (theField, s)
{   theField.focus();
    theField.select();
    alert(s);
   // statBar(pPrompt + s);
    return false;
}

// notificar que el campo theField es invalido
function formInvalid (s)
{
    alert(s);
   // statBar(pPrompt + s);
    return false;
}


function chequeoCampo (theField)
{
    var msg;
	var tipocampo;
	var devolver;
	if (theField.name.substring(0,1) == 'o')
	{
		tipocampo = theField.name.substring(1,2);
	} else {
		tipocampo = theField.name.substring(0,1);
	}
    if(tipocampo == 'f')
	{
		devolver =  isDate(theField.value);
		msg = pDate;
	} else if (tipocampo == 't')
    {
		devolver =  isAlphabetic(theField.value);
		msg = pAlphabetic;
    } else if (tipocampo == 'a')
	{
		devolver = isAlphanumeric(theField.value);
		msg = pAlphanumeric;
	} else if (tipocampo == 'e')
	{
		devolver = isEmail(theField.value);
		msg = pEmail;
	}  else if(tipocampo == 'i')
	{
		devolver = isInteger(theField.value);
		msg = pInteger;
	} else if (tipocampo == 'd')
	{
		devolver = isNumber(theField.value);
		msg = pNumber;
	}
    if (devolver == true)
	{
		statBar(" ");
        return true;
    } else
		if (n6) theField.value = "";
        return warnInvalid(theField,msg);

}

//*******************AÑADIDO POR EDUARDO ***********************

//*************************VALIDA SOLO FECHA********************
function valida_fecha (theField)
{
    var msg;
	var tipocampo;
	var devolver;

	devolver = isDate(theField.value);
	msg = pDate;
    if (devolver == true)
	{
		statBar(" ");
        return true;
    } else
		theField.value = "";
        return warnInvalid(theField,msg);

}

function compara_fecha(fecha, fecha2)
{
	var DatosFecha4 = fecha.split('/');
	var Fecha4 = new Date();
	Fecha4.setFullYear(DatosFecha4[2],DatosFecha4[1]-1,DatosFecha4[0]);
	var DatosFecha3 = fecha2.split('/');
	var Fecha3 = new Date();
	Fecha3.setFullYear(DatosFecha3[2],DatosFecha3[1]-1,DatosFecha3[0]);
	if (Fecha4 > Fecha3) {
		alert("Fecha inicio es mayor que fecha fin");
		return false;
	}
	else
		return true;
}

//**********************************************************

//*************************VALIDA SOLO NUMERO********************

function valida_numero (theField)
{
    var msg;
	var tipocampo;
	var devolver;

		devolver = isNumber(theField.value);
		msg = pInteger;

    if (devolver == true)
	{
		statBar(" ");
        return true;
    } else
		if (n6) theField.value = "";
        return warnInvalid(theField,msg);

}

//**********************************************************



//*************************VALIDA SOLO ENTERO********************

function valida_entero (theField)
{
    var msg;
	var tipocampo;
	var devolver;

		devolver = isInteger(theField.value);
		msg = pNumber;

    if (devolver == true)
	{
		statBar(" ");
        return true;
    } else
		if (n6) theField.value = "";
        return warnInvalid(theField,msg);

}

//**********************************************************



function chequeoForm (theForm)
{
	var numcampos = theForm.elements.length - 1;

	//Comprobación de que los campos obligatorios estan rellenos
	for (i=0; numcampos; i++)
	{
		if (theForm.elements[i].name.substring(0,1) == 'o')
		{
			if (isEmpty(theForm.elements[i].value))
			{
				statBar(pPrompt + " Debe de rellenar todos los campos obligatorios");
				return formInvalid("Debe de rellenar todos los campos obligatorios");
			}
		}
	}
	return true;
}
//********************************* AÑADIDO **************************************************

//******************************Validacion de mascara*****************************************
// Esta funcion, disennada por Gordon McComb http://www.gnmcomb.com/
// de su libro sobre Comercio Electronico
//(#: números, ?:letras, !:letras o números) Ejemplo: (###) ###-#### => (986) 985-6554
//Utilizamos las funciones

function mask (InString, Mask)  {
    LenStr = InString.length;
    LenMsk = Mask.length;
    if ((LenStr==0) || (LenMsk==0)) return false;
    if (LenStr!=LenMsk) return false;
    TempString="";
    for (Count=0; Count<=InString.length; Count++)  {
        StrChar = InString.substring(Count, Count+1);
        MskChar = Mask.substring(Count, Count+1);
        if (MskChar=='#') {
            if(!isInteger(StrChar)) return false;
        }
        else if (MskChar=='?') {
            if(!isAlphabetic(StrChar)) return false;
        }
        else if (MskChar=='!') {
            if(!isAlphanumeric(StrChar)) return false;
        }
//        else if (MskChar=='*') {
//        }
        else {
            if (MskChar!=StrChar) return false;
        }
    }
    return true;
}
//******************************Fin validacion de mascara*************************************


