/*
 * Javascript para el control de los comentarios de las noticias. Diario Público
 * autor: Fco. Javier Antúnez Ruiz, fjantunez@isotrol.com
 * autor: Miguel J. Jiménez,  mjjimenez@isotrol.com
 * */


/* Función que envia un comentario. El envio se hace con una petición ajax que recibe como parámetros
	los campos del formulario que componen el nuevo comentario. El resultado de la petición es el contenido
	que tendrá que aparecer en la capa 'listaComentarios'.
	Tiene un parámtero, url, que es la dirección a la que se hace la petición ajax
	
	Queda pendiente cómo actualizar el número de comentarios que hay en la parte superior de la página y 
	que esta identificado con el id 'numComentariosTop'
*/
function enviaComentario (url, rutaCaptcha) 
{
	
	var comentarioCorrecto = "Gracias por su comentario. En unos instantes será publicado.";
	var comentarioIncorrecto = "Se ha producido un error al enviar su comentario.";
	
	document.body.style.cursor = "wait"; 
	var capaComentarios = document.getElementById('listaComentarios');
	
	var capaNombre = document.getElementById('nombre_');
	var capaEmail =  document.getElementById('email');
	var capaComentario =  document.getElementById('comentario');
	var capaCodigo =  document.getElementById('codigo');
	var capaIdNoticia = document.getElementById('id_noticia');
	var capaTitulo = document.getElementById('titulo_comentarios');
	var capaFormulario = document.getElementById('formComentario');

	var nombre = "";
	if(!!capaNombre) {	//comprobando existencia - para usuarios no autenticados
		nombre = capaNombre.value;
	}
	
	var email = "";
	if(!!capaEmail) {	//comprobando existencia - para usuarios no autenticados
		email = capaEmail.value;
	}
	
	var comentario = capaComentario.value;
	
	var codigo = "";
	if(!!capaCodigo) {
		codigo = capaCodigo.value;
	}
	
	var idNoticia =  capaIdNoticia.value;
	var titulo = capaTitulo.innerHTML;
	var tipo =  document.getElementById('tipo').value;
	var mensaje = "Los comentarios deben tener:<br />"
	var b= false;
	var er_email = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	var altura = capaFormulario.offsetHeight;
	var anchura = capaFormulario.offsetWidth;
	var opaca = creaCapaOpaca(altura, anchura, true);

	
	/* Verificación del formulario*/
	if (!!capaNombre && trim(nombre) == '')		
	{	//comprobando existencia - solo existe para usuarios no autenticados
		mensaje += "- Nombre del comentador<br />";
		b= true;
	}
	if (!!capaEmail && trim(email) == '')	
	{
		mensaje += "- E-mail del comentador<br />";
		b= true;
	}	
	if(!!capaEmail && !er_email.test(trim(email)))
	{
		mensaje += "- Dirección de correo bien formada. Debe ser de la forma usuario@servidor.com <br />";
		b = true;
	}
	if (trim(comentario) == '')	
	{
		mensaje += "- Texto en el comentario<br />";
		b= true;
	}
	if (!!capaCodigo && trim(codigo) == '')	
	{
		mensaje += "- Código de verificación<br />";
		b= true;
	}
	/* Fallo en la verificación*/
	if(b)
	{
		reemplazarCaptcha(rutaCaptcha, "captchaComentario");
		setTextoOpaca(opaca, mensaje)
		capaFormulario.appendChild(opaca);
		document.body.style.cursor = "default"; 
		
	}
	else
	{
		var params = '?comentario=' + encodeURIComponent(comentario) + 
					'&id_noticia=' + idNoticia +
					'&tipo=' + tipo;
		if(!!nombre) {
			params += '&nombre=' + encodeURIComponent(nombre);
		}
		if(!!email) {
			params += '&email=' + email;
		}
		if(!!codigo) {
			params += '&codigo=' + codigo;
		}
		
		new Ajax.Request(url, {   
			/* antes:
			 * parameters: '?nombre='+encodeURIComponent(nombre)+'&email='+email+'&comentario='+encodeURIComponent(comentario)+'&codigo='+codigo+'&id_noticia='+idNoticia+'&tipo='+tipo ,
			 */
			parameters: params,
			method: 'get',   
			encoding: 'UTF-8',
			onSuccess: function(respuesta) 
				{     
					var cadena = respuesta.responseText.toString();
					cadena = trim(cadena);
					var inicio = cadena.indexOf("<error>");
					var fin = cadena.indexOf("</error>");					
					if (inicio != -1 && fin != -1)
					{												
						var mensajeError = cadena.substring (inicio + 7 , fin);
						setTextoOpaca(opaca, mensajeError);
						capaFormulario.appendChild(opaca);
						document.body.style.cursor = "default"; 
					}
					else
					{
						/*si existe la capa infoGaleriaFotoShow, es que estamos en una galeria de imágenes y no en
						 * una noticia. Guardo el titulo completo*/
						var tempo = null;
						if(document.getElementById('infoGaleriaFotoShow'))
						{
							tempo = document.getElementById('titulo_comentarios').innerHTML;
						}
						/*limpio la capa de comentarios y los campos con información del  envio realizado*/
/*						capaComentarios.value = '';*/
						if(!!capaNombre) {
							capaNombre.value = '';
						}
						if(!!capaEmail) {
							capaEmail.value = '';
						}
						capaComentario.value = '';								
						if(!!capaCodigo) {
							capaCodigo.value = '';
						}
						/*como se ha realizado bien la petición, actualizamos la capa que contiene los comentarios.
						Dentro de la respuesta esta el valor.
						*/						
						capaComentarios.innerHTML = cadena;		
						/*actualizamos el número de comentarios*/	
						if(!document.getElementById('infoGaleriaFotoShow'))
						{					
							var titulo_tmp = document.getElementById('titulo_comentarios').innerHTML;
						}
						else
						{
							var titulo_tmp = tempo;
						}
						//document.getElementById('titulo_comentarios').innerHTML = titulo.replace(/\d+$/, titulo_tmp);
						document.getElementById('titulo_comentarios').innerHTML = titulo_tmp;
						/*actualizamos el id de la noticia*/
						document.getElementById('id_noticia').value = idNoticia;
						document.body.style.cursor = "default";			
						/*recargo la capa de formulario*/				
						capaFormulario = $("formComentario");
						setTextoOpaca(opaca, comentarioCorrecto, true);
						capaFormulario.appendChild(opaca);
					}
					var eCodigo = document.getElementById("codigo");
					if(!!eCodigo) {
						eCodigo.value = "";
					}
					var eCaptchaComentario = document.getElementById("captchaComentario");
					if(!!eCaptchaComentario) {
						reemplazarCaptcha(rutaCaptcha, "captchaComentario");
					}
				}, 
			onFailure: function(respuesta) 
				{     				
					capaIdNoticia.value = idNoticia;
					/*limpio sólo el campo del código de verificación*/
					capaCodigo.innerHTML = '';						
					/* informo mediante un alert que se ha producido un fallo en el envio del comentario. 
						Dentro de la respuesta vendrá la información del error.
					*/
					var mensajeError = respuesta.responseText.toString();
					document.body.style.cursor = "default"; 
					setTextoOpaca(opaca, mensajeError)
					capaFormulario = $("formComentario");
					capaFormulario.appendChild(opaca);
					var eCodigo = document.getElementById("codigo");
					if(!!eCodigo) {
						eCodigo.value = "";
					}
					var eCaptchaComentario = document.getElementById("captchaComentario");
					if(!!eCaptchaComentario) {
						reemplazarCaptcha(rutaCaptcha, "captchaComentario");
					}
				} 		
			}); 
			
		document.body.style.cursor = "default";
	}
}



