Source: index.js

/*!
* 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;
}