 // JavaScript Document
function newImage(arg) {
	if (document.images) {
		rslt = new Image();
		rslt.src = arg;
		return rslt;
	}
}

function changeImages() {
	if (document.images && (preloadFlag == true)) {
		for (var i=0; i<changeImages.arguments.length; i+=2) {
			document[changeImages.arguments[i]].src = changeImages.arguments[i+1];
		}
	}
}

var preloadFlag = false;
function preloadImages() {
	if (document.images) {
		menu_02_over = newImage("images/menu_02-over.jpg");
		menu_03_over = newImage("images/menu_03-over.jpg");
		menu_04_over = newImage("images/menu_04-over.jpg");
		menu_05_over = newImage("images/menu_05-over.jpg");
		menu_06_over = newImage("images/menu_06-over.jpg");
		menu_07_over = newImage("images/menu_07-over.jpg");
		menu_08_over = newImage("images/menu_08-over.jpg");
		menu_09_over = newImage("images/menu_09-over.jpg");
		menu2_02_over = newImage("images/menu2_02-over.jpg");
		menu2_03_over = newImage("images/menu2_03-over.jpg");
		menu2_04_over = newImage("images/menu2_04-over.jpg");
		menu2_05_over = newImage("images/menu2_05-over.jpg");
		menu2_06_over = newImage("images/menu2_06-over.jpg");
		menu2_07_over = newImage("images/menu2_07-over.jpg");
		menu2_08_over = newImage("images/menu2_08-over.jpg");
		menu2_09_over = newImage("images/menu2_09-over.jpg");
		areas_01_over = newImage("images/areas_01-over.gif");
		areas_02_over = newImage("images/areas_02-over.gif");
		areas_03_over = newImage("images/areas_03-over.gif");
		areas_04_over = newImage("images/areas_04-over.gif");
		preloadFlag = true;
	}
}

function vacio(q) {
        for ( i = 0; i < q.length; i++ ) {
                if ( q.charAt(i) != " " ) {
                        return true
                }
        }
        return false
}

function mail(texto){ 

    var mailres = true;             
    var cadena = "abcdefghijklmnñopqrstuvwxyzABCDEFGHIJKLMNÑOPQRSTUVWXYZ1234567890@._-"; 
     
    var arroba = texto.indexOf("@",0); 
    if ((texto.lastIndexOf("@")) != arroba) arroba = -1; 
     
    var punto = texto.lastIndexOf("."); 
                 
     for (var contador = 0 ; contador < texto.length ; contador++){ 
        if (cadena.indexOf(texto.substr(contador, 1),0) == -1){ 
            mailres = false; 
            break; 
     } 
    } 

    if ((arroba > 1) && (arroba + 1 < punto) && (punto + 1 < (texto.length)) && (mailres == true) && (texto.indexOf("..",0) == -1)) 
     mailres = true; 
    else 
     mailres = false; 
                 
    return mailres; 
} 


function preloadImages_M() {
	if (document.images) {
		menu_02_over = newImage("../images/menu_02-over.jpg");
		menu_03_over = newImage("../images/menu_03-over.jpg");
		menu_04_over = newImage("../images/menu_04-over.jpg");
		menu_05_over = newImage("../images/menu_05-over.jpg");
		menu_06_over = newImage("../images/menu_06-over.jpg");
		menu_07_over = newImage("../images/menu_07-over.jpg");
		menu_08_over = newImage("../images/menu_08-over.jpg");
		menu_09_over = newImage("../images/menu_09-over.jpg");
		menu2_02_over = newImage("../images/menu2_02-over.jpg");
		menu2_03_over = newImage("../images/menu2_03-over.jpg");
		menu2_04_over = newImage("../images/menu2_04-over.jpg");
		menu2_05_over = newImage("../images/menu2_05-over.jpg");
		menu2_06_over = newImage("../images/menu2_06-over.jpg");
		menu2_07_over = newImage("../images/menu2_07-over.jpg");
		menu2_08_over = newImage("../images/menu2_08-over.jpg");
		menu2_09_over = newImage("../images/menu2_09-over.jpg");
		preloadFlag = true;
	}
}