/* Función que actualiza la valoración de un comentario. Esta versión es para la actualización de los
	comentarios más recientes, por lo que actualiza directamente el comentario indicado.
	Recibe tres parámetros. 
	El primero, valorVoto, indica si se ha de sumar o restar un punto al comentario.
	El segundo, idComentario, es el identificador del comentario.
	El tercero, url, es ha donde se hace la petición. Incluye el tipo de ordenación
	
*/
function votaComentarioM1 (valorVoto, idComentario, url) 
{
	document.body.style.cursor = "wait"; 
	var capaValor = document.getElementById (idComentario + '_val');
	var capaVotos = document.getElementById (idComentario + '_votos');
	var capaTitulo = document.getElementById('titulo_comentarios');
	var capaComentario = document.getElementById(idComentario);
	var capaIdNoticia = document.getElementById('id_noticia');
	var elemLi =  document.getElementById('comentario_'+ idComentario);
	var tipo = document.getElementById("tipo").value;
	
	var idNoticia = capaIdNoticia.value;
	var altura = document.getElementById ('comentario_'+ idComentario).offsetHeight;
	var anchura = document.getElementById ('comentario_'+ idComentario).offsetWidth;
	var opaca = creaCapaOpaca(altura, anchura);
	
	var titulo = capaTitulo.innerHTML;
	
	new Ajax.Request(url, {   
		parameters: '?idComentario='+idComentario+'&valorVoto='+valorVoto+'&tipo='+tipo ,
		method: 'get',   
		onSuccess: function(respuesta) 
			{     		
				var cadena = respuesta.responseText;
				cadena = trim(cadena);
				var inicio = cadena.indexOf("<error>");
				var fin = cadena.indexOf("</error>");
				if (inicio != -1 && fin != -1)
				{
					capaIdNoticia.value = idNoticia;
					var padre = document.getElementById("comentario_" + idComentario);
					var mensaje = cadena.substring (inicio + 7 , fin);
					setTextoOpaca(opaca, mensaje)
					document.body.style.cursor = "default"; 				
					padre.appendChild(opaca);				
				}
				else 
				{				
					capaIdNoticia.value = idNoticia;
					/*limpio la capa de comentarios y los campos con información del  envio realizado*/
					capaComentario.innerHTML = "";
					/*cargo el nuevo resultado que viene en la respuesta de la petición*/
					elemLi.innerHTML = respuesta.responseText.toString();
					/*queda pendiente como actualizar el valor de comentarios de la parte superior*/	
					document.body.style.cursor = "default"; 					
				}
			} ,
		onFailure: function(respuesta) 
			{     								
				/* informo mediante un alert que se ha producido un fallo en la actualización del comentario
				*/				
				var cadena = respuesta.responseText.toString();
				//alert('error '+cadena);
				setTextoOpaca(opaca, cadena)
				capaComentario.appendChild(opaca);
				document.body.style.cursor = "default"; 	
			}
		}); 
	document.body.style.cursor = "default"; 	
}



