function valida_form(forma,campos_v,email,idioma){
   ////////////////////////////////////////////////////////////////////////////////////////
   //   valida que campos de formulario no esten vacios,checkbox/radio marcados, etc.
   // Version: 0.9.3.1
   // cambios version 0.9.3.1 :
   //           -corregido bug al validar formato email con un campo de email vacio si este no es requerido
   // cambios version 0.9.3 :
   //			-opcion para indicar que campos no se validaran
   //           -soporte de idioma ingles y español
   // Codigo por: drk
   // parametros: forma (objeto formulario del documento, usualmente se llamara con this)
   //             campos_v (string, contiene los nombres de campos a validar, los nombres se separan con comas,
   //                              si no se especifica valida todos los campos)
   //             email (string, nombre del campo de email, si no se necesita checar email valido, se envia vacio)
   //             idioma (string, idioma de los mensajes, valores posibles 'es' o 'en', si no se especifica,
   //								se usa 'es' por default)
   // 	uso: -se coloca en el evento onsubmit del fomulario
   //        -si se precede la lista de campos con un signo - , indica que se validaran todos los campos menos los indicados
   //        -para mostrar los mensajes en ingles, añadir un cuarto parametro 'en', ej: return valida_form(this,'','','en')
   //        -si el ultimo parametro es vacio se puede omitir
   //
   //   ejemplos:
   //   <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,'campo1,campo2','')">
   //				-- valida los campos del formulario llamados 'campo1' y 'campo2', sin verificar email valido
   //
   //   <form name="forma" onsubmit="return valida_form(this,'campo1,campo2','mail')">
   //				-- valida los campos del formulario llamados 'campo1' y 'campo2', verifica email valido en campo llamado 'mail'
   //
   //   <form name="forma" onsubmit="return valida_form(this,'-campo1','')">
   //				-- valida todos los campos del formulario, menos el llamado 'campo1', sin verificar email valido
   //
   //   <form name="forma" onsubmit="return valida_form(this,'-campo1,campo2','')">
   //				-- valida todos los campos del formulario, menos los llamados 'campo1' y 'campo2', sin verificar email valido
   //
   /////////////////////////////////////////////////////////////////////////////////////////

	//mensajes
	MSG_REQUIRED=new Array();
	MSG_REQUIRED['es']='Los siguientes campos son requeridos:';
    MSG_REQUIRED['en']='The following fields are required:';

    MSG_INVALIDMAIL=new Array();
	MSG_INVALIDMAIL['es']="Direccion de email invalida";
	MSG_INVALIDMAIL['en']="Invalid e-mail address";

	 //inicializa parametros
  	 idioma=idioma||'es';
  	 campos_v=campos_v||'';
  	 
	 //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 title/nombres de los radio para validar
	 var found_it;                  //guarda si se encontro un radio checkeado
	 var flag_minus=false;          //indica si se validaran o no se validaran los campos mencionados

	 //inicializar array de campos a validar
	 if(campos_v!=''){
		if(campos_v.substring(0,1)=='-'){
			flag_minus=true;
			campos_v=campos_v.substring(1);
			}
		campos_v=campos_v.split(',');
	    }
	 else
		campos_v=new Array();
		
//inicia validacion
	 //si se define campo de email, validar
	 if(email && forma.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(campos_v.length>0 && !(in_array(forma.elements[i].name,campos_v) ^ flag_minus))
			continue;
        //alert(forma.elements[i].name+' - '+forma.elements[i].type+'='+forma.elements[i].value);
		//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(MSG_REQUIRED[idioma]+campos);
		return false;
		}
	//si detecto mail invalido
	else if(!flagmail){
		alert (MSG_INVALIDMAIL[idioma]);
		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;
	}
	
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  TO DO:
//  -agregar opcion para definir longitud maxima y minima (exacta?) para campos (independiente de si son o no requeridos)
//
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
