/**
 * Validador
 * @author José Carlos Cruz Parra AKA internia
 * josecarlos@programadorphpfreelance.com
 * http://www.programadorphpfreelance.com
 * 2007-2008
 * This code is released under the GNU General Public License.
 */
function Validador()
{
	this.msgEmailNoValido = "Email no válido: [*var0*]\n";
	this.msgNumeroNoValido = "Número no válido: [*var0*]\n";
	this.msgFechaNoValida = "Fecha no válida: [*var0*]\n";
	this.msgFaltaElDato = "Falta el dato: [*var0*]\n";
	this.msgLongitudMinima = "La longitud mínima para [*var0*] es [*var1*]\n";
	this.msgLongitudMaxima = "La longitud máxima para [*var0*] es [*var1*]\n";
	this.msgValorMinimo = "El valor mínimo para [*var0*] es [*var1*]\n";
	this.msgValorMaximo = "El valor máximo para [*var0*] es [*var1*]\n";
	this.msgDebeMarcarLaCasilla = "Debes marcar la casilla [*var0*]\n";
	this.msgDebeSeleccionarUnaOpcion = "Debe seleccionar una opción de [*var0*]\n";
	this.msgNoHaConfirmado = "No ha confirmado correctamente [*var0*]\n";

	this.ValidarForm = function(form_id, submitOnSuccess){
		var form = document.getElementById(form_id);
		var mensaje = "";
		var elements = form.elements;
		for (var c = 0; c < elements.length; c++) {
			var vacio = this.Trim(elements[c].value) == "";
			var className = elements[c].className;
			if (className.indexOf("requerido") != -1) {
				if (elements[c].type == "checkbox") {
					if (!elements[c].checked) {
						mensaje += this.msgDebeMarcarLaCasilla.replace("[*var0*]", this.getNombreElemento(elements[c]));
					}
				}
				else if (elements[c].type == "radio") {
					var radioelements = document.getElementsByName(elements[c].name);
					var radiochecked = false;
					for (var k = 0; k < radioelements.length; k++) {
						if (radioelements[k].checked) {
							radiochecked = true;
							break;
						}
					}
					if (!radiochecked) {
						mensaje += this.msgDebeSeleccionarUnaOpcion.replace("[*var0*]", this.getNombreElemento(elements[c]));
					}
				}
				else if(vacio) {
					mensaje += this.msgFaltaElDato.replace("[*var0*]", this.getNombreElemento(elements[c]));
				}
			}

			if(!vacio) {
				if (className.indexOf("email") != -1) {
					if (className.indexOf("confirm") != -1) {
						var aux = className.substring(className.indexOf("confirm"));
						aux = aux.indexOf(" ") != -1 ? aux.substring(7, aux.indexOf(" ")) : aux.substring(7);
						aux = document.getElementById(aux);
						if(aux.value != elements[c].value) {
							mensaje += this.msgNoHaConfirmado.replace("[*var0*]", this.getNombreElemento(aux));
						}
					}
					else if (!this.validateEmail(elements[c].value, false)) {
						mensaje += this.msgEmailNoValido.replace("[*var0*]", this.getNombreElemento(elements[c]));
					}
				}
				else if (className.indexOf("confirm") != -1) {
					var aux = className.substring(className.indexOf("confirm"));
					aux = aux.indexOf(" ") != -1 ? aux.substring(7, aux.indexOf(" ")) : aux.substring(7);
					aux = document.getElementById(aux);
					if(aux.value != elements[c].value) {
						mensaje += this.msgNoHaConfirmado.replace("[*var0*]", this.getNombreElemento(aux));
					}
				}

				if (className.indexOf("phone") != -1) {
					if (!this.validatePhone(elements[c].value, false, className.indexOf("strict") != -1 ? "" : " -")) {
						mensaje += this.msgNumeroNoValido.replace("[*var0*]", this.getNombreElemento(elements[c]));
					}
				}

				if (className.indexOf("date") != -1) {
					if (!this.validateDateStr(elements[c].value)) {
						mensaje += this.msgFechaNoValida.replace("[*var0*]", this.getNombreElemento(elements[c]));
					}
				}

				if (className.indexOf("minlength") != -1) {
					var aux = className.substring(className.indexOf("minlength"));
					aux = aux.indexOf(" ") != -1 ? aux.substring(9, aux.indexOf(" ")) : aux.substring(9);
					if (this.Trim(elements[c].value).length < aux) {
						mensaje += this.msgLongitudMinima.replace("[*var0*]", this.getNombreElemento(elements[c])).replace("[*var1*]", aux);
					}
				}

				if (className.indexOf("maxlength") != -1) {
					var aux = className.substring(className.indexOf("minlength"));
					aux = aux.indexOf(" ") != -1 ? aux.substring(9, aux.indexOf(" ")) : aux.substring(9);
					if (this.Trim(elements[c].value).length < aux) {
						mensaje += this.msgLongitudMaxima.replace("[*var0*]", this.getNombreElemento(elements[c])).replace("[*var1*]", aux);
					}
				}

				if (className.indexOf("minvalue") != -1) {
					var aux = className.substring(className.indexOf("minvalue"));
					aux = aux.indexOf(" ") != -1 ? aux.substring(8, aux.indexOf(" ")) : aux.substring(8);
					if (parseInt(this.Trim(elements[c].value)) < parseInt(aux)) {
						mensaje += this.msgValorMinimo.replace("[*var0*]", this.getNombreElemento(elements[c])).replace("[*var1*]", aux);
					}
				}

				if (className.indexOf("maxvalue") != -1) {
					var aux = className.substring(className.indexOf("maxvalue"));
					aux = aux.indexOf(" ") != -1 ? aux.substring(8, aux.indexOf(" ")) : aux.substring(8);
					if (parseInt(this.Trim(elements[c].value)) > parseInt(aux)) {
						mensaje += this.msgValorMaximo.replace("[*var0*]", this.getNombreElemento(elements[c])).replace("[*var1*]", aux);
					}
				}
			}
		}

		var ok = true;
		if (mensaje.length > 0) {
			alert(mensaje);
			ok = false;
		}

		if(ok && submitOnSuccess) {
			form.submit();
		}
		else {
			return ok;
		}

	}

	this.Trim = function(str)
	{
		var resultStr = "";
		resultStr = this.TrimLeft(str);
		resultStr = this.TrimRight(resultStr);
		return resultStr;
	}

	this.TrimLeft = function(str)
	{
		var resultStr = "";
		var i = len = 0;
		// Return immediately if an invalid value was passed in
		if(str + "" == "undefined" || str == null)
			return null;
		// Make sure the argument is a string
		str += "";
		if(str.length == 0)
			resultStr = "";
		else
		{
			// Loop through string starting at the beginning as long as there are spaces.
			len = str.length;

			while((i <= len) && (str.charAt(i) == " "))
				i++;
			// When the loop is done, we're sitting at the first non-space char,
			// so return that char plus the remaining chars of the string.
			resultStr = str.substring(i, len);
		}
		return resultStr;
	}

	this.TrimRight = function(str)
	{
		var resultStr = "";
		var i = 0;
		// Return immediately if an invalid value was passed in
		if(str + "" == "undefined" || str == null)
			return null;
		// Make sure the argument is a string
		str += "";

		if(str.length == 0)
			resultStr = "";
		else
		{
			// Loop through string starting at the end as long as there are spaces.
			i = str.length - 1;
			while ((i >= 0) && (str.charAt(i) == " "))
				i--;

			// When the loop is done, we're sitting at the last non-space char,
			// so return that char plus all previous chars of the string.
			resultStr = str.substring(0, i + 1);
		}
		return resultStr;
	}

	this.validatePhone = function(num, allowblank, extravalidchars)
	{
		num = num.replace(' ', '');
		var len = num.length;
		if(len < 9 || len > 20)
			return len == 0 ? allowblank : false;
		if(num.indexOf('+') > 0)
			return false;
		var validChars = "+0123456789" + extravalidchars;
		for(var c=0; c<len; c++)
			if(validChars.indexOf(num.charAt(c)) < 0)
				return false;
		return true;
	}

	this.validateEmail = function(addr, allowblank)
	{
		if(addr.length == 0)
			return allowblank;
		var invalidChars = '\/\'\\ ";:?!()[]\{\}^|';
		for(i=0; i<invalidChars.length; i++)
			if(addr.indexOf(invalidChars.charAt(i),0) > -1)
				return false;
		for(i=0; i<addr.length; i++)
			if(addr.charCodeAt(i)>127)
				return false;
		var atPos = addr.indexOf('@',0);
		if((atPos == -1)||(atPos == 0)||(addr.indexOf('@', atPos + 1) > - 1)||(addr.indexOf('.', atPos) == -1)||(addr.indexOf('@.',0) != -1)||(addr.indexOf('.@',0) != -1)||(addr.indexOf('..',0) != -1))
			return false;
		var suffix = addr.substring(addr.lastIndexOf('.')+1);
		if(suffix.length != 2 && suffix != 'cat' && suffix != 'com' && suffix != 'net' && suffix != 'org' && suffix != 'edu' && suffix != 'int' && suffix != 'mil' && suffix != 'gov' & suffix != 'arpa' && suffix != 'biz' && suffix != 'aero' && suffix != 'name' && suffix != 'coop' && suffix != 'info' && suffix != 'pro' && suffix != 'museum')
			return false;
		return true;
	}

	//Valida una hora en formato hh:mm ó h:mm
	this.validateHourStr = function(str)
	{
		var hora;
		var separador;
		var minuto;
		switch(str.length)
		{
			case 4:
				hora = str.substring(0, 1);
				separador = str.substring(1,2);
				minuto = str.substring(2, 4);
				break;
			case 5:
				hora = str.substring(0, 2);
				separador = str.substring(2,3);
				minuto = str.substring(3, 5);
				break;
			default:
				return false;
		}
		if(separador != ":")
			return false;
		hora = parseInt(hora, 10);
		minuto = parseInt(minuto, 10);
		if(isNaN(hora) || isNaN(minuto))
			return false;

		return (hora >= 0 && hora <= 23 && minuto >= 0 && minuto <= 59);
	}

	//Valida una fecha en formato dd-mm-yyyy (el carácter separador puede ser cualquiera)
	this.validateDateStr = function(date, min_ano, max_ano)
	{
		if(date.length != 10)
			return false;
		var ano = date.substring(6, 10);
		var mes = date.substring(3, 5);
		var dia = date.substring(0, 2);

		return this.validateDate(ano, mes, dia, min_ano, max_ano);
	}

	//Valida una fecha
	this.validateDate = function(ano, mes, dia, min_ano, max_ano)
	{
		ano = parseInt(ano, 10);
		mes = parseInt(mes, 10);
		dia = parseInt(dia, 10);

		if(isNaN(ano) || isNaN(mes) || isNaN(dia) || dia < 1 || (min_ano != null && ano < min_ano) || (max_ano != null && ano > max_ano))
			return false;

		switch(mes)
		{
			case 1:
			case 3:
			case 5:
			case 7:
			case 8:
			case 10:
			case 12:
				return dia <= 31;
			case 4:
			case 6:
			case 9:
			case 11:
				return dia <= 30;
			case 2:
				return dia <= (this.esBisiesto(ano) ? 29 : 28);
			default:
				return false;
		}
	}

	//Dice si un año es bisiesto
	this.esBisiesto = function(ano)
	{
		return ((ano%4)==0) && ((ano%100)!=0 || (ano%400)==0);
	}

	this.getNombreElemento = function(elemento)
	{
		return elemento.title == "" ? elemento.name : elemento.title;
	}
}
