// JavaScript Document

//Validacion de formularios

// ---------------------------------------------------------------------- //
//                                VARIABLES                               //
// ---------------------------------------------------------------------- //

var defaultEmptyOK = false;
var checkNiceness = true;

// listas de caracteres
var numeros = "0123456789";
var minusculas = "abcdefghijklmnopqrstuvwxyzáéíóúñüç"
var mayusculas = "ABCDEFGHIJKLMNOPQRSTUVWXYZÁÉÍÓÚÑÇ"
var whitespace = " \t\n\r";

// ---------------------------------------------------------------------- //
//                     TEXTOS PARA LOS MENSAJES                           //
// ---------------------------------------------------------------------- //
// m abrevia "missing" (faltante)
var mMessage = "Error: no puede dejar este campo vacio"

// p abrevia "prompt"
var pPrompt = "Error: ";
var pAlfanumerico = "introduzca un texto que contenga solo letras y/o numeros";
var pAlfabetico = "introduzca un texto que contenga solo letras";
var pInteger = "introduzca un numero entero";
var pNumero = "introduzca un numero";
var pNumeroTelefono = "Introduzca su número de telefono sin espacios ni guiones";
var pEmail = "introduzca una dirección de correo electrónico válida";
var pNombre = "introduzca un texto que contenga solo letras, numeros o espacios";
var pNice = "no puede utilizar comillas aqui";

// ---------------------------------------------------------------------- //
//                  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 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( ( mayusculas.indexOf( c ) != -1 ) ||
            ( minusculas.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 esInteger (s)
{   var i;
    if (isEmpty(s)) 
       if (esInteger.arguments.length == 1) return defaultEmptyOK;
       else return (esInteger.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 esNumero (s)
{   var i;
    var dotAppeared;
    dotAppeared = false;
    if (isEmpty(s)) 
       if (esNumero.arguments.length == 1) return defaultEmptyOK;
       else return (esNumero.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 esAlfabetico (s)
{   var i;

    if (isEmpty(s)) 
       if (esAlfabetico.arguments.length == 1) return defaultEmptyOK;
       else return (esAlfabetico.arguments[1] == true);
    for (i = 0; i < s.length; i++)
    {   
        // Verifica que el caracter actual es una letra
        var c = s.charAt(i);

        if (!isLetter(c))
        return false;
    }
    return true;
}


// s tiene solo letras y numeros
function esAlfanumerico (s)
{   var i;

    if (isEmpty(s)) 
       if (esAlfanumerico.arguments.length == 1) return defaultEmptyOK;
       else return (esAlfanumerico.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 esNombre (s)
{
    if (isEmpty(s)) 
       if (esNombre.arguments.length == 1) return defaultEmptyOK;
       else return (esAlfanumerico.arguments[1] == true);
    
    return( esAlfanumerico( stripCharsInBag( s, whitespace ) ) );
}

// ---------------------------------------------------------------------- //
//                           TELEFONO o EMAIL                                 //
// ---------------------------------------------------------------------- //

// s es numero de telefono valido
function esNumeroTelefono (s)
{   var modString;
    if (isEmpty(s)) 
       if (esNumeroTelefono.arguments.length == 1) return defaultEmptyOK;
       else return (esNumeroTelefono.arguments[1] == true);
   // modString = stripCharsInBag( s, phoneChars );
	 modString = s;
    return (esInteger(modString))
}

// s es una direccion de correo valida
function esEmail (s)
{
    if (isEmpty(s)) 
       if (esEmail.arguments.length == 1) return defaultEmptyOK;
       else return (esEmail.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 RECLAMARLE AL USUARIO                  //
// ---------------------------------------------------------------------- //

// pone el string s en la barra de estado
function statBar (s)
{   window.status = s
}

// notificar que el campo campo esta vacio
function warnEmpty (campo)
{   campo.focus()
		cambiaClase(campo.id, 'focused')
		campo.select()
		mPersonalizado="Error: el campo " + campo.id + " no puede estar vacio."
    alert(mPersonalizado)//mMessage
    statBar(mMessage)
    return false
}

// notificar que el campo campo es invalido
function warnInvalid (campo, s)
{   campo.focus()
		cambiaClase(campo.id, 'focused')
    campo.select()
    alert(s)
    statBar(pPrompt + s)
    return false
}


// el corazon de todo: checkField
function checkField (campo, funcion, emptyOK, s)
{   
    var msg;
    if (checkField.arguments.length < 3) emptyOK = defaultEmptyOK;
    if (checkField.arguments.length == 4) {
        msg = s;
    } else {
        if( funcion == esAlfabetico ) msg = pAlfabetico;
        if( funcion == esAlfanumerico ) msg = pAlfanumerico;
        if( funcion == esInteger ) msg = pInteger;
        if( funcion == esNumero ) msg = pNumero;
        if( funcion == esEmail ) msg = pEmail;
        if( funcion == esNumeroTelefono ) msg = pNumeroTelefono;
        if( funcion == pNombre ) msg = pNombre;
    }
    if ((emptyOK == true) && (isEmpty(campo.value))) return true;

    if ((emptyOK == false) && (isEmpty(campo.value))) {
		
        return warnEmpty(campo);}

    if ( checkNiceness && !isNice(campo.value))
        return warnInvalid(campo, pNice);

    if (funcion(campo.value) == true) 
        return true;
    else
        return warnInvalid(campo,msg);

}
function esAceptable(campo){
	if (isEmpty(campo.value)) return warnEmpty(campo);
	if (checkNiceness && !isNice(campo.value)) return warnInvalid(campo, pNice);
	return true;
}
function validar(formulario){

	if (!checkField(formulario.Nombre, esNombre, false, "Su nombre solo puede contener letras")) return false;
	if (!esAceptable(formulario.Empresa)) return false;
	if (!checkField(formulario.Telefono, esNumeroTelefono, false)) return false;
	if (!checkField(formulario.eMail, esEmail, false, "Es imprescindible una dirección de e-mail correcta")) return false;
	if (isEmpty(formulario.Distribuidor.value)) return warnEmpty(formulario.Distribuidor);
	if (isEmpty(formulario.Direccion.value)) return warnEmpty(formulario.Direccion);
	if (isEmpty(formulario.CodPostal.value)) return warnEmpty(formulario.CodPostal);
	if (isEmpty(formulario.Poblacion.value)) return warnEmpty(formulario.Poblacion);
	if (!esAceptable(formulario.Usuario)) return false;
	if (!esAceptable(formulario.Password)) return false;
	if(charInString(' ', formulario.Usuario.value)) return warnInvalid(formulario.Usuario, 'Su nombre de usuario no puede contener espacios en blanco');
	if(charInString(' ', formulario.Password.value)) return warnInvalid(formulario.Password, 'La clave no puede contener espacios en blanco');
	return true;
}

function cambiaClase(id, newClass) {
	identity=document.getElementById(id);
	identity.className=newClass;
	return true;
}



//------------------------------------------------

//					Verifica campos requeridos
			
//------------------------------------------------