/* Función que actualiza la valoración de un comentario. Esta versión es para la actualización de los
	comentarios más valorados, por lo que actualiza todo el bloque de comentarios.
	Recibe tres parámetros. 
	El primero, valorVoto, indica si se ha de sumar o restar un punto al comentario.
	El segundo, idComentario, es el identificador del comentario.
	El tercero, url, es ha donde se hace la petición. Incluye el tipo de ordenación
	
*/
function votaComentarioM2 (valorVoto, idComentario, url) 
{
	var capaValor = document.getElementById (idComentario + '_val');
	var capaVotos = document.getElementById (idComentario + '_votos');
	var capaTitulo = document.getElementById('titulo_comentarios');
	var titulo = capaTitulo.innerHTML;
	var capaIdNoticia = document.getElementById('id_noticia');
	var idNoticia = capaIdNoticia.value;
	var altura = document.getElementById ('comentario_'+ idComentario).offsetHeight;
	var anchura = document.getElementById ('comentario_'+ idComentario).offsetWidth;
	var opaca = creaCapaOpaca(altura, anchura);
	var elemLi =  document.getElementById('comentario_'+ idComentario);
	var tipo = document.getElementById("tipo").value;
	
	new Ajax.Request(url, {   
		parameters: '?idComentario='+idComentario+'&valorVoto='+valorVoto+'&tipo='+tipo ,
		method: 'get',   
		onSuccess: function(respuesta) 
			{     
				var cadena = respuesta.responseText;
				cadena = trim(cadena);
				var inicio = cadena.indexOf("<error>");
				var fin = cadena.indexOf("</error>");
				if (inicio != -1 && fin != -1)
				{
					capaIdNoticia.value = idNoticia;
					var padre = document.getElementById("comentario_" + idComentario);
					var mensaje = cadena.substring (inicio + 7 , fin);
					setTextoOpaca(opaca, mensaje)
					document.body.style.cursor = "default"; 				
					padre.appendChild(opaca);				
				}
				else 
				{
				/* en la respuesta vienen los dos valores que hay que actualizar, la valoración  y el número
					de veces que se ha valorado un comentario.*/
					capaValor.innerHTML = '';
					elemLi.innerHTML = respuesta.responseText.toString();		
				}
			} ,
		onFailure: function(respuesta) 
			{     	
					/* informo mediante un alert que se ha producido un fallo en la actualización del comentario
				*/
				var cadena = respuesta.responseText.toString();				
				setTextoOpaca(opaca, cadena)
				capaComentario.appendChild(opaca);
				document.body.style.cursor = "default"; 	
				
											
				/* informo mediante un alert que se ha producido un fallo en la actualización del comentario
				*/
				var cadena = respuesta.responseText.toString();
				//alert(cadena);
			} 		
		}); 
}

