
// prototyping class
var gerenciadorEnquete = {
	
	// constantes
	
	// definição de propriedades
	codUsuario : 0,
	
	htmlEnquetes : "",
	listaEnquetes : {},

    _formDocument : {},
    
    listaEnquetesVisivel : false,
    
		
	
	/**
	 * inicializador, chamar ao obter o CodUsuario e o CodTransmissao
	 */
	iniciar: function (CodTransmissao, CodUsuario) 
	{
		gerenciadorEnquete.codUsuario = CodUsuario;
		
        
        // consulta os formulários da transmissão atual
		var dt = verificaSessao( WCAjax.ListaFormulariosTransmissao(CodTransmissao) );
        
		if (dt == null) {
			trace('gerenciadorEnquete._consultarFormularios : ERRO : tabela de formulários nula');
			return;
		}
		
		// monta a parte visual
		var sb = new StringBuilder();
		
		sb.append("<table style='width:100%' cellpadding='5'>");
		sb.append("<tr>");
		sb.append("<td valign='top'>");
		
		sb.append("<div id='WebCasters_ListaEnquetes'>");
		
		sb.append("<div class='WebCasters_ListaEnquetes_Titulo'>");
		sb.append("Enquetes");
		sb.append("</div>");
		

		if (dt.rows.length < 1) {
		    sb.append("</div>");
			sb.append("<div class='WebCasters_Enquete_SemEnquetes'>N&atilde;o h&aacute; enquetes na transmiss&atilde;o atual.</div>");
		}else{
		
		    // para cada formulário encontrado
		    for (var i=0; i < dt.rows.length; i++) 
		    {
		        // monta o objeto do formulário
			    var enquete  = new FormularioEnquete(dt.rows[i].Codigo, gerenciadorEnquete.codUsuario);
    			
			    // armazena uma lista de enquetes
			    gerenciadorEnquete.listaEnquetes[enquete.formularioTransmissao.Codigo] = enquete;	
    			
			    //var ep = new FormularioEnquete(e.codigo, "blabla");
			    sb.append("<div class='WebCasters_ListaEnquetes_item'>");
			    sb.append("<span onclick='javascript:");
			    sb.append("top.gerenciadorEnquete.abrir("+enquete.formularioTransmissao.Codigo+")");
			    sb.append("'>");
			    sb.append("- "+enquete.formulario.Nome);
			    sb.append("</span>");
			    sb.append("</div>");
    			
		    }
    		
		    sb.append("</div>");
    		
		    sb.append("<div id='WebCasters_AguardandoEnquetes'>");
		    sb.append("Aguardando envio de enquetes...");
		    sb.append("</div>");
    		
		    sb.append("</td>");
		    sb.append("<td><div id='WebCasters_Enquete_ContainerFormulario' height='100%'></div></td>");
		}
		
	    sb.append("</tr>");
	    sb.append("</table>");
		
		// guarda o html do componente
		gerenciadorEnquete.htmlEnquetes = sb.toString();
	},
	
	
	/**
	 * ativa a interface do formulário, chamar ao obter o iframe ou ao carregar um novo template
	 */
	ativarInterface : function (containerEnquete, exibirListaEnquetes) {
		if (!containerEnquete) {
			return;
		}
		
		// coloca o html de formulários 
		containerEnquete.innerHTML = gerenciadorEnquete.htmlEnquetes;
		
		gerenciadorEnquete._formDocument = containerEnquete.ownerDocument;
		gerenciadorEnquete.listaEnquetesVisivel = exibirListaEnquetes;
		
		indirectRun (function () {
		    var dvLista = containerEnquete.ownerDocument.getElementById('WebCasters_ListaEnquetes');
		    var dvMensagem = containerEnquete.ownerDocument.getElementById('WebCasters_AguardandoEnquetes');
		    if(dvLista != null) { dvLista.style.display = exibirListaEnquetes?"inline":"none"; }
		    if(dvMensagem != null) { dvMensagem.style.display = !exibirListaEnquetes?"inline":"none"; }
		});
		
	},
	
	
	/**
	 * vê se é para mostrar a mensagem de "aguardando enquetes"
	 */ 
	exibirAguarndadoEnquetes : function ()
	{
	    if (gerenciadorEnquete.listaEnquetesVisivel == false)
	    {
	        var cf = gerenciadorEnquete.containerFormulario();
	        var cn = cf.childNodes;
	        
	        var dvMensagem = cf.ownerDocument.getElementById('WebCasters_AguardandoEnquetes');
	        
	        if (cn && cn.length > 0) 
	        {
	            dvMensagem.style.display = "none";
	        }
	        else
	        {
	            dvMensagem.style.display = "inline";
	        }
	        
	    }
	    
	},
	
	
	/**
	 * mostra um formulário um formulário
	 */ 
	abrir : function (codFormularioTransmissao) {
	
	    var msg_aguardando = $('WebCasters_AguardandoEnquetes');
	    
	    if (msg_aguardando) {
	        msg_aguardando.style.visibility = "hidden";
	    }
		
		if (!gerenciadorEnquete.listaEnquetes[codFormularioTransmissao]) {
			trace('gerenciadorEnquete.abrir: formulário não encontrado');
			return;
		}
		
		gerenciadorEnquete.listaEnquetes[codFormularioTransmissao].exibir();
	    
	    indirectRun (function () {
	        gerenciadorEnquete.exibirAguarndadoEnquetes();
	    });
	},
	
	/**
	 * pega o container de formulários
	 */
	containerFormulario : function() {
	    if (gerenciadorEnquete._formDocument === {}) {
	        trace('gerenciadorEnquete.containerFormulario : documento não definido');
	        return {};
	    }
	    
	    return gerenciadorEnquete._formDocument.getElementById('WebCasters_Enquete_ContainerFormulario');
	},
	
	formDocument : function () {
	    return gerenciadorEnquete._formDocument;
	}
	
	
}; // end enquete











