/*!
* Examlist index.js
*
* Copyright 2016 Implemental Systems S.L.
* Released under the MIT license.
* https://opensource.org/licenses/MIT
*
*/
var rootURL = "https://examlist-robertocalvouoc.rhcloud.com/rest/";
//var rootURL = "http://localhost:8080/examlist/rest/";
var examenes;
var examen;
var idUsuario = 0;
var token = "";
var perfil = "";
$.ajaxSetup({ cache: false });
$("#txt-usuario").val(window.localStorage.getItem("usuario"));
$("#txt-password").val(window.localStorage.getItem("password"));
if(window.localStorage.getItem("recordarme")==='S') {
$("#chck-rememberme").prop('checked', true);
}
document.addEventListener("deviceready", function(){init();});
function init() {
/*
if(!idUsuario || !token){
window.location.href = "#login-page";
} else {
window.location.href = "#menu-page";
}
*/
}
document.addEventListener("backbutton", function(e){
if($.mobile.activePage.is('#login-page')){
navigator.app.exitApp();
} else {
navigator.app.backHistory()
}
}, false);
/** Función que muestra el gif animado de 'Cargando' */
function mostrarSpinner() {
$.mobile.loading( 'show', {
text: "Cargando",
textVisible: true,
theme: "a",
textonly: false,
html: ""
});
}
/** Función que oculta el gif animado de 'Cargando' */
function ocultarSpinner() {
$.mobile.loading( "hide" );
}
/** Evento lanzado al pulsar el botón de acceder de la
* pantalla de login.
* Lanza una petición Ajax, al web-services que valida
* el usuario y contraseña.
* Si la petición es correcta muestra la pantalla de menu.
* Si se produce un error, muestra un mensaje indicativo
* @event Click en botón 'Acceder'
*/
$("#btn-acceder").click( function( event, ui) {
event.preventDefault();
clickBotonAcceder();
} );
/** Función que realiza la llamada Ajax a un web-services
* para comprobar si la combinación de usuario y contraseña
* introducida es correcta.
* Si la petición es correcta muestra la pantalla de menu.
* Si se produce un error, muestra un mensaje indicativo
* @listens Click en botón 'Acceder'
*/
function clickBotonAcceder() {
if(validarLogin()) {
mostrarSpinner();
$.ajax({
url:rootURL + 'usuario/login/'+$("#txt-usuario").val()+"/"+$("#txt-password").val(),
type: 'GET',
dataType: 'json',
error : function (){
ocultarSpinner();
toast("Error en la conexión.");},
success: function (data) {
responseLogin = data.respuesta;
ocultarSpinner();
if(data.codigoRespuesta==="OK") {
idUsuario = responseLogin.idUsuario;
token = responseLogin.token;
perfil = responseLogin.perfil;
recordarme();
if(perfil==="A") {
window.location.href = "#menu-page";
} else if(perfil==="P") {
mostrarListaExamenes();
} else {
goLogin();
}
} else {
toast(data.mensajeRespuesta);
}
}
});
}
}
/** Función que comprueba que los campos de la pantalla de login estén rellenos */
function validarLogin() {
if(!$("#txt-usuario").val()) {
$("#lit-usuario").addClass('ex-lit-error');
$("#txt-usuario").addClass('ex-txt-error');
}else {
$("#lit-usuario").removeClass('ex-lit-error');
$("#txt-usuario").removeClass('ex-txt-error');
}
if(!$("#txt-password").val()) {
$("#lit-password").addClass('ex-lit-error');
$("#txt-password").addClass('ex-txt-error');
}else{
$("#lit-password").removeClass('ex-lit-error');
$("#txt-password").removeClass('ex-txt-error');
}
if(!$("#txt-usuario").val() || !$("#txt-password").val()){
toast("Introduzca usuario y contraseña.");
return false;
}
return true;
}
/** Función que almacena el login de usuario si se ha seleccionado el checkbox de 'recuerdame' */
function recordarme(){
if($("#chck-rememberme").is(":checked")) {
window.localStorage.setItem("usuario", $("#txt-usuario").val());
window.localStorage.setItem("password", $("#txt-password").val());
window.localStorage.setItem("recordarme", 'S');
} else {
$("#txt-usuario").val('');
$("#txt-password").val('');
window.localStorage.setItem("usuario", '');
window.localStorage.setItem("password", '');
window.localStorage.setItem("recordarme", '');
}
}
/** Función que realiza un logout */
function logout() {
mostrarSpinner();
var stServerTime = getServerTime();
var serviceURL = 'usuario/logout';
$.ajax({
url:rootURL + serviceURL,
type: 'GET',
dataType: 'json',
headers: { "X-date":stServerTime,
"X-user": idUsuario,
"X-auth": getAuth(serviceURL, stServerTime)},
error : function (){
ocultarSpinner();
toast("Error en la conexión");},
success: function (data) {
ocultarSpinner();
goLogin();
}
});
}
/** Evento lanzado al pulsar el botón de 'Próximos exámenes'.
* Lanza una petición Ajax, al web-services que devuelve
* los próximos exámenes del usuario.
* Si la petición es correcta rellena la lista de los exámenes.
* Si se produce un error, muestra un mensaje indicativo
* @event Click en botón 'Próximos exámenes'
*/
$("#btn-next-exams").click( function( event, ui) {
mostrarListaExamenes();
} );
/** Función que muestra la lista de exámenes para el usuario
* @listens Click en botón 'Próximos exámenes'
*/
function mostrarListaExamenes() {
mostrarSpinner();
var stServerTime = getServerTime();
var serviceURL = 'examen/usuario';
$.ajax({
url: rootURL + serviceURL,
type: 'GET',
dataType: 'json',
headers: { "X-date":stServerTime,
"X-user": idUsuario,
"X-auth": getAuth(serviceURL, stServerTime)},
error : function (){
ocultarSpinner();
toast("Error en la conexión."); },
success: function (data) {
if(data.codigoRespuesta === "OK"){
$('#next-exams-page ul li').remove();
examenes = data.respuesta;
$.each(examenes, function(index, examen) {
$('#next-exams-page ul').append('<li id="'+ examen.idExamen +'"><a href="#">'+examen.asignatura+ '<p class="ui-date-time">'+ examen.fecha + ' ' + examen.horaInicio + '</p></a></li>');
});
ocultarSpinner();
if(examenes.length == 0) {
window.location.href = "#no-data-page";
} else {
window.location.href = "#next-exams-page";
$("#next-exams-page ul").listview("refresh");
}
} else{
errorRespuesta(data);
}
}
});
}
/** Evento lanzado al pulsar un elemento de la lista
* de los próximos exámenes.
* Lanza una petición Ajax, al web-services que devuelve
* los detalles de un exámen.
* Si la petición es correcta rellena la lista de los exámenes.
* Si se produce un error, muestra un mensaje indicativo
* @event Click en elemento 'Examen'
*/
$("#next-exams-page").on('click', 'li', function( event, ui) {
mostrarSpinner();
var idExamen = $(this).attr('id');
mostrarDetalleExamen(idExamen);
} );
/** Función que muestra el detalle de un examen
* @listens Click en elemento 'Examen'
*/
function mostrarDetalleExamen(idExamen) {
var stServerTime = getServerTime();
var serviceURL = 'examen/usuario/'+idExamen;
$.ajax({
url:rootURL + serviceURL,
type: 'GET',
dataType: 'json',
headers: { "X-date":stServerTime,
"X-user": idUsuario,
"X-auth": getAuth(serviceURL, stServerTime)},
error : function (){
ocultarSpinner();
toast("Error en la conexión.");},
success: function (data) {
if(data.codigoRespuesta === "OK"){
examen = data.respuesta;
$("#exam-name").text(examen.asignatura);
$("#sp-exam-date").text(examen.fecha);
$("#sp-exam-time").text(examen.horaInicio);
$("#sp-exam-place").text(examen.edificio + " " + examen.localizacion);
$("#sp-exam-address").text(examen.direccion);
$("#sp-exam-remarks").text(examen.observaciones);
ocultarSpinner();
window.location.href = "#exam-detail";
} else{
errorRespuesta(data);
}
}
});
}
/** Evento lanzado al pulsar el botón de 'Mapa'
* @event Click en botón 'Mapa'
*/
$(document).on('click', '#map-link', function(event, ui){
event.preventDefault();
$('#map-canvas').empty();
$("#map-title").text(examen.edificio + "-" + examen.localizacion);
window.location.href = "#map-page";
});
/** Evento lanzado al cargar la pantalla del mapa
* @event Cambio de orientación
*/
$(document).on('pageshow', '#map-page', function (event, data) {
mostrarMapa();
});
/** Función que muestra el mapa con la localización
* del examen.
* @listens Click en botón 'Mapa'
* @listens Cambio de orientación
*/
function mostrarMapa(){
//var defaultLatLng = new google.maps.LatLng(40.3234567, -3.6696545);
$('#map-canvas').height(getMapCanvasHeight());
var defaultLatLng = new google.maps.LatLng(examen.coordenadasLugar.latitud, examen.coordenadasLugar.longitud);
setTimeout(drawMap(defaultLatLng),100);
function drawMap(latlng) {
var myOptions = {
zoom: 19,
center: latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById("map-canvas"), myOptions);
// Add an overlay to the map of current lat/lng
var marker = new google.maps.Marker({
position: latlng,
map: map,
title: "Greetings!"
});
}
}
/** Evento lanzado al cambiar la orientación del dispositivo
* Si muestra la pantalla del mapa, la recargamos.
* @event Cambio de orientación
*/
$( window ).on( "orientationchange", function( event ) {
//window.location.href = "#map-page";
if(window.location.href.indexOf("#map-page") >= 0){
mostrarMapa();
}
});
/** Función encargada de calcular la altura del canvas para el mapa */
function getMapCanvasHeight() {
var header = $.mobile.activePage.find("div[data-role='header']:visible");
var footer = $.mobile.activePage.find("div[data-role='footer']:visible");
var map_canvas = $.mobile.activePage.find("div[id='map-canvas']:visible:visible");
var viewport_height = $(window).height();
var map_canvas_height = viewport_height - header.outerHeight() - footer.outerHeight();
if((map_canvas.outerHeight() - header.outerHeight() - footer.outerHeight()) <= viewport_height) {
map_canvas_height -= (map_canvas.outerHeight() - map_canvas.height());
}
return map_canvas_height;
}
/** Evento lanzado al pulsar el botón de 'Calificaciones'
* Lanza una petición Ajax, al web-services que devuelve
* las calificaciones de los últimos exámenes.
* Si la petición es correcta rellena la lista de los exámenes.
* Si se produce un error, muestra un mensaje indicativo
* @event Click en botón 'Calificaciones'
*/
$("#btn-califications").click( function( event, ui) {
event.preventDefault();
mostarUltimasCalificaciones();
} );
/** Función que muestra las ultimas calificaciones
* @listens Click en botón 'Calificaciones'
*/
function mostarUltimasCalificaciones() {
mostrarSpinner();
var serviceURL = 'examen/alumno/calificaciones';
var stServerTime = getServerTime();
$.ajax({
url: rootURL + serviceURL,
type: 'GET',
dataType: 'json',
headers: { "X-date":stServerTime,
"X-user": idUsuario,
"X-auth": getAuth(serviceURL, stServerTime)},
error : function (){
ocultarSpinner();
toast("Error en la conexión");},
success: function (data) {
ocultarSpinner();
if(data.codigoRespuesta === "OK"){
$('#califications-page ul li').remove();
examenes = data.respuesta;
$.each(examenes, function(index, examen) {
$('#califications-page ul').append('<li id="'+ examen.idExamen +'"><span class="ui-title-left">'+examen.asignatura+ '</span><span style="float:right; font-weight: bold;">'+examen.calificacion+'</span><p class="ui-date-time">'+examen.fecha+'</p></li>');
});
if(examenes.length == 0) {
window.location.href = "#no-data-page";
} else {
window.location.href = "#califications-page";
$("#califications-page ul").listview("refresh");
}
} else{
errorRespuesta(data);
}
}
});
}
/** Función que muestra un mensaje cuando la respuesta del servidor indica error */
function errorRespuesta(data){
if(data.codigoRespuesta ==="403" && (data.mensajeRespuesta.indexOf("Unauthorized")>-1)){
toast("Inicie sesión");
goLogin();
} else {
toast("Error en la conexión");
}
}
/** Función que muestra la pantalla de login */
function goLogin() {
token = "";
idUsuario = 0;
window.location.href = "#login-page";
}
/**
* Mensaje superpuesto
* @constructor
* @param {string} msg - Mensaje que se muestra.
*/
var toast=function(msg){
$("<div class='ui-loader ui-overlay-shadow ui-body-e ui-corner-all' style='opacity:1; background-color:#CCCCCC;'><h3>"+msg+"</h3></div>")
.css({ display: "block",
opacity: 1,
position: "fixed",
padding: "7px",
"text-align": "center",
width: "270px",
left: ($(window).width() - 284)/2,
top: $(window).height()/2 })
.appendTo( $.mobile.pageContainer ).delay( 1500 )
.fadeOut( 400, function(){
$(this).remove();
});
}
/** Función que obtiene la funcion sha256 de un texto.
* @param {string} texto - Texto del que se calcula la función sha256.
*/
function stringSHA256(texto) {
var bitArray = sjcl.hash.sha256.hash(texto);
var digest_sha256 = sjcl.codec.hex.fromBits(bitArray);
return digest_sha256;
}
/** Función que calcula la crea la cadena de seguridad concatenando:
* url + '|' + hora del servidor + '|' + idUsuario + '|' + token
*/
function getAuth(url, serverTime) {
var securityString = url+"|"+serverTime+"|"+idUsuario+"|"+token;
return stringSHA256(securityString);
}
/** Función que obtiene la hora del servidor
* mediante una petición Ajax a un web-service
*/
function getServerTime() {
var serverTime ="";
var serviceURL = 'usuario/time/'
var stTime = $.ajax({
url: rootURL + serviceURL,
type: 'GET',
dataType: 'json',
error : function (){
stTime =""; },
success: function (data) {
serverTime = data.respuesta;
},
async:false
});
return serverTime;
}