entity = new Array; //Este arreglo guarda todos los campos a ser validados
names = new Array; //Este arreglo guarda los nombres a desplegar de los campos correspondientes
code = new Array;	//Este arreglo guarda las validaciones ha ser aplicadas sobre el campo correspondiente

var position=0;//Esta variable nos indica la posicion disponible del arreglo de validaciones
var passed;//Esta variable nos indica si se pasaron todas las validaciones
var message=" \n";
var infocus;
var done=false;
//Esta función ejecuta las validaciones correspondientes
//la variable que recibe indica el tipo de validación a realizar
//code: ( 1 || vBlank )valida que el campo no este en blanco
//code: ( 2 || vNumber ) valida que el campo sea un número
//code: ( 3 || vMoney ) valida que el campo no tenga signo de pesos ni coma
//code: ( 4 || vMax ) valida que el campo no sea menor a un número dado de caracteres
//code: ( 5 || vMin ) valida que el campo sea mayor a un número dado de caracteres
//code: ( 6 || vInt ) valida que el campo sea un entero
//code: ( 7 || vPos ) valida que el campo sea un número positivo
//code: ( 8 || vSel ) valida que se haya seleccionado un index diferente del primero (0)
//code: ( 9 || vOpt ) valida que haya elementos que seleccionar
//code: ( 10 || vLess ) valida que el valor del campo sea menor a un número dado
//code: ( 11 || vLessC ) valida que el valor del campo sea menor a un número dado ( se le pasa otro campo )
//code: ( 12 || vEquals ) valida que el valor del campo sea igual al de otro campo ( se le pasa otro campo y su nombre )
//code: ( 12 || vGreater ) valida que el valor del campo sea mayor a un número dado

//cuando se quiere utilizar la validación vMin o vSize junto con la validación vMoney siempre debe de ir
//primero en el arreglo la validación vMoney ya que primero hay que quitar el signo de pesos o las comas según
//sea el caso y después poder trabajar con el dato real

//la validación vMin y vMax requieren que el parametro de tamaño siga en el arrego en el que se indica el tipo
//de validación


//Esta función realiza todas la validaciones
function validate(theForm)
{
	var actualSize=position;
	ignore= new Boolean(false);
	
	for(var i=0;i<actualSize;i++)
	{
		tempCode = new Array;
		tempCode = code[i];
		
		ignore=false;
	
		for(var j=0;j<tempCode.length;j++)
		{
			if(!ignore)
			{
				if((tempCode[j]==1)||(tempCode[j]=="vBlank"))
				{
					checkBlank(i);
				}
				else if((tempCode[j]==2)||(tempCode[j]=="vNumber"))
				{
					checkNumber(i);
				}
				else if((tempCode[j]==3)||(tempCode[j]=="vMoney"))
				{
					checkMoney(i);
				}
				else if((tempCode[j]==4)||(tempCode[j]=="vMax"))
				{
					checkLength(i,tempCode[j+1]);
					ignore=true;
				}
				else if((tempCode[j]==5)||(tempCode[j]=="vMin"))
				{
					checkMinimumSize(i,tempCode[j+1]);
					ignore=true;
				}
				else if((tempCode[j]==6)||(tempCode[j]=="vInt"))
				{
					checkInteger(i);
				}
				else if((tempCode[j]==7)||(tempCode[j]=="vPos"))
				{
					checkPositive(i);
				}
				else if((tempCode[j]==8)||(tempCode[j]=="vSel"))
				{
					checkSelection(i);
				}
				else if((tempCode[j]==9)||(tempCode[j]=="vOpt"))
				{
					checkOptions(i);
				}
				else if((tempCode[j]==10)||(tempCode[j]=="vLess"))
				{
					checkLessThan(i,tempCode[j+1]);
					ignore=true;
				}
				else if((tempCode[j]==11)||(tempCode[j]=="vLessC"))
				{
					checkLessThanC(i,tempCode[j+1]);
					ignore=true;
				}
				else if((tempCode[j]==12)||(tempCode[j]=="vEquals"))
				{
					checkEquals(i,tempCode[j+1],tempCode[j+2]);
					ignore=true;
				}
				else if((tempCode[j]==13)||(tempCode[j]=="vGreater"))
				{
					checkGreaterThan(i,tempCode[j+1]);
					ignore=true;
				}
				else if((tempCode[j]==14)||(tempCode[j]=="vQuote"))
				{
					checkQuote(i);
					ignore=true;
				}	
			}
			else
			{
				ignore=false;
			}
		}
	}
	if(passed==true)
	{
		position=0;
		return theForm.submit();
	}
	else
	{
		passed=true;
		alert(message);
		infocus.focus();
		message=" \n";
		done=false;
		return false;
	}
}


//dada de alta los datos correspondientes del campo junto con las validaciones ha aplicar
function data(campo, nombre, theCode)
{
	entity[position]=campo;
	names[position]=nombre;
	code[position++]=theCode;
	passed=true;
}


//verifica que el campo no este en blanco
function checkBlank(elemt)
{
	if(entity[elemt].value.length<=0)
	{
		message+="El campo: "+names[elemt]+" no puede quedar vacio \n";
		if(!done)
		{
			infocus=entity[elemt];
			done=true;
		}
		passed=false;
	}
}

//Verifica que el campo sea numérico
function checkNumber(elemt)
{
	var numb=new Number(entity[elemt].value);
	if((entity[elemt].value.length<=0)||(isNaN(numb)))
	{
		message+="El campo: "+names[elemt]+" solo puede tener números \n";
		
		if(!done)
		{
			infocus=entity[elemt];
			done=true;
		}
		passed=false;
	}
}


