/////////////////////////////////////////////////////////////////////////////////////////////////
// JavaScript Document                                                                         //
// Autor: Jesus Andrés Cabrera Suárez                                                          //       
// 2008                                                                                        //
// Function vForm: validacion de formularios                                                   //
//                                                                                             //
// * text, textarea, select:                                                                   //
//   sintaxis: 'NombreControl -> parametro'                                                    //
//                               -> * : Campo obligatorio                                      //
//                               -> # : Campo numerico                                         //
//                               -> % : Solo texto                                             //
// * Checkbutton                                                                               //
//   sintaxis:  'CheckButtonPrincipal'->Check2 | Check3 | Check3                               //
//                 Valida los controles Check asociados al Check principal                     //
//                                                                                             //
// * Version: 1.1                                                                              //
// Observacion: tambien valida input del tipo password                                         //
/////////////////////////////////////////////////////////////////////////////////////////////////

document.write("<LINK REL='stylesheet' HREF='lib/vForm/jsvform_style.css' TYPE='text/css'>"); // se carga la hoja de estilo para la validacin


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/* Funcion para validar formularios */
function vForm(parametros) //(formulario,parametros)
{
	//tamanio_formulario=formulario.length; //
	arrParametro=parametros.split(",");
	cantidad_controles=arrParametro.length; // cantidad de controles validados
	for(i=0;i<cantidad_controles;i++)
	{
		if(arrParametro[i].indexOf("->")==-1)
		{
			alert("Debe incluir el operador de asignacion '->'\nseguido de los parámetros *,#,%");
			return false;			
		}
		arrControl=arrParametro[i].split("->");
		control_nombre=arrControl[0];
		control_condicion=arrControl[1];
		condicion_elemento=control_condicion;
		
		// datos del control especifico
		tipo_elemento=(document.getElementById(control_nombre).type).toLowerCase();
		//alert("Control: "+control_nombre+"\nCondicion: "+control_condicion);
		//return false;
		
		valor_elemento=elimina_espacios(document.getElementById(control_nombre).value); // elimina los espacios por la derecha y por la izquierda de la cadena
		document.getElementById(control_nombre).value=valor_elemento; // se corrige los espacios en el campo
		
		elemento_actual_nombre=document.getElementById(control_nombre).name;
		elemento_actual_id=document.getElementById(control_nombre).id;
		

		if(condicion_elemento.length<1 && tipo_elemento!="submit" && tipo_elemento!="hidden" && tipo_elemento!='button' && tipo_elemento!='reset' && tipo_elemento!='image')
		{
			alert("*** Validacion Errónea del Formulario *** \n Los parametros del control '"+elemento_actual_nombre+" ("+tipo_elemento+")' deben ser definidos\nUse los comodines #,*,% dependiendo del caso..");
			return false;
		}
		
		//alert("Tipo de elemento: "+tipo_elemento+"\n Nombre: "+elemento_actual_nombre + "\n Id: "+elemento_actual_id+"\n Condicion: "+condicion_elemento);
		/////////////////// Validaciones de campos TEXT
		if(tipo_elemento=='text' || tipo_elemento=='textarea' || tipo_elemento=='password')
		{	//
			
			//
			if(encuentra(condicion_elemento,"*")==1) // Obligatorio - No vacio
			{
				//codigo que indique que la cadena no debe ser vacia (es obligatoria)
				if(document.getElementById(elemento_actual_id).value=="")
				{
					campo_obligatorio(elemento_actual_id);
					return false;
				}
				else
				{
					document.getElementById(elemento_actual_id).className="";
				}
			}
			if(encuentra(condicion_elemento,"#")==1) // El valor debe ser numerico
			{
				//codigo que indique que la cadena debe ser numerica		
				if(!Number(document.getElementById(elemento_actual_id).value))
				{
					if(document.getElementById(elemento_actual_id).value!="")
					{
						no_es_numero(elemento_actual_id);
						return false;
					}
				}
				else
				{
					document.getElementById(elemento_actual_id).className="";
				}
			}
		}
		///////////////////////// Validaciones para selectores
		if(tipo_elemento=="select-one" || tipo_elemento=="select-multiple")
		{
			if(encuentra(condicion_elemento,"*"))
			{
				if(document.getElementById(elemento_actual_id).value=='-' || document.getElementById(elemento_actual_id).value=='')
				{
					sin_seleccion(elemento_actual_id)
					return false;
				}
				else
				{
					document.getElementById(elemento_actual_id).className="";
				}
			}
			else
			{
				alert("Los parámetros especificados no aplicaan el los 'select'");
				return false;
			}
		}
		////////////////////////////////////////  Validaciones para checkbox  ///////////////////////////////////////
		if(tipo_elemento=="checkbox")
		{
			activos=0;
			lista_check = condicion_elemento.split("|"); // este separador perimte listar todos los checkbox asociados
			tamanioCheckInicial = lista_check.length;
			lista_check[tamanioCheckInicial] = elemento_actual_id;
			tamanioCheckFinal = lista_check.length; // ahora tiene un nuevo tamańo
			for(cc=0;cc<tamanioCheckFinal;cc++)
			{
				if(document.getElementById(lista_check[cc]).type="checkbox") // aqui se valida por si se introdujo un control distinto al checkbox
				{
					if(document.getElementById(lista_check[cc]).checked == true)
					{
						activos++; // 055
					}
				}
				else
				{
					elemento_erroneo=lista_check[cc];
					alert("El elemento '"+elemento_erroneo+"' no es un checkbox\nchequee la sintaxis de validación");
					return false;
				}
			}
			if(activos==0) // no existe ningun check marcado
			{
				arregloIdCheck=lista_check.join("##");
				no_checkbox(arregloIdCheck);
				return false;
			}
			else
			{
				for(ca=0;ca<tamanioCheckFinal;ca++)
				{
					document.getElementById(lista_check[ca]).className="";	
				}
			}
		}		
		//posterior evaluacion de radio button
		if(tipo_elemento=="radio")
		{
			if(encuentra(condicion_elemento,"*")==1)// Obligatorio - No vacio
			{
				// por desarrollar
			}
		}
		
	}
	//return false; // solo se descomenta para evaluar errores
	return true;
}

