﻿var anchoTotalBarraEncuestas = 135; //Ancho máximo en pixeles de la barra que indica el porcentaje de votos


/**************************
PROTOTIPO y ACTUALIZACION DE OBJETOS VISUALES
**************************/

function Encuesta(name, idEncuesta, estado)
{
    this._name = name;      //Id del webpart de encuesta
    this._id = idEncuesta;  //Id del item de la lista de encuestas
    this._estado = estado;  //Estado de la encuesta. 0=Cerrada, 1=Abierta
    this._modoLista = false;
    this._resultadosVisibles = false;
    
    //Ids de cliente de los diferentes controles html
    this._form = name + "_formEncuesta";
    this._resultados = name + "_resultadosEncuesta";
    this._btnVotar = name + "_btnVotarEncuesta";
    this._opciones = name + "_opcionesEncuesta";
    this._totalVotos = name + "_totalVotosEncuesta";
    this._votosOpcion = name + "_votosOpcion";
    this._porcentajeVotosOpcion = name + "_porcentajeVotosOpcion";
    this._porcentajeBarraOpcion = name + "_porcentajeBarraOpcion";
    this._divEncListado = name + "_divEncListado";
    this._cerrarEncuesta = name + "_cerrarEncuesta";
    
        
    //Si no existe el formulario de votacion es porque la encuesta está en modo listado
    if(! $get(this._form) )
      this._modoLista = true; 
      
    
    //Si la encuesta está en modo webpart y está cerrada, mostrar los resultados
    if(!this._modoLista && this._estado == 0)
        this.MostrarResultados();
}

Encuesta.prototype = {
    Votar: function() {
        //Comprobar que se haya seleccionado alguna de las opciones
        if (this.GetValorOpcionSeleccionada() != 0) {
            //Llamado ajax para actualizar la encuesta
            var scope = this;
            Terra.Portal.AjaxServices.EncuestasService.VotarEncuesta(this._id, this.GetValorOpcionSeleccionada(), function(encuestaActualizada) { scope.OnVotar(encuestaActualizada) }, this.OnVotarError);
        }
    },

    OnVotar: function(encuestaActualizada) {
        this.ActualizarResultados(encuestaActualizada);
        this.MostrarResultados();
    },

    OnVotarError: function(error) {
        //alert("Error: " + error.get_message() + " -- " + error.get_stackTrace()); 
        $get('btnVotarEncuesta').disabled = true;
    },

    MostrarOcultarResultados: function() {
        if (this._resultadosVisibles)
            this.OcultarResultados();
        else
            this.MostrarResultados();

    },

    MostrarResultados: function() {

        //Mostrar el div con los resultados
        $get(this._resultados).style.display = "block";     //Mostrar resultados

        //Dependiendo del modo de la encuesta, la funcionalidad cambia
        if (this._modoLista) {
            $get(this._divEncListado).className = "encu select";    //Cambiar la clase css de la pregunta seleccionada
            $get(this._cerrarEncuesta).style.display = "block";     //Mostrar el enlace para cerrar la encuesta
        }
        else {
            $get(this._form).style.display = "none";        //Ocultar formulario
            $get(this._btnVotar).style.display = "none";   //Ocultar botón de votación
        }

        //Cambiar el estado de los resultados
        this._resultadosVisibles = true;

    },

    //Solo es llamado cuando el control está en modo lista
    OcultarResultados: function() {
        $get(this._resultados).style.display = "none";  //Mostrar resultados
        $get(this._divEncListado).className = "encu";   //Cambiar la clase css de la pregunta seleccionada
        $get(this._cerrarEncuesta).style.display = "none";  //Ocultar el enlace para cerrar la encuesta 

        //Cambiar el estado de los resultados
        this._resultadosVisibles = false;
    },

    //Obtiene el value del radioButton seleccionado
    GetValorOpcionSeleccionada: function() {
        var valorOpcionSeleccionada = 0;
        var opciones = document.getElementsByName(this._opciones);
        for (i = 0; i < opciones.length; i++) {
            if (opciones[i].checked) {
                valorOpcionSeleccionada = opciones[i].value;
                break;
            }
        }

        return valorOpcionSeleccionada;
    },

    //Actualiza los resultados de una encuesta. Recibe una entidad Encuesta actualizada
    ActualizarResultados: function(encuestaActualizada) {
        if (this.GetValorOpcionSeleccionada() != 0) {
            //Actualizar el total de votos
            var numTotalVotos = GetTotalVotos(encuestaActualizada);
            var objTotalVotos = $get(this._totalVotos);
            SetObjInnerText(objTotalVotos, numTotalVotos);

            //Actualizar numero de votos y porcentajes de cada opción de respuesta
            for (i = 0; i < encuestaActualizada.votoRespuestas.length; i++) {
                //Actualizar el numero de votos de la opcion actual
                numVotosOpcionActual = encuestaActualizada.votoRespuestas[i];
                var objVotosOpcion = $get(this._votosOpcion + (i + 1));
                if (objVotosOpcion == null) break;
                SetObjInnerText(objVotosOpcion, "" + numVotosOpcionActual);

                //Actualizar el porcentaje de votaciones de la opción actual
                var objPorcentajeVotosOpcion = $get(this._porcentajeVotosOpcion + (i + 1));
                numPorcentajeVotos = parseInt(numVotosOpcionActual / numTotalVotos * 100);
                SetObjInnerText(objPorcentajeVotosOpcion, "" + numPorcentajeVotos + "%");

                //Actualizar barra de porcentaje de la opción actual
                anchoBarra = numPorcentajeVotos * anchoTotalBarraEncuestas / 100;
                var objPorcentajeBarraOpcion = $get(this._porcentajeBarraOpcion + (i + 1));
                objPorcentajeBarraOpcion.width = anchoBarra;
            }
        }

    }
}

/******************
METODOS AUXILIARES
******************/
//Calcula el numero total de votos de una encuesta. Recibe una entidad Encuesta
function GetTotalVotos(encuesta)
{
    var totalVotos = 0;
    for(i=0; i<encuesta.votoRespuestas.length; i++)
    {
        totalVotos += encuesta.votoRespuestas[i];
    }
    
    return totalVotos;
}

//Obtiene el texto de un objeto html. En firefox es textContent, en IE es innerText
function GetObjInnerText(obj)
{
    if(obj.innerText) //IE
        return obj.innerText;
    else if(obj.textContent)    //Firefox
        return obj.textContent;
    
}

//Establece el texto de un objeto html. En firefox es textContent, en IE es innerText
function SetObjInnerText(obj, text)
{
    if(obj.innerText)   //IE
        obj.innerText = text;
    else if(obj.textContent)    //Firefox
        obj.textContent = text;
    
}

if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();