function preloadImages_C() {
		if (document.images) {
			menu_02_over = newImage("/images/menu_02-over.jpg");
			menu_03_over = newImage("/images/menu_03-over.jpg");
			menu_04_over = newImage("/images/menu_04-over.jpg");
			menu_05_over = newImage("/images/menu_05-over.jpg");
			menu_06_over = newImage("/images/menu_06-over.jpg");
			menu_07_over = newImage("/images/menu_07-over.jpg");
			menu_08_over = newImage("/images/menu_08-over.jpg");
			menu_09_over = newImage("/images/menu_09-over.jpg");
			menu2_02_over = newImage("/images/menu2_02-over.jpg");
			menu2_03_over = newImage("/images/menu2_03-over.jpg");
			menu2_04_over = newImage("/images/menu2_04-over.jpg");
			menu2_05_over = newImage("/images/menu2_05-over.jpg");
			menu2_06_over = newImage("/images/menu2_06-over.jpg");
			menu2_07_over = newImage("/images/menu2_07-over.jpg");
			menu2_08_over = newImage("/images/menu2_08-over.jpg");
			menu2_09_over = newImage("/images/menu2_09-over.jpg");
			preloadFlag = true;
		}
	}


function dame_correo(id){

usuario1="info"; 
dominio1="imafe.com"; 
usuario2="comercial";
dominio2="mrcreativos.es"; 
conector="@"; 

if (id==1){
	return "<area shape='rect' coords='555,1,637,17' href='mailto:"+usuario1 + conector + dominio1+"' target='_blank' alt='Email Imafe' />";
}
else {
    return "<area shape='rect' coords='312,24,476,59' href='mailto:"+usuario2 + conector + dominio2+"' target='_blank' alt='MRcreativos.com' />";

}

}

function escribe_enlace_correo(id){
	document.write( dame_correo(id) );
}

function escribe_palabras_general() {
	document.write("master direccion recursos humanos,master relaciones internacionales comercio exterior, master direccion personal asesoria laboral, master asesoria fiscal, master gestion ambiental, master prevencion riesgos laborales, curso asesoria fiscal, curso asesoria laboral, curso comercio exterior, curso comercio, curso derecho tributario, curso direccion de personal, curso direccion personal, curso direccion recursos humanos, curso en asesoria laboral, curso en comercio exterior, curso en direccion de recursos humanos, curso en gestion laboral, curso en prevencion de riesgos, curso en prevencion, curso en prl, curso en recursos humanos, curso en relaciones internacionales, curso fiscal, curso fiscalidad, curso gestion laboral, curso impuesto renta, curso impuesto sociedades, curso impuesto valor añadido, curso impuestos renta, curso impuestos, curso laboral, curso prevencion riesgos laborales, curso prevencion, curso recursos humanos, curso relaciones internacionales, curso riesgos laborales, curso rrhh,  curso tecnico prevencion riesgos laborales, formacion asesoria fiscal, formacion asesoria laboral, formacion comercio exterior, formacion comercio, formacion contratacion internacional, formacion contratacion temporal, formacion desarrollo organizacional, formacion direccion de personal, formacion direccion personal, formacion en asesoria laboral, formacion en comercio exterior, formacion en contratacion, formacion en desarrollo organizacional, formacion en desarrollo profesional en rrhh, formacion en desarrollo profesional, formacion en gestion de nominas, formacion en gestion estrategica de rrhh, formacion en gestion estrategica, formacion en gestion laboral, formacion en logistica internacional, formacion en marketing internacional, formacion en negociacion de rrhh, formacion en planificacion de recursos humanos, formacion en politica retributiva, formacion en prevencion de riesgos, formacion en prevencion, formacion en prl, formacion en relaciones internacionales, formacion en relaciones laborales, formacion en retribucion salarial, formacion en seguridad social, formacion en seleccion de personal, formacion fiscal, formacion fiscalidad, formacion gestion laboral, formacion organizacion de recursos humanos, formacion prevencion riesgos laborales, formacion prevencion, formacion recursos humanos, formacion relaciones internacionales, formacion relaciones laborales, formacion riesgos laborales, formacion seleccion de rrhh,  formacion tecnico prevencion riesgos laborales, master asesoria fiscal, master asesoria laboral, master comercio exterior, master comercio, master derecho tributario, master direccion de personal, master direccion personal, master direccion recursos humanos, master en asesoria laboral, master en comercio exterior, master en direccion de recursos humanos, master en gestion laboral, master en prevencion de riesgos, master en prevencion, master en prl, master en recursos humanos, master en relaciones internacionales, master fiscal, master fiscalidad, master gestion laboral, master impuesto renta, master impuesto sociedades, master impuesto valor añadido, master impuestos renta, master impuestos, master iva, master laboral, master prevencion riesgos laborales, master prevencion, master recursos humanos, master relaciones internacionales, master riesgos laborales, master rrhh, master seguridad social, master seguridad trabajo, master tecnico prevencion riesgos laborales, masters asesoria fiscal, masters asesoria laboral, masters derecho tributario, masters direccion de personal, masters direccion personal, masters direccion recursos humanos, masters en asesoria laboral, masters en comercio exterior, masters en direccion de recursos humanos, masters en prevencion de riesgos, masters en prevencion, masters en prl, masters en recursos humanos, masters en relaciones internacionales, masters en rrhh, masters fiscal, masters fiscalidad, masters impuesto renta, masters impuesto sociedades, masters impuesto valor añadido, masters impuestos renta, masters impuestos, masters iva, masters laboral, masters prevencion riesgos laborales, masters prevencion, masters recursos humanos, masters relaciones internacionales, masters riesgos laborales, masters seguridad trabajo, masters tecnico prevencion riesgos laborales, tecnico prevencion riesgos laborales, tecnico riesgos laborales, tecnico superior en prevencion de riesgos laborales, tecnico superior en prevencion de riesgos, tecnico superior en prevencion, tecnico superior prevencion riesgos laborales, tecnico superior prevencion riesgos, administracion de recursos humanos, asesoria fiscal, asesoria laboral, comercio exterior, curso, cursos y masters, cursos, derecho tributario, direccion de personal, direccion recursos humanos, direccion, empleo, empresa, empresas, formacion, gestion de los recursos humanos, gestion de nominas, gestion de recursos humanos, gestion estrategica recursos humanos financiacion internacional, fiscal, fiscalidad, master, masters y cursos, masters, prevencion de riesgos, prevencion riesgos laborales, prevencion riesgos, prevencion, prl, recurso, recursos humanos, recursos, relaciones internacionales comercio exterior, relaciones internacionales, relaciones laborales, relaciones, riesgos laborales, riesgos, rrhh, seguridad trabajo, seleccion de personal, seleccion personal, seleccion, subvencion, tecnicas, titulacion, titulo, trabajo");
}