function existe_vacio(cadena)
{
	tamanio_cadena=cadena.length;
	espacio_en_blanco=0;
	for(i=0;i<tamanio_cadena;i++)
	{
		if(cadena[i]==" ")
		{
			espacio_en_blanco++;
		}			
	}
	if(espacio_en_blanco==tamanio_cadena)
	{
		return true; // En este caso esta vacio
	}
	else
	{
		return false; // el texto posee contenido != vacio
	}
}

function elimina_espacios(cad_entrada)
{
    while(cad_entrada.charAt(0) == " ")
	{
    	cad_entrada = cad_entrada.substr(1, cad_entrada.length - 1);
    }
    while (cad_entrada.charAt(cad_entrada.length - 1) == " ")
	{
    	cad_entrada=cad_entrada.substr(0, cad_entrada.length - 1);
    }
	return cad_entrada;
}

function encuentra(cadena_fija,cadena_buscada)
{
	if (cadena_fija.indexOf(cadena_buscada)!=-1)
	{
		return 1;
	}
	else
	
	{
		return 0;
	}
}
//Esta funcion emite un mensaje de alerta, y redirecciona al campo que esta vacio, cambiando el estilo
function campo_obligatorio(id)
{
	document.getElementById(id).className="Validacion_Erronea";
	alert("Ha dejado en blanco un campo obligatorio.\nFavor suministrar información");
	document.getElementById(id).focus();
}
function no_es_numero(id)
{
	document.getElementById(id).className="Validacion_Erronea";
	document.getElementById(id).onChange="alert('hola');";
	alert("Ha ingresado caracteres inválidos en un campo numérico.\nFavor, corrregir el error...");
	document.getElementById(id).focus();
}

function sin_seleccion(id)
{
	document.getElementById(id).className="Validacion_Erronea";
	alert("Debe seleccionar un elemento de la lista desplegable");
	document.getElementById(id).focus();
}

function no_checkbox(listaId)
{
	arregloId = listaId.split("##");
	arregloIdTamanio = arregloId.length;
	for(ca=0;ca<arregloIdTamanio;ca++)
	{
		document.getElementById(arregloId[ca]).className="Validacion_Erronea";	
	}
	alert("Debe marcar al menos un elemento...");	
}
//////////////////////////////////////////////////////////////////////////////
/* Funcion Ajax: Asincrono Javascript XML*/
function nuevoAjax(){
	var xmlhttp=false;
	try {
		xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
	} catch (e) {
		try {
			xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (E) {
			xmlhttp = false;
		}
	}

	if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
		xmlhttp = new XMLHttpRequest();
	}
	return xmlhttp;
}
function llamar(id,pagina,datos){
	contenedor = document.getElementById(id);
	ajax=nuevoAjax();
	ajax.open("POST", pagina,true);
	ajax.onreadystatechange=function() {
		if (ajax.readyState==4) {
			contenedor.innerHTML = ajax.responseText
		}
	}
	ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	ajax.send(datos);
}