// JavaScript Document

/** 
 * INSTRUCCIONES PARA EL USO DE LA FUNCI� MM_validateForm()
 * En el evento del submit donde ser�invocado, colocar la llamada como en el siguiente 
 * ejemplo: onClick="validarFrm('nombreDelCampo','x','condicion'); return document.MM_returnValue",
 * de ser radiobutton o checkbox debemos colocar "validarFrm('nombreDelCampo[ ]','x','condicion'); return document.MM_returnValue",
 * Donde s�o el primero es obligatorio, los otros pueden ir vacios ('').
 * Para validar que 2 campos sean iguales colocaremos el name del primer campo, del segundo y la condici� 'IdemField' de la 	  siguiente forma ('campo1','campo2','IdemField').
 * 1) Para cada campo se deben usar los 3 argumentos, siendo 'nombreDelCampo' su atributo 
 * name;  el tercero, la 'condici�' que ser�la siguiente dependiendo del caso:
 * - Si s�o es Requerido sin importar su contenido 'R', sino es requerido ''
 * - Si es una direcci� de correo, si es requerida 'RisEmail', sino es requerida 'NisEmail'
 * - Si es una direcci� Url, si es requerida 'RisUrl', sino es requerida 'NisUrl'
 * - Si es un nmero, si es requerido "RisNum', sino es requerido 'NisNum'
 * - Si es un nmero entre un rango de valores, por ej. entre 1 y 5 colocar, si es requerido 'RinRange1:5',
 * - sino es requerido 'NinRange1:5'
 * 2) Para radiobuttons y checkboxes:
 *   En el atributo name en el formulario debemos colocar el nombre del campo seguido de corchetes ej: nombreDelCampo[ ] 
 * - Si se quiere validar si en un grupo de radiobuttons hay alguno seleccionado colocaremos en 'Condici�' RadChk
 * - Si se quiere validar si en un grupo de checkboxes hay una cantidad n de estos seleccionados utilizaremos el segundo 
 *    argumento indicando el 'n' 
 */

// Definiendo un m�odo "trim()" para el objeto "String" que eliminar�los espacios en blanco al inicio y al final de una cadena
String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ''); };

// Funci� que busca los objetos en el formulario
function MM_findObj(n, d) 
{ 	var p,i,x;  
	if(!d) 
		d=document; 
	if((p=n.indexOf("?"))>0&&parent.frames.length) {
    		d=parent.frames[n.substring(p+1)].document; 
		n=n.substring(0,p);
	}
  	if(!(x=d[n])&&d.all) 
		x=d.all[n]; 
	for (i=0;!x&&i<d.forms.length;i++) 
		x=d.forms[i][n];
  	for(i=0;!x&&d.layers&&i<d.layers.length;i++) 
		x=MM_findObj(n,d.layers[i].document);
  	if(!x && d.getElementById) 
		x=d.getElementById(n); return x;
}


function tamaMinimo(e,tam)
{
 var a; 
 s=document.getElementById(e);
 a=s.value;
 if(a.toString().length<tam)
	return false;

return true;
 
}