function escribe_palabras_masters() {
	document.write("master direccion recursos humanos,master relaciones internacionales comercio exterior, master direccion personal asesoria laboral, master asesoria fiscal, master gestion ambiental, master prevencion riesgos laborales, curso asesoria fiscal, curso asesoria laboral, curso comercio exterior, curso comercio, curso derecho tributario, curso direccion de personal, curso direccion personal, curso direccion recursos humanos, curso en asesoria laboral, curso en comercio exterior, curso en direccion de recursos humanos, curso en gestion laboral, curso en prevencion de riesgos, curso en prevencion, curso en prl, curso en recursos humanos, curso en relaciones internacionales, curso fiscal, curso fiscalidad, curso gestion laboral, curso impuesto renta, curso impuesto sociedades, curso impuesto valor añadido, curso impuestos renta, curso impuestos, curso laboral, curso prevencion riesgos laborales, curso prevencion, curso recursos humanos, curso relaciones internacionales, curso riesgos laborales, curso rrhh,  curso tecnico prevencion riesgos laborales, formacion asesoria fiscal, formacion asesoria laboral, formacion comercio exterior, formacion comercio, formacion contratacion internacional, formacion contratacion temporal, formacion desarrollo organizacional, formacion direccion de personal, formacion direccion personal, formacion en asesoria laboral, formacion en comercio exterior, formacion en contratacion, formacion en desarrollo organizacional, formacion en desarrollo profesional en rrhh, formacion en desarrollo profesional, formacion en gestion de nominas, formacion en gestion estrategica de rrhh, formacion en gestion estrategica, formacion en gestion laboral, formacion en logistica internacional, formacion en marketing internacional, formacion en negociacion de rrhh, formacion en planificacion de recursos humanos, formacion en politica retributiva, formacion en prevencion de riesgos, formacion en prevencion, formacion en prl, formacion en relaciones internacionales, formacion en relaciones laborales, formacion en retribucion salarial, formacion en seguridad social, formacion en seleccion de personal, formacion fiscal, formacion fiscalidad, formacion gestion laboral, formacion organizacion de recursos humanos, formacion prevencion riesgos laborales, formacion prevencion, formacion recursos humanos, formacion relaciones internacionales, formacion relaciones laborales, formacion riesgos laborales, formacion seleccion de rrhh,  formacion tecnico prevencion riesgos laborales, master asesoria fiscal, master asesoria laboral, master comercio exterior, master comercio, master derecho tributario, master direccion de personal, master direccion personal, master direccion recursos humanos, master en asesoria laboral, master en comercio exterior, master en direccion de recursos humanos, master en gestion laboral, master en prevencion de riesgos, master en prevencion, master en prl, master en recursos humanos, master en relaciones internacionales, master fiscal, master fiscalidad, master gestion laboral, master impuesto renta, master impuesto sociedades, master impuesto valor añadido, master impuestos renta, master impuestos, master iva, master laboral, master prevencion riesgos laborales, master prevencion, master recursos humanos, master relaciones internacionales, master riesgos laborales, master rrhh, master seguridad social, master seguridad trabajo, master tecnico prevencion riesgos laborales, masters asesoria fiscal, masters asesoria laboral, masters derecho tributario, masters direccion de personal, masters direccion personal, masters direccion recursos humanos, masters en asesoria laboral, masters en comercio exterior, masters en direccion de recursos humanos, masters en prevencion de riesgos, masters en prevencion, masters en prl, masters en recursos humanos, masters en relaciones internacionales, masters en rrhh, masters fiscal, masters fiscalidad, masters impuesto renta, masters impuesto sociedades, masters impuesto valor añadido, masters impuestos renta, masters impuestos, masters iva, masters laboral, masters prevencion riesgos laborales, masters prevencion, masters recursos humanos, masters relaciones internacionales, masters riesgos laborales, masters seguridad trabajo, masters tecnico prevencion riesgos laborales, tecnico prevencion riesgos laborales, tecnico riesgos laborales, tecnico superior en prevencion de riesgos laborales, tecnico superior en prevencion de riesgos, tecnico superior en prevencion, tecnico superior prevencion riesgos laborales, tecnico superior prevencion riesgos, administracion de recursos humanos, asesoria fiscal, asesoria laboral, comercio exterior, curso, cursos y masters, cursos, derecho tributario, direccion de personal, direccion recursos humanos, direccion, empleo, empresa, empresas, formacion, gestion de los recursos humanos, gestion de nominas, gestion de recursos humanos, gestion estrategica recursos humanos financiacion internacional, fiscal, fiscalidad, master, masters y cursos, masters, prevencion de riesgos, prevencion riesgos laborales, prevencion riesgos, prevencion, prl, recurso, recursos humanos, recursos, relaciones internacionales comercio exterior, relaciones internacionales, relaciones laborales, relaciones, riesgos laborales, riesgos, rrhh, seguridad trabajo, seleccion de personal, seleccion personal, seleccion, subvencion, tecnicas, titulacion, titulo, trabajo");
}


