<commit_before>/* global Nando, unescape */

(function() {

	function inicia() {

		iniciaLibro()
			.then( pideLista )
			.then( pideCategorias )
			.then( adicionaCategoriasADatalistDeCategorias )
			.then( pideEbooks )
			.then( adicionaCategoriasADatalistDeEbooks )
			.then( muestraLibros )
			.catch( error => console.error( error ))

		inicializaEventHandlers()
	}
	
	/**
	 * Pide al modulo Red la lista de libros en la biblioteca del usuario
	 * @author Nando
	 * @returns {Promise<object>} El objeto con la informacion del servidor
	 */
	function pideLista() {

		return Nando.Cargador
			.trae( 'Red' )
			.then( R => R.traeJson( 'lista' ))
			.catch( error => console.error( error ))
	}

	/**
	 * Pide las categorias a las que pertenecen los libros recibidos
	 * @author Nando
	 * @param   {Array} lista La lista la enviamos al modulo Libro para que la guarde
	 * @returns {Array} Contiene solo los nombres de las categorias
	 */
	function pideCategorias( lista ) {

		return Nando.Libro.guarda( lista ).categorias
	}

	function iniciaLibro() {

		return Nando.Cargador
			.trae( 'Libro' )
			.then( L => L.inicia())
	}
	
	/**
	 * La informacion para el datalist que usa el usuario al momento de dar una categoria a un libro
	 * se alimenta de la lista de categorias suministrada. Quitamos 'Leyendo' y 'Sin leer' porque no
	 * son categorias como tal sino ayudantes para los libros sin categoria
	 * @author Nando
	 * @param   {Array}              categorias La lista de categorias
	 * @returns {Promise<undefined>} No devolvemos nada en la promesa
	 */
	function adicionaCategoriasADatalistDeCategorias( categorias ) {
		const categoriasFiltradas = categorias.filter( categoria => /Leyendo|Sin leer/.test( categoria ) === false )

		return Nando.Cargador
			.trae( 'Elementos' )
			.then( E => E.creaOptionsPara( E.damePorId( 'CategoriaEbookList' ), categoriasFiltradas ))
			.catch( error => console.log( error ))
	}
	
	/**
	 * Pedimos al modulo Elementos que cree la lista con los libros para que el usuario comience a leer
	 * alguno
	 * @author Nando
	 * @returns {promise}
	 */
	function muestraLibros() {

		return Promise.resolve( Nando.Libro.categoriasConLibros )
			.then( categorias => Nando.Elementos.creaListaLibros( categorias, Nando.Elementos.dame( 'section' )))
	}
	
	/**
	 * Inicializa los event handlers para los elementos que contienen links y/o botones
	 * @author Nando
	 * @returns {Promise} [[Description]]
	 */
	function inicializaEventHandlers() {

		return Nando.Cargador.trae( 'Elementos' ).then( function( E ) {

			return Promise.all([
				E.dame( 'section' ),
				E.dame( 'aside' ),
				E.damePorId( 'CategoriaEbook' ),
				E.damePorId( 'BuscarEbook' ),
			])
		}).then( function([ $section, $aside, $inputCategoria, $inputBuscar ]) {

			$section.addEventListener( 'click', _clickEnSectionLibros )
			$aside.addEventListener( 'click', _clickEnMenu )
			$inputCategoria.addEventListener( 'change', _changeInputCategoria )
			$inputBuscar.addEventListener( 'change', _changeBuscarEbook )
		})
	}
	
	/**
	 * Cuando hacemos click en un link de un libro lo traemos, mostramos en el pdfjs y anunciamos
	 * el cambio de estado de todos los elementos del UI
	 * Cuando hacemos click en 'Recomiendame un libro al azar, busca en la lista de libros Sin leer
	 * para que la persona lea uno que no haya contemplado
	 * @private
	 * @author Nando
	 * @param {object} e Event
	 */
	function _clickEnSectionLibros( e ) {
		e.preventDefault()
		
		let dataset = e.target.dataset
		
		if ( 'id' in dataset ) {
			
			if ( dataset.id == 'azar' ) {
				let ebook = Nando.Libro.traeLibroAlAzarDe( 'Sin leer' )
				
				_changeBuscarEbook.bind({ value: ebook })()
			}
			
			return
		}

		if ( !e.target.pathname ) return

		Nando.Cargador.trae( 'Red' )
			.then( R => R.traeJson( 'book', `info=${ e.target.pathname }` ))
			.then( infoLibro => Nando.Libro.extraeDetallesDe( infoLibro, unescape( e.target.pathname )))
			.then( detalleLibro => Nando.Elementos.muestraLibro( detalleLibro, Nando.Elementos.damePorId( 'iframe' )))
			.then( () => Nando.Cargador.trae( 'Estados' ))
			.then( E => {
				let detalle = Nando.Libro.detalleLibro

				if ( detalle.leyendo ) E.cambiaA( E.LEYENDO )
				else E.cambiaA( E.LIBRO )
			})
	}
	
	function _clickEnMenu( e ) {

		if ( !e.target.id ) return

		switch( e.target.id ) {
			case 'CloseEbook':<commit_msg>Adicione un return que faltaba<commit_after>/* global Nando, unescape */

(function() {

	function inicia() {

		iniciaLibro()
			.then( pideLista )
			.then( pideCategorias )
			.then( adicionaCategoriasADatalistDeCategorias )
			.then( pideEbooks )
			.then( adicionaCategoriasADatalistDeEbooks )
			.then( muestraLibros )
			.catch( error => console.error( error ))

		inicializaEventHandlers()
	}
	
	/**
	 * Pide al modulo Red la lista de libros en la biblioteca del usuario
	 * @author Nando
	 * @returns {Promise<object>} El objeto con la informacion del servidor
	 */
	function pideLista() {

		return Nando.Cargador
			.trae( 'Red' )
			.then( R => R.traeJson( 'lista' ))
			.catch( error => console.error( error ))
	}

	/**
	 * Pide las categorias a las que pertenecen los libros recibidos
	 * @author Nando
	 * @param   {Array} lista La lista la enviamos al modulo Libro para que la guarde
	 * @returns {Array} Contiene solo los nombres de las categorias
	 */
	function pideCategorias( lista ) {

		return Nando.Libro.guarda( lista ).categorias
	}

	function iniciaLibro() {

		return Nando.Cargador
			.trae( 'Libro' )
			.then( L => L.inicia())
	}
	
	/**
	 * La informacion para el datalist que usa el usuario al momento de dar una categoria a un libro
	 * se alimenta de la lista de categorias suministrada. Quitamos 'Leyendo' y 'Sin leer' porque no
	 * son categorias como tal sino ayudantes para los libros sin categoria
	 * @author Nando
	 * @param   {Array}              categorias La lista de categorias
	 * @returns {Promise<undefined>} No devolvemos nada en la promesa
	 */
	function adicionaCategoriasADatalistDeCategorias( categorias ) {
		const categoriasFiltradas = categorias.filter( categoria => /Leyendo|Sin leer/.test( categoria ) === false )

		return Nando.Cargador
			.trae( 'Elementos' )
			.then( E => E.creaOptionsPara( E.damePorId( 'CategoriaEbookList' ), categoriasFiltradas ))
			.catch( error => console.log( error ))
	}
	
	/**
	 * Pedimos al modulo Elementos que cree la lista con los libros para que el usuario comience a leer
	 * alguno
	 * @author Nando
	 * @returns {promise}
	 */
	function muestraLibros() {

		return Promise.resolve( Nando.Libro.categoriasConLibros )
			.then( categorias => Nando.Elementos.creaListaLibros( categorias, Nando.Elementos.dame( 'section' )))
	}
	
	/**
	 * Inicializa los event handlers para los elementos que contienen links y/o botones
	 * @author Nando
	 * @returns {Promise} [[Description]]
	 */
	function inicializaEventHandlers() {

		return Nando.Cargador.trae( 'Elementos' ).then( function( E ) {

			return Promise.all([
				E.dame( 'section' ),
				E.dame( 'aside' ),
				E.damePorId( 'CategoriaEbook' ),
				E.damePorId( 'BuscarEbook' ),
			])
		}).then( function([ $section, $aside, $inputCategoria, $inputBuscar ]) {

			$section.addEventListener( 'click', _clickEnSectionLibros )
			$aside.addEventListener( 'click', _clickEnMenu )
			$inputCategoria.addEventListener( 'change', _changeInputCategoria )
			$inputBuscar.addEventListener( 'change', _changeBuscarEbook )
		})
	}
	
	/**
	 * Cuando hacemos click en un link de un libro lo traemos, mostramos en el pdfjs y anunciamos
	 * el cambio de estado de todos los elementos del UI
	 * Cuando hacemos click en 'Recomiendame un libro al azar, busca en la lista de libros Sin leer
	 * para que la persona lea uno que no haya contemplado
	 * @private
	 * @author Nando
	 * @param {object} e Event
	 */
	function _clickEnSectionLibros( e ) {
		e.preventDefault()
		
		let dataset = e.target.dataset
		
		if ( 'id' in dataset ) {
			
			if ( dataset.id == 'azar' ) {
				let ebook = Nando.Libro.traeLibroAlAzarDe( 'Sin leer' )
				
				return _changeBuscarEbook.bind({ value: ebook })()
			}
			
			return
		}

		if ( !e.target.pathname ) return

		Nando.Cargador.trae( 'Red' )
			.then( R => R.traeJson( 'book', `info=${ e.target.pathname }` ))
			.then( infoLibro => Nando.Libro.extraeDetallesDe( infoLibro, unescape( e.target.pathname )))
			.then( detalleLibro => Nando.Elementos.muestraLibro( detalleLibro, Nando.Elementos.damePorId( 'iframe' )))
			.then( () => Nando.Cargador.trae( 'Estados' ))
			.then( E => {
				let detalle = Nando.Libro.detalleLibro

				if ( detalle.leyendo ) E.cambiaA( E.LEYENDO )
				else E.cambiaA( E.LIBRO )
			})
	}
	
	function _clickEnMenu( e ) {

		if ( !e.target.id ) return

		switch( e.target.id ) {
			case 'CloseEbook':
{'fraction_non_alphanumeric': 0.11815693430656934, 'fraction_numerical': 0.0, 'mean_word_length': 3.388888888888889, 'pattern_counts': {'":': 0, '<': 7, '<?xml version=': 0, '>': 33, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4209233', 'n_tokens_mistral': 3436, 'n_tokens_neox': 3087, 'n_words': 842}