function valida_form(forma,email,campos_v){
   ////////////////////////////////////////////////////////
   //   valida que campos de formulario no esten vacios,checkbox/radio marcados, etc.
   // Version: 0.9.2.1
   // Codigo por: drk
   // parametros: forma (objeto formulario del documento, usualmente se llamara con this)
   //             email (string, nombre del campo de email, si no se necesita checar email valido, se envia vacio)
   //             campos_v (array, contiene los nombres de campos a validar, los nombres se separan con comas,
   //                              si no se especifica valida todos los campos)
   //
   // uso: se coloca en el evento onsubmit del fomulario (importante, notar la 'A' mayuscula en 'Array'")
   //   <form name="forma" onsubmit="return valida_form(this)">
   //				^-- valida todos los campos del formulario, sin verificar email valido"
   //
   //   <form name="forma" onsubmit="return valida_form(this,'mail')">
   //				^-- valida todos los campos del formulario, verifica email valido en campo llamado 'mail'"
   //
   //   <form name="forma" onsubmit="return valida_form(this,'mail',Array('campo1','campo2'))">
   //				^-- valida los campos del formulario llamados 'campo1' y 'campo2', verifica email valido en campo llamado 'mail'"
   //
   //   <form name="forma" onsubmit="return valida_form(this,'',Array('campo1','campo2'))">
   //				^-- valida los campos del formulario llamados 'campo1' y 'campo2', sin verificar email valido"
   //
   ////////////////////////////////////////////////////////
	 //inicializar array de campos a validar si no se especifica
	 campos_v=campos_v||new Array();

	 //variables necesarias para la validacion
	 var campos='';					//guarda los nombres de los campos vacios encontrados
	 var flagmail=true;             //guarda si el email es valido (o si no es necesario validar)
	 var radios = new Array();      //guarda los nombres de los radio para validar
	 var radios2 = new Array();      //guarda los nombres de los radio para validar
	 var found_it;                  //guarda si se encontro un radio checkeado

	 //si se define campo de email, validar
	 if(email)
		flagmail=valida_mail(forma[email]);

	//recorrer los elementos del formulario
	 for(i=0;i<forma.elements.length;i++){

        
		//si existe el array de campos para validar, y el campo actual no esta dentro de este, pasar al siguiente
		if(!in_array(forma.elements[i].name,campos_v) && campos_v.length>0)
			continue;
        //alert(forma.elements[i].title);
		//si es campo de "texto", verifica que no este vacio
		if(forma.elements[i].type=='text' || forma.elements[i].type=='textarea' || forma.elements[i].type=='select-one'){
			if(forma.elements[i].value=='')
			    campos=campos+"\n"+(forma.elements[i].title?forma.elements[i].title:forma.elements[i].name);
			}
		//si es checkbox, verificar si esta checkeado
		if(forma.elements[i].type=='checkbox'){
			if(forma.elements[i].checked===false)
			    campos=campos+"\n"+(forma.elements[i].title?forma.elements[i].title:forma.elements[i].name);
		 	}
		 //llena array con nombres de radios para validar despues
		 if(forma.elements[i].type=='radio' && !(in_array(forma.elements[i].name,radios)))
		    radios.push(forma.elements[i].name);
		    radios2.push(forma.elements[i].title?forma.elements[i].title:forma.elements[i].name);
		 }

		//verifica radios
        //este ciclo recorre el array con los nombres de los radios
		for (var j=0; j<radios.length; j++){
			found_it=false;
			xradio=radios2[j];
            //este recorre cada grupo de radios para verificar si se selecciono uno
			for (var i=0; i<forma[xradio].length; i++)  {
				if (forma[xradio][i].checked)  {
					found_it = forma[xradio][i].value;
					}
				}
			//si no se encontro un radio checkeado, agregar el nombre a la lista de campos
			if(!found_it){
				campos=campos+"\n"+xradio;
				}
			}
	//si detecto campos vacios
	if(campos.length>0){
		alert('Los siguientes campos son requeridos:'+campos);
		return false;
		}
	//si detecto mail invalido
	else if(!flagmail){
		alert ("Direccion de email invalida");
		return false;
		}
	//si todo esta bien, envia la forma :D
	else{
  		return true;
		}
	}

//funciones "de utileria" necesarias para la funcion principal
function in_array (needle, haystack, argStrict) {
    // Checks if the given value exists in the array
    //
    // version: 911.718
    // discuss at: http://phpjs.org/functions/in_array    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: vlado houba
    // +   input by: Billy
    // +   bugfixed by: Brett Zamir (http://brett-zamir.me)
    // *     example 1: in_array('van', ['Kevin', 'van', 'Zonneveld']);    // *     returns 1: true
    // *     example 2: in_array('vlado', {0: 'Kevin', vlado: 'van', 1: 'Zonneveld'});
    // *     returns 2: false
    // *     example 3: in_array(1, ['1', '2', '3']);
    // *     returns 3: true    // *     example 3: in_array(1, ['1', '2', '3'], false);
    // *     returns 3: true
    // *     example 4: in_array(1, ['1', '2', '3'], true);
    // *     returns 4: false
    var key = '', strict = !!argStrict;
    if (strict) {
        for (key in haystack) {
            if (haystack[key] === needle) {
                return true;            }
        }
    } else {
        for (key in haystack) {
            if (haystack[key] == needle) {                return true;
            }
        }
    }
     return false;
}

function valida_mail(email){
//verifica formato de email valido
	var re  = /^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$/;
	if (!re.test(email.value)) {
    	return false;
		}
	return true;
	}
