/***
	Objeto para verificar los campos requeridos en una forma HTML
***/

// Definición de variables globales
//var formulario;			//forma principal a la que se requieren verificar los campos requeridos
//var URLdestino;			// a donde enviar la forma si todos los campos requeridos están llenos
var nomCampos= new Array();
var mensajes= new Array();
var correos= new Array();
var numericos= new Array();
var alfabeticos= new Array();

/*
	Constructor del Objeto
	Recibe como parámetros:
		- El formulario que va a verfificar
		- La página al que va a enviar los datos
*/
function Requeridos(i_forma, i_pagDestino)
{
	//varibles
	this.forma= i_forma;	//formulario
	this.pagDestino= i_pagDestino;

	//funciones
	this.agregaRequerido= agregaRequerido;
	this.verificaRequeridos= verificaRequeridos;
	this.verificaCorreo= verificaCorreo;
	this.campoCorreo= campoCorreo;
	this.enviar= enviar;
	this.campoAlfabetico= campoAlfabetico;
	this.verificaAlfabetico= verificaAlfabetico;
	this.campoNumerico= campoNumerico;
	this.verificaNumerico= verificaNumerico;
}


/*
	función para agregar un campo requerido
	Necesita dos parámetros:
		- El nombre del campo del formulario
		- El mensaje que debe enviar cuando el campo no tenga información
*/
function agregaRequerido(i_nomCampo, i_mensaje)
{
	//agrega al arreglo nomCampos el indice en el que queda el mensaje en el arreglo mensajes, el arreglo nomCampos es indexado por los nombre del campo
	
	i_nomCampo= "'"+i_nomCampo+"'";
	nomCampos[eval(i_nomCampo)]= mensajes.length;
	mensajes[mensajes.length]= i_mensaje;

}

/*
	función que verifica que todos los campos requeridos tengan información
*/
function verificaRequeridos()
{

	var indice;
	var flag= true;

	for (var i=0; i<this.forma.length; i++)
	{
		var nombre= "'"+this.forma[i].name+"'";

		if ( nomCampos[eval(nombre)] != null )
		{
			var tipo= this.forma[i].type;
			switch ( tipo )
			{
				case "text":
				case "password":
				case "file":
				case "textarea":
					if ( correos.join().indexOf(this.forma[i].name)!= -1 )
					{
						if (!verificaCorreo(this.forma[i].value))
						{
							alert( mensajes[nomCampos[eval(nombre)]] );
							this.forma[i].focus();
							return false;
						}
					}
					else if ( alfabeticos.join().indexOf(this.forma[i].name)!= -1 )
					{
						if (!verificaAlfabetico(this.forma[i].value))
						{
							alert( mensajes[nomCampos[eval(nombre)]] );
							this.forma[i].focus();
							return false;
						}
					}
					else if ( numericos.join().indexOf(this.forma[i].name)!= -1 )
					{
						if (!verificaNumerico(this.forma[i].value))
						{
							alert( mensajes[nomCampos[eval(nombre)]] );
							this.forma[i].focus();
							return false;
						}
					}
					else if ( this.forma[i].value== "" || this.forma[i].value== null )
					{
						alert( mensajes[nomCampos[eval(nombre)]] );
						this.forma[i].focus();
						return false;
					}
				break;

				case "select":
				case "select-one":
					if ( this.forma[i][this.forma[i].selectedIndex].value == "" )
					{
						alert( mensajes[nomCampos[eval(nombre)]] );
						this.forma[i].focus();
						return false;
					}
				break;

				case "select-multiple":
					var selActual= this.forma[i].name;
					var flagAux= false;
					

					for (var j=0; j< this.forma[i].options.length; j++)
					{
						if (this.forma[i].options[j].selected)
						{
							flagAux= true;
							break;
						}
					}

					if (j==this.forma[i].options.length)
					{
						alert( mensajes[nomCampos[eval(nombre)]] );
						this.forma[i].focus();
						return false;
					}
				break;

				case "radio":
				case "checkbox":
					var rad_checkActual= this.forma[i].name;
					var flagAux= false;
					do 
					{
						if (this.forma[i].checked)
							flagAux= true;
						i++;
					} while (this.forma[i].name==rad_checkActual);
						
					if (flagAux)
						i--;
					else
					{
						alert( mensajes[nomCampos[eval(nombre)]] );
						this.forma[--i].focus();
						return false;
					}
				break;
				
			}

		}
	}

	// Si todos los datos requeridos fueron llenados, regresa TRUE
	if ( i==this.forma.length )
	{
		return true;
	}
	else
		return false;
}

