/**
	*	function trim(str)
	* [str] contiene la cadena de origen.
	*
	*	Devuelve la cadena sin espacios por los flancos, es decir, quita los espacios
	*	que encuentre al inicio y final de la cadena. Si la cadena contiene solo espacios
	*	devolvera la cadena vacia.
**/
function trim(str) {
	return str.replace(/(^\s+)|(\s+$)/g, '');
}

/** function es_numerico(val)
	*	[val] valor que queremos saber si es o no numerico
	*
	* Determina si el valor recibido es numerico o no.
**/
function es_numerico(val) {
	return ( ! isNaN(val) );
}

/** function es_cif(cif)
	*	[cif] valor que queremos saber si es o no un cif
	*
	* Determina si el valor recibido es un cif o no.
**/
function es_cif(cif) {
	if(cif == '') return true;
	par = 0;
	non = 0;
	letras = "ABCDEFGHKLMNPQS";
	let = cif.charAt(0);

	if (cif.length!=9) {
		return false; // El Cif debe tener 9 digitos
	}
	if (letras.indexOf(let.toUpperCase())==-1) {
		return false; // El comienzo del Cif no es valido
	}
	for (zz=2;zz<8;zz+=2) {
		par = par+parseInt(cif.charAt(zz));
	}
	for (zz=1;zz<9;zz+=2) {
		nn = 2*parseInt(cif.charAt(zz));
		if (nn > 9) nn = 1+(nn-10);
		non = non+nn;
	}
	parcial = par + non;
	control = (10 - ( parcial % 10));
	if (control==10) control=0;
	if (control!=cif.charAt(8)) {
		return false; // El Cif no es valido
	}
	return true; // El Cif es valido
}

/** function es_nif(nif)
	*	[nif] valor que queremos saber si es o no un nif
	*
	* Determina si el valor recibido es un nif o no.
**/
function es_nif(nif) {
	if(nif == '') return true;
	dni=nif.substring(0,nif.length-1);
	let=nif.charAt(nif.length-1);
	if(!isNaN(let)) {
		return false; // Falta la letra
	} else {
		cadena = 'TRWAGMYFPDXBNJZSQVHLCKET';
		posicion = dni % 23;
		letra = cadena.substring(posicion,posicion+1);
		if(letra!=let.toUpperCase()) {
			return false; // Nif no valido
		}
	}
	return true; // Nif valido
}

/** function es_email(email)
	*	[email] valor que queremos saber si es o no un email
	*
	* Determina si el valor recibido es un email o no.
**/
function es_email(email) {
	if(email == '') return true;
	return email.match(/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/);
}

/** function es_url(url)
	*	[url] valor que queremos saber si es o no una url
	*
	* Determina si el valor recibido es una url o no.
**/
function es_url(url) {
	if(url == '') return true;
	return url.match(/^(((ht|f)tp(s?))\:\/\/)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/);
}

/** function es_fecha(fecha)
	*	[fecha] valor que queremos saber si es o no una fecha en formato dd/mm/aaaa
	*
	* Determina si el valor recibido es o no una fecha en formato dd/mm/aaaa
**/
function es_fecha(fecha) {
	if(fecha == '') return true;
	if( ! fecha.match(/^(\d{2}\/\d{2}\/\d{4})$/) ) return false; // formato incorrecto
	dia = parseInt(fecha.substring(0,2),10);
	mes = parseInt(fecha.substring(3,5),10) - 1;
	ano = parseInt(fecha.substring(6),10);
	f_date = new Date(ano,mes,dia);
	if(f_date.getFullYear()!=ano || f_date.getMonth()!=mes || f_date.getDate()!=dia) return false;
	return true;
}

function es_minimo(valor) {
	if(valor.length < 3){
		return false;
	}
	return true;
}

/** function es_fecha_hora(fecha_hora)
	*	[fecha_hora] valor que queremos saber si es o no una fecha_hora en formato dd/mm/aaaa hh:mm:ss
	*
	* Determina si el valor recibido es o no una fecha_hora en formato dd/mm/aaaa hh:mm:ss
**/
function es_fecha_hora(fecha_hora) {
	if(fecha_hora == '') return true;
	if( ! fecha_hora.match(/^(\d{2}\/\d{2}\/\d{4}( \d{2}:\d{2}:\d{2})?)$/) ) return false; // formato incorrecto
	dia = parseInt(fecha_hora.substring(0,2),10);
	mes = parseInt(fecha_hora.substring(3,5),10) - 1;
	ano = parseInt(fecha_hora.substring(6,10),10);
	hora = 0;
	minuto = 0;
	segundo = 0;
	if( ! es_fecha(fecha_hora) ) {
		hora = parseInt(fecha_hora.substring(11,13),10);
		minuto = parseInt(fecha_hora.substring(14,16),10);
		segundo = parseInt(fecha_hora.substring(17),10);
	}
	f_date = new Date(ano,mes,dia,hora,minuto,segundo);
	if(f_date.getFullYear()!=ano || f_date.getMonth()!=mes || f_date.getDate()!=dia || f_date.getHours()!=hora || f_date.getMinutes()!=minuto || f_date.getSeconds()!=segundo) return false;
	return true;
}

