/**
 * Manejo de comentarios, denuncias, votación y paginación
 * @author Daniela Rodríguez <dcareri@gmail.com>
 * @requires jQuery
 *  
 */
var mono = {};

mono.CFG = {}
	
mono.CFG.DEBUG = true;
mono.CFG.COMENTARIOS_MAX_CAPS = 70; // máximo porcentaje de caracteres en mayúsculas tolerables en un comentario	
mono.CFG.URL_BASE = "/";
mono.CFG.URL_COMENTARIO_ENVIAR = mono.CFG.URL_BASE + "comentario/crear";
mono.CFG.URL_COMENTARIO_DENUNCIAR = mono.CFG.URL_BASE + "comentario/denunciar";
mono.CFG.URL_COMENTARIO_VOTAR = mono.CFG.URL_BASE + "comentario/votar";
mono.CFG.URL_PAGINA_SOLICITAR = mono.CFG.URL_BASE + "comentario/paginador/";



// Constantes de idioma --------------------------------------------------------------------

mono.msg = {
	
	ERROR_500 : "Ha ocurrido un error en el servidor. Por favor, vuelva a intentar en unos minutos.",
	ERROR_403_COMENTARIO : "Para dejar un comentario debe iniciar sesi&oacute;n.",
	ERROR_403_DENUNCIA : "Para denunciar un comentario, debe iniciar sesion.",
	ERROR_403_VOTAR : "Para poder votar, debe iniciar sesion.",
	ERROR_400_COMENTARIO : "Antes de enviar, escriba el comentario.",
	CONFIRMA_DENUNCIA : "Confirme por favor que este comentario viola los Terminos y Condiciones de Monografias.com",
	DENUNCIA_ENVIADA : "&nbsp;|&nbsp; <strong>Comentario denunciado</strong>",
	NO_VOTAR_DOBLE : "No puede votar el mismo comentario dos veces"
	
}

// Utilidades --------------------------------------------------------------------
mono.util = {
	
	log : function(a) { 
		if (mono.CFG.DEBUG) {
			try {
				if (!("console" in window) || !("firebug" in console)) {
					$("#debug").append(a.toString()).append('<br >').show();
				} else {
					console.log(a);
				}
			} catch(E) {}
		}
	},
	
	getCookie : function(nombre) {
		var results = document.cookie.match ( '(^|;) ?' + nombre + '=([^;]*)(;|$)' );
		if (results) {
			return (unescape(results[2]));
		} else {
			return null;
		}
	},

	setCookie : function(nombre, value, neverexpires) {
		var cookie_string = nombre + "=" + escape(value) + "; path=/";
		if (neverexpires) {
			var cookie_date = new Date();
			cookie_date.setDate (cookie_date.getDate() + 365 );
			cookie_string += "; expires=" + cookie_date.toGMTString();
		}
		document.cookie = cookie_string;
	},

	deleteCookie : function(nombre) {
		var cookie_date = new Date();
		cookie_date.setTime (cookie_date.getTime() - 1 );
		document.cookie = nombre += "=; expires=" + cookie_date.toGMTString();
	},
	
	sanearTexto : function(t) {
		var mayus = t.match(/[A-Z]/g);
		if (mayus) { 
			var cantMayus = mayus.length;
			var total = t.length;
			if ( ((cantMayus/total)*100) > mono.CFG.COMENTARIOS_MAX_CAPS ) {
				t = t.charAt(0).toUpperCase() + t.substr(1).toLowerCase(); // HOLA --> Hola
			}
		}
		t = t.replace(/([A-Za-z0-9,\.!\?\$\-])\1{5,}/g, "$1"+"$1"+"$1"+"$1"); // Holaaaaaaaaaaaaaa --> Holaaaa
		return t;
	}
	
}

