// JavaScript Document

/**
 *** Validador de formulario javascript V.1.0
 by Obed Santos.
 
 CONTROLA LOS ELEMENTOS :
 ========================
	*	text
	*	file
	*	radio
	*	checkbox
	-	textarea
	-	select

 No controla:
 ==================
 	*	password

 PARA USARLO:
 ============
	 -- Primeramente tener creadas 2 clases (CSS) para utilizarce como respuesta de la validación.
			 Estas clases son:
				- error_lbl
				- error_mensaje
			 Estas clases serán usadas al no validar el formulario.
			 
	 -- Además de esto, se requiere como segundo parámetro en la llamada a la función, el id de un elemento q se mostrará 
	 como mensaje
	 	de error (se guarda el id en "id_de_elemento_error").
	 	general a mostrarse cada vez q el el formulario no valide
	 
	 
  - El marcado con (1), utiliza un texto especial en su atributo "alt":
  	 * R -- para requerido
	 * N -- para No requerido
	 * [ A | B ] dentro de los paréntesis rectos dos valores (A y B) separados por carácter pipe "|" 
					(valor A tipo de dato, valor B id del tag a resaltar en caso de error en validación )
					Los tipos de dato pueden ser: - t (texto) - n (numerico) - e (email)
					
	Ej 1. R[t|id_label_respuesta] ----> El input es campo Obligatorio (R -requerido), acepta el "tipo de dato" texto (t -texto) en caso de no validar
	 									agrega la clase "error_lbl" al tag q tenga como id "id_label_respuesta".
	 
	Ej 2. N[e|otro_id_respuesta] -----> El input no es Obligatorio (N -no requerido), acepta el "tipo de dato" email (e -email) en caso de no validar
										agrega la clase "error_lbl" al tag q tenga como id "otro_id_respuesta".
	
	
  - El marcado con (2), utiliza un nombre especial en su atributo "alt":
  	 * R -- para requerido
	 * N -- para No requerido
	 * [ A | B ] dentro de los paréntesis rectos dos valores (A y B) separados por carácter pipe "|" 
					(valor A tipo de dato, valor B id del tag a resaltar en caso de error en validación )
					El tipo de dato valido para este input es  - f (archivo)
	 * extensiones de archivo aceptadas para este input, todas separadas por el caracter "-" ( extensiones jpg, gif, png, etc)

	Ej 1. R[f|div_repuesta_id]jpg-gif-png ----> El input es campo Obligatorio (R -requerido), en caso de no validar
	 									agrega la clase "error_lbl" al tag q tenga como id "div_respuesta_id".
										Sólo acepta archivos con la extensión jpg, gif o png.
										
	Ej 2. N[f|span_respuesta_id]xls-ppt-qt-doc ------------> El input es campo no obligatorio (N -requerido), en caso de no validar
												agrega la clase "error_lbl" al tag q tenga como id "span_respuesta_id".
												Sólo se acepta archivos con extensión xls, ppt, qt y doc

  - Los marcados con (3), utiliza un nombre especial en su atributo "alt":
  	 * R -- para requerido
	 * [ A ] dentro de los paréntesis rectos solo un valor que corresponde al id del tag a resaltar en caso de error en validación 

  - Los marcados con (4), utiliza un nombre especial en su atributo "id":
  	 * R__ -- para requerido (atención es "R__" con doble subguión)
	 *  Luego del  2ble subguión, solo un valor que corresponde al id del tag a resaltar en caso de error en validación


	1	text
	2	file
	3	radio
	3	checkbox
	4	textarea
	4	select
*/

function valid_ltrim(s) {
   return s.replace(/^\s+/, "");
}
function valid_rtrim(s) {
   return s.replace(/\s+$/, "");
}
function valid_trim(s) {
   return valid_rtrim(valid_ltrim(s));
}
function valid_getObj(id){
	return document.getElementById(id);
}

function valid_agregarClase(obj, clase){
	if(obj == null) return;
	valid_removerClase(obj, clase);
	obj.className += " " + clase;
}
function valid_removerClase(obj, clase){
	if(obj == null) return;
	var rep = obj.className.match(' '+clase) ? ' '+clase : clase;
	obj.className = obj.className.replace(rep, '');
}
function valid_verificar_extensiones(ruta, exts){
	if(exts == '') return true; // si no se especifica las extensiones q acepta, acepta todos los tipos de archivo
		
	ext = ruta.split('.');
	ext = valid_trim(ext[ext.length-1]);
	exts = exts.split('-');
	var inn = false;
	for(var i=0; i< exts.length; i++){
		if(valid_trim(exts[i].toUpperCase()) == ext.toUpperCase()){
			inn = true;
		}
	}
	return inn;
}