//Quita el signo de pesos y las comas del campo
function checkMoney(elemt)
{
	var character;
	var newString="";
	var data=entity[elemt].value;
	for(var i=0;i<data.length;i++)
	{
		character=data.charAt(i);
		if((character!=",")&&(character!="$"))
		{
			newString+=character;
		}
	}
	var numb=new Number(newString);
	if((newString.length<=0)||(isNaN(numb)))
	{
		message+="El campo: "+names[elemt]+" solo puede tener el signo de pesos, comas y números (no puede quedar en blanco ni tener un precio inválido) \n";
		if(!done)
		{
			infocus=entity[elemt];
			done=true;
		}
		passed=false;
	}
	else
	{
		entity[elemt].value=newString;
	}
}

//valida que el campo tenga como máximo el número de caracteres dados en size
function checkLength(elemt, size)
{
	var stringToCheck=entity[elemt].value;
	if(stringToCheck.length>size)
	{
		message+="Favor de no exceder de "+size+" caracteres en el campo: "+names[elemt]+" (El número de caracteres introducidos fue de "+stringToCheck.length+") \n";
		if(!done)
		{
			infocus=entity[elemt];
			done=true;
		}
		passed=false;
	}
}

//valida que el campo tenga el número minimo de caracteres dados en size
function checkMinimumSize(elemt, size)
{
	var stringToCheck=entity[elemt].value;
	if(stringToCheck.length<size)
	{
		message+="El número mínimo de caracteres que debe de tener el campo: "+names[elemt]+" es de "+size+" (El número de caracteres introducidos fue de "+stringToCheck.length+") \n";
		if(!done)
		{
			infocus=entity[elemt];
			done=true;
		}
		passed=false;
	}
}

//valida que el campo tenga un número entero
function checkInteger(elemt)
{
	var numb=new Number(entity[elemt].value);
	if((entity[elemt].value.length<=0)||(isNaN(numb)))
	{
		message+="El campo: "+names[elemt]+" solo puede tener números enteros \n";
		if(!done)
		{
			infocus=entity[elemt];
			done=true;
		}
		passed=false;
	}
	else
	{	
		var character;
		var newString="";
		var data=entity[elemt].value;
		for(var i=0;i<data.length;i++)
		{
			character=data.charAt(i);
			if(character==".")
			{
				message+="El campo: "+names[elemt]+" debe de contener solo números enteros \n";
				if(!done)
				{
					infocus=entity[elemt];
					done=true;
				}
				passed=false;
			}
		}
	}
}


//valida que el campo tenga un número positivo, este puede ser cero
function checkPositive(elemt)
{
	var numb=new Number(entity[elemt].value);
	if((entity[elemt].value.length<=0)||(isNaN(numb)))
	{
		message+="El campo: "+names[elemt]+" solo puede tener números positivos \n";
		
		if(!done)
		{
			infocus=entity[elemt];
			done=true;
		}
		passed=false;
	}
	else
	{
		if(entity[elemt].value<0)
		{
			message+="El campo: "+names[elemt]+" solo puede tener números positivos \n";
			
			if(!done)
			{
				infocus=entity[elemt];
				done=true;
			}
			passed=false;
		}
	}
}

//valida que se haya seleccionado un elemento distino del primero (0)
function checkSelection(elemt)
{
	if(entity[elemt].selectedIndex == '0')
	{
		message+="Favor de seleccionar en: "+names[elemt]+" \n";
		if(!done)
		{
			infocus=entity[elemt];
			done=true;
		}
		passed=false;
	}
}

//valida que haya elementos que seleccionar
function checkOptions(elemt)
{
	if((entity[elemt].length)==0)
	{
		message+="El campo: "+names[elemt]+" esta vacío por lo que no se puede proceder, se deben de dar de alta elementos en la sección correspondiente a estas opciones antes de dar de alta esta información \n";
		if(!done)
		{
			infocus=entity[elemt];
			done=true;
		}
		passed=false;
	}
}

function checkLessThan(elemt, data)
{
	var numb=new Number(entity[elemt].value);
	var numb2=new Number(data);
	
	if(numb > numb2)
	{
		message+="El valor introducido en el campo: "+names[elemt]+" debe de ser menor o igual a "+numb2+" \n";
		if(!done)
		{
			infocus=entity[elemt];
			done=true;
		}
		passed=false;
	}	
}

function checkLessThanC(elemt, data)
{
	var numb=new Number(entity[elemt].value);
	var numb2=new Number(data.value);
	
	if(numb > numb2)
	{
		message+="El valor introducido en el campo: "+names[elemt]+" debe de ser menor o igual a "+numb2+" \n";
		if(!done)
		{
			infocus=entity[elemt];
			done=true;
		}
		passed=false;
	}	
}

function checkEquals(elemt, data, name)
{
	if(entity[elemt].value != data.value)
	{
		message+="El valor introducido en el campo: "+names[elemt]+" debe de ser igual al introducido en el campo: "+name+" \n";
		entity[elemt].value='';
		data.value='';
		if(!done)
		{
			infocus=entity[elemt];
			done=true;
		}
		passed=false;
	}	
}

function checkGreaterThan(elemt, data)
{
	var numb=new Number(entity[elemt].value);
	var numb2=new Number(data);
	
	if(numb <= numb2)
	{
		message+="El valor introducido en el campo: "+names[elemt]+" debe de ser mayor a "+numb2+" \n";
		if(!done)
		{
			infocus=entity[elemt];
			done=true;
		}
		passed=false;
	}	
}

//Quita el signo de pesos y las comas del campo
function checkQuote(elemt)
{
	var character;
	var newString="";
	var data=entity[elemt].value;
	for(var i=0;i<data.length;i++)
	{
		character=data.charAt(i);
		if((character!="\""))
		{
			newString+=character;
		}
	}
	entity[elemt].value=newString;
}