/* Funcion que obtiene el listado ordenado de comentarios.
 * Tiene 3 parámetros
 * El primero, url, la dirección a la que se hace la petición de ordenación
 * El segundo, tipo, indica el tipo de noticia a tratar (noticia, galeria, etc...)
 * El tercero, orden, indica el tipo de ordenación a realizar.
 * El cuarto, pag, recibe el número de página a mostrar.
 * El quinto, asc, recibe 'si' o 'no' e indica si se ordena ascendentemente o no.
 * 
 */
function getComentariosOrdenados (url, tipo, orden, pag, asc)
{
	var capaComentarios = document.getElementById('listaComentarios');
	var idNoticia = document.getElementById('id_noticia').value;
	var tituloComentarios = document.getElementById('titulo_comentarios').innerHTML;
		
	new Ajax.Request(url, {   
		parameters: '?tipo='+tipo+'&id_noticia='+idNoticia+'&orden='+orden+'&pag='+pag+'&asc='+asc ,
		method: 'get',   
		onSuccess: function(respuesta) 
			{     
				/* en la respuesta vienen los dos valores que hay que actualizar, la valoración  y el número
					de veces que se ha valorado un comentario.*/
					capaComentarios.innerHTML = '';
					capaComentarios.innerHTML = respuesta.responseText.toString();
					document.getElementById('id_noticia').value = idNoticia; // Volvemos a darle el valor del ID al campo del formulario que llegará vacio
					
					if (tipo == "galeria") {
						document.getElementById('titulo_comentarios').innerHTML = tituloComentarios; // Ponemos el título original de nuevo a la capa
					}
					
					location.hash = '#comentarios'
			} ,
		onFailure: function(respuesta) 
			{     								
				// informo mediante un alert que se ha producido un fallo en la actualización de la lista de comentarios
				var cadena = respuesta.responseText.toString();
				//alert(cadena);
			} 		
		}); 
}

/**
 * Función utilizada para la moderación de un comentario determinado
 */