// Comentarios --------------------------------------------------------------------
mono.comentarios = {
	
	setHandlers : function() {
		
		// Mostrar el form de comentarios solo a los logueados.
		if (mono.CFG.usuario_logueado) {
			$("#cont-form-comentario").show();
		} else {
			$("#js-inicia-primero").show();
		}
		
		// Desactivar el envío hasta que el user escriba algo
		$("#form-enviar-comentario button.submit").attr("disabled", "disabled");
		
		// Validar que el user escriba algo
		var timeout;
		$(":input[name='comentario-texto']").bind("keydown", function(e) {
			var $elem = $(this);
			clearTimeout(timeout);
			timeout = setTimeout( function() {
				var val = $elem.val();
				if (!val) {
					$("#form-enviar-comentario button.submit").attr("disabled", "disabled");
				} else  {
					$("#form-enviar-comentario button.submit").removeAttr("disabled");
				}
			}, 500);
		});	
		
		// Enviar
		$("#form-enviar-comentario").bind("submit", function(e) {
			e.preventDefault();
			var $form = $(this);
			$form.desactivar();
			$("#js-comentario-error").hide();
			var oldComentario = $(":input[name='comentario-texto']").val();
			var newComentario = mono.util.sanearTexto(oldComentario);
			$(":input[name='comentario-texto']").val(newComentario);
			$.ajax({
				url : mono.CFG.URL_COMENTARIO_ENVIAR,
				type : "POST",
				data : { "mono_id" : mono.temp_mono_id, "comentario" : newComentario },
				success : function(result) {
					$("#cont-form-comentario").hide();
					$("#js-comentario-publicado").show();
					$("#js-comentarios").empty().html(result);
					mono.denuncias.setHandlers();
					mono.calificacion.setHandlers();
					mono.paginacion.setHandlers();
				},
				error : function(XHR, estado, error) {
					switch (XHR.status) {
						case 500 : {
							$("#js-comentario-error p").html(mono.msg.ERROR_500);
							$("#js-comentario-error").show();
							$form.activar();
						} break;
						
						case 403 : {
							$("#js-comentario-error p").html(mono.msg.ERROR_403_COMENTARIO);
							$("#js-comentario-error").show();
							$form.activar();
						} break;
						
						case 400 : {
							$("#js-comentario-error p").html(mono.msg.ERROR_400_COMENTARIO);
							$("#js-comentario-error").show();
							$form.activar();
						} break;
						
					}
					
				}
			}); // ajax
			
		});
		
		mono.util.log("comentarios.setHandlers listo.");
			
	} // setHandlers
	
}

// Denuncia --------------------------------------------------------------------
mono.denuncias = {
	
	setHandlers : function() {
			
		// Mostrar el denunciador solo a los logueados.
		if (mono.CFG.usuario_logueado) {
			$(".js-denunciador").show();
		}
		
		$(".js-denunciar").bind("click", function(e) {
			e.preventDefault();
			$el = $(this);
			comentarioId = $el.parents("li").attr("id").match(/js-comentario-([0-9]+)/)[1];
			if (confirm(mono.msg.CONFIRMA_DENUNCIA)) {
				$.ajax({
					url : mono.CFG.URL_COMENTARIO_DENUNCIAR,
					type : "POST",
					data : { "comentario_id" : comentarioId },
					success : function(result) {
						$el.parents(".js-denunciador").html(mono.msg.DENUNCIA_ENVIADA);
					},
					error : function(XHR, estado, error) {
						switch (XHR.status) {
							case 500 : {
								alert(mono.msg.ERROR_500);
							} break;
							
							case 403 : {
								alert(mono.msg.ERROR_403_DENUNCIA);
							} break;						
						}
					}
				}); // ajax	
			}
			
		});
		
		mono.util.log("denuncias.setHandlers listo.");
	} //setHandlers
	
}