/** function set_msg_err(campo, mensaje)
	*	[campo] representa el campo del formulario.
	*	[mensaje] es el mensaje de error que se desea visualizar.
	*
	*	La funcion muestra el mensaje en una capa cuyo id sera
	*	msg_err_ y el nombre asociado al campo. Para quitar el
	*	mensaje de error basta con llamar a esta funcion pasandole
	*	la cadena vacia como mensaje.
**/
function set_msg_err(campo, mensaje) {
	var titulo_campo = campo.get('title');
	if( ! titulo_campo ) { titulo_campo = campo.get('name'); }
    msg_err_total += titulo_campo+': '+mensaje+'<br/>';
    return; // fin del metodo.

	var id_msg_err = 'msg_err_' + campo.id;
	var capa_msg_err = $(id_msg_err);
	/* si no tenemos la capa de error, inyectamos una capa de error tratando que se suporponga al input */
	if( ! capa_msg_err ) {
		var alto = campo.getStyle('height').toInt()+campo.getStyle('border-top').toInt()+campo.getStyle('border-bottom').toInt();
		var ancho = campo.getStyle('width').toInt();
		if(Browser.Engine.trident) { ancho += campo.getStyle('border-right').toInt(); }
		if(ancho<10){ ancho=10; }
		if(alto<10)	{ alto=10;	}
		var arriba = campo.getTop().toInt();
		var izquierda = campo.getLeft().toInt()+campo.getStyle('border-left').toInt();
		var contenedor_total = $('contenedor_total');
		var referencia = $(document.body);
		if(contenedor_total) {
			arriba -= contenedor_total.getTop().toInt();
			izquierda -= contenedor_total.getLeft().toInt()+campo.getStyle('border-left').toInt();
			referencia = contenedor_total;
		}

		var capa_msg_err = new Element('div', {
													'id'	: id_msg_err,
													'styles': {
														'height'	: alto,
														'width'		: ancho,
														'top'		: arriba,
														'left'		: izquierda,
														'z-index'	: campo.getStyle('z-index').toInt()+1,
														'position'	: 'absolute',
														'background-color'	: '#cccccc',
														'color'				: '#ff0000',
														'border-color'		: '#ff0000',
														'text-align'		: 'left'
													},
													'events': {
														'click': function() {
															click_msg_err(this.id);
														}
													}
										} ).injectInside( referencia );

		capa_msg_err.className = campo.className;
	} else {
		capa_msg_err.set('background-color', '#FFFFFF');
		capa_msg_err.removeEvents('click');
		capa_msg_err.addEvent('click', function() {
			click_msg_err(this.id);
		} );
	}
	capa_msg_err.set('html',mensaje);
	if ( mensaje == '' ) {
		capa_msg_err.setStyle('display','none');
	} else {
		capa_msg_err.setStyle('display','block');
		resaltar(id_msg_err);
	}

	campo.blur();
	capa_msg_err.blur();
}

/** function click_msg_err(id_msg_err)
	*	A esta funcion la invocamos al hacer click en el mensaje de error.
	*	Oculta la capa del mensaje y pone el foco en el input asociado a dicha capa.
**/
function click_msg_err(id_msg_err) {
	var capa_msg_err = $(id_msg_err);
	var id_campo = id_msg_err.substr(8);
	var campo = $(id_campo);
	try {
		campo.focus();
	}catch(e){}
	capa_msg_err.setStyle('display','none');
}

