%@ $Language=JScript /* PARA COLORES PHP */ %>
<%
// ---------------------------------------------------------------------------- //
// Modulo multiseccional de encuestas //
// ---------------------------------- //
// Este modulo se encarga del manejo de las encuestas. //
// ( Presentarlas y Capturar los votos ) //
// ---------------------------------------------------------------------------- //
// Definiciones de los posibles tipos de respuestas.
define("RESPUESTA_NORMAL",1);
define("RESPUESTA_ABIERTA",2);
// Definiciones de obtencion de respuestas
define("RTAS_SIN_ORDEN",1);
define("RTAS_ORDEN_VOTO",2);
define("RTAS_ORDEN_PRIORIDAD",3);
define("RTAS_ORDEN_ENCUESTA",4);
class cEncuesta
{
// Clase Encuesta
// Propiedades Generales
var $encID; // ID de la encuesta.
var $secID; // ID de la seccion a la cual corresponde la encuesta.
var $encNombre; // Nombre de la encuesta.
var $encFechaAlta; // Fecha de alta de la encuesta.
var $encFechaFinalizacion; // Fecha de finalizacion de la encuesta.
var $encActiva; // Estado de la encuesta ( 'S'/'N' ).
var $encCantVotos; // Cantidad total de votos en la encuesta.
var $encPublica; // Encuesta Publica? ('S'/'N').
var $cantVotosPorMaquina; // Cantidad de veces que se puede votar desde una maquina
// esto se va a manejar con cookies.
var $cantVotosRealizados; // Cantidad de votos efectuados
var $puedevotar; // Booleano que contiene justamente eso.
// Propiedades de presentacion
var $docBase; // Documento al cual va dirigido el POST del formulario
var $anchotabla; // Ancho de la tabla que contiene la salida.
var $cssTituloEncuesta; // Clase del titulo de la encuesta.
var $cssPregunta; // Clase de la pregunta de la encuesta.
var $cssRespuesta; // Clase de las posibles respuestas a la pregunta.
var $segundosDuracion; // Segundos en los que expira la cookie. Las funciones de seteo permiten mandar parametros como dias, horas, minutos y segundos.
var $imgBaseBarra; // Imagen de fondo de las barras que muestran los porcentajes.
var $colorFondo; // Color de fondo de toda la encuesta.
var $colorBarraPorcentaje; // Color de las barritas cuando no se usa una imagen de fondo.
var $colorFondoOpcionP; // Color que se pone la celda que contiene una opcion para contestar cuando se pasa el mouse por arriba
var $colorFondoOpcionR; // Color que se pone la celda que contiene una opcion para contestar cuando se pasa el mouse por arriba
function cEncuesta($doc="")
{
// ----------------------------------------------------- //
// Constructor : Inicializa las propiedades de la clase. //
// ----------------------------------------------------- //
$this->encID = 0;
$this->secID = 0;
$this->encNombre = "";
$this->encFechaAlta = "";
$this->encFechaFinalizacion = "";
$this->encActiva = "N";
$this->encCantVotos = 0;
$this->cantVotosPorMaquina = 5;
$this->cantVotosRealizados = 0;
$this->docBase = ($doc?$doc:"$PHP_SELF");
$this->imgBaseBarra = "";
$this->anchotabla = 400;
$this->colorBarraPorcentaje = "red";
$this->cssTituloEncuesta = "encuesta";
$this->cssPregunta = "pregunta";
$this->cssRespuesta = "respuesta";
$this->colorFondo = "white";
$this->colorFondoOpcionP = "#F5F5F5";
$this->colorFondoOpcionR = "#FFF4F4";
$this->SetDuracionCookie(0,0,1);
}
function Conectar($id)
{
global $conn;
// ----------------------------------------------------- //
// Conectar : Carga las propiedades de la clase con los //
// datos de la encuesta solicitada. //
// Parametros: //
// - id : ID de la encuesta. //
// ----------------------------------------------------- //
$rsEnc = $conn->execute("select * from encEncuestas where encID = $id and encActiva = 'S'");
if($rsEnc->numrows!=0) // Deberia ser si encontro al id ese.
{
$this->encID = $id;
$this->secID = $rsEnc->field("secID");
$this->encNombre = $rsEnc->field("encNombre");
$this->encFechaAlta = $rsEnc->field("encFechaAlta");
$this->encFechaFinalizacion = $rsEnc->field("encFechaFinalizacion");
$this->encActiva = $rsEnc->field("encActiva");
$this->encCantVotos = $rsEnc->field("encCantVotos");
$this->encPublica = $rsEnc->field("encPublica");
if($_SESSION["usr"]->usrID)
$id = $_SESSION["usr"]->usrID;
else
$id = 0;
if(isset($_COOKIE["votos:$this->encID:$id"]))
{
$this->cantVotosRealizados = $_COOKIE["votos:$this->encID:$id"];
if($this->cantVotosRealizados>=$this->cantVotosPorMaquina)
$this->puedevotar=false;
else
$this->puedevotar=true;
}else $this->puedevotar = true;
}else
{
// Ocurrio algo, porque no se encontro el id.
die("No se encontro la encuesta ");
}
}
function ObtenerListadoPreguntas()
{
// ----------------------------------------------------- //
// ObtenerListadoPreguntas : Retorna un array asociativo //
// con la cantidad de preguntas disponibles y pares //
// del tipo ([ID_PREG],[TITULO_PREG]). //
// ----------------------------------------------------- //
global $conn;
$rsPreguntas = $conn->execute("select * from encPreguntas where encID = $this->encID");
$cantPreg = $rsPreguntas->numrows;
$arrayPreguntas = array();
for($i=0;$i<$cantPreg;$i++)
{
// Insertamos en el array los pares [id_preg],[Nombre]
array_push($arrayPreguntas,
array( "ID" => $rsPreguntas->field("preID") ,
"Pregunta" => $rsPreguntas->field("prePregunta")));
$rsPreguntas->movenext();
}
return array("Cant"=>$cantPreg,"Preguntas"=>$arrayPreguntas);
}
function ObtenerListadoRespuestas($idpregunta,$flagorden=RTAS_SIN_ORDEN)
{
// ----------------------------------------------------- //
// ObtenerListadoPreguntas : Retorna un array asociativo //
// con la cantidad de respuestas disponibles y arrays //
// del tipo ([ID_PREG],[TITULO_PREG],[TIPO_RESP]). //
// Parametros: //
// - idpregunta: El id de la pregunta del cual se quiere //
// obtener las respuestas. //
// ----------------------------------------------------- //
global $conn;
if($idpregunta)
{
switch($flagorden)
{
case RTAS_SIN_ORDEN: $orden = " resID "; break;
case RTAS_ORDEN_VOTO: $orden = " resTotalVotos desc "; break;
case RTAS_ORDEN_PRIORIDAD: $orden = "(resTotalPrioridades/resTotalVotos) asc "; break;
case RTAS_ORDEN_ENCUESTA: $orden = " resTipo, resRespuesta "; break;
}
$rsRespuestas = $conn->execute("select * from encRespuestas where preID = $idpregunta order by $orden ");
$cantRes = $rsRespuestas->numrows;
$arrayRespuestas = array();
$options =0;
for($i=0;$i<$cantRes;$i++)
{
// Insertamos en el array los pares [id_res],[Nombre]
array_push($arrayRespuestas,
array( "ID" => $rsRespuestas->field("resID"),
"Respuesta" => $rsRespuestas->field("resRespuesta"),
"Tipo" => $rsRespuestas->field("resTipo"),
"TotalVotos" => $rsRespuestas->field("resTotalVotos"),
"TotalPrioridades" => $rsRespuestas->field("resTotalPrioridades"))
);
if($rsRespuestas->field("resTipo")!=RESPUESTA_ABIERTA) $options++;
$rsRespuestas->movenext();
}
return array("Cant"=>$cantRes,"CantOptions"=>$options,"Respuestas"=>$arrayRespuestas);
}
}
function ObtenerDatosPregunta($idpregunta)
{
// ----------------------------------------------------- //
// ObtenerDatosPregunta : //
// Devuelve todos los datos sobre la pregunta //
// almacenados en la base de datos. //
// //
// Parametros: //
// - idpregunta : Pregunta a mostrar. //
// ----------------------------------------------------- //
global $conn;
if($idpregunta)
{
$rsEstaPregunta = $conn->execute("select * from encPreguntas where preID = $idpregunta");
if($rsEstaPregunta->numrows!=0)
{
// Preparar el array con los datos
$arrayPregunta = array(
"ID" => $rsEstaPregunta->field("preID"),
"Pregunta" => $rsEstaPregunta->field("prePregunta"),
"Prioridades" => $rsEstaPregunta->field("prePrioridades"),
"MultiplesRespuestas" => $rsEstaPregunta->field("preMultiplesRespuestas"),
"CantRespuestas" => $rsEstaPregunta->field("preCantRespuestas")
);
return $arrayPregunta;
}
}
return false;
}
function Javascript()
{
global $estaenunsubdir;
if($estaenunsubdir)
{
$file = fopen("../includes/encuesta_new.js", "r");
$content = fread($file, filesize("../includes/encuesta_new.js"));
}else
{
$file = fopen("includes/encuesta_new.js", "r");
$content = fread($file, filesize("includes/encuesta_new.js"));
}
$rtn = "";
$rtn .= "\n\n";
return $rtn;
}
function PresentarEncuestaEx($debug=false)
{
// ------------------------------------------------------- //
// PresentarEncuestaEx : Esta funcion presenta toda una //
// encuesta con todas sus preguntas. //
// //
// Parametros: //
// - debug : Para algo, todavia no se me ocurre. //
// ------------------------------------------------------- //
$p = $this->ObtenerListadoPreguntas();
$rtn = "";
$rtn .= "
\n";
return $rtn;
}
function PresentarResultadosEx($ordenar=false,$votos=false,$todosvotos=false,$debug=false)
{
// ----------------------------------------------------- //
// PresentaResultadosEx : //
// Este metodo Presenta encuestas con multiples //
// preguntas. //
// //
// Parametros: //
// - debug : Para algo, todavia no se me ocurre. //
// //
// Nota //
// Esta funcion debe utilizarse despues de haberse //
// conectado con la encuesta para que funcione //
// correctamente. //
// Es para encuestas multipreguntas. //
// ----------------------------------------------------- //
global $conn;
$p = $this->ObtenerListadoPreguntas();
$rtn .= "\n";
$rtn .= " \n";
$rtn .= " | Resultado $this->encNombre | \n";
$rtn .= "
\n";
$rtn .= " |
\n";
for($j=0;$j<$p["Cant"];$j++)
{
// Cada vuelta es una pregunta, asi que habria que mostrar las respuestas correspondientes y, sus
// resultados.
$rtn .= " \n";
$rtn .= " \n";
$rtn .= "\n";
$idpregunta = $p["Preguntas"][$j]["ID"];
$rs = $conn->execute("select count(*) as votos from encVotos where preID = $idpregunta");
$preg = $this->ObtenerDatosPregunta($idpregunta);
$rtn .= " \n";
$rtn .= " | ".$preg["Pregunta"]."".($votos?" ".$rs->field("votos")." votos":"")." | \n";
$rtn .= " \n";
$rtn .= " | \n";
// Obtengo la cantidad todal de votos singulares para la pregunta - para obtener porcentajes.
$totalvotos = $rs->field("votos");
$totalrespuestas = $resp["CantOptions"];
if($preg["MultiplesRespuestas"]=='S')
{
// Analisis si es de opcion multiple.
if($preg["Prioridades"]=='S')
{
$resp = $this->ObtenerListadoRespuestas($idpregunta,($ordenar==true?RTAS_ORDEN_PRIORIDAD:RTAS_SIN_ORDEN));
// Si tiene prioridades me parece que es mas importante ver las prioridades.
for($i=0;$i<$resp["Cant"];$i++)
{
if($resp["Respuestas"][$i]["Tipo"]==RESPUESTA_NORMAL)
{
$rtn .= " \n";
$rtn .= "\n";
if($resp["Respuestas"][$i]["TotalVotos"]==0) $promPrioridad=0;
else $promPrioridad = ($resp["Respuestas"][$i]["TotalPrioridades"]/$resp["Respuestas"][$i]["TotalVotos"]);
if($promPrioridad==0) $porcentaje=0;
else
{
$pendiente = 100 /(1-$resp["CantOptions"]);
$ti = 100 - $pendiente;
$porcentaje = $pendiente*$promPrioridad + $ti;
}
$porcentaje2 = vsprintf("%.2f",$promPrioridad);
$rtn .= "\n";
$rtn .= "| ".$resp["Respuestas"][$i]["Respuesta"]." | \n";
$rtn .= "".($todosvotos?$resp["Respuestas"][$i]["TotalVotos"]." votos - ":"")."Prioridad: $porcentaje2 | \n";
$rtn .= " | \n";
if($this->imgBaseBarra!="")
{ $rtn .= " | \n"; // Aqui el contenido con el color ganador
}else
{ $rtn .= "  | \n"; // Aqui el contenido con el color ganador
}
$rtn .= "\n"; // Aqui el resto.
$rtn .= " | | \n";
$rtn .= " \n";
}
}
}else
{
// Seria importante ver la cantidad de votos.
$resp = $this->ObtenerListadoRespuestas($idpregunta,($ordenar==true?RTAS_ORDEN_VOTO:RTAS_SIN_ORDEN));
for($i=0;$i<$resp["Cant"];$i++)
{
if($resp["Respuestas"][$i]["Tipo"]==RESPUESTA_NORMAL)
{
$rtn .= " \n";
$rtn .= "";
if(!$totalvotos) $porcentaje=0;
else $porcentaje = ($resp["Respuestas"][$i]["TotalVotos"]/$totalvotos)*100;
$porcentaje2 = vsprintf("%.1f",$porcentaje);
$rtn .= "";
$rtn .= "| ".$resp["Respuestas"][$i]["Respuesta"]." | ";
$rtn .= "".($todosvotos?$resp["Respuestas"][$i]["TotalVotos"]." votos - ":"")."$porcentaje2 % | ";
$rtn .= " | \n";
if($this->imgBaseBarra!="")
{
$rtn .= " | \n"; // Aqui el contenido con el color ganador
}else
{
$rtn .= "  | \n"; // Aqui el contenido con el color ganador
}
$rtn .= ""; // Aqui el resto.
$rtn .= " | | \n";
$rtn .= " \n";
}
}
}
}else
{
$resp = $this->ObtenerListadoRespuestas($idpregunta,($ordenar==true?RTAS_ORDEN_VOTO:RTAS_SIN_ORDEN));
for($i=0;$i<$resp["Cant"];$i++)
{
if($resp["Respuestas"][$i]["Tipo"]==RESPUESTA_NORMAL)
{
$rtn .= " \n";
$rtn .= "";
if(!$totalvotos) $porcentaje=0;
else $porcentaje = ($resp["Respuestas"][$i]["TotalVotos"]/$totalvotos)*100;
$porcentaje2 = vsprintf("%.1f",$porcentaje);
$rtn .= "";
$rtn .= "| ".$resp["Respuestas"][$i]["Respuesta"]." | ";
$rtn .= "".($todosvotos?$resp["Respuestas"][$i]["TotalVotos"]." votos - ":"")."$porcentaje2 % | ";
$rtn .= " | \n";
if($this->imgBaseBarra!="")
{
$rtn .= " | \n"; // Aqui el contenido con el color ganador
}else
{
$rtn .= "  | \n"; // Aqui el contenido con el color ganador
}
$rtn .= ""; // Aqui el resto.
$rtn .= " | | \n";
$rtn .= " \n";
}
}
}
$rtn .= " | |
\n";
$rtn .= "| |
\n";
}
$rtn .= "
\n";
return $rtn;
}
function CapturarVotacionEx($debug=false)
{
// ----------------------------------------------------- //
// CapturarVotacionEx : //
// Este metodo captura automaticamente el formulario //
// y lo procesa haciendo las altas necesarias para //
// contabilizar la votacion recien efectuada //
// //
// Parametros: //
// - debug : Para algo, todavia no se me ocurre. //
// //
// Nota //
// Esta funcion debe utilizarse despues de haberse //
// conectado con la encuesta para que funcione //
// correctamente. //
// Es para encuestas multipreguntas. //
// ----------------------------------------------------- //
global $conn;
if(isset($_POST["idenc"])&&isset($_POST["cantpreg"]))
{
//foreach($_POST as $key=>$value) echo "$key=>$value
";
if($this->encPublica=='N')
{
if($_SESSION["usr"]->usrID!=0)
{
// Tomamos el id del usuario para registrar el voto
$usr = $_SESSION["usr"]->usrID;
}else
{
// Redireccionamos sin hacer nada.
header("Location: $this->docBase");
exit();
}
}else $usr = 0;
// Hacemos un bucle para ver las distintas preguntas.
$p = $this->ObtenerListadoPreguntas();
for($j=0;$j<$p["Cant"];$j++)
{
// Cada vuelta de bucle es una pregunta, asi que habria que sacar la pregunta y
// las respuestas de la misma.
$resp = $this->ObtenerListadoRespuestas($p["Preguntas"][$j]["ID"]);
$preg = $this->ObtenerDatosPregunta($p["Preguntas"][$j]["ID"]);
$idpregunta = $preg["ID"];
if($preg["MultiplesRespuestas"]=='S')
{
// Analisis para preguntas con multiples respuestas.
for($i=0;$i<$resp["Cant"];$i++)
{
if($_POST["chk_".$j."_".$i]=='on')
{
$sqlInsertVoto = "insert into encVotos ( resID,preID, votPrioridad, votTextoRespuesta, usrID ) values ";
$sqlInsertVoto .= "(".$_POST["resp_".$j."_".$i].", $idpregunta, ".($_POST["sel_".$j."_".$i]?$_POST["sel_".$j."_".$i]:0).",'".$_POST["respAbierta".$j."_".$i]."',$usr )";
$sqlUpdateRespuesta = "update encRespuestas set resTotalVotos = resTotalVotos + 1, resTotalPrioridades = resTotalPrioridades + ".($_POST["sel_".$j."_".$i]?$_POST["sel_".$j."_".$i]:0)." where resID = ".$_POST["resp_".$j."_".$i];
$conn->execute($sqlInsertVoto);
$conn->execute($sqlUpdateRespuesta);
}
if(isset($_POST["respAbierta".$j."_".$i]))
{
if($_POST["respAbierta".$j."_".$i]!="")
{
// Quiere decir que hay una respuesta abierta aqui.
$sqlInsertVoto = "insert into encVotos ( resID,preID, votPrioridad, votTextoRespuesta,usrID ) values ";
$sqlInsertVoto .= "(".$_POST["resp_".$j."_".$i].", $idpregunta, ".($_POST["sel_".$j."_".$i]?$_POST["sel_".$j."_".$i]:0).",'".$_POST["respAbierta".$j."_".$i]."',$usr )";
$sqlUpdateRespuesta = "update encRespuestas set resTotalVotos = resTotalVotos + 1, resTotalPrioridades = resTotalPrioridades + ".($_POST["sel_".$j."_".$i]?$_POST["sel_".$j."_".$i]:0)." where resID = ".$_POST["resp_".$j."_".$i];
$conn->execute($sqlInsertVoto);
$conn->execute($sqlUpdateRespuesta);
}
}
}
}else
{
// Analisis para preguntas con unica respuesta.
for($i=0;$i<$resp["Cant"];$i++)
{
if(isset($_POST["radio_$i"]))
{
$sqlInsertVoto = "insert into encVotos ( resID,preID, votPrioridad, votTextoRespuesta,usrID ) values ";
$sqlInsertVoto .= "(".$_POST["radio_$i"].", $idpregunta, ".($_POST["sel_".$j."_".$i]?$_POST["sel_".$j."_".$i]:0).",'".$_POST["respAbierta".$j."_".$i]."',$usr )";
$sqlUpdateRespuesta = "update encRespuestas set resTotalVotos = resTotalVotos + 1 where resID = ".$_POST["radio_$i"];
$conn->execute($sqlInsertVoto);
$conn->execute($sqlUpdateRespuesta);
}elseif(isset($_POST["respAbierta".$j."_".$i]))
{
if($_POST["respAbierta".$j."_".$i]!="")
{
// Quiere decir que hay una respuesta abierta aqui.
$sqlInsertVoto = "insert into encVotos ( resID,preID, votPrioridad, votTextoRespuesta,usrID ) values ";
$sqlInsertVoto .= "(".$_POST["resp_".$j."_".$i].", $idpregunta, ".($_POST["sel_".$j."_".$i]?$_POST["sel_".$j."_".$i]:0).",'".$_POST["respAbierta".$j."_".$i]."',$usr )";
$sqlUpdateRespuesta = "update encRespuestas set resTotalVotos = resTotalVotos + 1, resTotalPrioridades = resTotalPrioridades + ".($_POST["sel_".$j."_".$i]?$_POST["sel_".$j."_".$i]:0)." where resID = ".$_POST["resp_".$j."_".$i];
$conn->execute($sqlInsertVoto);
$conn->execute($sqlUpdateRespuesta);
}
}
}
}
}
$conn->execute("update encEncuestas set encCantVotos = encCantVotos + 1 where encID = $this->encID");
// Deberiamos mandar o resetear la cookie de cuantas veces voto.
$this->cantVotosRealizados++;
if($_SESSION["usr"]->usrID)
$id = $_SESSION["usr"]->usrID;
else
$id = 0;
$valor = $this->cantVotosRealizados;
setcookie("votos:$this->encID:$id");
setcookie("votos:$this->encID:$id",$valor,time()+$this->segundosDuracion,"/","$SERVER_NAME");
$redir = "";
if(strrchr($this->docBase,"?"))
$redir = "Location: $this->docBase&vo=1";
else
$redir = "Location: $this->docBase?vo=1";
header($redir);
exit();
}
}
// Metodos Set y Get de las propiedades de la clase.
function SetImagenBarras($imagen) { $this->imgBaseBarras=$imagen; }
function GetImagenBarras() { return $this->imgBaseBarras; }
function SetCssTitulo($clase) { $this->cssTituloEncuesta=$clase; }
function GetCssTitulo() { return $this->cssTituloEncuesta; }
function SetCssPregunta($clase) { $this->cssPregunta=$clase; }
function GetCssPregunta() { return $this->cssPregunta; }
function SetCssRespuesta($clase) { $this->cssRespuesta=$clase; }
function GetCssRespuesta() { return $this->cssRespuesta; }
function SetMaxVotos($votos) { $this->cantVotosPorMaquina = $votos; }
function GetMaxVotos() { return $this->cantVotosPorMaquina; }
function GetVotosRealizados() { return $this->cantVotosRealizados; }
function GetPuedeVotar() { return $this->puedevotar; }
function SetDocBase($docbase) { $this->docBase = $docBase; }
function GetDocBase() { return $this->docBase; }
function SetAnchoTabla($ancho) { $this->anchotabla = $ancho; }
function GetAnchoTabla() { return $this->anchotabla; }
function SetColorBarras($color) { $this->colorBarraPorcentaje = $color; }
function GetColorBarras() { return $this->colorBarraPorcentaje; }
function SetColorFondoOpcionR($color) { $this->colorFondoOpcionR = $color; }
function GetColorFondoOpcionR() { return $this->colorFondoOpcionR; }
function SetColorFondoOpcionP($color) { $this->colorFondoOpcionP = $color; }
function GetColorFondoOpcionP() { return $this->colorFondoOpcionP; }
function GetSegundosDuracion() { return $this->segundosDuracion; }
function SetDuracionCookie($seg,$min=0,$hr=0)
{ $this->segundosDuracion = $seg + $min*60 + $hr*3600; }
}
%>