/*
	funcion qeu realiza en submit
*/
function enviar()
{
	if (this.pagDestino!="" && this.pagDestino!=null)
	{	
		this.forma.action= this.pagDestino;
	}

	this.forma.submit();
}


/*
	función que verifica que la dirección de correo sea válida
*/
function verificaCorreo(mail)
{

	for(var i=0; i<mail.length;i++)
	{
	   var car=mail.charAt(i);
	   if (car < '0' || car > '9')
		if (car <'a' || car>'z')
			if(car != '@' && car !='_' && car != '.')
				break;
	}
	if (i==mail.length) // No hay caracteres extraños
	{
		var part=mail.split("@");
		if (part.length !=2) // Hay mas de una arroba o no hay ninguna
		{
			return false;
		}
		else
		{
			if (part[0].length<2) // El nombre de usuario es de 2 caracteres o menos
			{
				return false;
			}
			else
			{
				var login=part[0].split(".");
				if (login.length>2) // hay mas de un punto en el nombre de usuario
				{
					return false;
				}
				else  
				{
					for(var j=0; j<login.length;j++)
						if (login[j].length==0) // Dos puntos juntos o un punto antes de la arroba
							break;
					if (j != login.length)
					{
						return false;
					}
					else
					{
						var dominio=part[1].split(".");
						if (dominio.length<2 || dominio.length>4) // No hay puntos en el dominio o hay mas de tres puntos
						{
							return false;
						}
						else  
						{	
							for(var j=0; j<dominio.length;j++)
								if (dominio[j].length==0) // Dos puntos juntos o un punto al final
									break;
							if (j != dominio.length)
							{
								return false;
							}
							else 
								return true; // TODO BIEN
						}
					}
				}
			}
		}
	}
	else 
		return false;
}

/*
	verifica que la cadena solo tenga letras
*/
function verificaAlfabetico(cad)
{
	var flag= false;
	cad = cad.toLowerCase();

	if (cad.length<=0)
	{
		return false;
	}

	for(var i=0; i<cad.length;i++)
	{
		var car= cad.charAt(i);
		
		if (car <'a' || car>'z')
			if(car !='_' && car != '.' && car != '-' && car != ';' && car != ':' && car != '¿' && car != '?' && car != '¡' && car != '!')
			{
				return false;	
			}
	}

	if ( i==cad.length )
	{
		return true;
	}
	else
		return false;


}

/*
	varifica que la cadena solo tenga números
*/
function verificaNumerico(cad)
{
	var flag= false;

	if (cad.length<=0)
	{
		return false;
	}

	for(var i=0; i<cad.length;i++)
	{
	   var car= cad.charAt(i);
		
		if (car <'0' || car>'9')
		{
			return false;
		}

	}

	if ( i==cad.length )
	{
		return true;
	}
	else
		return false;
}


/*
	Guarda el nombre del campo de correo electrónico en un arreglo
	Necesita como parámetros:
		- El nombre del campo
*/
function campoCorreo(i_campoCorreo)
{
	correos[correos.length]= i_campoCorreo;
}

/*
	Guarda el nombre del campo alfabético (solo letras) en un arreglo
	Necesita como parámetros:
		- El nombre del campo
*/
function campoAlfabetico(i_campoAlfa)
{
	alfabeticos[alfabeticos.length]= i_campoAlfa;
}

/*
	Guarda el nombre del campo numérico (solo acepta números) en un arreglo
	Necesita como parámetros:
		- El nombre del campo
*/
function campoNumerico(i_campoNumerico)
{
	numericos[numericos.length]= i_campoNumerico;
}



/*
	Función para mandar llamar la ventana de impresión 
*/
function printWindow()
{
   bV = parseInt(navigator.appVersion)
   if (bV >= 4) window.print()
}


/*
	Función para abrir ventanas en el centro de la pantalla
*/
function centerPopUp( url, name, width, height, scrollbars )
{

        if( scrollbars == null ) scrollbars = "0"

        str  = "";
        str += "resizable=1,";
        str += "scrollbars=" + scrollbars + ",";
        str += "width=" + width + ",";
        str += "height=" + height + ",";

        if ( window.screen ) {
                var ah = screen.availHeight - 30;
                var aw = screen.availWidth - 10;

                var xc = ( aw - width ) / 2;
                var yc = ( ah - height ) / 2;

                str += ",left=" + xc + ",screenX=" + xc;
                str += ",top=" + yc + ",screenY=" + yc;
        }
                window.open( url, name, str );
}