/**
 * classe para formulários 
 */
var FormularioEnquete = Type.classCreate();
FormularioEnquete.prototype = {
	initialize: function(CodFormularioTransmissao, CodUsuario) {
		
		this.codFormularioTransmissao = CodFormularioTransmissao;
		this.codUsuario = CodUsuario;
		
		
		this.listaPerguntas = [];
		this.formularioTransmissao = {};
		this.formulario = {};
		
		this._carregarDados();
		
	},
	
	
	/**
	 * consulta os dados do formulário e monta a estrutura
	 */
	_carregarDados: function() {
		// consulta fomulario transmissao;
		var dt = verificaSessao(
			WCAjax.FormularioTransmissaoBuscaPorCodigo(this.codFormularioTransmissao) );
		
		if (dt == null || dt.rows.length != 1) {
			trace('[ERROR] FormularioEnquete._carregarDados : formularioTransmissao not loaded');
			this._criarLinha("").innerHTML = "N&atilde;o foi possivel carregar o formulario.";
			return false;
		}
		
		this.formularioTransmissao = dt.rows[0];
		
		// consulta o formulario
		dt = null;
		dt = verificaSessao(
			WCAjax.EnqueteBuscaPorCodigo(this.formularioTransmissao.CodFormulario) );
		
		if (dt == null || dt.rows.length != 1) {
			trace('[ERROR] FormularioEnquete._carregarDados : Formulario not loaded');
			//this._criarLinha("").innerHTML = "N&atilde;o foi possivel carregar o formulario.";
			return false;
		}
		
		this.formulario = dt.rows[0];
		
		
		// zera a lista de perguntas
		this.listaPerguntas = [];
		
		return true;
		
		
	},
	
	
	
	
	
	
	// chamar ao obter instrução de exibir formulário
	exibir: function () {
		this._inicializaContainer();
		
		// verifica se o usuário já respondeu
		var usuarioRespondeu =  verificaSessao(
			WCAjax.FormularioTransmissaoUsuarioRespondeu(this.formularioTransmissao.Codigo
			, this.codUsuario) );
		
		if (usuarioRespondeu == true) {
			
			trace('[INFO] FormularioEnquete.continuarAbertura : user already answered formularioTransmissao '+this.formularioTransmissao.Codigo);
			
			this._exibirResultado();
			return;
		}
		
		
		// exibe o fomulário
		this._criarLinha("WebCasters_Enquete_Titulo").innerHTML
			= this.formulario.Nome;
		
		var perguntas = verificaSessao(WCAjax.ListaPerguntasPorFormulario(this.formulario.Codigo));
		this.listaPerguntas = [];
		
		// cria as perguntas
		trace('[INFO] FormularioEnquete.continuarAbertura : there is '+perguntas.rows.length+' perguntas');
		for (var i=0; i < perguntas.rows.length; i++) {
			this._montaPergunta(perguntas.rows[i]);
		}
		
		
		
		var linhaBotoes = this._criarLinha("WebCasters_Enquete_LinhaBotoes");
		
		
		// cria o botão de fechar
		
		var botaoFechar = gerenciadorEnquete.containerFormulario().ownerDocument.createElement("input");
		botaoFechar.type = "button";
        botaoFechar.className = "WebCasters_Enquete_BotaoFechar";
        botaoFechar.value = "Fechar";
        
        linhaBotoes.appendChild(botaoFechar);
        
		
		// cria o botão de enviar		
		
		var botaoEnviar = gerenciadorEnquete.containerFormulario().ownerDocument.createElement("input");
		botaoEnviar.type = "button";
        botaoEnviar.className = "WebCasters_Enquete_BotaoEnviar";
        botaoEnviar.value = "Enviar";
        
        linhaBotoes.appendChild(botaoEnviar);
		
		
		var enqueteAtual = this;
		simpleAddEvent(botaoEnviar, 'click', function() {enqueteAtual.responder();} );
		simpleAddEvent(botaoFechar, 'click', function() {enqueteAtual._eliminaContainer();} );
		
		trace('[INFO] FormularioEnquete.continuarAbertura : finished');
	},
	
	
	
	// verifica se a área de enquetes existe
	_areaAtiva : function () {
	    var container = gerenciadorEnquete.containerFormulario();
	    return container !== {};
	},
	
	
	// monta o identificador do formulário atual
	_myId : function() {
	    return "WebCasters_Formulario_" + this.codFormularioTransmissao;
	},
    
    
    // monta/limpa o container da enquete atual
	_inicializaContainer: function () {
	    var myid = this._myId();
	    
	    var c = gerenciadorEnquete.formDocument().getElementById(myid);
	    
	    // se o container já existir, esvazia
	    if (c != null) 
	    {
	        c.innerHTML = "";
	    }
	    else // se o container não existir, cria.
	    {
	        c = gerenciadorEnquete.formDocument().createElement("div");
		    c.id = myid;
		    c.className = "WebCasters_Enquete_Formulario";
		    gerenciadorEnquete.containerFormulario().appendChild(c);
	    }
	},
	
	_eliminaContainer : function () {
	    var myid = this._myId();
	    
	    var c = gerenciadorEnquete.formDocument().getElementById(myid);
	    
	    gerenciadorEnquete.containerFormulario().removeChild(c);
	    
	    indirectRun (function () {
	        gerenciadorEnquete.exibirAguarndadoEnquetes();
	    });
	},
	
	// exibe uma linha no container da enquete atual
	_criarLinha : function (nomeClasseCSS) {
		var myid = this._myId();
		
		var container = gerenciadorEnquete.formDocument().getElementById(myid);
		
		var linhaNova = gerenciadorEnquete.formDocument().createElement("div");
		linhaNova.className = 'WebCasters_Enquete_Linha ' + nomeClasseCSS;
		
		container.appendChild(linhaNova);
		
		return linhaNova;
		
	},
	
	
	
	// monta uma pergunta
	_montaPergunta : function (pergunta) {
		trace("[INFO] FormularioEnquete._montaPergunta : making pergunta "+pergunta.Codigo);
		
		var doc = gerenciadorEnquete.formDocument();
		
		// monta os dados
		var objPergunta = new EnquetePergunta();
		objPergunta.pergunta = pergunta;
		objPergunta.doc = doc;
		
		// mantém a referência na lista de perguntas
		this.listaPerguntas.push(objPergunta);
		
		var prefix = this._myId() + "_";
		
		// monta a parte visual
		
		this._criarLinha("WebCasters_Enquete_Pergunta").innerHTML
				= this.listaPerguntas.length + ') ' + pergunta.TextoPergunta.replace("\n","<br/>");
		
		

		switch(pergunta.LivreUnicaMultipla) 
		{
			case 0: // livre
				var caixaTexto = {};
				
	            if (pergunta.QuantidadeLinhas > 1) {
		            var caixaTexto = doc.createElement("Textarea");
		            caixaTexto.rows = pergunta.QuantidadeLinhas;
	        	} else {
	        		var caixaTexto = doc.createElement("input");
	        		caixaTexto.type = "text";
	        	}
	        	
	        	caixaTexto.className = "WebCasters_Enquete_Pergunta_Livre";
	        	
	        	this._criarLinha("WebCasters_Enquete_Resposta").appendChild(caixaTexto);
	        	objPergunta.objLivre = caixaTexto;
	            
				break;	
			
			case 1: // unica
				var opcoes = verificaSessao(WCAjax.ListaOpcoesPorPergunta(pergunta.Codigo));
				
				if (!opcoes) {
				    trace("[ERRO] FormularioEnquete._montaPergunta : opcoes (unica escolha) invalid ");
				    return;
				}
				
				var nome = prefix + "Unica_" + pergunta.Codigo;
				
				for (var i=0; i<opcoes.rows.length; i++) {
					var op_id = nome + "_" + opcoes.rows[i].Codigo;
					
					this._criarLinha("WebCasters_Enquete_Resposta").innerHTML =
						"<input type='radio' name='"+nome+"' id='"+op_id+"' value='"+opcoes.rows[i].Codigo+"' />"
						+ "<label for='"+op_id+"'>"+opcoes.rows[i].Texto+"</label>";

					objPergunta.listaIdOpcoes.push(op_id);
				}
				
				break;
				
			case 2: // multipla
				var opcoes = verificaSessao(WCAjax.ListaOpcoesPorPergunta(pergunta.Codigo));
				
				if (!opcoes) {
				    trace("[ERRO] FormularioEnquete._montaPergunta : opcoes (multipla escolha) invalid");
				    return;
				}
				
				var nome = prefix + "Multipla_" + pergunta.Codigo;
				
				for (var i=0; i<opcoes.rows.length; i++) {
					var op_id = nome + "_" + opcoes.rows[i].Codigo;
					
					this._criarLinha("WebCasters_Enquete_Resposta").innerHTML =
						"<input type='checkbox' id='"+op_id+"' value='"+opcoes.rows[i].Codigo+"' />"
						+ "<label for='"+op_id+"'>"+opcoes.rows[i].Texto+"</label>";

					objPergunta.listaIdOpcoes.push(op_id);
				}
				
				break;
			
			default:
				trace("[ERROR] FormularioEnquete._montaPergunta : wrong type.");
			
		} // end switch
		
		
	}, // end _montaPergunta
	
	
	
	
	
	
	// vê se foi tudo respondido, grava as respostas e exibe o resultado
	responder : function () {
		trace("[INFO] FormularioEnquete.responder : starting answer for F"+this.formulario.Codigo);
		
		// verifica se tudo foi respondido
		for (var i=0; i<this.listaPerguntas.length; i++) {
			var p = this.listaPerguntas[i];
			
			if (!p.respondida()) {
				alert("Por favor responda a questão "+(i+1));
				
				trace("[INFO] FormularioEnquete.responder : pergunta "+p.pergunta.Codigo+" is unanswered");
				
				return;
			}
			
		}
		
		trace("[INFO] FormularioEnquete.responder : all perguntas is answered");
		
		this._enviarRespostas();
		
		this._exibirResultado();
		
		
	}, // end responder enquete
	
	
	// envia as respostas efetivamente
	_enviarRespostas : function () {
		trace("[INFO] FormularioEnquete._enviarRespostas : starting");
		
		var doc = gerenciadorEnquete.containerFormulario().ownerDocument;
		
		// envia as respostas
		for (var i=0; i<this.listaPerguntas.length; i++) {
			var p = this.listaPerguntas[i];
			
			trace("[INFO] FormularioEnquete._enviarRespostas : sending answer of pergunta "+p.pergunta.Codigo);
			
			// resposta livre
			if (p.pergunta.LivreUnicaMultipla == 0) {
				trace("[INFO] FormularioEnquete._enviarRespostas : WCAjax.FormularioTransmissaoInsereResposta("+this.formularioTransmissao.Codigo+", "+this.codUsuario+", "+p.pergunta.Codigo+", 0, "+p.objLivre.value+");");
				
				verificaSessao(WCAjax.FormularioTransmissaoInsereResposta(
					this.formularioTransmissao.Codigo, 
					this.codUsuario, 
					p.pergunta.Codigo, 
					0, 
					p.objLivre.value));
					
				continue;
			}
			
			// multipla escolha
			// loopa as respostas selecionadas
			for (var c=0; c < p.listaIdOpcoes.length; c++) {
				var op = doc.getElementById(p.listaIdOpcoes[c]);
				
				if (!op.checked) {
					continue;
				}
				
				trace("[INFO] FormularioEnquete._enviarRespostas : WCAjax.FormularioTransmissaoInsereResposta("+this.formularioTransmissao.Codigo+", "+this.codUsuario+", "+p.pergunta.Codigo+", "+op.value+", '');");
				
				// se estiver marcado, grava
				verificaSessao(WCAjax.FormularioTransmissaoInsereResposta(
					this.formularioTransmissao.Codigo, 
					this.codUsuario, 
					p.pergunta.Codigo, 
					op.value, 
					""));
				
				
			} // end loop respostas
			
			
		} // end loop perguntas
		
	}, // end eviar respostas
	
	
	// exibe o resutlado da enquete
	_exibirResultado : function () {
		trace("[INFO] FormularioEnquete._exibirResultado : starting");
		
		if (!this._areaAtiva()) {
			trace("[INFO] FormularioEnquete._exibirResultado : containerEnquete not found");
			
			return;
		}
		
		this._inicializaContainer();
		this._criarLinha("WebCasters_Enquete_Mensagem").innerHTML = "Obrigado, sua resposta foi processada.";

		// se não for para exibir o resultado, para por aqui
		if (!(this.formularioTransmissao.ExibeRespostaUsuario 
			|| this.formularioTransmissao.ExibeRespostaGeral
			|| visualizador.Usuario.SuperUsuario || visualizador.Usuario.Administrador)) {
			
			trace("[INFO] FormularioEnquete._exibirResultado : will not show the result of enquete");
			
			return;
		}
		
		this._criarLinha("WebCasters_Enquete_Mensagem").innerHTML = "Confira o resultado.";
		
		trace("[INFO] FormularioEnquete._exibirResultado : generating for F"+this.formulario.Codigo+"/FT" + this.formularioTransmissao.Codigo);
		
		// se estiver marcado, grava
		this._criarLinha("").innerHTML = verificaSessao(
			WCAjax.FormularioTransmissaoResultado(this.formularioTransmissao.Codigo) );
			
			
		var linhaBotoes = this._criarLinha("WebCasters_Enquete_LinhaBotoes");
		
		// cria o botão de fechar
		
		var botaoFechar = gerenciadorEnquete.containerFormulario().ownerDocument.createElement("input");
		botaoFechar.type = "button";
        botaoFechar.className = "WebCasters_Enquete_BotaoFechar";
        botaoFechar.value = "Fechar";
        
        linhaBotoes.appendChild(botaoFechar);
        
        var botaoVoid = gerenciadorEnquete.containerFormulario().ownerDocument.createElement("input");
        botaoVoid.type = "button";
        botaoVoid.className = "WebCasters_Enquete_BotaoEnviar";
        botaoVoid.value = "void";
        botaoVoid.style.visibility = "hidden";
        
        linhaBotoes.appendChild(botaoVoid);
        
        var enqueteAtual = this;
        simpleAddEvent(botaoFechar, 'click', function() {enqueteAtual._eliminaContainer();} );
        
			
	}
	
};












// classe para referenciar pergunta e objetos de resposta

var EnquetePergunta = Type.classCreate();

EnquetePergunta.prototype = {
	
	// construtor
	initialize : function() {
		this.pergunta = {};
		
		// referência ao objeto HTML de resposta "texto livre"
		this.objLivre = {};	
		
		// documento onde se encontram o formulário
		this.doc = {};
		
		// lista de opções
		this.listaIdOpcoes = [];
		
		
	},
	
	
	// diz se a pergunta doi respondida ou não
	respondida : function () {
		switch(this.pergunta.LivreUnicaMultipla) 
		{
			case 0: // livre
				return this.objLivre.value != "";
				break;
				
			case 1: //unica
			case 2: //multipla escolha
				trace('opt.length: ' + this.listaIdOpcoes.length);
				for (var i=0; i < this.listaIdOpcoes.length; i++) {
					var p = this.doc.getElementById(this.listaIdOpcoes[i]);
					if (p.checked) {
						return true;
					}
				}
				return false;
				
			default:
				return false;
		}
		
	}
	
	
};
