/**
  * ***********************************************************************************************
  *   				   Super-Ultra-Fashion validador automatico de formularios(v 2.0)  
  *
  * Chequea automaticamente un formulario recorriendo todos sus elementos, y a partir 
  * del id que tengan, determina la mejor forma de verificarlos.
  * Los tipos que se chequean son:
  * 								str  	- Strings
  *									int  	- Enteros
  *									mail 	- Dirección de e-mail
  *									sel  	- Select
  *									radio	- Radio
  *                 				ci   	- Cedulas en el formato 1234567-8
  *									rut  	- Número de RUT 11111111-1
  *									pass 	- Passwords, chequea que exista el campo
  * "NOMBRECAMPOPASS2_pass" para chequearlo también.
  * - Los campos requeridos van a tener la sintaxis: rq_NOMBRECAMPO_tipo
  * - Usa el id "error" para referenciar a un bloque en el que se muestra el mensaje de error
  * - Usa la clase "error_contenedor" para cambiar los estilos de los td e inputs.
  * - Para especificar un contenedor de un campo (seria el tr), su id, debe ser: "contenedor_NOMBRECAMPO".
  *
  * MODO DE USO:
  *	Darle los IDs correspondientes dentro del formulario, para especificar los campos requeridos y mandar a validar, dando como parametro el "name" del formulario.
  *
  *	NOTA: Si existe un campo password, el validador automaticamente, chequea que exista el campo "Repetir contraseña" para comprobar que se haya escrito igual.
  *
  * @param 		string 	nombreForm	El "name" del form a chequear.
  * @param		enum	layout	Si el form esta embebido en tablas o divs (para desplegar correctamente los errores).
  * Los valores posibles del enum son ("div", "table")
  */
function validaForm(theForm){
	var form = theForm;
	var todoBien = true;
	var elemento;
	var elemActual;
	var contenedor //el contenedor del elemento actual.
	var regExp = /rq_([^_]+(_[^_]+)?)_([a-z]+)/; /*obtiene todos los campos requeridos y separa su nombre, y su tipo */
	var mailRegExp = /[^@]+@[^\.]+\.[^\s]+$/; /* chequea que el mail tenga el formato correcto */
	var ciRegExp = /[0-9]{6,7}-\d/;
	var pass1, pass2; //para chequear que se ingresen ambos passwords iguales.
	
	for(index = 0; index < form.elements.length; index++)  {
		elemento = form.elements[index];
		if(elemento.id != undefined) {
			if(matches = elemento.id.match(regExp)) {
				elemActual = elemento;
				contenedor = document.getElementById("contenedor_"+matches[1]);
				switch(matches[3]){
					case 'str':
						if(elemActual.value.length == 0) {
							todoBien = false;
							contenedor.className = "error";
						} else {
							contenedor.className = "mensaje";
						}
					case 'txt':
						if(elemActual.value.length == 0) {
							todoBien = false;
							contenedor.className = "error";
						} else {
							contenedor.className = "mensaje";
						}
					break;
					case 'mail':
						if(!mailRegExp.test(elemActual.value)){
							todoBien = false;
							contenedor.className = "error";
						} else {
							contenedor.className = "mensaje";
						}
					break;
					case 'int':
						if(isNaN(parseInt(elemActual.value))) {
							todoBien = false;
							contenedor.className = "error";
						} else {
							contenedor.className = "mensaje";
						}
					break;
					case 'sel':
						if 	(elemActual.selectedIndex == 0 && 
									(	
										elemActual.options[elemActual.selectedIndex].value == "" ||
										elemActual.options[elemActual.selectedIndex].value == "-1"
									)
								)
						{
							todoBien = false;
							contenedor.className = "error";
						} else {
							contenedor.className = "mensaje";
						}
					break;
					case 'ci':
					  if(!ciRegExp.test(elemActual.value)) {
					    todoBien = false;
							contenedor.className = "error";
						} else {
						  contenedor.className = "mensaje";
						}
					break;
					case 'radio':
						if(!validoCollection(form.elements,elemActual)) {
							todoBien = false;
							contenedor.className = "error";
						} else {							
							contenedor.className = "mensaje";
						}
					break;					
					case 'rut':
						//alert(elemActual.value+"-"+document.getElementById("rut_guion").value);
						if(!validoRut(elemActual.value+"-"+document.getElementById("rut_guion").value)){
							contenedor.className = "error";
							todoBien = false;
						}else{
							contenedor.className = "mensaje";
						}
					break;
					case 'pass':
						if(elemActual.value.length == 0) {
							todoBien = false;
							contenedor.className = "error";							
						} else {
							contenedor.className = "mensaje";
						}
						
						var pass2 = matches[1] + "2_pass";
						var campo2 = document.getElementById(pass2);
						var contenedor2 = document.getElementById("contenedor_"+matches[1]+"2")
						if(campo2 != undefined) {
							if(campo2.value == "" || elemActual.value != campo2.value) {
								todoBien = false;
								contenedor2.className = "error";	
							} else {
								contenedor2.className = "mensaje";
							}
						}
					break;
					
				}
			}
		}
	}
	
	if(!todoBien) { //si no está todo bien, no queda otra que mostrar el mensaje de error
		document.getElementById("error").style.display = "block";
		var loc = window.location.href.split("#");
		window.location.href = loc[0] + "#error";
		return false;
	} else {
		//alert("Los datos se ingresaron correctamente");
		return true;
	}
}

function validoRut(valor){
	
	rut_completo = valor.split("-");
	vari = rut_completo[0];
	dv   = rut_completo[1];
	suma = 0;
	divi = 0;
	cont = 0;
	rut = vari;
	res = 1;
	cont = 2;  

	//if(objRut.value == "" || dv.value == "") return false;
	if(vari == "" || dv == "") return false;

	for (a = 1; a <= vari.length; a++){
		divi = (rut % 10);
		rut = rut - divi;
		rut = Math.ceil(rut / 10);
		res = divi * cont;
		suma = suma + res;
		cont++;
		if(cont == 8) {
			cont = 2;
		}
	}
	
	suma = suma % 11;
	suma = 11 - suma;
	
	if(suma == 11){
		suma = 0;
	} else if (suma == 10) {
		suma = "k";
	}
	if(dv != suma) {
		return false;
	}
	return true;
}


function validoCollection(collection,elemento)
{
	var i;
	for (i = 0; i < collection.length; i++){
		if (collection[i].name==elemento.name && collection[i].type=="radio" && collection[i].checked)	   	
			return true;
	}
	return false;
}
