Skip to content
Snippets Groups Projects
functions.js 5.89 KiB
Newer Older
  • Learn to ignore specific revisions
  • let slideNumber = 0;
    
    
    Silas Meister's avatar
    Silas Meister committed
    const newsImageSources = ['../img/nasa_news_1.jpg', '../img/nasa_news_2.jpg', '../img/nasa_news_3.jpg'];
    
    const newsTitles = ['Space Station', 'Earth', 'NASA Goddard'];
    const newsSubtitles = ['Expedition 48 Crew Lands Safely on Earth', 'NASA Announces Summer 2023 Hottest on Record', 'NASA\'s Webb Snaps Supersonic Outflow of Young Star'];
    
    
    Silas Meister's avatar
    Silas Meister committed
    document.addEventListener("DOMContentLoaded", function() {
        onload();
    });
    
    
    function onload() {
        console.log("Page loaded");
    
    
    Silas Meister's avatar
    Silas Meister committed
        handleSearchChanged();
    
        setInterval(slideImage, 30000);
    
    Silas Meister's avatar
    Silas Meister committed
        setHoverForOverlay();
    
    Silas Meister's avatar
    Silas Meister committed
    function handleSearchChanged() {
        const searchForm = document.forms['search-form'];
        const searchInput = searchForm.elements['search-input'];
    
        searchInput.addEventListener("input", onInputChanged);
    }
    
    async function onInputChanged(event) {
    
        const searchWord = event.target.value;
    
    Silas Meister's avatar
    Silas Meister committed
    
    
        const json = await fetchNews(searchWord);
    
    Silas Meister's avatar
    Silas Meister committed
    
        if (json === undefined)
            return;
    
    
        displaySearchResults(json, searchWord);
    
    Silas Meister's avatar
    Silas Meister committed
    }
    
    function fetchNews(searchWord) {
        let request = fetch(`NewsFetch.php?searchWord=${searchWord}`)
                        .then((response) => {
                            if (response.status >= 200 && response.status < 300) {
                                return response.json();
                            } else {
                                return Promise.reject("An error occured while fetching the news!");
                            }
                        })
                        .catch((error) => console.error(error));  
                        
        return request;               
    }
    
    
    function displaySearchResults(json, searchWord) {
    
        const searchResults = document.getElementById('search-results');
    
        searchResults.innerText = "";
    
    
        const ul = document.createElement('ul');
    
    
    Silas Meister's avatar
    Silas Meister committed
        json.forEach((news) => {
    
            const li = createNewsChild(news, searchWord);
    
            ul.appendChild(li);
    
    Silas Meister's avatar
    Silas Meister committed
        });
    
        searchResults.appendChild(ul);
    
    
        const display = json.length === 0 ? "none" : "block";;
        searchResults.style.display = display;
    }
    
    
    function createNewsChild(news, searchWord) {
        const title = news['title'];
        const id = news['id'];
    
    
        const li = document.createElement('li');
    
        const a = createLinkWithHighlightedParts(title, searchWord)
    
        const hrefAttr = document.createAttribute('href');
    
        hrefAttr.value = 'NewsArticle.php?articleId=' + encodeURIComponent(id);
    
    
        a.setAttributeNode(hrefAttr);
    
        li.appendChild(a);
    
        return li;
    
    Silas Meister's avatar
    Silas Meister committed
    }
    
    
    function createLinkWithHighlightedParts(title, searchWord) {
        const a = document.createElement('a');
    
        const indices = [...title.toLowerCase().matchAll(new RegExp(searchWord, 'gi'))].map((a) => a.index).sort((a, b) => b-a);
        const length = searchWord.length;
        const separator = '*';
    
        for (const index of indices) {
            title = title.substr(0, index) + separator + title.substr(index, length) + separator + title.substr(index + length);
        }
    
        const separatedBySearchWord = title.split(separator);
        const nodes = separatedBySearchWord.map((element) => {
            if (element.toLowerCase() === searchWord.toLowerCase())
                return createSpanNode(element);
            else
                return createTextNode(element);
        })
    
        a.append(...nodes);   
    
        return a;
    }
    
    function createSpanNode(text) {
        const span = document.createElement('span');
    
        const textNode = createTextNode(text);
        span.appendChild(textNode);
    
        const classAttribute = document.createAttribute('class');
        classAttribute.value = 'highlight';
    
        span.setAttributeNode(classAttribute);
    
        return span;
    }
    
    function createTextNode(text) {
        const textNode = document.createTextNode(text);
    
        return textNode;
    }
    
    
    function slideImage() {
        slideNumber = (slideNumber + 1) % 3;
    
        const slideImage = document.getElementById('slide-image');
    
        const slideContainer = document.getElementById('slide-container');
        const slideTitle = slideContainer.children[0];
        const slideSubtitle = slideContainer.children[1];
        
        let newsImageSource = newsImageSources[slideNumber];
        let newsTitle = newsTitles[slideNumber];
        let newsSubtitle = newsSubtitles[slideNumber];
    
        slideImage.src = newsImageSource;
        slideTitle.textContent = newsTitle;
        slideSubtitle.textContent = newsSubtitle;
    
    Silas Meister's avatar
    Silas Meister committed
    }
    
    function setHoverForOverlay() {
    
    Silas Meister's avatar
    Silas Meister committed
        document.querySelectorAll('.overlay > .overlay-description').forEach(function(element) {
            element.addEventListener("mouseover", function() { hover(this, true); });
            element.addEventListener("mouseout", function() { hover(this, false); });
        });
    
    Silas Meister's avatar
    Silas Meister committed
    function hover(element, hoverActivated) {
        console.log(element);
    
    Silas Meister's avatar
    Silas Meister committed
        let height = "";
    
        if (hoverActivated)
            height = "100%";
        else
            height = "auto";
    
    
    Silas Meister's avatar
    Silas Meister committed
        element.parentElement.style.height = height;
    
    }
    
    // Example Code using XMLHttpRequest
    
    /*let request = new XMLHttpRequest();
    
    function pollData() {
        "use strict";
        requestData();
        window.setInterval(requestData, 5000);
    }
    
    function requestData() { // fordert die Daten asynchron an
        "use strict";
        let gameId = document.getElementById("gameId").value;
        request.open("GET", "Exam21API.php?gameId="+gameId);
        request.onreadystatechange = processData;
        request.send(null);
    
        
        request.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
    
        request.onreadystatechange = processData;
        request.send("key1="+encodeURI("13")+"&key2="+encodeURI("42"));
    }
    
    function processData() {
        "use strict";
        if (request.readyState === 4) { // Uebertragung = DONE
            if (request.status === 200) { // HTTP-Status = OK
                if (request.responseText != null)
                    updateView(request.responseText); // Daten verarbeiten
                else console.error("Dokument ist leer");
            } else console.error("Uebertragung fehlgeschlagen");
        } // else; // Uebertragung laeuft noch
    }
    
    function updateView(data) {
        "use strict";
        console.log(data);
        let dataObject = JSON.parse(data);
    }*/