// Funci� que valida el formulario
function MM_validateForm()  
{ 	

	var i, p, q, nomb,counter=1 ,condicion, num, min, max, errores='', args=MM_validateForm.arguments;
	
  	for (i = 0 ; i < (args.length - 2); i += 3) 
	{
		
  	 	condicion = args[i+2];   			//Almacena la condici�
  		valor = MM_findObj(args[i]); 		//busca el objeto del formulario dado el nombre
		nombreMsg = valor.id; 			 	//nombre que aparecer�en los errores (el "id" del campo)				
		campoAuxuliar = args[i+1];			//2do de cada tres par�etros utilizado para IdemField y RadChk 
		
		if(condicion != "RadChk" && condicion != "lista")
		{
			valor = valor.value; 		 		// valor del campo							
			long_completa = valor.length;		//longitud del campo
			long_trim = (valor.trim()).length;	//longitud de espacios en blanco
			
			if(valor.trim() != "")
			{
				if (condicion.indexOf('isEmail') != -1) 
				{ 	
					condicion = "isEmail";
				}
				else if (condicion.indexOf('isNum') != -1) 
				{ 	
					condicion = "isNum";
				}
				else if (condicion.indexOf('inRange') != -1)
				{
					condicionAux = condicion;
					condicion = "inRange";
				}
				else if (condicion.indexOf('isUrl') != -1)
				{
					condicion = "isUrl";
				}
				else if (condicion.indexOf('isFloat') != -1)
				{
					condicion = "isFloat";
				}
			}
			else
			{
				if(condicion.charAt(0) == 'R')//si es requerido
				{
					condicion = "R";
				}
				else if((long_completa > 0) && (long_trim <= 0))//si s�o hay espacios en blanco
				{ 
					condicion = "WhiteSpaces";
				}
			}//if valor.trim				
		}//if condicion
		
		switch (condicion)
		{
			case "isUrl":
				//expresi� regular para validar url
				var urlExpReg= /^(http(s)?:\/\/)?(\w)+\.(\w)+\.(\w{2,}(\.\w{2,n})?(\/)?)((\/)?\S+(\/)?)*(\.\w+)?$/;
				
				if (!urlExpReg.test(valor))
				{ 
					errores += '- \"' + nombreMsg + '\" debe contener una direcci� url v�ida.\n';
				}	
				
			break;
			case "IdemField":
			
				campo2 = MM_findObj(campoAuxuliar); //busco el segundo campo 				          
				valor2 = campo2.value;              //almaceno el valor del segundo campo
				nombreMsg2 = campo2.id;             //nombre del segundo campo que aparecer�en el mensaje
				
				if(valor != valor2) //si el contenido del primer campo es distinto del segundo
				{
					errores += '- \"' + nombreMsg + "\" no coincide con \"" +  nombreMsg2 + '\".\n';
				}
								
			break;
			case "RadChk":
			
				if(campoAuxuliar == '')//si es RADIO 
				{							 
					var flag=0; //bandera que se activar�a 1 si un radio del grupo est�seleccionado 

					for(j = 0 ; j < valor.length ; j++)
					{
						name = valor[j].id;				
	
						if(valor[j].checked==true)//si un radio est�seleccionado coloca flag en 1
						{
							flag=1;	
						}
					}
					if (flag==0) //si no hay ningn radio seleccionado
					{
						errores += '- \"' + name + '\" es requerido.\n';
					}
				}
				else//si es  CHECKBOX 
				{ 	
					counter = 0;
					for(j = 0 ; j < valor.length ; j++) 
					{
						name=valor[j].id;				
						if(valor[j].checked == true) //si un checkbox est�seleccionado incrementa el contador
						{ 		
							counter++;				
						}
					}
				
					if(counter < parseInt(campoAuxuliar))//verifica si se seleccion�la cantidad de checkboxses requeridas
					{ 		
						errores += '- \"' + name + '\"  al menos'+ ' ' + campoAuxuliar + ' son requeridos.\n';
					}
				}	
										
			break;
			case "lista":
				counter = 0;
				nombreMsg = valor.id;
				
				for(j = 0 ; j < valor.length ; j++) 
				{									
					if(valor[j].selected == true) //si un item de la lista est�seleccionado incrementa el contador
					{ 		
						counter++;				
					}
				}
			
				if(counter < parseInt(campoAuxuliar))//verifica si se seleccion�la cantidad de checkboxses requeridas
				{ 		
					errores += '- \"' + nombreMsg + '\"  al menos'+ ' ' + campoAuxuliar + ' son requeridos.\n';
				}
			
			break;
			case "isEmail":
				//expresi� regular para validar email
				var mailExpReg = /^[A-Za-z]\w+(\.|\_|\-)?\w+(\.|\_|\-)?\w+@(\w+\.\w+){1}(\.\w+){0,3}$/;					
				
				if (!mailExpReg.test(valor))
				{
					errores += '- \"' + nombreMsg + '\" debe contener una direcci� de correo electr�ico.\n';
				}
				
			break;
			case "isNum":
				//expresi� regular para validar nmeros
				var numExpReg = /^\d+$/;
				
				if (!numExpReg.test(valor))
				{
					errores += '- \"' + nombreMsg + '\" debe ser num�ico.\n';
				}		
							
			break;	
			case "isFloat":
				//expresi� regular para validar nmeros
				var numExpReg = /^(\-)?((\d)+)?(\,\d{1,2})?$/;
				
				if (!numExpReg.test(valor))
				{
					errores += '- \"' + nombreMsg + '\" debe ser num�ico.\n';
				}		
							
			break;			
			case "combo":
				p = valor.indexOf('000');
				
				if (p == '000')
				{
					errores += '- \"' + nombreMsg + '\" es requerido.\n';
				}
				
			break;	
			case "WhiteSpaces":
			
					errores += '- \"'+ nombreMsg +'\" no puede contener s�o espacios en blanco.\n';
			break;
			case "inRange":
			
				p = condicionAux.indexOf(':');
				min = condicionAux.substring(8, p); 
				max = condicionAux.substring(p + 1);
				
				if (valor < min || max < valor) 
				{
					errores += '- \"' + nombreMsg + '\" debe ser un nmero comprendido entre '+ min +' y '+ max +'.\n';
				}
				
			break;
			case "R":
				if(valor == '')
				{
					errores += '- \"'+ nombreMsg +'\" es requerido.\n';					
				}
			break;	
			case "Tam":
				
				
				if(tamaMinimo(nombreMsg,campoAuxuliar)==false)
				{
					errores += '- \"'+ nombreMsg +'\" tam.\n';		
				}
			break;	
			
		}//switch
	}//for	
 
  	if (errores)//si se registraron errores 
	{
//  		alert('Han ocurrido los siguientes errores:\n'+errores);
		
	}
	
  	document.MM_returnValue = (errores == '');
}