function escribe_palabras_cursos() {
	document.write("master direccion recursos humanos,master relaciones internacionales comercio exterior, master direccion personal asesoria laboral, master asesoria fiscal, master gestion ambiental, master prevencion riesgos laborales, curso asesoria fiscal, curso asesoria laboral, curso comercio exterior, curso comercio, curso derecho tributario, curso direccion de personal, curso direccion personal, curso direccion recursos humanos, curso en asesoria laboral, curso en comercio exterior, curso en direccion de recursos humanos, curso en gestion laboral, curso en prevencion de riesgos, curso en prevencion, curso en prl, curso en recursos humanos, curso en relaciones internacionales, curso fiscal, curso fiscalidad, curso gestion laboral, curso impuesto renta, curso impuesto sociedades, curso impuesto valor añadido, curso impuestos renta, curso impuestos, curso laboral, curso prevencion riesgos laborales, curso prevencion, curso recursos humanos, curso relaciones internacionales, curso riesgos laborales, curso rrhh,  curso tecnico prevencion riesgos laborales, formacion asesoria fiscal, formacion asesoria laboral, formacion comercio exterior, formacion comercio, formacion contratacion internacional, formacion contratacion temporal, formacion desarrollo organizacional, formacion direccion de personal, formacion direccion personal, formacion en asesoria laboral, formacion en comercio exterior, formacion en contratacion, formacion en desarrollo organizacional, formacion en desarrollo profesional en rrhh, formacion en desarrollo profesional, formacion en gestion de nominas, formacion en gestion estrategica de rrhh, formacion en gestion estrategica, formacion en gestion laboral, formacion en logistica internacional, formacion en marketing internacional, formacion en negociacion de rrhh, formacion en planificacion de recursos humanos, formacion en politica retributiva, formacion en prevencion de riesgos, formacion en prevencion, formacion en prl, formacion en relaciones internacionales, formacion en relaciones laborales, formacion en retribucion salarial, formacion en seguridad social, formacion en seleccion de personal, formacion fiscal, formacion fiscalidad, formacion gestion laboral, formacion organizacion de recursos humanos, formacion prevencion riesgos laborales, formacion prevencion, formacion recursos humanos, formacion relaciones internacionales, formacion relaciones laborales, formacion riesgos laborales, formacion seleccion de rrhh,  formacion tecnico prevencion riesgos laborales, master asesoria fiscal, master asesoria laboral, master comercio exterior, master comercio, master derecho tributario, master direccion de personal, master direccion personal, master direccion recursos humanos, master en asesoria laboral, master en comercio exterior, master en direccion de recursos humanos, master en gestion laboral, master en prevencion de riesgos, master en prevencion, master en prl, master en recursos humanos, master en relaciones internacionales, master fiscal, master fiscalidad, master gestion laboral, master impuesto renta, master impuesto sociedades, master impuesto valor añadido, master impuestos renta, master impuestos, master iva, master laboral, master prevencion riesgos laborales, master prevencion, master recursos humanos, master relaciones internacionales, master riesgos laborales, master rrhh, master seguridad social, master seguridad trabajo, master tecnico prevencion riesgos laborales, masters asesoria fiscal, masters asesoria laboral, masters derecho tributario, masters direccion de personal, masters direccion personal, masters direccion recursos humanos, masters en asesoria laboral, masters en comercio exterior, masters en direccion de recursos humanos, masters en prevencion de riesgos, masters en prevencion, masters en prl, masters en recursos humanos, masters en relaciones internacionales, masters en rrhh, masters fiscal, masters fiscalidad, masters impuesto renta, masters impuesto sociedades, masters impuesto valor añadido, masters impuestos renta, masters impuestos, masters iva, masters laboral, masters prevencion riesgos laborales, masters prevencion, masters recursos humanos, masters relaciones internacionales, masters riesgos laborales, masters seguridad trabajo, masters tecnico prevencion riesgos laborales, tecnico prevencion riesgos laborales, tecnico riesgos laborales, tecnico superior en prevencion de riesgos laborales, tecnico superior en prevencion de riesgos, tecnico superior en prevencion, tecnico superior prevencion riesgos laborales, tecnico superior prevencion riesgos, administracion de recursos humanos, asesoria fiscal, asesoria laboral, comercio exterior, curso, cursos y masters, cursos, derecho tributario, direccion de personal, direccion recursos humanos, direccion, empleo, empresa, empresas, formacion, gestion de los recursos humanos, gestion de nominas, gestion de recursos humanos, gestion estrategica recursos humanos financiacion internacional, fiscal, fiscalidad, master, masters y cursos, masters, prevencion de riesgos, prevencion riesgos laborales, prevencion riesgos, prevencion, prl, recurso, recursos humanos, recursos, relaciones internacionales comercio exterior, relaciones internacionales, relaciones laborales, relaciones, riesgos laborales, riesgos, rrhh, seguridad trabajo, seleccion de personal, seleccion personal, seleccion, subvencion, tecnicas, titulacion, titulo, trabajo");
}



