// Title: Tigra Form Validator
// URL: http://www.softcomplex.com/products/tigra_form_validator/
// Version: 1.2
// Date: 02/17/2005 (mm/dd/yyyy)
// Notes: Registration needed to use this script legally. Visit official site for details.
//Dominios no validos
//var a_dominios = ['hotmail.com.pe','gmail.com.pe'];
// regular expressions or function to validate the format
var re_dt = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/,
re_tm = /^(\d{1,2})\:(\d{1,2})\:(\d{1,2})$/,phone_p = /^[2-8]\d+$/,
phone_l = /^[2-7]\d+$/,celular = /^[89]\d+$/,
a_formats = {
	'alpha'   : /^[a-zA-Z\s\áéíóúñÁÉÍÓÚÑ]*$/,	'alphanum': /^[a-zA-Z0-9\s\.,%@;()_?¿!¡\'\-\áéíóúñÁÉÍÓÚÑ]*$/,	'alphanum3': /^[a-zA-Z0-9\s\áéíóúñÁÉÍÓÚÑ]*$/,		'alphanum2': /^[a-zA-Z0-9]*$/,
	'unsigned': /^\d+$/,
	'integer' : /^[\+\-]?\d*$/,
	'real'    : /^[\+\-]?\d*\.?\d*$/,
	'email'   : /^[\w-\.]+\@[\w\.-]+\.[a-zA-Z]{2,4}$/,	
	'phone_p' : function (s_phone){
					// check format
					if (!phone_p.test(s_phone))
						return false;
					// check que todos los dígitos no sean iguales
					for (i=0; i<s_phone.length-1;i++){
						digito = s_phone.charAt(i);
						if ( digito==s_phone.charAt(i+1) ) 							igual = false;
						else {							igual = true;
							break;												}
					}					
					return igual;				},	
	'phone_l' : function (s_phone){
					// check format
					if (!phone_l.test(s_phone))
						return false;
					// check que todos los dígitos no sean iguales
					for (i=0; i<s_phone.length-1;i++){
						digito = s_phone.charAt(i);
						if ( digito==s_phone.charAt(i+1) ) 							igual = false;
						else {							igual = true;
							break;												}
					}					
					return igual;				},					'phone_e' : /^[\d\s\()-]+$/,
	'celular' : function (s_celular){
					// check format
					if (!celular.test(s_celular))
						return false;
					// check que todos los dígitos no sean iguales
					for (i=0; i<s_celular.length-1;i++){
						digito = s_celular.charAt(i);
						if ( digito==s_celular.charAt(i+1) ) 							igual = false;
						else {							igual = true;
							break;												}
					}					
					return igual;				},	'phone_2'  : /^[\d\s\()]+$/,
	'date'    : function (s_date) {
					// check format
					if (!re_dt.test(s_date))
						return false;
					// check allowed ranges	
					if (RegExp.$1 > 31 || RegExp.$2 > 12)
						return false;
					// check number of day in month
					var dt_test = new Date(RegExp.$3, Number(RegExp.$2-1), RegExp.$1);
					if (dt_test.getMonth() != Number(RegExp.$2-1))
						return false;
					return true;
				},
	'time'    : function validate_time(s_time) {
					// check format
					if (!re_tm.test(s_time))
						return false;
					// check allowed ranges	
					if (RegExp.$1 > 23 || RegExp.$2 > 59 || RegExp.$3 > 59)
						return false;
					return true;
				},	'ruc'     : function validate_ruc(s_ruc){
						  if ( esnumero( s_ruc ) ) {
						    if ( s_ruc.length == 8 ){
						      suma = 0
						      for (i=0; i<s_ruc.length-1;i++){
						        digito = s_ruc.charAt(i) - '0';
						        if ( i==0 ) suma += (digito*2)
						        else suma += (digito*(s_ruc.length-i))
						      }
						      resto = suma % 11;
						      if ( resto == 1) resto = 11;
						      if ( resto + ( s_ruc.charAt( s_ruc.length-1 ) - '0' ) == 11 ){
						        return true
						      }
						    } else if ( s_ruc.length == 11 ){
						      suma = 0
						      x = 6
						      for (i=0; i<s_ruc.length-1;i++){
						        if ( i == 4 ) x = 8
						        digito = s_ruc.charAt(i) - '0';
						        x--
						        if ( i==0 ) suma += (digito*x)
						        else suma += (digito*x)
						      }
						      resto = suma % 11;
						      resto = 11 - resto
						      
						      if ( resto >= 10) resto = resto - 10;
						      if ( resto == s_ruc.charAt( s_ruc.length-1 ) - '0' ){
						        return true
						      }      
						    }
						  }
						  return false
						}
			},
a_messages = [		'El nombre del formulario no ha sido incluido para construir la rutina de validación.',	'No existen arreglos de campos del formulario "%form%" para construir la rutina de validación.',
	'El formulario "%form%" no puede ser encontrado en esta página.',
	'La descripción del campo "%n%" del formulario está incompleta. Falta atributo "%l%".',
	'No se puede encontrar el campo "%n%" en el formulario "%form%".',
	'No se puede encontrar la etiqueta tag (id="%t%").',
	'No se puede verificar la igualdad. No se encontró el campo "%m%".',
	'El campo "%l%" es de ingreso obligatorio.',
	'El valor para "%l%" debe ser de %mn% caracteres como mínimo.',
	'El valor para "%l%" no debe ser mayor que %mx% caracteres.',	'El campo "%l%" presenta errores de formato. "%v%" no es un valor valido.',
	'El campo "%l%" debe ser igual al campo "%ml%".',	'El campo "%l%" debe ser diferente al campo "%ml%".',	'No se puede verificar la desigualdad. No se encontró el campo "%d%".',	'No se puede verificar la obligatoriedad. No se encontró el campo "%rr%".',	'No se puede verificar la obligatoriedad. No se encontró el campo "%rr2%".',	'El campo "%l%" no presenta un dominio válido.'
]
// validator counstruction routine
function validator(s_form, a_fields, o_cfg) {
	this.f_error = validator_error;
	this.f_alert = o_cfg && o_cfg.alert
		? function(s_msg) { alert(s_msg); return false }
		: function() { return false };
		
	// check required parameters
	if (!s_form)	
		return this.f_alert(this.f_error(0));
	this.s_form = s_form;
	
	if (!a_fields || typeof(a_fields) != 'object')
		return this.f_alert(this.f_error(1));
	this.a_fields = a_fields;

	this.a_2disable = o_cfg && o_cfg['to_disable'] && typeof(o_cfg['to_disable']) == 'object'
		? o_cfg['to_disable']
		: [];
		
	this.exec = validator_exec;
}

// validator execution method
function validator_exec() {
	var o_form = document.forms[this.s_form];
	if (!o_form)	
		return this.f_alert(this.f_error(2));
		
	b_dom = document.body && document.body.innerHTML;
	
	// check integrity of the form fields description structure
	for (var n_key in this.a_fields) {
		// check input description entry
		this.a_fields[n_key]['n'] = n_key;
		if (!this.a_fields[n_key]['l'])
			return this.f_alert(this.f_error(3, this.a_fields[n_key]));
		o_input = o_form.elements[n_key];
		if (!o_input)
			return this.f_alert(this.f_error(4, this.a_fields[n_key]));
		this.a_fields[n_key].o_input = o_input;
	}

	// reset labels highlight
	if (b_dom)
		for (var n_key in this.a_fields) 
			if (this.a_fields[n_key]['t']) {
				var s_labeltag = this.a_fields[n_key]['t'], e_labeltag = get_element(s_labeltag);
				if (!e_labeltag)
					return this.f_alert(this.f_error(5, this.a_fields[n_key]));
				this.a_fields[n_key].o_tag = e_labeltag;
				
				// normal state parameters assigned here
				e_labeltag.className = 'tfvNormal';
			}

	// collect values depending on the type of the input
	for (var n_key in this.a_fields) {
		var s_value = '';
		o_input = this.a_fields[n_key].o_input;
		if (o_input.type == 'checkbox') // checkbox
			s_value = o_input.checked ? o_input.value : '';
		else if (o_input.value) // text, password, hidden
			s_value = o_input.value;
		else if (o_input.options) // select
			s_value = o_input.selectedIndex > -1
				? o_input.options[o_input.selectedIndex].value
				: null;
		else if (o_input.length > 0) // radiobuton
			for (var n_index = 0; n_index < o_input.length; n_index++)
				if (o_input[n_index].checked) {
					s_value = o_input[n_index].value;
					break;
				}
		this.a_fields[n_key]['v'] = s_value.replace(/(^\s+)|(\s+$)/g, '');
	}		// Elimina espacios en blanco al principio, al final y al medio
	for (var n_key in this.a_fields) {		if (this.a_fields[n_key]['b'])			this.a_fields[n_key].o_input.value = quitaEspacio(this.a_fields[n_key]['v']);
	}
	
	// check for errors
	var n_errors_count = 0,
		n_another, n_another2, o_format_check, cont;
	for (var n_key in this.a_fields) {
		o_format_check = this.a_fields[n_key]['f'] && a_formats[this.a_fields[n_key]['f']]
			? a_formats[this.a_fields[n_key]['f']]
			: null;

		// reset previous error if any
		this.a_fields[n_key].n_error = null;
				
		// check reqired fields -> Depende si otro campo esta lleno o vacío en un solo sentido				if (this.a_fields[n_key]['rr']) {							for (var n_key1 in this.a_fields)
				if (n_key1 == this.a_fields[n_key]['rr']) {
					n_another = n_key1;
					break;
				}
			if (n_another == null)
				return this.f_alert(this.f_error(14, this.a_fields[n_key]));	
			if (this.a_fields[n_another]['v'] != '') {
				this.a_fields[n_key]['r'] = true;
			}else
				this.a_fields[n_key]['r'] = false;		}
		
		// check reqired fields -> Depende si otro campo esta lleno o vacío en los dos sentidos		if (this.a_fields[n_key]['rr2']) {		    			for (var n_key1 in this.a_fields)
				if (n_key1 == this.a_fields[n_key]['rr2']) {
					n_another1 = n_key1;					
					break;
				}
			if (n_another1 == null)
				return this.f_alert(this.f_error(15, this.a_fields[n_key]));
			if (this.a_fields[n_another1]['v'] != '')
				this.a_fields[n_key]['r'] = true;
			else
				this.a_fields[n_key]['r'] = false;			
						if (this.a_fields[n_another1]['r'] != true){
				is_true = false;							for (var n_key1 in this.a_fields)
					if (this.a_fields[n_key1]['rr2'] && n_another1 == this.a_fields[n_key1]['rr2']) {
						if (this.a_fields[n_key1]['v'] != ''){							is_true = true;
							break;						}
					}
				if (is_true)					this.a_fields[n_another1]['r'] = true;
				else
					this.a_fields[n_another1]['r'] = false;				
			}			
			
			//alert(this.a_fields[n_key]['l'] + ': '+ this.a_fields[n_key]['v'] + ' - ' + this.a_fields[n_key]['r']);
			//alert(this.a_fields[n_another1]['l'] + ': '+ this.a_fields[n_another1]['v'] + ' - ' + this.a_fields[n_another1]['r']);		}						// check reqired fields -> Depende si otro campo esta lleno o vacío		if (this.a_fields[n_key]['rs']) {			for (var n_key4 in this.a_fields)
				if (n_key4 == this.a_fields[n_key]['rs']) {
					n_another = n_key4;
					break;
				}
			if (n_another == null)
				return this.f_alert(this.f_error(14, this.a_fields[n_key]));
								if (this.a_fields[n_another]['r'] = false)
				if (this.a_fields[n_key]['v'] != '')
					this.a_fields[n_another]['r'] = true;			else {				cont = 0;
				for (var n_key5 in this.a_fields)
					if (n_another == this.a_fields[n_key5]['rs'])
						if (this.a_fields[n_key1]['v'] != '')							cont ++;				if (cont == 0)
					this.a_fields[n_another]['r'] = false;					
			}			}
						// check reqired fields
		if (this.a_fields[n_key]['r'] && !this.a_fields[n_key]['v']) {
			this.a_fields[n_key].n_error = 1;
			n_errors_count++;
		}						// check length
		else if (this.a_fields[n_key]['mn'] && this.a_fields[n_key]['v'] != '' && String(this.a_fields[n_key]['v']).length < this.a_fields[n_key]['mn']) {
			this.a_fields[n_key].n_error = 2;
			n_errors_count++;
		}
		else if (this.a_fields[n_key]['mx'] && String(this.a_fields[n_key]['v']).length > this.a_fields[n_key]['mx']) {
			this.a_fields[n_key].n_error = 3;
			n_errors_count++;
		}		
		// check format
		else if (this.a_fields[n_key]['v'] && this.a_fields[n_key]['f'] && (
			(typeof(o_format_check) == 'function'
			&& !o_format_check(this.a_fields[n_key]['v']))
			|| (typeof(o_format_check) != 'function'
			&& !o_format_check.test(this.a_fields[n_key]['v'])))
			) {
			this.a_fields[n_key].n_error = 4;
			n_errors_count++;
		}		
		// check match	
		else if (this.a_fields[n_key]['m']) {
			for (var n_key2 in this.a_fields)
				if (n_key2 == this.a_fields[n_key]['m']) {
					n_another = n_key2;
					break;
				}
			if (n_another == null)
				return this.f_alert(this.f_error(6, this.a_fields[n_key]));
			if (this.a_fields[n_another]['v'] != this.a_fields[n_key]['v']) {
				this.a_fields[n_key]['ml'] = this.a_fields[n_another]['l'];
				this.a_fields[n_key].n_error = 5;
				n_errors_count++;
			}		
		}
		
		// Verifica dominios en un e-mail
		if (this.a_fields[n_key]['e']){			var dom = new Array();
			var correo = this.a_fields[n_key]['v'].toLowerCase();
			dom = correo.split("@");			//var domTemp = dom[1];
			for (i=0; i<a_dominios.length;i++){									if( a_dominios[i] == dom[1] ){
					this.a_fields[n_key].n_error = 10;
					n_errors_count++;
					break;				}			}		}				// check Diferentes	- Verifica que los campos sean diferentes
		if (this.a_fields[n_key]['d']) {
			for (var n_key3 in this.a_fields)
				if (n_key3 == this.a_fields[n_key]['d']) {
					n_another = n_key3;
					break;
				}
			if (n_another == null)
				return this.f_alert(this.f_error(13, this.a_fields[n_key]));
			if (this.a_fields[n_another]['v'].toLowerCase() == this.a_fields[n_key]['v'].toLowerCase() && this.a_fields[n_another]['v'] != "") {
				this.a_fields[n_key]['ml'] = this.a_fields[n_another]['l'];
				this.a_fields[n_key].n_error = 6;
				n_errors_count++;
			}
		}		
		
	}

	// collect error messages and highlight captions for errorneous fields
	var s_alert_message = '',
		e_first_error;

	if (n_errors_count) {
		for (var n_key in this.a_fields) {
			var n_error_type = this.a_fields[n_key].n_error,
				s_message = '';
				
			if (n_error_type)
				s_message = this.f_error(n_error_type + 6, this.a_fields[n_key]);

			if (s_message) {
				if (!e_first_error)
					e_first_error = o_form.elements[n_key];
				s_alert_message += s_message + "\n";
				// highlighted state parameters assigned here
				if (b_dom && this.a_fields[n_key].o_tag)
					this.a_fields[n_key].o_tag.className = 'tfvHighlight';
			}
		}
		alert(s_alert_message);
		// set focus to first errorneous field
		if (e_first_error.focus && e_first_error.type != 'hidden'  && !e_first_error.disabled)
			eval("e_first_error.focus()");
		// cancel form submission if errors detected
		return false;
	}
	
	for (n_key in this.a_2disable)
		if (o_form.elements[this.a_2disable[n_key]])
			o_form.elements[this.a_2disable[n_key]].disabled = true;

	return true;
}

function validator_error(n_index) {
	var s_ = a_messages[n_index], n_i = 1, s_key;
	for (; n_i < arguments.length; n_i ++)
		for (s_key in arguments[n_i])
			s_ = s_.replace('%' + s_key + '%', arguments[n_i][s_key]);
	s_ = s_.replace('%form%', this.s_form);
	return s_
}

function get_element (s_id) {
	return (document.all ? document.all[s_id] : (document.getElementById ? document.getElementById(s_id) : null));
}//PARA VALIDAR RUC
function esnumero(campo){ return (!(isNaN( campo )));}function esnulo(campo){ return (campo == null||campo=="");}
//ELIMINAR ESPACIOS EN BLANCO
function quitaEspacio(valor){ 
	var pBlanco, uBlanco, vBlanco;
	pBlanco = /^ /; //espacios en blanco al principio
	uBlanco = / $/; // espacios en blanco al final
	vBlanco = /[ ]+/g; // espacios en blanco en medio
		 
	c_1 = new String(valor);
	c_1 = c_1.replace(vBlanco," ");
	c_1 = c_1.replace(pBlanco,"");
	c_1 = c_1.replace(uBlanco,"");		 
	valor = c_1;
	
	return valor;
}