function moderaComentario(url, parametros, vista, pag, asc, tipo)
{
	var idComentario = parametros.match(/idComentario\=(\d+)/)[1]; // Nos quedamos con el ID del comentario
	var capaComentarios = document.getElementById('listaComentarios');
	var capaComentario = document.getElementById('comentario_c'+idComentario);
	var altura = capaComentario.offsetHeight;
	var anchura = capaComentario.offsetWidth;
	var opaca = creaCapaOpaca(altura, anchura);
	
	new Ajax.Request(url, {
		parameters: '?'+parametros,
		method: 'get',
		onSuccess: function(respuesta)
			{
				var cadena = respuesta.responseText;
				cadena = trim(cadena);
				var inicio = cadena.indexOf("<error>");
				var fin = cadena.indexOf("</error>");
				if (inicio != -1 && fin != -1)
				{ // Existe error
					var mensaje = cadena.substring (inicio + 7 , fin);
					setTextoOpaca(opaca, mensaje)
					document.body.style.cursor = "default"; 				
					capaComenterio.appendChild(opaca);
					intervalOpaca_c = window.setInterval(function(){if (document.getElementById('capaOpaca') == null) {alert("RECARGAMOS LISTA"); window.clearInterval(intervalOpaca_c);} }, 100);		
				}
				else 
				{ // No existe error
					inicio = cadena.indexOf("<ok>");
					fin = cadena.indexOf("</ok>");
					var mensaje = cadena.substring (inicio + 4 , fin);
					setTextoOpaca(opaca, mensaje)
					document.body.style.cursor = "default";			
					capaComentario.appendChild(opaca);
					intervalOpaca_c = window.setInterval(function()
						{if (document.getElementById('capaOpaca') == null)
							{
								getComentariosOrdenados(url.substr(0, url.lastIndexOf('/')) + '/listaComentarios', tipo, vista, pag, asc);
								window.clearInterval(intervalOpaca_c);
							} 
						}, 100);
				}
			},
		onFailure: function(respuesta)
			{
			}
	});
}

/*********************** funciones auxiliares ******************************/

function trim (cadena) {
	var tmp = ltrim(cadena);
	tmp = rtrim (tmp);
	return tmp;
}

function ltrim (cadena) {
	var tmp = cadena.replace(/^\s+/, "");
	return tmp;
}

function rtrim (cadena) {
	var tmp = cadena.replace(/\s+$/, "");
	return tmp;
}

/************************ funciones para la capa de mensajes ******************/

function creaCapaOpaca (altura, anchura, comentario)
{
	var opaca = document.createElement('div');
		
	opaca.className = 'opacidad';
	opaca.id = 'capaOpaca';
	opaca.onclick = function() {
		if (comentario)
			borraOpaca(true);
		else
			borraOpaca();
	}
	opaca.style.height = (altura - 20) + 'px';
	opaca.style.width = (anchura-15) + 'px';
	return opaca;
}

/*
 * Recibe tres parámetros
 * capa, la capa que hemos creado anteriormente y que es la opaca.
 * mensaje, el mensaje que va a contener a la capa opaca.
 * enlace, un booleano, que puede venir o no. Si viene y es true sirve para identificar el caso de 
 * 			de la capa para la información de un comentario enviado. El caso false no está contemplado.
 * */
function setTextoOpaca(capa, mensaje, enlace)
{	
	var texto = document.createElement('div');
	var cerrar  = document.createElement('div');
	cerrar.className = 'cerrar';
	cerrar.innerHTML = "[Pulse para Cerrar]"
	texto.innerHTML = mensaje;


	capa.appendChild(texto);
	/*if (enlace == true)
	{
		var enlaceNormas = document.createElement('a');
		enlaceNormas.innerHTML = "Normas para comentar."
		enlaceNormas.setAttribute('title','Enlace a Normas para comentar');
		enlaceNormas.setAttribute('href', '/normascomentarios');
		enlaceNormas.setAttribute('style', 'color: #fff');
		enlaceNormas.setAttribute('target', '_blank');
		capa.appendChild(enlaceNormas);
	}*/
	capa.appendChild(cerrar);
}

function borraOpaca (comentario, accionAJAX) 
{
	var opaca = document.getElementById('capaOpaca');
	var padre = opaca.parentNode;
	padre.removeChild(opaca);
	if(comentario)
		location.hash = '#comentarios';
	
	
	if (typeof accionAJAX != "undefined")
	{
		
	}
}