// ---------------------------------------------------------------------- //
//                             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;

// 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 = "Error: no puede dejar este espacio vacio"

// 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 = "ingrese un numero";
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";

// ---------------------------------------------------------------------- //
//                FUNCIONES PARA MANEJO DE ARRAYS                         //
// ---------------------------------------------------------------------- //

// 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 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 ) ) );
}

// ---------------------------------------------------------------------- //
//                            TLF 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 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
}

// el corazon de todo: checkField
function checkField (theField, theFunction, emptyOK, s)
{   
    var msg;
    if (checkField.arguments.length < 3) emptyOK = defaultEmptyOK;
    if (checkField.arguments.length == 4) {
        msg = s;
    } else {
        if( theFunction == isAlphabetic ) msg = pAlphabetic;
        if( theFunction == isAlphanumeric ) msg = pAlphanumeric;
        if( theFunction == isInteger ) msg = pInteger;
        if( theFunction == isNumber ) msg = pNumber;
        if( theFunction == isEmail ) msg = pEmail;
        if( theFunction == isPhoneNumber ) msg = pPhoneNumber;
        if( theFunction == isName ) msg = pName;
    }
    
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;

    if ((emptyOK == false) && (isEmpty(theField.value))) 
        return warnEmpty(theField);

    if ( checkNiceness && !isNice(theField.value))
        return warnInvalid(theField, pNice);

    if (theFunction(theField.value) == true) 
        return true;
    else
        return warnInvalid(theField,msg);

}
