/**
@author Thyago Schleuss - thyago@dynamix.com.br
Classe utilizada para avaliação
e comentários de matérias. 
**/
function MateriaUtils() {
	
	// Função para avaliar a matéria
	this.avaliar = function( star ) {
		var rate = obj.getStarNumber(star);
		var mat = obj.getMateriaNumber();
		var params = "action=avaliarMateria&star=" + rate + "&materia=" + mat;
		$.ajax({
			type: "POST",
   			url: url + "/servlet/ServletAvaliacao",
   			contentType: "application/x-www-form-urlencoded;charset=ISO-8859-1",
   			data: params,
   			dataType: "text",
		    success: function(data) {
				if( data == "0" ) {
					obj.respostaAvaliar( rate );
				} else if( data == "-1" ) {
					alert("Parâmetros inválidos !");
				}
			}
		});
	};
	
	// Verifica se a matéria ja foi avaliada
	this.jaAvaliado = function() {
		var mat = obj.getMateriaNumber();
		var params = "action=avaliouMateria&materia=" + mat;
		$.ajax({
			type: "POST",
   			url: url + "/servlet/ServletAvaliacao",
   			contentType: "application/x-www-form-urlencoded;charset=ISO-8859-1",
   			data: params,
   			dataType: "text",
		    success: function(data) {
	   			if( data != "-1" ) {
					obj.respostaAvaliou( data );
				} else {
					alert("Parâmetros inválidos !");
				}
			}
		});
	};
	
	// Recupera o total de avaliações para a matéria
	this.totalAvaliacoes = function() {
		var mat = obj.getMateriaNumber();
	 	var params = "action=getAvaliacoesCount&materia=" + mat;
		$.ajax({
			type: "POST",
   			url: url + "/servlet/ServletAvaliacao",
   			contentType: "application/x-www-form-urlencoded;charset=ISO-8859-1",
   			data: params,
   			dataType: "xml",
		    success: function(data) {

				var qtde = $(data).find("qtde").text();
				var media = $(data).find("media").text();
				
   				if( qtde != "-1" ) {
					obj.respostaTotalAvaliacoes( qtde, media );
				} else {
					alert("Parâmetros inválidos !");
				}
			}
		});
	};
	
	// Seta o total de avaliações no HTML
	this.respostaTotalAvaliacoes = function( valor, media ) {
		var avaliar = document.getElementById("avaliacaoCount");
		var total = "Avaliações ("+ valor + ")";
		avaliar.innerHTML = total;
		obj.mostrarMediaEstrelas(media);
	};
	
	// Seta a nota no HTML caso o usuário ja tenha votado
	this.respostaAvaliou = function( valor ) {
		if( valor != "false" ) {
			var avaliar = document.getElementById("avaliar");
			var starLi = avaliar.getElementsByTagName("li");
			for( var i = 0; i < starLi.length; i++ ) {
				if( starLi[i].id == 'star' ) {
					starChild = starLi[i].firstChild;
					starChild.removeAttribute("onmouseover");
					starChild.removeAttribute("onclick");
					starChild.removeAttribute("onmouseout");
					if( obj.getStarNumber( starChild ) <= valor ) {
						starLi[i].className = 'ativo';
					} else {
						starLi[i].className = '';
					}
				}
			}			
			avaliar.innerHTML = avaliar.innerHTML.replace( "Avaliar" , "Sua avaliação" );
			
			if( $("#avaliacao").length > 0 ) {
				$("#avaliacao").show();
			}
		}
	};
	
	// Atualiza as estrelas e o total de avaliações
	this.respostaAvaliar = function( valor ) {
		obj.respostaAvaliou( valor );
		obj.totalAvaliacoes();
	};
	
	// monta a lista de estrelas para a media
	this.mostrarMediaEstrelas = function(media) {
		
		var idx		 = new Number(1);
		var estrelas = new Number(5);
		var qtde     = parseInt(media);
		var decimal  = (new Number(media) % new Number(1));

		if( decimal <= new Number(0.15) ) {
			decimal = new Number(0);
		} else if ( decimal >= new Number(0.75) ) {
			decimal = new Number(0);
			qtde += new Number(1);
		}
		
		if( qtde > new Number(5) ) {
			qtde = new Number(5);
		}

		for( idx = 1; idx <= qtde; idx++) {
			var id = "#star_" + idx;
			$("#avaliacao").find(id).addClass('ativo');
		}

		var md = "Média " + qtde;
		// meia estrela
		if( decimal > 0 && qtde < 5 ) {
			md += ".5";
			
			if( idx <= estrelas ) {
				var id = "#star_" + idx;
				if( $("#avaliacao").find(id).hasClass("ativo") ) {
					$("#avaliacao").find(id).removeClass("ativo");
				}
				$("#avaliacao").find(id).addClass('parcial');
			}
		}
		
		for( idx = 1; idx <= estrelas; idx++) {
			var id = "#star_" + idx;
			$("#avaliacao").find(id).find('a').attr( 'title', md ); 
		}
	};
	
	// Faz o efeito nas estrelas ao passar o mouse
	this.preAvaliar = function( star ) {
		var starId = obj.getStarNumber(star);
		var starLi = document.getElementsByTagName("li");
		for( var i = 0; i < starLi.length; i++ ) {
			if( starLi[i].id == 'star' ) {
				starChild = starLi[i].firstChild;
				if( obj.getStarNumber( starChild ) <= starId ) {
					starLi[i].className = 'ativo';
				} else {
					starLi[i].className = '';
				}
			}
		}
	};
	
	// Remove a cor das estrelas ao retirar o mouse
	this.desAvaliar = function() {
		var starLi = document.getElementsByTagName("li");
		var count = "";
		for( var i = 0; i < starLi.length; i++ ) {
			if( starLi[i].id == 'star' ) {
				starLi[i].className = '';
			}
		}
	};
	
	// Retorna o valor da estrela ao clica-la
	this.getStarNumber = function( star ) {
		return star.href.substring( ( star.href.lastIndexOf("#")+1 ) );
	};
	
	// Retorna o valor da matéria ao clicar na estrela
	this.getMateriaNumber = function() {
		var velhaEnd = (location.href.lastIndexOf("#") > (location.href.indexOf("cd_materia=")+11));
		if( velhaEnd === true ) {
			return location.href.substring( ( location.href.indexOf("cd_materia=")+11 ) , location.href.lastIndexOf("#") );
		} else {
			return location.href.substring( ( location.href.indexOf("cd_materia=")+11 ) );
		}
		return "";
	};
	
	// Função para avaliar a matéria
	this.comentar = function( ds_comentario , ds_email , ds_nome ) {
		var mat = obj.getMateriaNumber();
	 	var params =  "action=comentarMateria&materia=" + mat;
	 		params += "&ds_comentario=" + ds_comentario + "&ds_email=" + ds_email + "&ds_nome=" + ds_nome;
		$.ajax({
			type: "POST",
   			url: url + "/servlet/ServletComentario",
   			contentType: "application/x-www-form-urlencoded;charset=ISO-8859-1",
   			data: params,
   			dataType: "text",
		    success: function(data) {
	   			if( data == "0" ) {
					obj.consultarComentarios(1);
					obj.consultarComentariosCount();
				} else if ( data == "-1" ) {
					alert("Parâmetros inválidos !");
				}
			}
		});
	};

	// Função para consultar os comentarios ao clicar no botão
	this.consultarComentarios = function( paginacao ) {
		obj.carregando();
		var mat = obj.getMateriaNumber();
		var params = "action=getComentarios&materia=" + mat + "&paginacao=" + paginacao;
		$.ajax({
			type: "POST",
   			url: url + "/servlet/ServletComentario",
   			contentType: "application/x-www-form-urlencoded;charset=ISO-8859-1",
   			data: params,
   			dataType: "xml",
		    success: function(data) {
				obj.parseComentarioXml(data);
			}
		});
		return false;
	};
	
	// Função que intepreta o XML envia pelo servidor
	// e monta o resultado com os comentarios
	this.parseComentarioXml = function( xmldocument ) {
	
		var comentarios = xmldocument.getElementsByTagName("comentario");
		var list = $("#resultadosComent");
		list.find('li').remove(); 
		list.append("<li class=\"titulo\">Ver comentários</li>");
		
		if ( comentarios.length > 0 ) {
			for ( i = 0; i < comentarios.length; i++ ) {
		    	var nome = comentarios[i].getElementsByTagName("nome").item(0);
		    	var text = comentarios[i].getElementsByTagName("texto").item(0);
		    	if( i != comentarios.length-1 ) {
		    		list.append("<li><strong>" + nome.firstChild.data + "</strong><div>" + text.firstChild.data + "</div><hr></hr></li>");
		    	} else {
		    		list.append("<li class=\"ultimo\"><strong>" + nome.firstChild.data + "</strong><div>" + text.firstChild.data + "</div></li>");
		    	}
			}
			
			montaPaginacao(xmldocument);
			
		} else {
			list.append("<li class=\"ultimo\"><strong>Não há comentários cadastrados para esta matéria</strong></li>");
		}
		obj.carregando();
	};
	
	// Monta o menu de navegação caso haja muitos comentários
	var montaPaginacao = function(xmldocument) {
	
		// Parametros vem do servidor juntamente com os comentários
		var params 		= xmldocument.getElementsByTagName("parametros");
		paginasPorNav   = new Number(params[0].getElementsByTagName("paginasPorNav").item(0).firstChild.data	);
		tamanhoIntevalo = new Number(params[0].getElementsByTagName("tamanhoIntevalo").item(0).firstChild.data	);
		paginaAtual 	= new Number(params[0].getElementsByTagName("paginaAtual").item(0).firstChild.data		);
		totalPaginas 	= new Number(params[0].getElementsByTagName("totalPaginas").item(0).firstChild.data		);
		totalRegistros 	= new Number(params[0].getElementsByTagName("totalRegistros").item(0).firstChild.data	);
		
		// Caso ouver mais registros do que suporta 1 página
		// mostra a paginacao
		if(totalRegistros > tamanhoIntevalo) {
		
			var pag = $(".paginacao");
			var PRIMEIRO = 1;
			pag.find('li').remove(); 
		
			if ( paginaAtual == PRIMEIRO ) {
				pag.append('<li class="anterior"><a class="inativo"><span>Anterior</span></a></li>');
			} else {
				pag.append('<li class="anterior"><a href="javascript:void(0)" onclick="javascript: matUtils.navegar(' + (paginaAtual-1) + ');" title="Ir para a página anterior"><span>Anterior</span></a></li>');
			}
			
			var dzn = Math.floor((paginaAtual - 1) / paginasPorNav);
			var ini = 1 + paginasPorNav * dzn;
			var fim = Math.min( totalPaginas , (ini + paginasPorNav));
				fim = Math.max(fim , ini);
			
			for( var f = ini; f <= fim; f++ ) 
			{
				// Faz com que sempre tenha uma opção da páginacao
				// anterior no inicio do menu
				if( f == ini && f != PRIMEIRO ) {
					pag.append('<li><a href="javascript:void(0);" onclick="javascript: matUtils.navegar(' + (f - 1) + ');" title="Ir para a página ' + (f - 1) + '">' + (f - 1) + '</a></li>');
				}
				
				if ( f == paginaAtual ) {
					pag.append('<li class="ativo"><a>' + f + '</a></li>');
				}else{
					pag.append('<li><a href="javascript:void(0);" onclick="javascript: matUtils.navegar(' + f + ');" title="Ir para a página ' + f + '">' + f + '</a></li>');
				}
			}
			
			if (totalRegistros == 0 || paginaAtual == Math.ceil( totalRegistros / tamanhoIntevalo )) {
				pag.append('<li class="proxima"><a class="inativo"><span>Próxima</span></a></li>');
			}else{
				pag.append('<li class="proxima"><a href="javascript:void(0);" onclick="javascript: matUtils.navegar(' + (paginaAtual + 1) + ');" title="Ir para a próxima página"><span>Próxima</span></a></li>');
			}
			
			pag.fadeIn();
		}
	};

	// Função para navegar pelo resultado da consulta ( quando há paginação )
	this.navegar = function( pagina ) {
		obj.consultarComentarios(pagina);
	};
	
	// Função que consulta a quantidade de comentários para a matéria
	this.consultarComentariosCount = function() {
		var mat = obj.getMateriaNumber();
		var params = "action=getComentariosCount&materia=" + mat;
		$.ajax({
			type: "POST",
   			url: url + "/servlet/ServletComentario",
   			contentType: "application/x-www-form-urlencoded;charset=ISO-8859-1",
   			data: params,
   			dataType: "text",
		    success: function(data) {
				obj.respostaComentariosCount(data);
			}
		});
		return false;
	};
	
	// Função que exibe a quantidade de comentario na tela
	this.respostaComentariosCount = function( total ) {
		var bt = document.getElementById("matCount");
		bt.innerHTML = total;
	};
	
	// Função que mostra a animação de loading
	this.carregando = function(){
		if ( $("#comentLoad").is(":hidden") ) {
			$("#comentContent").hide();
			$("#comentLoad").fadeIn();
		} else {
			$("#comentLoad").fadeOut( "normal" , function() {
				$("#comentContent").fadeIn("slow");
			});
		}
	};
	
	// Vincula a função de consultar comentarios
	// ao botão na página
	$(document).ready( function() {
		$("#verComent").click( function () {
			if ( $("#comentContent").is(":hidden") ) {
				obj.consultarComentarios(1);
				obj.consultarComentariosCount();
		    } else {
		       	$("#comentContent").slideUp("slow");
		    }
     	});
    });
    
    // Função que exibe o popup para comentar
	this.displayMessageComentario = function(url) {
		
		dhtml.setShadowOffset(5);
		dhtml.setSource(url);
		dhtml.setCssClassMessageBox("modalClass");
		dhtml.setSize(396,450);
		dhtml.setShadowDivVisible(true);
		dhtml.display();
	};
	
    // Função que exibe o popup para comentar
	this.displayMessage = function(url) {
		dhtml.setShadowOffset(5);
		dhtml.setSource(url);
		dhtml.setCssClassMessageBox("modalClass");
		dhtml.setSize(396,371);
		dhtml.setShadowDivVisible(true);
		dhtml.display();
	};
	
	this.displayMessageRec = function(url) {
		dhtml.setShadowOffset(5);
		dhtml.setSource(url);
		dhtml.setCssClassMessageBox("modalClass");
		dhtml.setSize(396,525);
		dhtml.setShadowDivVisible(true);
		dhtml.display();
	};
	
	this.displayRecMsg = function(url) {
		dhtml.setShadowOffset(5);
		dhtml.setSource(url);
		dhtml.setCssClassMessageBox("modalClass");
		dhtml.setSize(400,185);
		dhtml.setShadowDivVisible(true);
		dhtml.display();	
	};
	
	this.displayRedesSociais = function(url) {
		dhtml.setShadowOffset(5);
		dhtml.setSource(url);
		dhtml.setCssClassMessageBox("modalClass");
		dhtml.setSize(345,180);
		dhtml.setShadowDivVisible(true);
		dhtml.display();	
	};

	// Função que recupera os valores do popup de comentarios
	this.enviarComentario = function() {
	
		var ds_nome = document.getElementById("ds_nome");
		var ds_email = document.getElementById("ds_email");
		var ds_comentario = document.getElementById("ds_comentario");
		
		var nome = obj.encodeText(ds_nome.value);
		var email = ds_email.value;
		var comentario = obj.encodeText(ds_comentario.value);
		
		if( nome == null || nome == "" ) {
			alert("Preencha os campos obrigatórios !");
			ds_nome.focus();
		} else if( comentario == null || comentario == "" ) {
			alert("Preencha os campos obrigatórios !");
			ds_comentario.focus();			
		} else if( email != null && email != "" && !obj.validaEmail(email) ) {
			alert("Seu e-mail não é válido !");
			ds_email.focus();
			ds_email.select( 0 , email.length );	
		} else {
			matUtils.comentar( comentario , 
				email , nome 
			);
			obj.closeModal();
			obj.displayRecMsg( url + "/corpo/2009-materia-plus/dialog/comentar_resp.jsp");
		}
		return false;
	};
	
	// Função que abre o popup de recomendações, já populado
	this.reEnviarRecomendacao = function( params ) {
		obj.displayMessageRec( url + '/corpo/2009-materia-plus/dialog/recomendar.jsp?' + params );
	};
	
	// Função que recupera os valores do popup de recomendacao
	this.enviarRecomendacao = function() {
	
		var ds_nome = document.getElementById("ds_nome");
		var ds_email = document.getElementById("ds_email");
		var ds_nome_amigo = document.getElementById("ds_nome_amigo");
		var ds_email_amigo = document.getElementById("ds_email_amigo");
		var ds_comentario = document.getElementById("ds_comentario");
		
		var nome = obj.encodeText(ds_nome.value);
		var email = ds_email.value;
		var nome_amigo = obj.encodeText(ds_nome_amigo.value);
		var email_amigo = ds_email_amigo.value;
		var comentario = obj.encodeText(ds_comentario.value);
		
		if( nome == null || nome == "" ) {
			alert("Preencha os campos obrigatórios !");
			ds_nome.focus();
		} else if( email == null || email == "" ) {
			alert("Preencha os campos obrigatórios !");
			ds_email.focus();		
 		} else if( nome_amigo == null || nome_amigo == "" ) {
			alert("Preencha os campos obrigatórios !");
			ds_nome_amigo.focus();	
		}else if( email_amigo == null || email_amigo == "" ) {
			alert("Preencha os campos obrigatórios !");
			ds_email_amigo.focus();			
		} else if( !obj.validaEmail(email) ) {
			alert("Seu e-mail não é válido !");
			ds_email.focus();
			ds_email.select( 0 , email.length );	
		} else if( !obj.validaEmail(email_amigo) ) {
			alert("O e-mail de seu amigo não é válido !");
			ds_email_amigo.focus();
			ds_email_amigo.select( 0 , email_amigo.length );	
		} else {
			$(".loadRec").fadeIn("fast",function() {
				var mat = obj.getMateriaNumber();
				var opts = "&ds_nome=" + nome + "&ds_email=" + email + "&ds_nome_amigo=" + nome_amigo;
				var opts2 = "&ds_email_amigo=" + email_amigo + "&ds_comentario=" + comentario;
				var opts3 = "&cd_canal=" + cd_canal + "&cd_secao=" + cd_secao;
				var params = "action=recomendarMateria&materia=" + mat + opts + opts2 + opts3;
				$.ajax({
					type: "POST",
		   			url: url + "/servlet/ServletRecomendacao",
		   			contentType: "application/x-www-form-urlencoded;charset=ISO-8859-1",
		   			data: params,
		   			dataType: "text",
				    success: function(data) {
				    	obj.closeModal();
				    	obj.displayRecMsg( url + "/corpo/2009-materia-plus/dialog/recomendar_msg.jsp?resultado=" + data + opts + opts2 + opts3 );
					}
				});
			});
		}
		return false;
	};
	
	// Função absurda para codificar as palavras
	// acentuadas em ambos os browsers..
	this.encodeText = function( texto ) {
	    if ( navigator.userAgent.indexOf("Firefox") != -1 ||  
	    		navigator.userAgent.indexOf("Chrome") ) {
	        return encodeURIComponent(texto);
	    } else { 
	        return escape(texto);
	    }
	};
	
	// Função que limpa os valores do popup
	this.limpaCampos = function() {
		document.getElementById("ds_nome").value = "";
		document.getElementById("ds_email").value = "";
		document.getElementById("ds_comentario").value = "";
		obj.closeModal();
		return false;
	};
	
	// Fecha um modal
	this.closeModal = function() {
		dhtml.close();
		return false;		
	};
	
	// Função para limpar os campos do formulário de recomendação
	this.limpaCamposRecomendacao = function() {
		document.getElementById("ds_nome").value = "";
		document.getElementById("ds_email").value = "";
		document.getElementById("ds_nome_amigo").value = "";
		document.getElementById("ds_email_amigo").value = "";
		document.getElementById("ds_comentario").value = "";
		obj.closeModal();
		return false;	
	};
	
	this.validaEmail = function(mail) {
	    var exp = new RegExp(/^\w+([\.-]?\w+)*@((\w+([\.-]?\w+)*(\.\w{2,3})+)|localhost)$/);
	    if( typeof mail == "string" ) {
	    	if(exp.test(mail)) {
	    		return true; 
	    	}
	    } else if ( typeof mail == "object" ) {
	        if(exp.test(mail.value)) {
	        	return true;
	        }
	    } else {
	    	return false;
	    }
	};
	
	this.countNewLine = function( field )
	{
		var str = field.value;
		var expReg = /\n/g;
		var n = str.match(expReg);	
		if ( n == null ) {
			return 0;
		} 
		else {
			return n.length;
		}
	};

	this.countTotalChar = function( target, field , maxlength )
	{
		var count = document.getElementById( target );
		if( eval( count ) ) 
		{
			var realCount = obj.countNewLine( field ) + field.value.length ;
			count.innerHTML = realCount;
			if( realCount >= maxlength ) {
				count.className = "genRed";
			}
			else {
				count.className = "gen";
			}
		}
	};
	
	this.searchNewLine = function( str )
	{
		var expReg = /\n/g;
		var n = str.match(expReg);	
		if ( n == null ) {
			return 0;
		} 
		else {
			return n.length;
		}
	};

	this.limitLength = function( window, e, target, field , maxlength )
	{
		var key;
		
		if (window.event) {
			key = window.event.keyCode;
		}
		else {
			key = e.which;
		}
		
		var isAllowed  = ( key == 8 || key == 37 || key == 38 || key == 39 || key == 40 );
		var value = field.value;
		var realCount = ( obj.countNewLine( field ) + value.length );	
		if ( realCount >= maxlength ) {
			var c = obj.searchNewLine( value.substring( 0 , maxlength ) );
			field.value = value.substring( 0 , maxlength - c );
			obj.countTotalChar( target, field , maxlength );
			if( isAllowed ) {
				return true;
			}
			return false;
		}
		obj.countTotalChar( target, field , maxlength );
		return true;
	};

	// Função que abre a janela de impressão
	this.printing = function() {
		if (!window.print) {
			return;
		}
		window.print();
	};
	
	this.setUrl = function( serverUrl ) {
		url = serverUrl;
	};

	this.getUrl = function() {
		return url;
	};
	
	this.setCdCanal = function( cdCanal ) {
		cd_canal = cdCanal;
	};

	this.getCdCanal = function() {
		return cd_canal;
	};
	
	this.setCdSecao = function( cdSecao ) {
		cd_secao = cdSecao;
	};

	this.getCdSecao = function() {
		return cd_secao;
	};
	
	var paginasPorNav = 0;
	var tamanhoIntevalo = 0;
	var paginaAtual = 0;
	var totalPaginas = 0;
	var totalRegistros = 0;

	var obj = this;
	var url = "";
	var cd_canal = "";
	var cd_secao = "";
	var dhtml = new DHTML_modalMessage();
}