// Calificacion --------------------------------------------------------------------
mono.calificacion = {
	
	setHandlers : function() {
		
		// habilitar manitos solo a los logueados.
		if (mono.CFG.usuario_logueado) {
			
			$(".js-upvote, .js-downvote").bind("click", function(e) {
				e.preventDefault();
				$(this).blur();
				var $el = $(this);
				var $padre = $(this).parents("li");
				var comentarioId = $padre.attr("id").match(/js-comentario-([0-9]+)/)[1];
				var username = mono.util.getCookie("monoauth_username");
				if (username == null) return false;
				mono.util.log ("verificando si existe: " + "mono_" + username + "_" + comentarioId);
				if (mono.util.getCookie("mono_" + username + "_" + comentarioId)) {
					alert (mono.msg.NO_VOTAR_DOBLE);
					return false;
				} else {
					accion = $el.hasClass("js-upvote") ? "sumar" : "restar";
					$.ajax({
						url : mono.CFG.URL_COMENTARIO_VOTAR,
						type : "POST",
						data : { "comentario_id" : comentarioId, "accion" : accion },
						success : function(result) {
							mono.util.setCookie("mono_" + username + "_" + comentarioId, "true", true);
							diferencia = $el.hasClass("js-upvote") ? 1 : -1;
							var oldValor = parseInt ($el.siblings(".js-votos-actuales").text());
							var newValor = oldValor + diferencia;
							$el.siblings(".js-votos-actuales").text(newValor);
							var oldSrc = $el.children("img").attr("src").match(/^(.*).gif$/)[1];
							var newSrc = oldSrc + "_done.gif";
							$el.children("img").attr("src", newSrc);
							$(".js-upvote, .js-downvote", $padre).unbind("click").bind("click",function(e) {
								e.preventDefault();
								$(this).blur();
								alert (mono.msg.NO_VOTAR_DOBLE);
							});
						},
						error : function(XHR, estado, error) {
							switch (XHR.status) {
								case 500 : {
									alert(mono.msg.ERROR_500);
								} break;
								
								case 403 : {
									alert(mono.msg.ERROR_403_DENUNCIA);
								} break;						
							}
						}
					}); // ajax	
					
				}
			});
			
		} else {
			
			$(".js-upvote, .js-downvote").bind("click", function(e) {
				e.preventDefault();
				$(this).blur();
				alert (mono.msg.ERROR_403_VOTAR);
			});
			
		}
		
		mono.util.log("calificacion.setHandlers listo.");		
	} // setHandlers
	
}


// Paginacion --------------------------------------------------------------------
mono.paginacion = {
	
	setHandlers : function() {
		
		$(".js-pag-anterior, .js-pag-siguiente, .js-pag-nro").bind("click", function(e) {
			e.preventDefault();
			$(this).blur();
			var $el = $(this);

			mono.util.log("click - " + $el.name);

			if ($el.hasClass("js-pag-nro")) {
				var pag = parseInt ($el.text());
			} else {
				var actual = parseInt ($el.siblings(".js-pag-actual").text());
				var pag = $el.hasClass("js-pag-anterior") ? actual - 1 : actual + 1;
			}

			mono.paginacion.cargarPagina(pag);
			
		});
	
		mono.util.log("paginacion.setHandlers listo.");			
	}, // setHandlers
	
	cargarPagina : function(pag) {
		$.ajax({
			url : mono.CFG.URL_PAGINA_SOLICITAR,
			type : "GET",
			data : { "mono_id" : mono.temp_mono_id, "pagina" : pag },
			success : function(result) {
				$("#js-comentarios").empty().html(result);
				mono.denuncias.setHandlers();
				mono.calificacion.setHandlers();
				mono.paginacion.setHandlers();
			},
			error : function(XHR, estado, error) {
				// fallar silenciosamente					
			}
		}); // ajax	
	} // cargarPagina

}

// Extender jQuery con funciones utiles --------------------------------------------------------------------

jQuery.fn.extend ({
		
	// Desactivar form
	desactivar: function() {
		$(':input[readonly!="readonly"]:not(.desactivado)', this).each(function() {
			var $el = $(this);
			$el.attr('readonly', 'readonly').addClass('desactivado js-dis'); // Ojo, seteamos radonly, no disabled
			if ($el.hasClass('submit'))	{
				$el.addClass('busy');
				$el.attr('disabled', 'disabled').attr('oldValue', $.trim($(this).html()));
				$el.html("Enviando...");
				$el.blur();
			}
		})
		return this;
	},
	
	// Reactivar form
	activar: function() {
		return $('.desactivado.js-dis', this).each(function() {
			$(this).removeAttr('readonly').removeClass('desactivado js-dis');
			if ($(this).attr('oldValue')) { 
				$(this).removeClass('busy');
				$(this).html($(this).attr('oldValue'));
				$(this).removeAttr('disabled').removeAttr('oldValue');
			}
		});
	}
	
});

mono.followbox = {
        followMeBox : function(){
                // Mostrar el form de comentarios solo a los logueados.
                if (mono.CFG.usuario_logueado) {
                        $("#js-followme-logged").show();
                } else {
                        $("#js-followme-error").show();

                }

        }

}

// Main ------------------------------------------------------

$(document).bind("ready", function() {
	if (mono.util.getCookie("monoauth_session_hash")) {
		mono.CFG.usuario_logueado = true;
	} else {
		mono.CFG.usuario_logueado = false;
	}
	mono.followbox.followMeBox();
	mono.comentarios.setHandlers();
	mono.paginacion.cargarPagina(1);
});