function validar_form(frm, id_de_elemento_error){
var txtAlt = ''; var txtValor = '';
var id_lbl_rpta = '';
var tipo_dato = '';
var ver_error = 0;
var nombre_check = '';

var tipo = new Object();
tipo['t'] = /^\w+$/;
tipo['n'] = /^[0-9]+$/;
tipo['e'] = /^([0-9a-zA-Z]+([_.-]?[0-9a-zA-Z]+)*@[0-9a-zA-Z]+[0-9,a-z,A-Z,.,-]*(.){1}[a-zA-Z]{2,4})+$/;

var error_all = new Array();
var ids_all = new Array();

	for(var i = 0; i < frm.elements.length; i++){

		error_all[i] = 0;
		ids_all[i] = '';
		
		if(frm.elements[i].type == 'text' || frm.elements[i].type == 'password'){	//utiliza alt
			txtAlt = frm.elements[i].alt;
			txtValor = frm.elements[i].value;
			id_lbl_rpta = txtAlt.split('|')[1].split(']')[0];
			tipo_dato = txtAlt.split('|')[0].split('[')[1];
			ids_all[i] = id_lbl_rpta;
			
			if(txtAlt.indexOf('R[') != -1){ // es campo requerido
				if(valid_trim(txtValor) != ""){ // no esta vacio
					if(tipo_dato == 't' && valid_trim(txtValor) != '')
						error_all[i] = 0;
					else if(!tipo[tipo_dato].test(txtValor)) // NO es correcto el formato ingresado
						error_all[i] = 1;
					else // SI es correcto el formato ingresado
						error_all[i] = 0;
				}else{ // si esta vacio
					error_all[i] = 1;
				}
			}else{ // no es campo requerido
				if(valid_trim(txtValor) != ""){ // no esta vacio
					if(tipo_dato == 't' && valid_trim(txtValor) != '')
						error_all[i] = 0;
					else if(!tipo[tipo_dato].test(txtValor)) // NO es correcto el formato ingresado
						error_all[i] = 1;
					else // SI es correcto el formato ingresado
						error_all[i] = 0;
				}
			}
			
		}else if(frm.elements[i].type == 'file'){ //utiliza alt
		
			txtAlt = frm.elements[i].alt;
			txtValor = frm.elements[i].value;
			id_lbl_rpta = txtAlt.split('|')[1].split(']')[0];
			extensiones = txtAlt.split(']')[1];
			ids_all[i] = id_lbl_rpta;
			
			if(txtAlt.indexOf('R[') != -1){ // es campo requerido
				if(valid_trim(txtValor) != ""){ // no esta vacio
					if(valid_verificar_extensiones(txtValor, extensiones)) // NO es correcto el formato ingresado
						error_all[i] = 0;
					else // SI es correcto el formato ingresado
						error_all[i] = 1;
				}else{ // si esta vacio
					error_all[i] = 1;
				}
			}else{ // no es campo requerido
				if(valid_trim(txtValor) != ""){ // no esta vacio
					if(valid_verificar_extensiones(txtValor, extensiones)) // NO es correcto el formato ingresado
						error_all[i] = 0;
					else // SI es correcto el formato ingresado
						error_all[i] = 1;
				}
			}
			
		}else if(frm.elements[i].type == 'textarea'){ //utiliza id
		
			txtAlt = frm.elements[i].id;
			txtValor = frm.elements[i].value;
			id_lbl_rpta = txtAlt.split('__')[1];
			ids_all[i] = id_lbl_rpta;
			
			if(txtAlt.indexOf('R__') != -1){ // es campo requerido
				if(valid_trim(txtValor) != ""){ // no esta vacio
					error_all[i] = 0;
				}else{ // si esta vacio
					error_all[i] = 1;
				}
			}else{ // no es campo requerido
				error_all[i] = 0;
			}
			
		}else if(frm.elements[i].type.indexOf('select') != -1){ //utiliza id
		
			txtAlt = frm.elements[i].id;
			ids_all[i] = txtAlt.split('__')[1];
			
			if(txtAlt.indexOf('R__') != -1){ // es campo requerido
				if(frm.elements[i].selectedIndex == 0){
					error_all[i] = 1;
				}else{
					error_all[i] = 0;
				}
			}else{ // no es campo requerido
				error_all[i] = 0;
			}
		
		}else if(frm.elements[i].type == 'radio'){ //utiliza alt

			txtAlt = frm.elements[i].alt;
			if(txtAlt.indexOf('R[') != -1){ // es campo requerido
				if(nombre_check != frm.elements[i].name){
					ids_all[i] = txtAlt.split('[')[1].split(']')[0];
					
					nombre_check = frm.elements[i].name;
					var sub_ch_select = false;
					//alert(frm.elements.length);
					for(var sub_ch = 0; sub_ch < frm.elements.length; sub_ch++){
						if(frm.elements[sub_ch].name == nombre_check && frm.elements[sub_ch].checked){
							sub_ch_select = true;
						}
					}
					if(sub_ch_select){
						error_all[i] = 0;
					}else{
						error_all[i] = 1;
					}
				}
			}else{
				error_all[i] = 0;
			}

		}else if(frm.elements[i].type == 'checkbox'){ //utiliza alt

			txtAlt = frm.elements[i].alt;
			if(txtAlt.indexOf('R[') != -1){ // es campo requerido
				if(nombre_check != frm.elements[i].name){
					ids_all[i] = txtAlt.split('[')[1].split(']')[0];
					
					nombre_check = frm.elements[i].name;
					var sub_ch_select = false;
					//alert(frm.elements.length);
					for(var sub_ch = 0; sub_ch < frm.elements.length; sub_ch++){
						if(frm.elements[sub_ch].name == nombre_check && frm.elements[sub_ch].checked){
							sub_ch_select = true;
						}
					}
					if(sub_ch_select){
						error_all[i] = 0;
					}else{
						error_all[i] = 1;
					}
				}
				
			}else{
				error_all[i] = 0;
			}
		}/*else if(frm.elements[i].type == 'password'){ //utiliza alt
//			alert('Nombre: '+frm.elements[i].name+' - es tipo PASSWORD ');
		}*/
		
	}
	
	
	
	for(var i=0; i < error_all.length; i++){
		if(error_all[i] == 1)
			valid_agregarClase(valid_getObj(ids_all[i]), 'error_lbl');
		else
			valid_removerClase(valid_getObj(ids_all[i]), 'error_lbl');
		ver_error += error_all[i];
	}
	if(ver_error>0){
		valid_agregarClase(valid_getObj(id_de_elemento_error), 'error_mensaje');
		return false;
	}else{
		valid_removerClase(valid_getObj(id_de_elemento_error), 'error_mensaje');
		return true;
	}
}