/** function es_correcto(campo)
	*	[campo] representa el campo del formulario.
	*
	* Determina si el campo es correcto. Para ello aplica diversas validaciones
	*	en funcion de los diversos valores que presente en su className.
**/
function es_correcto(campo) {
	/* Este método es del editor de texto, lo que hacemos es forzarlo a que guarde el valor que contiene en el campo del textarea antes de ser enviado */
	if(campo.hasClass('editor_undanet_'+campo.id)) {
		tinyMCE.getInstanceById(campo.id).save();
		cont_editores++;
	}
	if(campo.hasClass('editor_undanet2_'+campo.id)) {
		tinyMCE.getInstanceById(campo.id).save();
		cont_editores++;
	}
	if(campo.hasClass('trim')) {
		campo.value = trim(campo.value);
	}
	if(campo.hasClass('obligatorio')) {
		if( campo.value == '' ) {
			set_msg_err(campo,'Campo obligatorio');
			return false;
		}
	}
	if(campo.hasClass('numerico')) {
		if( ! es_numerico(campo.value) ) {
			set_msg_err(campo,'Campo numérico');
			return false;
		}
	}
	if(campo.hasClass('email')) {
		if( ! es_email(campo.value) ) {
			set_msg_err(campo,'Formato erroneo');
			return false;
		}
	}
    if(campo.hasClass('minimo')) {
		if( ! es_minimo(campo.value) ) {
			set_msg_err(campo,'6 caracteres');
			return false;
		}
	}
	if(campo.hasClass('url')) {
		if( ! es_url(campo.value) ) {
			set_msg_err(campo,'Formato erroneo');
			return false;
		}
	}
	if(campo.hasClass('fecha')) {
		if( ! es_fecha(campo.value) ) {
			set_msg_err(campo,'Fecha incorrecta');
			return false;
		}
	}
	if(campo.hasClass('fecha_hora')) {
		if( ! es_fecha_hora(campo.value) ) {
			set_msg_err(campo,'Fecha incorrecta');
			return false;
		}
	}
	if(campo.hasClass('nif')) {
		if( ! es_nif(campo.value) ) {
			set_msg_err(campo,'Formato erroneo');
			return false;
		}
	}
	if(campo.hasClass('cif')) {
		if( ! es_cif(campo.value) ) {
			set_msg_err(campo,'Formato erroneo');
			return false;
		}
	}
	if(campo.hasClass('nif-cif')) {
		if( (! es_nif(campo.value)) && (! es_cif(campo.value)) ) {
			set_msg_err(campo,'Formato erroneo');
			return false;
		}
	}

	return true;
}

/** function validar_campo(campo)
	*	[campo] es el campo que queremos validar.
	*
	* Esta funcion valida el campo y devuelve true en caso de que cumpla las restricciones.
	*	Si encuentra errores muestra el mensaje de error en la capa correspondiente, en
	*	caso contrario limpia el posible mensaje de error que tubiera previamente asociado.
**/
function validar_campo(campo) {
	/*
		para que funcionen los metodos avanzados de mootools como 'hasClass' en IE es necesario crear una variable que referencie
		el objeto extraido del id. Esto implica que es necesario que todos los input del formulario tengan id.
	*/
	var campo = $(campo.id);
	campo.blur();
	return es_correcto(campo);
}

/** function validar_formulario_activo(formulario)
	*	[formulario] es el formulario que queremos validar.
	*
	* Esta funcion valida el formulario y devuelve true en caso de que se pueda enviar.
	*	Si encuentra errores muestra los mensajes de error en las capas correspondientes.
	*	Para ello recorre todos los campos y les aplica la funcion es_correcto
	*	uno a uno. Para los campos correctos limpia el posible mensaje de error que
	*	tubiera previamente asociado.
**/
var msg_err_total = '';
function validar_formulario(formulario) {
	msg_err_total = '';
	for(var i=0 ; i < formulario.elements.length ; ++i) {
		validar_campo(formulario.elements[i]);
	}
	if(msg_err_total == '') { return true; }
	else { show_error('<b>Por favor, revise los siguientes errores</b><br/><blockquote>'+msg_err_total+'</blockquote>', 'alerta'); return false; }
}

var cont_editores; /* variable global para saber si hay editores tinyMCE */

/** function submit_formulario(id_formulario)
	* [id_formulario]	Id del formulario que queremos validar y enviar.
	*
	*	Valida el formulario, y en caso de que todo sea correcto comprueba
	*	si hay editores (tinyMCE) y si los hay los quita para evitar problemas
	*	a loa hora de hacer el submit. Si todo es correcto envía el formulario
	*	ejecutando un submit dobre el mismo.
**/
function submit_formulario(id_formulario) {
	cont_editores = 0;
	var formulario = $(id_formulario);
	if(validar_formulario(formulario)) {
		if(cont_editores>0) tinyMCE.triggerSave();
		formulario.submit();
	}
}

function submit_formulario_sin_validar(id_formulario) {
	cont_editores = 0;
	var formulario = $(id_formulario);
	
	if(cont_editores>0) tinyMCE.triggerSave();
	formulario.submit();

}

/** function ir_a_validado(id_j_frame, id_formulario, run_js)
	* [id_j_frame]		Id de la capa donde queremos volcar el resultado del envio AJAX.
	* [id_formulario]	Id del formulario que queremos validar y enviar por AJAX.
	* [run_js]			Parametro opcional (por defecto false) que determina si queremos
	*					que se ejecuten los scripts encontrados en la respuesta AJAX
	*					y la funcion init.
	*
	*	Valida el formulario, y en caso de que todo sea correcto comprueba
	*	si hay editores (tinyMCE) y si los hay los quita para evitar problemas
	*	a loa hora de hacer el submit. Si todo es correcto envía el formulario
	*	ejecutando un submit dobre el mismo.
**/
function ir_a_validado(id_j_frame, id_formulario, run_js){
	var formulario = $(id_formulario);
	if(validar_formulario(formulario)==true) {
		ir_a_formulario(id_j_frame,id_formulario,run_js);
	}
}

