From aeb1afccbfc5f30e2886a9c43e371868207b7a2d Mon Sep 17 00:00:00 2001 From: Son Nguyen Date: Thu, 23 May 2024 20:10:37 +0700 Subject: [PATCH] Update: Enhanced loading times (#192) --- MovieVerse-Mobile/app/js/LICENSE | 21 - MovieVerse-Mobile/app/js/actor-details.js | 678 ------- MovieVerse-Mobile/app/js/analytics.js | 758 -------- MovieVerse-Mobile/app/js/chat-auxiliary.js | 288 --- MovieVerse-Mobile/app/js/chat.js | 470 ----- MovieVerse-Mobile/app/js/create-account.js | 136 -- MovieVerse-Mobile/app/js/favorites.js | 1949 -------------------- MovieVerse-Mobile/app/js/firebase.js | 50 - MovieVerse-Mobile/app/js/inception.js | 1264 ------------- MovieVerse-Mobile/app/js/index.ejs | 93 - MovieVerse-Mobile/app/js/movie-details.js | 1520 --------------- MovieVerse-Mobile/app/js/movie-match.js | 475 ----- MovieVerse-Mobile/app/js/movie-timeline.js | 506 ----- MovieVerse-Mobile/app/js/notifications.js | 177 -- MovieVerse-Mobile/app/js/quiz.js | 341 ---- MovieVerse-Mobile/app/js/ratings-module.js | 80 - MovieVerse-Mobile/app/js/reset-password.js | 131 -- MovieVerse-Mobile/app/js/root-config.js | 66 - MovieVerse-Mobile/app/js/router.js | 51 - MovieVerse-Mobile/app/js/search.js | 909 --------- MovieVerse-Mobile/app/js/service-worker.js | 114 -- MovieVerse-Mobile/app/js/settings.js | 373 ---- MovieVerse-Mobile/app/js/sign-in.js | 81 - MovieVerse-Mobile/app/js/triviaModule.js | 69 - MovieVerse-Mobile/app/js/tv-details.js | 1111 ----------- MovieVerse-Mobile/app/js/user-profile.js | 699 ------- index.html | 3 +- sitemap.xml | 54 +- 28 files changed, 28 insertions(+), 12439 deletions(-) delete mode 100644 MovieVerse-Mobile/app/js/LICENSE delete mode 100644 MovieVerse-Mobile/app/js/actor-details.js delete mode 100644 MovieVerse-Mobile/app/js/analytics.js delete mode 100644 MovieVerse-Mobile/app/js/chat-auxiliary.js delete mode 100644 MovieVerse-Mobile/app/js/chat.js delete mode 100644 MovieVerse-Mobile/app/js/create-account.js delete mode 100644 MovieVerse-Mobile/app/js/favorites.js delete mode 100644 MovieVerse-Mobile/app/js/firebase.js delete mode 100644 MovieVerse-Mobile/app/js/inception.js delete mode 100644 MovieVerse-Mobile/app/js/index.ejs delete mode 100644 MovieVerse-Mobile/app/js/movie-details.js delete mode 100644 MovieVerse-Mobile/app/js/movie-match.js delete mode 100644 MovieVerse-Mobile/app/js/movie-timeline.js delete mode 100644 MovieVerse-Mobile/app/js/notifications.js delete mode 100644 MovieVerse-Mobile/app/js/quiz.js delete mode 100644 MovieVerse-Mobile/app/js/ratings-module.js delete mode 100644 MovieVerse-Mobile/app/js/reset-password.js delete mode 100644 MovieVerse-Mobile/app/js/root-config.js delete mode 100644 MovieVerse-Mobile/app/js/router.js delete mode 100644 MovieVerse-Mobile/app/js/search.js delete mode 100644 MovieVerse-Mobile/app/js/service-worker.js delete mode 100644 MovieVerse-Mobile/app/js/settings.js delete mode 100644 MovieVerse-Mobile/app/js/sign-in.js delete mode 100644 MovieVerse-Mobile/app/js/triviaModule.js delete mode 100644 MovieVerse-Mobile/app/js/tv-details.js delete mode 100644 MovieVerse-Mobile/app/js/user-profile.js diff --git a/MovieVerse-Mobile/app/js/LICENSE b/MovieVerse-Mobile/app/js/LICENSE deleted file mode 100644 index a0ef1b39..00000000 --- a/MovieVerse-Mobile/app/js/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2024 Son Nguyen - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/MovieVerse-Mobile/app/js/actor-details.js b/MovieVerse-Mobile/app/js/actor-details.js deleted file mode 100644 index 1b7c45c0..00000000 --- a/MovieVerse-Mobile/app/js/actor-details.js +++ /dev/null @@ -1,678 +0,0 @@ -const search = document.getElementById("search"); -const searchButton = document.getElementById("button-search"); -const form = document.getElementById("form1"); -const main = document.getElementById("main"); -const IMGPATH = "https://image.tmdb.org/t/p/w1280"; -const searchTitle = document.getElementById("search-title"); - -function showSpinner() { - document.getElementById('myModal').classList.add('modal-visible'); -} - -function hideSpinner() { - document.getElementById('myModal').classList.remove('modal-visible'); -} - -const movieCode = { - part1: 'YzVhMjBjODY=', - part2: 'MWFjZjdiYjg=', - part3: 'ZDllOTg3ZGNjN2YxYjU1OA==' -}; - -function getMovieCode() { - return atob(movieCode.part1) + atob(movieCode.part2) + atob(movieCode.part3); -} - -function generateMovieNames(input) { - return String.fromCharCode(97, 112, 105, 95, 107, 101, 121, 61); -} - -function getMovieVerseData(input) { - return String.fromCharCode(97, 112, 105, 46, 116, 104, 101, 109, 111, 118, 105, 101, 100, 98, 46, 111, 114, 103); -} - -function updateBrowserURL(name) { - const nameSlug = createNameSlug(name); - const newURL = window.location.protocol + "//" + window.location.host + window.location.pathname + '?' + nameSlug; - window.history.replaceState({ path: newURL }, '', newURL); -} - -function createNameSlug(name) { - return name.toLowerCase().replace(/ /g, '-').replace(/[^\w-]/g, ''); -} - -const SEARCHPATH = `https://${getMovieVerseData()}/3/search/movie?&${generateMovieNames()}${getMovieCode()}&query=`; - -form.addEventListener('submit', (e) => { - e.preventDefault(); - const searchQuery = document.getElementById('search').value; - localStorage.setItem('searchQuery', searchQuery); - window.location.href = 'search.html'; -}); - -function handleSearch() { - const searchQuery = document.getElementById('search').value; - localStorage.setItem('searchQuery', searchQuery); - window.location.href = 'search.html'; -} - -function calculateMoviesToDisplay() { - const screenWidth = window.innerWidth; - if (screenWidth <= 689.9) return 10; - if (screenWidth <= 1021.24) return 20; - if (screenWidth <= 1353.74) return 21; - if (screenWidth <= 1684.9) return 20; - if (screenWidth <= 2017.49) return 20; - if (screenWidth <= 2349.99) return 18; - if (screenWidth <= 2681.99) return 21; - if (screenWidth <= 3014.49) return 24; - if (screenWidth <= 3345.99) return 27; - if (screenWidth <= 3677.99) return 20; - if (screenWidth <= 4009.99) return 22; - if (screenWidth <= 4340.99) return 24; - if (screenWidth <= 4673.49) return 26; - if (screenWidth <= 5005.99) return 28; - if (screenWidth <= 5337.99) return 30; - if (screenWidth <= 5669.99) return 32; - if (screenWidth <= 6001.99) return 34; - if (screenWidth <= 6333.99) return 36; - if (screenWidth <= 6665.99) return 38; - if (screenWidth <= 6997.99) return 40; - if (screenWidth <= 7329.99) return 42; - if (screenWidth <= 7661.99) return 44; - if (screenWidth <= 7993.99) return 46; - if (screenWidth <= 8325.99) return 48; - return 20; -} - -let initialMainContent = ''; - -document.addEventListener('DOMContentLoaded', () => { - initialMainContent = document.getElementById('main').innerHTML; - - const actorId = localStorage.getItem('selectedActorId'); - if (actorId) { - fetchActorDetails(actorId); - } - else { - fetchActorDetails(2037); - } - - document.getElementById('clear-search-btn').style.display = 'none'; -}); - -async function fetchActorDetails(actorId) { - showSpinner(); - const actorUrl = `https://${getMovieVerseData()}/3/person/${actorId}?${generateMovieNames()}${getMovieCode()}`; - const creditsUrl = `https://${getMovieVerseData()}/3/person/${actorId}/movie_credits?${generateMovieNames()}${getMovieCode()}`; - try { - const [actorResponse, creditsResponse] = await Promise.all([ - fetch(actorUrl), - fetch(creditsUrl) - ]); - - const actor = await actorResponse.json(); - const credits = await creditsResponse.json(); - if (actor.success === false) { - document.getElementById('actor-details-container').innerHTML = ` -
-

Actor details not found - try again with a different actor.

-
`; - } - else { - updateBrowserURL(actor.name); - populateActorDetails(actor, credits); - } - hideSpinner(); - } - catch (error) { - console.log('Error fetching actor details:', error); - document.getElementById('actor-details-container').innerHTML = ` -
-

Actor details not found - try again with a different actor.

-
`; - hideSpinner(); - } -} - -async function populateActorDetails(actor, credits) { - const actorImage = document.getElementById('actor-image'); - const actorName = document.getElementById('actor-name'); - const actorDescription = document.getElementById('actor-description'); - - if (actor.profile_path) { - actorImage.src = `https://image.tmdb.org/t/p/w1280${actor.profile_path}`; - actorName.textContent = actor.name; - document.title = `${actor.name} - Actor's Details`; - } - else { - actorImage.style.display = 'none'; - actorName.textContent = actor.name; - const noImageText = document.createElement('h2'); - noImageText.textContent = 'Image Not Available'; - noImageText.style.textAlign = 'center'; - noImageText.style.height = '800px'; - document.querySelector('.actor-left').appendChild(noImageText); - } - - let ageOrStatus; - if (actor.birthday) { - if (actor.deathday) { - ageOrStatus = calculateAge(actor.birthday, actor.deathday) + ' (Deceased)'; - } - else { - ageOrStatus = calculateAge(actor.birthday) + ' (Alive)'; - } - } - else { - ageOrStatus = 'Unknown'; - } - - actorDescription.innerHTML = ` -

Biography: ${actor.biography || 'Information Unavailable'}

-

Also Known As: ${actor.also_known_as.join(', ') || 'Information Unavailable'}

-

Date of Birth: ${actor.birthday || 'Information Unavailable'}

-

Date of Death: ${actor.deathday || 'Information Unavailable'}

-

Age: ${ageOrStatus}

-

Place of Birth: ${actor.place_of_birth || 'Information Unavailable'}

-

Known For: ${actor.known_for_department || 'Information Unavailable'}

-

Height: ${actor.height || 'Information Unavailable'}

- `; - - const gender = document.createElement('div'); - gender.innerHTML = `

Gender: ${actor.gender === 1 ? 'Female' : actor.gender === 2 ? 'Male' : 'Information Unavailable'}

`; - actorDescription.appendChild(gender); - - const popularity = document.createElement('div'); - popularity.innerHTML = `

Popularity Score: ${actor.popularity.toFixed(2)}

`; - actorDescription.appendChild(popularity); - - const filmographyHeading = document.createElement('p'); - filmographyHeading.innerHTML = 'Filmography: '; - actorDescription.appendChild(filmographyHeading); - - const movieList = document.createElement('div'); - movieList.classList.add('movie-list'); - - credits.cast.forEach((movie, index) => { - const movieLink = document.createElement('span'); - movieLink.textContent = movie.title; - movieLink.classList.add('movie-link'); - movieLink.addEventListener('click', () => { - localStorage.setItem('selectedMovieId', movie.id); - window.location.href = 'movie-details.html'; - }); - movieList.appendChild(movieLink); - - if (index < credits.cast.length - 1) { - movieList.appendChild(document.createTextNode(', ')); - } - }); - - filmographyHeading.appendChild(movieList); - - const mediaUrl = `https://${getMovieVerseData()}/3/person/${actor.id}/images?${generateMovieNames()}${getMovieCode()}`; - const mediaResponse = await fetch(mediaUrl); - const mediaData = await mediaResponse.json(); - const images = mediaData.profiles; - - const detailsContainer = document.getElementById('actor-description'); - - let mediaContainer = document.getElementById('media-container'); - if (!mediaContainer) { - mediaContainer = document.createElement('div'); - mediaContainer.id = 'media-container'; - mediaContainer.style = ` - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - position: relative; - width: 450px; - margin: 20px auto; - overflow: hidden; - max-width: 100%; - box-sizing: border-box; - `; - detailsContainer.appendChild(mediaContainer); - } - - let mediaTitle = document.getElementById('media-title'); - if (!mediaTitle) { - mediaTitle = document.createElement('p'); - mediaTitle.id = 'media-title'; - mediaTitle.textContent = 'Media:'; - mediaTitle.style = ` - font-weight: bold; - align-self: center; - margin-bottom: 5px; - `; - } - - detailsContainer.appendChild(mediaTitle); - detailsContainer.appendChild(mediaContainer); - - let imageElement = document.getElementById('series-media-image'); - if (!imageElement) { - imageElement = document.createElement('img'); - imageElement.id = 'series-media-image'; - imageElement.style = ` - max-width: 100%; - max-height: 210px; - transition: opacity 0.5s ease-in-out; - opacity: 1; - border-radius: 16px; - cursor: pointer; - `; - mediaContainer.appendChild(imageElement); - } - - if (images.length > 0) { - imageElement.src = `https://image.tmdb.org/t/p/w1280${images[0].file_path}`; - } - - imageElement.addEventListener('click', function() { - const imageUrl = this.src; - const modalHtml = ` -
- - × -
- `; - document.body.insertAdjacentHTML('beforeend', modalHtml); - const modal = document.getElementById('image-modal'); - const closeModalBtn = document.getElementById('removeBtn'); - - closeModalBtn.onclick = function() { - modal.remove(); - }; - - modal.addEventListener('click', function(event) { - if (event.target === this) { - this.remove(); - } - }); - }); - - let prevButton = document.getElementById('prev-media-button'); - let nextButton = document.getElementById('next-media-button'); - if (!prevButton || !nextButton) { - prevButton = document.createElement('button'); - nextButton = document.createElement('button'); - prevButton.id = 'prev-media-button'; - nextButton.id = 'next-media-button'; - prevButton.innerHTML = ''; - nextButton.innerHTML = ''; - - [prevButton, nextButton].forEach(button => { - button.style = ` - position: absolute; - top: 50%; - transform: translateY(-50%); - background-color: #7378c5; - color: white; - border-radius: 8px; - height: 30px; - width: 30px; - border: none; - cursor: pointer; - `; - button.onmouseover = () => button.style.backgroundColor = '#ff8623'; - button.onmouseout = () => button.style.backgroundColor = '#7378c5'; - }); - - prevButton.style.left = '0'; - nextButton.style.right = '0'; - - mediaContainer.appendChild(prevButton); - mediaContainer.appendChild(nextButton); - } - - let currentIndex = 0; - prevButton.onclick = () => navigateMedia(images, imageElement, -1); - nextButton.onclick = () => navigateMedia(images, imageElement, 1); - - function navigateMedia(images, imgElement, direction) { - currentIndex += direction; - if (currentIndex < 0) { - currentIndex = images.length - 1; - } else if (currentIndex >= images.length) { - currentIndex = 0; - } - imgElement.style.opacity = '0'; - setTimeout(() => { - imgElement.src = `https://image.tmdb.org/t/p/w1280${images[currentIndex].file_path}`; - imgElement.style.opacity = '1'; - }, 420); - } - - if (window.innerWidth <= 767) { - mediaContainer.style.width = 'calc(100% - 40px)'; - } - - if (images.length === 0) { - mediaContainer.innerHTML = '

No media available

'; - } - - applySettings(); -} - -function calculateAge(birthday, deathday = null) { - const birthDate = new Date(birthday); - const referenceDate = deathday ? new Date(deathday) : new Date(); - const diff = referenceDate - birthDate.getTime(); - const ageDate = new Date(diff); - return Math.abs(ageDate.getUTCFullYear() - 1970); -} - -async function ensureGenreMapIsAvailable() { - if (!localStorage.getItem('genreMap')) { - await fetchGenreMap(); - } -} - -async function fetchGenreMap() { - const url = `https://${getMovieVerseData()}/3/genre/movie/list?${generateMovieNames()}${getMovieCode()}`; - try { - const response = await fetch(url); - const data = await response.json(); - const genreMap = data.genres.reduce((map, genre) => { - map[genre.id] = genre.name; - return map; - }, {}); - localStorage.setItem('genreMap', JSON.stringify(genreMap)); - } - catch (error) { - console.log('Error fetching genre map:', error); - } -} - -async function rotateUserStats() { - await ensureGenreMapIsAvailable(); - - const stats = [ - { - label: "Your Current Time", - getValue: () => { - const now = new Date(); - let hours = now.getHours(); - let minutes = now.getMinutes(); - hours = hours < 10 ? '0' + hours : hours; - minutes = minutes < 10 ? '0' + minutes : minutes; - return `${hours}:${minutes}`; - } - }, - { label: "Most Visited Movie", getValue: getMostVisitedMovie }, - { label: "Most Visited Director", getValue: getMostVisitedDirector }, - { label: "Most Visited Actor", getValue: getMostVisitedActor }, - { - label: "Movies Discovered", - getValue: () => { - const viewedMovies = JSON.parse(localStorage.getItem('uniqueMoviesViewed')) || []; - return viewedMovies.length; - } - }, - { - label: "Favorite Movies", - getValue: () => { - const favoritedMovies = JSON.parse(localStorage.getItem('moviesFavorited')) || []; - return favoritedMovies.length; - } - }, - { - label: "Favorite Genre", - getValue: () => { - const mostCommonGenreCode = getMostCommonGenre(); - const genreMapString = localStorage.getItem('genreMap'); - if (!genreMapString) { - console.log('No genre map found in localStorage.'); - return 'Not Available'; - } - - let genreMap; - try { - genreMap = JSON.parse(genreMapString); - } - catch (e) { - console.log('Error parsing genre map:', e); - return 'Not Available'; - } - - let genreObject; - if (Array.isArray(genreMap)) { - genreObject = genreMap.reduce((acc, genre) => { - acc[genre.id] = genre.name; - return acc; - }, {}); - } - else if (typeof genreMap === 'object' && genreMap !== null) { - genreObject = genreMap; - } - else { - console.log('genreMap is neither an array nor a proper object:', genreMap); - return 'Not Available'; - } - - return genreObject[mostCommonGenreCode] || 'Not Available'; - } - }, - { label: "Watchlists Created", getValue: () => localStorage.getItem('watchlistsCreated') || 0 }, - { label: "Average Movie Rating", getValue: () => localStorage.getItem('averageMovieRating') || 'Not Rated' }, - { - label: "Directors Discovered", - getValue: () => { - const viewedDirectors = JSON.parse(localStorage.getItem('uniqueDirectorsViewed')) || []; - return viewedDirectors.length; - } - }, - { - label: "Actors Discovered", - getValue: () => { - const viewedActors = JSON.parse(localStorage.getItem('uniqueActorsViewed')) || []; - return viewedActors.length; - } - }, - { label: "Your Trivia Accuracy", getValue: getTriviaAccuracy }, - ]; - - let currentStatIndex = 0; - - function updateStatDisplay() { - const currentStat = stats[currentStatIndex]; - document.getElementById('stats-label').textContent = currentStat.label + ':'; - document.getElementById('stats-display').textContent = currentStat.getValue(); - currentStatIndex = (currentStatIndex + 1) % stats.length; - } - - updateStatDisplay(); - - const localTimeDiv = document.getElementById('local-time'); - let statRotationInterval = setInterval(updateStatDisplay, 3000); - - localTimeDiv.addEventListener('click', () => { - clearInterval(statRotationInterval); - updateStatDisplay(); - statRotationInterval = setInterval(updateStatDisplay, 3000); - }); -} - -function updateMovieVisitCount(movieId, movieTitle) { - let movieVisits = JSON.parse(localStorage.getItem('movieVisits')) || {}; - if (!movieVisits[movieId]) { - movieVisits[movieId] = { count: 0, title: movieTitle }; - } - movieVisits[movieId].count += 1; - localStorage.setItem('movieVisits', JSON.stringify(movieVisits)); -} - -function getMostVisitedMovie() { - const movieVisits = JSON.parse(localStorage.getItem('movieVisits')) || {}; - let mostVisitedMovie = ''; - let maxVisits = 0; - - for (const movieId in movieVisits) { - if (movieVisits[movieId].count > maxVisits) { - mostVisitedMovie = movieVisits[movieId].title; - maxVisits = movieVisits[movieId].count; - } - } - - return mostVisitedMovie || 'Not Available'; -} - -function getMostVisitedActor() { - const actorVisits = JSON.parse(localStorage.getItem('actorVisits')) || {}; - let mostVisitedActor = ''; - let maxVisits = 0; - - for (const actorId in actorVisits) { - if (actorVisits[actorId].count > maxVisits) { - mostVisitedActor = actorVisits[actorId].name; - maxVisits = actorVisits[actorId].count; - } - } - - return mostVisitedActor || 'Not Available'; -} - -function getMostVisitedDirector() { - const directorVisits = JSON.parse(localStorage.getItem('directorVisits')) || {}; - - let mostVisitedDirector = ''; - let maxVisits = 0; - - for (const directorId in directorVisits) { - if (directorVisits[directorId].count > maxVisits) { - mostVisitedDirector = directorVisits[directorId].name; - maxVisits = directorVisits[directorId].count; - } - } - - return mostVisitedDirector || 'Not Available'; -} - -function getTriviaAccuracy() { - let triviaStats = JSON.parse(localStorage.getItem('triviaStats')) || { totalCorrect: 0, totalAttempted: 0 }; - if (triviaStats.totalAttempted === 0) { - return 'No trivia attempted'; - } - let accuracy = (triviaStats.totalCorrect / triviaStats.totalAttempted) * 100; - return `${accuracy.toFixed(1)}% accuracy`; -} - -function getMostCommonGenre() { - const favoriteGenresArray = JSON.parse(localStorage.getItem('favoriteGenres')) || []; - const genreCounts = favoriteGenresArray.reduce((acc, genre) => { - acc[genre] = (acc[genre] || 0) + 1; - return acc; - }, {}); - - let mostCommonGenre = ''; - let maxCount = 0; - - for (const genre in genreCounts) { - if (genreCounts[genre] > maxCount) { - mostCommonGenre = genre; - maxCount = genreCounts[genre]; - } - } - - return mostCommonGenre || 'Not Available'; -} - -document.addEventListener('DOMContentLoaded', rotateUserStats); - -function handleSignInOut() { - const isSignedIn = JSON.parse(localStorage.getItem('isSignedIn')) || false; - - if (isSignedIn) { - localStorage.setItem('isSignedIn', JSON.stringify(false)); - alert('You have been signed out.'); - } - else { - window.location.href = 'sign-in.html'; - return; - } - - updateSignInButtonState(); -} - -function updateSignInButtonState() { - const isSignedIn = JSON.parse(localStorage.getItem('isSignedIn')) || false; - const signInText = document.getElementById('signInOutText'); - - const signInIcon = document.getElementById('signInIcon'); - const signOutIcon = document.getElementById('signOutIcon'); - - if (isSignedIn) { - signInText.textContent = 'Sign Out'; - signInIcon.style.display = 'none'; - signOutIcon.style.display = 'inline-block'; - } - else { - signInText.textContent = 'Sign In'; - signInIcon.style.display = 'inline-block'; - signOutIcon.style.display = 'none'; - } -} - -document.addEventListener("DOMContentLoaded", function() { - updateSignInButtonState(); - applySettings(); - document.getElementById('googleSignInBtn').addEventListener('click', handleSignInOut); -}); - -async function showMovieOfTheDay() { - const year = new Date().getFullYear(); - const url = `https://${getMovieVerseData()}/3/discover/movie?${generateMovieNames()}${getMovieCode()}&sort_by=vote_average.desc&vote_count.gte=100&primary_release_year=${year}&vote_average.gte=7`; - - try { - const response = await fetch(url); - const data = await response.json(); - const movies = data.results; - - if (movies.length > 0) { - const randomMovie = movies[Math.floor(Math.random() * movies.length)]; - localStorage.setItem('selectedMovieId', randomMovie.id); - window.location.href = 'movie-details.html'; - } - else { - fallbackMovieSelection(); - } - } - catch (error) { - console.log('Error fetching movie:', error); - fallbackMovieSelection(); - } -} - -function fallbackMovieSelection() { - const fallbackMovies = [432413, 299534, 1726, 562, 118340, 455207, 493922, 447332, 22970, 530385, 27205, 264660, 120467, 603, 577922, 76341, 539, 419704, 515001, 118340, 424, 98]; - const randomFallbackMovie = fallbackMovies[Math.floor(Math.random() * fallbackMovies.length)]; - localStorage.setItem('selectedMovieId', randomFallbackMovie); - window.location.href = 'movie-details.html'; -} - -function applySettings() { - const savedBg = localStorage.getItem('backgroundImage'); - const savedTextColor = localStorage.getItem('textColor'); - const savedFontSize = localStorage.getItem('fontSize'); - - if (savedBg) { - document.body.style.backgroundImage = `url('${savedBg}')`; - } - if (savedTextColor) { - applyTextColor(savedTextColor); - } - if (savedFontSize) { - const size = savedFontSize === 'small' ? '12px' : savedFontSize === 'medium' ? '16px' : '20px'; - document.body.style.fontSize = size; - } -} - -function applyTextColor(color) { - document.querySelectorAll('h1, h2, h3, p, a, span, div, button, input, select, textarea, label, li') - .forEach(element => { - element.style.color = color; - }); -} \ No newline at end of file diff --git a/MovieVerse-Mobile/app/js/analytics.js b/MovieVerse-Mobile/app/js/analytics.js deleted file mode 100644 index 82b83a28..00000000 --- a/MovieVerse-Mobile/app/js/analytics.js +++ /dev/null @@ -1,758 +0,0 @@ -const movieCode = { - part1: 'YzVhMjBjODY=', - part2: 'MWFjZjdiYjg=', - part3: 'ZDllOTg3ZGNjN2YxYjU1OA==' -}; - -function getMovieCode() { - return atob(movieCode.part1) + atob(movieCode.part2) + atob(movieCode.part3); -} - -function generateMovieNames(input) { - return String.fromCharCode(97, 112, 105, 95, 107, 101, 121); -} - -function getMovieVerseData(input) { - return String.fromCharCode(97, 112, 105, 46, 116, 104, 101, 109, 111, 118, 105, 101, 100, 98, 46, 111, 114, 103); -} - -function showSpinner() { - document.getElementById('myModal').classList.add('modal-visible'); -} - -function hideSpinner() { - document.getElementById('myModal').classList.remove('modal-visible'); -} - -const string = `${getMovieCode()}`; - -async function fetchData(url) { - try { - const response = await fetch(url); - return await response.json(); - } - catch (error) { - console.log('Error fetching data:', error); - return null; - } -} - -function createChart(canvasId, chartType, data, options = {}) { - const ctx = document.getElementById(canvasId).getContext('2d'); - new Chart(ctx, { - type: chartType, - data: data, - options: options - }); -} - -async function loadMoviesByYearChart() { - showSpinner(); - const years = []; - const movieCounts = []; - const currentYear = new Date().getFullYear(); - - for (let year = currentYear - 10; year <= currentYear; year++) { - years.push(year); - const response = await fetchData(`${BASE_URL}/discover/movie?${generateMovieNames()}=${string}&primary_release_year=${year}`); - movieCounts.push(response.total_results); - } - - createChart('chart1', 'line', { - labels: years, - datasets: [{ - label: 'Number of Movies Released', - data: movieCounts, - backgroundColor: 'rgba(0,148,255,1)', - borderColor: 'rgba(54, 162, 235, 1)', - borderWidth: 1 - }] - }); - - hideSpinner(); -} - -async function loadGenrePopularityChart() { - showSpinner(); - const genresResponse = await fetchData(`${BASE_URL}/genre/movie/list?${generateMovieNames()}=${string}`); - const genres = genresResponse.genres; - - const genreNames = []; - const genrePopularity = []; - - for (const genre of genres) { - genreNames.push(genre.name); - const response = await fetchData(`${BASE_URL}/discover/movie?${generateMovieNames()}=${string}&with_genres=${genre.id}`); - genrePopularity.push(response.results.reduce((acc, movie) => acc + movie.popularity, 0) / response.results.length); - } - - createChart('chart2', 'bar', { - labels: genreNames, - datasets: [{ - label: 'Average Popularity', - data: genrePopularity, - backgroundColor: 'rgba(255, 99, 132, 1)', - borderColor: 'rgba(255, 99, 132, 1)', - borderWidth: 1 - }] - }); - - hideSpinner(); -} - -async function loadMoviesByCertificationChart() { - showSpinner(); - const certifications = ['G', 'PG', 'PG-13', 'R']; - const movieCounts = []; - - for (const certification of certifications) { - const response = await fetchData(`${BASE_URL}/discover/movie?${generateMovieNames()}=${string}&certification_country=US&certification=${certification}`); - movieCounts.push(response.total_results); - } - - createChart('chart3', 'bar', { - labels: certifications, - datasets: [{ - label: 'Number of Movies', - data: movieCounts, - backgroundColor: 'rgba(75, 192, 192, 1)', - borderColor: 'rgba(75, 192, 192, 1)', - borderWidth: 1 - }] - }); - - hideSpinner(); -} - -async function loadAveragePopularityChart() { - showSpinner(); - const years = []; - const averagePopularity = []; - const currentYear = new Date().getFullYear(); - - for (let year = currentYear - 4; year <= currentYear; year++) { - years.push(year); - const response = await fetchData(`${BASE_URL}/discover/movie?${generateMovieNames()}=${string}&primary_release_year=${year}`); - const totalPopularity = response.results.reduce((sum, movie) => sum + movie.popularity, 0); - averagePopularity.push(totalPopularity / response.results.length); - } - - createChart('chart4', 'line', { - labels: years, - datasets: [{ - label: 'Average Popularity', - data: averagePopularity, - backgroundColor: 'rgba(255, 159, 64, 1)', - borderColor: 'rgba(255, 159, 64, 1)', - borderWidth: 1 - }] - }); - showSpinner(); -} - -Chart.defaults.color = "black"; -Chart.defaults.scale.grid.borderColor = "black"; - -async function loadMoviesByLanguageChart() { - showSpinner(); - const languages = ['en', 'es', 'fr', 'de', 'it']; - const movieCounts = []; - - for (const language of languages) { - const response = await fetchData(`${BASE_URL}/discover/movie?${generateMovieNames()}=${string}&with_original_language=${language}`); - movieCounts.push(response.total_results); - } - - createChart('chart5', 'bar', { - labels: languages.map(lang => lang.toUpperCase()), - datasets: [{ - label: 'Number of Movies', - data: movieCounts, - backgroundColor: 'rgba(153, 102, 255, 1)', - borderColor: 'rgba(153, 102, 255, 1)', - borderWidth: 1 - }], - options: { - responsive: true, - maintainAspectRatio: false - } - }); - - hideSpinner(); -} - -async function loadVoteCountByGenreChart() { - showSpinner(); - const genreResponse = await fetchData(`${BASE_URL}/genre/movie/list?${generateMovieNames()}=${string}`); - const genres = genreResponse.genres.slice(0, 5); - const genreNames = []; - const averageVoteCounts = []; - - for (const genre of genres) { - genreNames.push(genre.name); - const response = await fetchData(`${BASE_URL}/discover/movie?${generateMovieNames()}=${string}&with_genres=${genre.id}`); - const totalVotes = response.results.reduce((sum, movie) => sum + movie.vote_count, 0); - averageVoteCounts.push(totalVotes / response.results.length); - } - - createChart('chart6', 'bar', { - labels: genreNames, - datasets: [{ - label: 'Average Vote Count', - data: averageVoteCounts, - backgroundColor: 'rgba(255, 206, 86, 1)', - borderColor: 'rgba(255, 206, 86, 1)', - borderWidth: 1 - }] - }); - - hideSpinner(); -} - -async function loadMovieReleaseDatesByMonthChart() { - showSpinner(); - const months = Array.from({ length: 12 }, (_, i) => new Date(0, i).toLocaleString('en', { month: 'long' })); - const movieCounts = Array(12).fill(0); - const currentYear = new Date().getFullYear(); - - const response = await fetchData(`${BASE_URL}/discover/movie?${generateMovieNames()}=${string}&primary_release_year=${currentYear}`); - response.results.forEach(movie => { - const releaseDate = new Date(movie.release_date); - movieCounts[releaseDate.getMonth()]++; - }); - - createChart('chart7', 'bar', { - labels: months, - datasets: [{ - label: 'Movies Released', - data: movieCounts, - backgroundColor: 'rgba(123, 239, 178, 1)', - borderColor: 'rgba(123, 239, 178, 1)', - borderWidth: 1 - }] - }); - - hideSpinner(); -} - -async function loadMoviesByDecadeChart() { - showSpinner(); - const decades = ['1980s', '1990s', '2000s', '2010s', '2020s']; - const decadeStartYears = [1980, 1990, 2000, 2010, 2020]; - const movieCounts = []; - - for (const startYear of decadeStartYears) { - const endYear = startYear + 9; - const response = await fetchData(`${BASE_URL}/discover/movie?${generateMovieNames()}=${string}&primary_release_date.gte=${startYear}-01-01&primary_release_date.lte=${endYear}-12-31`); - movieCounts.push(response.total_results); - } - - createChart('chart8', 'bar', { - labels: decades, - datasets: [{ - label: 'Number of Movies', - data: movieCounts, - backgroundColor: 'rgb(255,0,0)', - borderColor: 'rgb(255,0,0)', - borderWidth: 1 - }], - options: { - responsive: true, - maintainAspectRatio: false, - scales: { - x: { - ticks: { - color: 'black' - } - }, - y: { - ticks: { - color: 'black' - } - } - }, - plugins: { - legend: { - position: 'right', - labels: { - color: 'black' - } - } - } - } - }); - - hideSpinner(); -} - -async function loadMoviesByProductionCountriesChart() { - showSpinner(); - const countries = ['US', 'GB', 'CA', 'FR', 'DE']; - const countryNames = ['USA', 'UK', 'Canada', 'France', 'Germany']; - const movieCounts = []; - - for (const country of countries) { - const response = await fetchData(`${BASE_URL}/discover/movie?${generateMovieNames()}=${string}&with_original_language=en®ion=${country}`); - movieCounts.push(response.total_results); - } - - createChart('chart9', 'bar', { - labels: countryNames, - datasets: [{ - label: 'Number of Movies', - data: movieCounts, - backgroundColor: 'rgba(0,32,255,0.75)', - borderColor: 'rgb(0,21,255)', - borderWidth: 1 - }], - options: { - responsive: true, - maintainAspectRatio: false, - scales: { - x: { - ticks: { - color: 'black' - } - }, - y: { - ticks: { - color: 'black' - } - } - }, - plugins: { - legend: { - position: 'right', - labels: { - color: 'black' - } - } - } - } - }); - - hideSpinner(); -} - -async function loadTopRatedMoviesPerYearChart() { - const years = []; - const topMovies = []; - const currentYear = new Date().getFullYear(); - - for (let year = currentYear - 10; year <= currentYear; year++) { - years.push(year); - const response = await fetchData(`${BASE_URL}/discover/movie?${generateMovieNames()}=${string}&primary_release_year=${year}&sort_by=vote_average.desc&vote_count.gte=100`); - if (response.results.length > 0) { - topMovies.push(response.results[0].vote_average); - } - else { - topMovies.push(0); - } - } - - createChart('chart11', 'bar', { - labels: years, - datasets: [{ - label: 'Top Rated Movie Score', - data: topMovies, - backgroundColor: 'rgba(255, 159, 64, 1)', - borderColor: 'rgba(255, 159, 64, 1)', - borderWidth: 1 - }] - }); -} - -async function loadTotalMovieVotesOverYearsChart() { - const years = []; - const totalVoteCounts = []; - const currentYear = new Date().getFullYear(); - - for (let year = currentYear - 10; year <= currentYear; year++) { - years.push(year); - const response = await fetchData(`${BASE_URL}/discover/movie?${generateMovieNames()}=${string}&primary_release_year=${year}`); - const yearlyTotalVotes = response.results.reduce((sum, movie) => sum + movie.vote_count, 0); - totalVoteCounts.push(yearlyTotalVotes); - } - - createChart('chartVotesOverYears', 'line', { - labels: years, - datasets: [{ - label: 'Total Movie Votes', - data: totalVoteCounts, - backgroundColor: 'rgba(255, 193, 7, 1)', - borderColor: 'rgba(255, 193, 7, 1)', - borderWidth: 1 - }] - }); -} - -async function loadHighlyRatedMoviesOverYearsChart() { - const years = []; - const highRatedMovieCounts = []; - const currentYear = new Date().getFullYear(); - const startYear = currentYear - 10; - - for (let year = startYear; year <= currentYear; year++) { - years.push(year); - const response = await fetchData(`${BASE_URL}/discover/movie?${generateMovieNames()}=${string}&primary_release_year=${year}&vote_average.gte=8`); - highRatedMovieCounts.push(response.total_results); - } - - createChart('chartHighlyRatedMovies', 'line', { - labels: years, - datasets: [{ - label: 'Highly Rated Movies (Rating >= 8)', - data: highRatedMovieCounts, - backgroundColor: 'rgba(0, 206, 209, 1)', - borderColor: 'rgba(0, 206, 209, 1)', - borderWidth: 1 - }] - }); -} - -function loadAllCharts() { - loadMoviesByYearChart(); - loadGenrePopularityChart(); - loadMoviesByCertificationChart(); - loadAveragePopularityChart(); - loadMoviesByLanguageChart(); - loadVoteCountByGenreChart(); - loadMovieReleaseDatesByMonthChart(); - loadMoviesByDecadeChart(); - loadMoviesByProductionCountriesChart(); - loadTopRatedMoviesPerYearChart(); - loadTotalMovieVotesOverYearsChart(); - loadHighlyRatedMoviesOverYearsChart(); -} - -document.addEventListener('DOMContentLoaded', loadAllCharts); - -const BASE_URL = `https://${getMovieVerseData()}/3`; - -async function showMovieOfTheDay() { - const year = new Date().getFullYear(); - const url = `https://${getMovieVerseData()}/3/discover/movie?${generateMovieNames()}=${getMovieCode()}&sort_by=vote_average.desc&vote_count.gte=100&primary_release_year=${year}&vote_average.gte=7`; - - try { - const response = await fetch(url); - const data = await response.json(); - const movies = data.results; - - if (movies.length > 0) { - const randomMovie = movies[Math.floor(Math.random() * movies.length)]; - localStorage.setItem('selectedMovieId', randomMovie.id); - window.location.href = 'movie-details.html'; - } - else { - fallbackMovieSelection(); - } - } - catch (error) { - console.log('Error fetching movie:', error); - fallbackMovieSelection(); - } -} - -function handleSignInOut() { - const isSignedIn = JSON.parse(localStorage.getItem('isSignedIn')) || false; - - if (isSignedIn) { - localStorage.setItem('isSignedIn', JSON.stringify(false)); - alert('You have been signed out.'); - } - else { - window.location.href = 'sign-in.html'; - return; - } - - updateSignInButtonState(); -} - -function updateSignInButtonState() { - const isSignedIn = JSON.parse(localStorage.getItem('isSignedIn')) || false; - - const signInText = document.getElementById('signInOutText'); - const signInIcon = document.getElementById('signInIcon'); - const signOutIcon = document.getElementById('signOutIcon'); - - if (isSignedIn) { - signInText.textContent = 'Sign Out'; - signInIcon.style.display = 'none'; - signOutIcon.style.display = 'inline-block'; - } - else { - signInText.textContent = 'Sign In'; - signInIcon.style.display = 'inline-block'; - signOutIcon.style.display = 'none'; - } -} - -document.addEventListener("DOMContentLoaded", function() { - updateSignInButtonState(); - document.getElementById('googleSignInBtn').addEventListener('click', handleSignInOut); -}); - -function fallbackMovieSelection() { - const fallbackMovies = [432413, 299534, 1726, 562, 118340, 455207, 493922, 447332, 22970, 530385, 27205, 264660, 120467, 603, 577922, 76341, 539, 419704, 515001, 118340, 424, 98]; - const randomFallbackMovie = fallbackMovies[Math.floor(Math.random() * fallbackMovies.length)]; - localStorage.setItem('selectedMovieId', randomFallbackMovie); - window.location.href = 'movie-details.html'; -} - -document.getElementById('settings-btn').addEventListener('click', () => { - window.location.href = 'settings.html'; -}); - -document.addEventListener('DOMContentLoaded', () => { - applySettings(); - - function applySettings() { - const defaultBg = '../../images/universe-1.png'; - const savedBg = localStorage.getItem('backgroundImage') || defaultBg; - const savedTextColor = localStorage.getItem('textColor'); - const savedFontSize = localStorage.getItem('fontSize'); - document.body.style.backgroundImage = `url('${savedBg}')`; - - if (savedTextColor) { - document.querySelectorAll('h1, h2, h3, p, a, span, div, button, input, select, textarea, label, li').forEach(element => { - element.style.color = savedTextColor; - }); - } - - if (savedFontSize) { - const size = savedFontSize === 'small' ? '12px' : savedFontSize === 'medium' ? '16px' : '20px'; - document.body.style.fontSize = size; - } - } -}); - -async function ensureGenreMapIsAvailable() { - if (!localStorage.getItem('genreMap')) { - await fetchGenreMap(); - } -} - -async function fetchGenreMap() { - const url = `https://${getMovieVerseData()}/3/genre/movie/list?${generateMovieNames()}${getMovieCode()}`; - try { - const response = await fetch(url); - const data = await response.json(); - const genreMap = data.genres.reduce((map, genre) => { - map[genre.id] = genre.name; - return map; - }, {}); - localStorage.setItem('genreMap', JSON.stringify(genreMap)); - } - catch (error) { - console.log('Error fetching genre map:', error); - } -} - -async function rotateUserStats() { - await ensureGenreMapIsAvailable(); - - const stats = [ - { - label: "Your Current Time", - getValue: () => { - const now = new Date(); - let hours = now.getHours(); - let minutes = now.getMinutes(); - hours = hours < 10 ? '0' + hours : hours; - minutes = minutes < 10 ? '0' + minutes : minutes; - return `${hours}:${minutes}`; - } - }, - { label: "Most Visited Movie", getValue: getMostVisitedMovie }, - { label: "Most Visited Director", getValue: getMostVisitedDirector }, - { label: "Most Visited Actor", getValue: getMostVisitedActor }, - { - label: "Movies Discovered", - getValue: () => { - const viewedMovies = JSON.parse(localStorage.getItem('uniqueMoviesViewed')) || []; - return viewedMovies.length; - } - }, - { - label: "Favorite Movies", - getValue: () => { - const favoritedMovies = JSON.parse(localStorage.getItem('moviesFavorited')) || []; - return favoritedMovies.length; - } - }, - { - label: "Favorite Genre", - getValue: () => { - const mostCommonGenreCode = getMostCommonGenre(); - const genreMapString = localStorage.getItem('genreMap'); - if (!genreMapString) { - console.log('No genre map found in localStorage.'); - return 'Not Available'; - } - - let genreMap; - try { - genreMap = JSON.parse(genreMapString); - } - catch (e) { - console.log('Error parsing genre map:', e); - return 'Not Available'; - } - - let genreObject; - if (Array.isArray(genreMap)) { - genreObject = genreMap.reduce((acc, genre) => { - acc[genre.id] = genre.name; - return acc; - }, {}); - } - else if (typeof genreMap === 'object' && genreMap !== null) { - genreObject = genreMap; - } - else { - console.log('genreMap is neither an array nor a proper object:', genreMap); - return 'Not Available'; - } - - return genreObject[mostCommonGenreCode] || 'Not Available'; - } - }, - { label: "Watchlists Created", getValue: () => localStorage.getItem('watchlistsCreated') || 0 }, - { label: "Average Movie Rating", getValue: () => localStorage.getItem('averageMovieRating') || 'Not Rated' }, - { - label: "Directors Discovered", - getValue: () => { - const viewedDirectors = JSON.parse(localStorage.getItem('uniqueDirectorsViewed')) || []; - return viewedDirectors.length; - } - }, - { - label: "Actors Discovered", - getValue: () => { - const viewedActors = JSON.parse(localStorage.getItem('uniqueActorsViewed')) || []; - return viewedActors.length; - } - }, - { label: "Your Trivia Accuracy", getValue: getTriviaAccuracy }, - ]; - - let currentStatIndex = 0; - - function updateStatDisplay() { - const currentStat = stats[currentStatIndex]; - document.getElementById('stats-label').textContent = currentStat.label + ':'; - document.getElementById('stats-display').textContent = currentStat.getValue(); - currentStatIndex = (currentStatIndex + 1) % stats.length; - } - - updateStatDisplay(); - - const localTimeDiv = document.getElementById('local-time'); - let statRotationInterval = setInterval(updateStatDisplay, 3000); - - localTimeDiv.addEventListener('click', () => { - clearInterval(statRotationInterval); - updateStatDisplay(); - statRotationInterval = setInterval(updateStatDisplay, 3000); - }); -} - -function updateMovieVisitCount(movieId, movieTitle) { - let movieVisits = JSON.parse(localStorage.getItem('movieVisits')) || {}; - if (!movieVisits[movieId]) { - movieVisits[movieId] = { count: 0, title: movieTitle }; - } - movieVisits[movieId].count += 1; - localStorage.setItem('movieVisits', JSON.stringify(movieVisits)); -} - -function getMostVisitedMovie() { - const movieVisits = JSON.parse(localStorage.getItem('movieVisits')) || {}; - let mostVisitedMovie = ''; - let maxVisits = 0; - - for (const movieId in movieVisits) { - if (movieVisits[movieId].count > maxVisits) { - mostVisitedMovie = movieVisits[movieId].title; - maxVisits = movieVisits[movieId].count; - } - } - - return mostVisitedMovie || 'Not Available'; -} - -function getMostVisitedActor() { - const actorVisits = JSON.parse(localStorage.getItem('actorVisits')) || {}; - let mostVisitedActor = ''; - let maxVisits = 0; - - for (const actorId in actorVisits) { - if (actorVisits[actorId].count > maxVisits) { - mostVisitedActor = actorVisits[actorId].name; - maxVisits = actorVisits[actorId].count; - } - } - - return mostVisitedActor || 'Not Available'; -} - -function getMostVisitedDirector() { - const directorVisits = JSON.parse(localStorage.getItem('directorVisits')) || {}; - let mostVisitedDirector = ''; - let maxVisits = 0; - - for (const directorId in directorVisits) { - if (directorVisits[directorId].count > maxVisits) { - mostVisitedDirector = directorVisits[directorId].name; - maxVisits = directorVisits[directorId].count; - } - } - - return mostVisitedDirector || 'Not Available'; -} - -function getTriviaAccuracy() { - let triviaStats = JSON.parse(localStorage.getItem('triviaStats')) || { totalCorrect: 0, totalAttempted: 0 }; - if (triviaStats.totalAttempted === 0) { - return 'No trivia attempted'; - } - let accuracy = (triviaStats.totalCorrect / triviaStats.totalAttempted) * 100; - return `${accuracy.toFixed(1)}% accuracy`; -} - -function getMostCommonGenre() { - const favoriteGenresArray = JSON.parse(localStorage.getItem('favoriteGenres')) || []; - const genreCounts = favoriteGenresArray.reduce((acc, genre) => { - acc[genre] = (acc[genre] || 0) + 1; - return acc; - }, {}); - - let mostCommonGenre = ''; - let maxCount = 0; - - for (const genre in genreCounts) { - if (genreCounts[genre] > maxCount) { - mostCommonGenre = genre; - maxCount = genreCounts[genre]; - } - } - - return mostCommonGenre || 'Not Available'; -} - -document.addEventListener('DOMContentLoaded', rotateUserStats); - -const form = document.getElementById('form1'); - -form.addEventListener('submit', (e) => { - e.preventDefault(); - const searchQuery = document.getElementById('search').value; - localStorage.setItem('searchQuery', searchQuery); - window.location.href = 'search.html'; -}); - -function handleSearch() { - const searchQuery = document.getElementById('search').value; - localStorage.setItem('searchQuery', searchQuery); - window.location.href = 'search.html'; -} diff --git a/MovieVerse-Mobile/app/js/chat-auxiliary.js b/MovieVerse-Mobile/app/js/chat-auxiliary.js deleted file mode 100644 index e0096978..00000000 --- a/MovieVerse-Mobile/app/js/chat-auxiliary.js +++ /dev/null @@ -1,288 +0,0 @@ -document.addEventListener('DOMContentLoaded', function() { - const searchBar = document.getElementById('search'); - const searchButton = document.getElementById('button-search'); - const myHeading = document.getElementById('my-heading'); - const localTime = document.getElementById('local-time'); - - function toggleVisibility() { - const query = searchBar.value.trim(); - if (query) { - if (window.innerWidth > 800) { - myHeading.style.visibility = 'hidden'; - myHeading.style.opacity = '0'; - localTime.style.visibility = 'hidden'; - localTime.style.opacity = '0'; - } - } - else { - myHeading.style.visibility = 'visible'; - myHeading.style.opacity = '1'; - localTime.style.visibility = 'visible'; - localTime.style.opacity = '1'; - } -} - searchBar.addEventListener('input', toggleVisibility); - toggleVisibility(); -}); - -document.addEventListener('DOMContentLoaded', function() { - const searchInput = document.getElementById('search'); - const viewAllResultsBtn = document.getElementById('view-all-results'); - const clearSearchBtn = document.getElementById('clear-search'); - const searchResultsContainer = document.getElementById('search-results'); - const myHeading = document.getElementById('my-heading'); - const localTime = document.getElementById('local-time'); - const searchButton = document.getElementById('button-search'); - - function toggleButtons() { - const query = searchInput.value.trim(); - viewAllResultsBtn.style.display = query ? 'inline-block' : 'none'; - clearSearchBtn.style.display = query ? 'inline-block' : 'none'; - } - - clearSearchBtn.addEventListener('click', function() { - searchInput.value = ''; - searchResultsContainer.innerHTML = ''; - toggleButtons(); - searchInput.focus(); - - myHeading.style.visibility = 'visible'; - myHeading.style.opacity = '1'; - localTime.style.visibility = 'visible'; - localTime.style.opacity = '1'; - }); - - toggleButtons(); - searchInput.addEventListener('input', toggleButtons); -}); - -function showSpinner() { - document.getElementById('myModal').classList.add('modal-visible'); -} - -function hideSpinner() { - document.getElementById('myModal').classList.remove('modal-visible'); -} - -document.addEventListener('DOMContentLoaded', function() { - document.getElementById('search').addEventListener('input', function(e) { - showSpinner(); - const viewAllResultsBtn = document.getElementById('view-all-results'); - const searchInput = document.getElementById('search'); - const query = e.target.value.trim(); - const searchResultsContainer = document.getElementById('search-results'); - - viewAllResultsBtn.style.display = query ? 'block' : 'none'; - - function toggleButtons() { - viewAllResultsBtn.style.display = query ? 'inline-block' : 'none'; - const clearSearchBtn = document.getElementById('clear-search'); - clearSearchBtn.style.display = query ? 'inline-block' : 'none'; - } - - if (query) { - const searchURL = `https://${getMovieVerseData()}/3/search/multi?${generateMovieNames()}${getMovieCode()}&query=${encodeURIComponent(query)}`; - fetch(searchURL) - .then(response => response.json()) - .then(data => { - const sortedResults = data.results.sort((a, b) => b.popularity - a.popularity); - displaySearchResults(sortedResults.slice(0, 5)); - }) - .catch(err => console.log("Fetching error:", err)); - } - else { - searchInput.value = ''; - searchResultsContainer.innerHTML = ''; - toggleButtons(); - searchInput.focus(); - } - - searchInput.addEventListener('input', function() { - if (searchInput.value.trim()) { - viewAllResultsBtn.style.display = 'block'; - } - else { - viewAllResultsBtn.style.display = 'none'; - } - }); - - viewAllResultsBtn.addEventListener('click', function() { - const searchQuery = searchInput.value.trim(); - if (searchQuery) { - localStorage.setItem('searchQuery', searchQuery); - window.location.href = 'search.html'; - } - else { - alert('Please enter a search query.'); - } - }); - - hideSpinner(); - }); - - function displaySearchResults(results) { - showSpinner(); - const resultsContainer = document.getElementById('search-results'); - resultsContainer.innerHTML = ''; - - results.forEach(item => { - const card = document.createElement('div'); - card.className = 'search-result-card'; - card.style.cursor = 'pointer'; - - const imagePath = item.poster_path || item.profile_path ? `https://image.tmdb.org/t/p/w500${item.poster_path || item.profile_path}` : null; - - if (imagePath) { - const image = document.createElement('img'); - image.src = imagePath; - image.className = 'result-image'; - card.appendChild(image); - } - else { - const placeholder = document.createElement('div'); - placeholder.className = 'result-image-placeholder'; - placeholder.textContent = 'Image Not Available'; - placeholder.style.textAlign = 'center'; - placeholder.style.padding = '10px'; - card.appendChild(placeholder); - } - - const details = document.createElement('div'); - details.className = 'result-details'; - - const name = document.createElement('div'); - name.className = 'result-name'; - name.textContent = item.title || item.name; - details.appendChild(name); - - const type = document.createElement('div'); - type.className = 'result-type'; - type.textContent = item.media_type === 'movie' ? 'Movie' : item.media_type === 'tv' ? 'TV Series' : 'Person'; - details.appendChild(type); - - card.appendChild(details); - resultsContainer.appendChild(card); - - card.addEventListener('click', () => handleResultClick(item)); - }); - - hideSpinner(); - } - - async function handleResultClick(item) { - console.log('Clicked item:', item.media_type, item.id); - - if (!item.media_type) { - console.log('Media type is undefined'); - return; - } - - if (item.media_type === 'movie') { - localStorage.setItem('selectedMovieId', item.id); - window.location.href = 'movie-details.html'; - } - else if (item.media_type === 'tv') { - localStorage.setItem('selectedTvSeriesId', item.id); - window.location.href = 'tv-details.html'; - } - else if (item.media_type === 'person') { - try { - const personDetailsUrl = `https://${getMovieVerseData()}/3/person/${item.id}?${generateMovieNames()}${getMovieCode()}`; - const response = await fetch(personDetailsUrl); - const personDetails = await response.json(); - - if (personDetails.known_for_department === 'Directing') { - localStorage.setItem('selectedDirectorId', item.id); - window.location.href = 'director-details.html?' + item.id; - } - else { - localStorage.setItem('selectedActorId', item.id); - window.location.href = 'actor-details.html?' + item.id; - } - } - catch (error) { - console.log('Error fetching person details:', error); - } - } - else { - console.log('Unknown media type:', item.media_type); - } - } -}); - -document.addEventListener('DOMContentLoaded', function() { - const searchInput = document.getElementById('search'); - const viewAllResultsBtn = document.getElementById('view-all-results'); - const clearSearchBtn = document.getElementById('clear-search'); - const searchResultsContainer = document.getElementById('search-results'); - let selectedIndex = -1; - - function clearSelection() { - const results = searchResultsContainer.getElementsByClassName('search-result-card'); - if (selectedIndex >= 0 && selectedIndex < results.length) { - results[selectedIndex].style.backgroundColor = ''; - } - else if (selectedIndex === results.length) { - viewAllResultsBtn.style.backgroundColor = ''; - } - else if (selectedIndex === results.length + 1) { - clearSearchBtn.style.backgroundColor = ''; - } - } - - function moveSelection(direction) { - const results = searchResultsContainer.getElementsByClassName('search-result-card'); - const totalElements = results.length + 2; - clearSelection(); - - if (direction === 'down') { - selectedIndex = (selectedIndex + 1) % totalElements; - } - else if (direction === 'up') { - selectedIndex = (selectedIndex - 1 + totalElements) % totalElements; - } - - if (selectedIndex < results.length) { - results[selectedIndex].style.backgroundColor = '#ff8623'; - results[selectedIndex].scrollIntoView({ block: "nearest" }); - } - else if (selectedIndex === results.length) { - viewAllResultsBtn.style.backgroundColor = '#ff8623'; - viewAllResultsBtn.scrollIntoView({ block: "nearest" }); - } - else if (selectedIndex === results.length + 1) { - clearSearchBtn.style.backgroundColor = '#ff8623'; - clearSearchBtn.scrollIntoView({ block: "nearest" }); - } - } - - searchInput.addEventListener('keydown', function(e) { - if (e.key === 'ArrowDown' || (e.key === 'Tab' && !e.shiftKey)) { - e.preventDefault(); - moveSelection('down'); - } - else if (e.key === 'ArrowUp' || (e.key === 'Tab' && e.shiftKey)) { - e.preventDefault(); - moveSelection('up'); - } - else if (e.key === 'Enter') { - e.preventDefault(); - if (selectedIndex >= 0 && selectedIndex < searchResultsContainer.getElementsByClassName('search-result-card').length) { - searchResultsContainer.getElementsByClassName('search-result-card')[selectedIndex].click(); - } - else if (selectedIndex === searchResultsContainer.getElementsByClassName('search-result-card').length) { - viewAllResultsBtn.click(); - } - else if (selectedIndex === searchResultsContainer.getElementsByClassName('search-result-card').length + 1) { - clearSearchBtn.click(); - } - else { - const query = searchInput.value.trim(); - localStorage.setItem('searchQuery', query); - window.location.href = 'search.html'; - } - } - }); - - searchInput.addEventListener('blur', clearSelection); -}); diff --git a/MovieVerse-Mobile/app/js/chat.js b/MovieVerse-Mobile/app/js/chat.js deleted file mode 100644 index 7c9f6f1c..00000000 --- a/MovieVerse-Mobile/app/js/chat.js +++ /dev/null @@ -1,470 +0,0 @@ -import { initializeApp } from "https://www.gstatic.com/firebasejs/10.8.0/firebase-app.js"; -import { getFirestore, collection, addDoc, doc, startAfter, getDocs, query, where, orderBy, onSnapshot, documentId, serverTimestamp, limit } from "https://www.gstatic.com/firebasejs/10.8.0/firebase-firestore.js"; - -document.addEventListener('DOMContentLoaded', () => { - const mainElement = document.getElementById('main'); - const isLoggedIn = localStorage.getItem('isSignedIn'); - - if (!isLoggedIn || isLoggedIn !== 'true') { - mainElement.style.display = 'none'; - - const signInMessage = document.createElement('div'); - signInMessage.innerHTML = '

You must be signed in to access MovieVerse chat services.

'; - signInMessage.style.display = 'flex'; - signInMessage.style.justifyContent = 'center'; - signInMessage.style.alignItems = 'center'; - signInMessage.style.height = '100vh'; - signInMessage.style.borderRadius = '12px'; - signInMessage.style.margin = '10px auto'; - signInMessage.style.marginRight = '20px'; - signInMessage.style.marginLeft = '20px'; - signInMessage.style.marginBottom = '20px'; - signInMessage.style.backgroundColor = 'rgba(0, 0, 0, 0.6)'; - document.getElementById('footer').style.display = 'none'; - - const adContainer2 = document.getElementById('ad-container2'); - if (adContainer2) { - document.body.insertBefore(signInMessage, adContainer2); - } - else { - document.body.appendChild(signInMessage); - } - } - else { - mainElement.style.display = ''; - } - - loadUserList(); - setupSearchListeners(); -}); - - -const firebaseConfig = { - apiKey: atob("QUl6YVN5REw2a1FuU2ZVZDhVdDhIRnJwS3VpdnF6MXhkWG03aw=="), - authDomain: atob("bW92aWV2ZXJzZS1hcHAuZmlyZWJhc2VhcHAuY29t"), - projectId: "movieverse-app", - storageBucket: atob("bW92aWV2ZXJzZS1hcHAuYXBwc3BvdC5jb20="), - messagingSenderId: atob("ODAyOTQzNzE4ODcx"), - appId: atob("MTo4MDI5NDM3MTg4NzE6d2ViOjQ4YmM5MTZjYzk5ZTI3MjQyMTI3OTI=") -}; - -initializeApp(firebaseConfig); -const db = getFirestore(); - -const currentUserEmail = localStorage.getItem('currentlySignedInMovieVerseUser'); -let selectedUserEmail = null; - -const messagesDiv = document.getElementById('messages'); -const userListDiv = document.getElementById('userList'); -const messageInput = document.getElementById('messageInput'); -const sendButton = document.getElementById('sendButton'); - -sendButton.addEventListener('click', async () => { - const text = messageInput.value.trim(); - if (text && selectedUserEmail) { - try { - await addDoc(collection(db, "messages"), { - sender: currentUserEmail, - recipient: selectedUserEmail, - message: text, - timestamp: serverTimestamp(), - readBy: [currentUserEmail] - }); - messageInput.value = ''; - - const userElement = document.querySelector(`.user[data-email="${selectedUserEmail}"]`); - - if (!userElement) { - const newUserElement = await createUserElement(selectedUserEmail); - userListDiv.prepend(newUserElement); - selectUser(newUserElement); - } - else { - userListDiv.prepend(userElement); - selectUser(userElement); - } - } - catch (error) { - console.error("Error adding message: ", error); - } - } -}); - -async function createUserElement(email) { - const userElement = document.createElement('div'); - userElement.classList.add('user'); - userElement.setAttribute('data-email', email); - userElement.addEventListener('click', () => loadMessages(email)); - - const profileQuery = query(collection(db, 'profiles'), where('__name__', '==', email)); - const profileSnapshot = await getDocs(profileQuery); - let imageUrl = '../../images/user-default.png'; - if (!profileSnapshot.empty) { - const profileData = profileSnapshot.docs[0].data(); - imageUrl = profileData.profileImage || imageUrl; - } - - const img = document.createElement('img'); - img.src = imageUrl; - img.style.width = '50px'; - img.style.borderRadius = '25px'; - img.style.marginRight = '10px'; - userElement.appendChild(img); - - const emailDiv = document.createElement('div'); - emailDiv.textContent = email; - userElement.appendChild(emailDiv); - - return userElement; -} - -function selectUser(userElement) { - if (previouslySelectedUserElement) { - previouslySelectedUserElement.classList.remove('selected'); - previouslySelectedUserElement.style.backgroundColor = ''; - } - userElement.classList.add('selected'); - userElement.style.backgroundColor = '#ff8623'; - previouslySelectedUserElement = userElement; -} - -document.getElementById('messageInput').addEventListener('keydown', function(event) { - if (event.key === 'Enter' && !event.shiftKey) { - event.preventDefault(); - sendButton.click(); - } -}); - -function formatMessage(message, isCurrentUser, timestamp) { - const messageElement = document.createElement('div'); - messageElement.classList.add('message'); - messageElement.textContent = isCurrentUser ? `You: ${message}` : `${selectedUserEmail}: ${message}`; - - if (timestamp && timestamp.toDate) { - messageElement.dataset.timestamp = timestamp.toDate().toISOString(); - } - else { - console.log('Timestamp is not in the expected format:', timestamp); - messageElement.dataset.timestamp = 'Unknown time'; - } - - messageElement.classList.add(isCurrentUser ? 'my-message' : 'other-message'); - messageElement.addEventListener('mouseover', showTooltip); - messageElement.addEventListener('click', showTooltip); - - return messageElement; -} - -function showTooltip(event) { - const messageElement = event.target.closest('.message'); - const timestampString = messageElement.dataset.timestamp; - - const date = new Date(timestampString); - const tooltipText = isNaN(date.getTime()) ? 'Unknown time' : date.toLocaleString('default', { - year: 'numeric', month: 'short', day: 'numeric', - hour: '2-digit', minute: '2-digit' - }); - - const tooltip = document.createElement('div'); - tooltip.className = 'tooltip'; - tooltip.textContent = tooltipText; - document.body.appendChild(tooltip); - - const rect = messageElement.getBoundingClientRect(); - const tooltipRect = tooltip.getBoundingClientRect(); - - const leftPosition = rect.left + (rect.width / 2) - (tooltipRect.width / 2); - tooltip.style.position = 'fixed'; - tooltip.style.top = `${rect.top - tooltipRect.height - 5}px`; - tooltip.style.left = `${Math.max(leftPosition, 0) - 12}px`; - - function removeTooltip() { - tooltip.remove(); - } - messageElement.addEventListener('mouseout', removeTooltip); - setTimeout(removeTooltip, 5000); -} - -const chatSection = document.getElementById('chatSection'); -const noUserSelected = document.getElementById('noUserSelected'); - -chatSection.style.display = 'none'; -noUserSelected.style.display = 'flex'; - -async function loadMessages(userEmail) { - selectedUserEmail = userEmail; - messagesDiv.innerHTML = ''; - - chatSection.style.display = 'flex'; - noUserSelected.style.display = 'none'; - - const userEmailDisplay = document.getElementById('userEmailDisplay'); - if (userEmailDisplay) { - userEmailDisplay.textContent = `Chatting with: ${selectedUserEmail}`; - } - - document.querySelectorAll('.user').forEach(user => user.classList.remove('selected')); - const selectedUser = document.querySelector(`.user[data-email="${selectedUserEmail}"]`); - if (selectedUser) { - selectedUser.classList.add('selected'); - } - - const messagesQuery = query( - collection(db, "messages"), - orderBy("timestamp"), - where("sender", "in", [currentUserEmail, selectedUserEmail]), - where("recipient", "in", [currentUserEmail, selectedUserEmail]) - ); - - onSnapshot(messagesQuery, (snapshot) => { - messagesDiv.innerHTML = ''; - snapshot.docs.forEach((doc) => { - const messageData = doc.data(); - const isCurrentUser = messageData.sender === currentUserEmail; - const timestamp = messageData.timestamp; - const messageElement = formatMessage(messageData.message, isCurrentUser, timestamp); - messagesDiv.appendChild(messageElement); - - if (!isCurrentUser && (!messageData.readBy || !messageData.readBy.includes(currentUserEmail))) { - updateReadStatus(doc.id); - } - }); - - messagesDiv.scrollTop = messagesDiv.scrollHeight; - }); -} - -async function updateReadStatus(messageId) { - const messageRef = doc(db, "messages", messageId); - await updateDoc(messageRef, { - readBy: arrayUnion(currentUserEmail) - }); -} - -let searchDebounceTimeout; -let lastVisible = null; -const initialFetchLimit = 5; -const maxTotalFetch = 20; - -function setupSearchListeners() { - const searchUserInput = document.getElementById('searchUserInput'); - const searchUserResults = document.getElementById('searchUserResults'); - - searchUserInput.addEventListener('input', () => { - clearTimeout(searchDebounceTimeout); - const searchText = searchUserInput.value.trim(); - - if (searchText) { - searchDebounceTimeout = setTimeout(() => { - lastVisible = null; - performSearch(searchText, true); - }, 300); - } - else { - searchUserResults.innerHTML = ''; - searchUserResults.style.display = 'none'; - } - }); -} - -async function performSearch(searchText, isNewSearch = false) { - const searchUserResults = document.getElementById('searchUserResults'); - - try { - showSpinner(); - - let userQuery = query( - collection(db, 'MovieVerseUsers'), - where('email', '>=', searchText), - where('email', '<=', searchText + '\uf8ff'), - orderBy('email'), - limit(initialFetchLimit) - ); - - if (!isNewSearch && lastVisible) { - userQuery = query(userQuery, startAfter(lastVisible)); - } - - const querySnapshot = await getDocs(userQuery); - - if (isNewSearch) { - searchUserResults.innerHTML = ''; - } - - if (!querySnapshot.empty) { - lastVisible = querySnapshot.docs[querySnapshot.docs.length - 1]; - } - - for (const doc of querySnapshot.docs) { - const user = doc.data(); - const userDiv = document.createElement('div'); - userDiv.className = 'user-search-result'; - userDiv.style.cursor = 'pointer'; - userDiv.addEventListener('click', () => loadMessages(user.email)); - - const profileQuery = query(collection(db, 'profiles'), where('__name__', '==', user.email)); - const profileSnapshot = await getDocs(profileQuery); - let imageUrl = '../../images/user-default.png'; - if (!profileSnapshot.empty) { - const profileData = profileSnapshot.docs[0].data(); - imageUrl = profileData.profileImage || imageUrl; - } - - const img = document.createElement('img'); - img.src = imageUrl; - img.style.width = '33%'; - img.style.borderRadius = '8px'; - userDiv.appendChild(img); - - const textDiv = document.createElement('div'); - textDiv.style.width = '67%'; - textDiv.style.textAlign = 'left'; - textDiv.innerHTML = `${user.email}

${user.bio || ''}

`; - userDiv.appendChild(textDiv); - - searchUserResults.appendChild(userDiv); - } - - searchUserResults.style.display = 'block'; - hideSpinner(); - - if (isNewSearch || !querySnapshot.empty && querySnapshot.size === initialFetchLimit) { - const loadMoreButton = document.createElement('button'); - loadMoreButton.textContent = 'Load More'; - loadMoreButton.id = 'loadMoreButton'; - loadMoreButton.style.marginBottom = '20px'; - loadMoreButton.addEventListener('click', () => performSearch(searchText)); - searchUserResults.appendChild(loadMoreButton); - - if (searchUserResults.children.length >= maxTotalFetch) { - loadMoreButton.style.display = 'none'; - } - } - } - catch (error) { - console.error("Error fetching user list: ", error); - if (error.code === 'resource-exhausted') { - const noUserSelected = document.getElementById('noUserSelected'); - if (noUserSelected) { - noUserSelected.textContent = "Sorry, our database is currently overloaded. Please try reloading once more, and if that still doesn't work, please try again in a couple hours. For full transparency, we are currently using a database that has a limited number of reads and writes per day due to lack of funding. Thank you for your patience as we work on scaling our services. At the mean time, feel free to use other MovieVerse features!"; - noUserSelected.style.margin = '25px auto'; - } - hideSpinner(); - } - } -} - -let previouslySelectedUserElement = null; - -async function loadUserList() { - try { - showSpinner(); - - const userLimit = 5; - const messageLimit = 30; - - const sentMessagesQuery = query( - collection(db, "messages"), - orderBy("timestamp", "desc"), - where("sender", "==", currentUserEmail), - limit(messageLimit) - ); - const receivedMessagesQuery = query( - collection(db, "messages"), - orderBy("timestamp", "desc"), - where("recipient", "==", currentUserEmail), - limit(messageLimit) - ); - - const [sentMessagesSnapshot, receivedMessagesSnapshot] = await Promise.all([ - getDocs(sentMessagesQuery), - getDocs(receivedMessagesQuery) - ]); - - let userEmails = new Set(); - sentMessagesSnapshot.forEach(doc => userEmails.add(doc.data().recipient)); - receivedMessagesSnapshot.forEach(doc => userEmails.add(doc.data().sender)); - - let users = []; - for (let email of userEmails) { - if (email) { - const userQuery = query(collection(db, "MovieVerseUsers"), where("email", "==", email)); - const userSnapshot = await getDocs(userQuery); - userSnapshot.forEach(doc => { - let userData = doc.data(); - if (userData.email) { - users.push(userData); - } - }); - } - } - - users.sort((a, b) => { - const aLastMessage = [...sentMessagesSnapshot.docs, ...receivedMessagesSnapshot.docs].find(doc => doc.data().sender === a.email || doc.data().recipient === a.email); - const bLastMessage = [...sentMessagesSnapshot.docs, ...receivedMessagesSnapshot.docs].find(doc => doc.data().sender === b.email || doc.data().recipient === b.email); - return (bLastMessage?.data().timestamp.toDate() || 0) - (aLastMessage?.data().timestamp.toDate() || 0); - }); - - users = users.slice(0, userLimit); - - userListDiv.innerHTML = ''; - for (const user of users) { - const userElement = document.createElement('div'); - userElement.classList.add('user'); - userElement.setAttribute('data-email', user.email); - userElement.onclick = () => { - if (previouslySelectedUserElement) { - previouslySelectedUserElement.classList.remove('selected'); - previouslySelectedUserElement.style.backgroundColor = ''; - } - selectedUserEmail = user.email; - loadMessages(user.email); - document.querySelectorAll('.user').forEach(u => u.classList.remove('selected')); - userElement.classList.add('selected'); - userElement.style.backgroundColor = '#ff8623'; - previouslySelectedUserElement = userElement; - }; - - const profileQuery = query(collection(db, 'profiles'), where('__name__', '==', user.email)); - const profileSnapshot = await getDocs(profileQuery); - let imageUrl = '../../images/user-default.png'; - if (!profileSnapshot.empty) { - const profileData = profileSnapshot.docs[0].data(); - imageUrl = profileData.profileImage || imageUrl; - } - - const img = document.createElement('img'); - img.src = imageUrl; - img.style.width = '50px'; - img.style.borderRadius = '25px'; - img.style.marginRight = '10px'; - userElement.appendChild(img); - - const emailDiv = document.createElement('div'); - emailDiv.textContent = user.email; - userElement.appendChild(emailDiv); - - userListDiv.appendChild(userElement); - } - - hideSpinner(); - } - catch (error) { - console.error("Error fetching user list: ", error); - if (error.code === 'resource-exhausted') { - const noUserSelected = document.getElementById('noUserSelected'); - if (noUserSelected) { - noUserSelected.textContent = "Sorry, our database is currently overloaded. Please try reloading once more, and if that still doesn't work, please try again in a couple hours. For full transparency, we are currently using a database that has a limited number of reads and writes per day due to lack of funding. Thank you for your patience as we work on scaling our services. At the mean time, feel free to use other MovieVerse features!"; - } - hideSpinner(); - } - } -} - -function showSpinner() { - document.getElementById('myModal').classList.add('modal-visible'); -} - -function hideSpinner() { - document.getElementById('myModal').classList.remove('modal-visible'); -} diff --git a/MovieVerse-Mobile/app/js/create-account.js b/MovieVerse-Mobile/app/js/create-account.js deleted file mode 100644 index bc5c32ac..00000000 --- a/MovieVerse-Mobile/app/js/create-account.js +++ /dev/null @@ -1,136 +0,0 @@ -import { initializeApp } from "https://www.gstatic.com/firebasejs/10.8.0/firebase-app.js"; -import { getFirestore, collection, addDoc, getDocs, query, where, doc, setDoc } from "https://www.gstatic.com/firebasejs/10.8.0/firebase-firestore.js"; - -function isValidPassword(password) { - const minLength = 8; - const hasUppercase = /[A-Z]/.test(password); - const hasLowercase = /[a-z]/.test(password); - const hasNumbers = /\d/.test(password); - const hasSpecialChar = /[!@#$%^&*(),.?":{}|<>]/.test(password); - - return ( - password.length >= minLength && - hasUppercase && - hasLowercase && - hasNumbers && - hasSpecialChar - ); -} - -function translateFBC(value) { - return atob(value); -} - -function getFBConfig1() { - const fbConfig1 = "QUl6YVN5REw2a1FuU2ZVZDhVdDhIRnJwS3VpdnF6MXhkWG03aw=="; - return translateFBC(fbConfig1); -} - -function getFBConfig2() { - const fbConfig2 = "bW92aWV2ZXJzZS1hcHAuZmlyZWJhc2VhcHAuY29t"; - return translateFBC(fbConfig2); -} - -function getFBConfig3() { - const fbConfig3 = "bW92aWV2ZXJzZS1hcHAuYXBwc3BvdC5jb20="; - return translateFBC(fbConfig3); -} - -function getFBConfig4() { - const fbConfig4 = "ODAyOTQzNzE4ODcx"; - return translateFBC(fbConfig4); -} - -function getFBConfig5() { - const fbConfig5 = "MTo4MDI5NDM3MTg4NzE6d2ViOjQ4YmM5MTZjYzk5ZTI3MjQyMTI3OTI="; - return translateFBC(fbConfig5); -} - -const firebaseConfig = { - apiKey: getFBConfig1(), - authDomain: getFBConfig2(), - projectId: "movieverse-app", - storageBucket: getFBConfig3(), - messagingSenderId: getFBConfig4(), - appId: getFBConfig5() -}; - -const app = initializeApp(firebaseConfig); -const db = getFirestore(app); - -document.getElementById('createAccountForm').addEventListener('submit', async (e) => { - try { - e.preventDefault(); - const email = document.getElementById('newEmail').value; - const password = document.getElementById('newPassword').value; - const confirmPassword = document.getElementById('confirmPassword').value; - - if (!isValidPassword(password)) { - alert('Password does not meet the security requirements.\n\n' + - 'Your password must include:\n' + - '- At least 8 characters\n' + - '- At least one uppercase letter\n' + - '- At least one lowercase letter\n' + - '- At least one number\n' + - '- At least one special character (e.g., !@#$%^&*)'); - return; - } - - if (password !== confirmPassword) { - alert('Passwords do not match.'); - return; - } - - const exists = await accountExists(email); - if (exists) { - alert('An account with this email already exists.'); - return; - } - - try { - await addDoc(collection(db, "MovieVerseUsers"), { - email: email, - password: password - }); - - const profileRef = doc(db, 'profiles', email); // Using email as document ID for simplicity - await setDoc(profileRef, { - username: 'N/A', - dob: 'N/A', - bio: 'N/A', - favoriteGenres: ['N/A'], - location: 'N/A', - favoriteMovie: 'N/A', - hobbies: ['N/A'], - favoriteActor: 'N/A', - favoriteDirector: 'N/A', - personalQuote: 'N/A', - profileImage: '../../images/user-default.png' - }); - - alert('Account created successfully! Now please sign in on the sign in page to proceed.'); - window.location.href = 'sign-in.html'; - } - catch (error) { - console.log("Error creating account: ", error); - alert('Failed to create account. Please try again later.'); - } - } - catch (error) { - console.error("Error fetching user list: ", error); - if (error.code === 'resource-exhausted') { - const noUserSelected = document.getElementById('account-creation-form-container'); - if (noUserSelected) { - noUserSelected.innerHTML = "Sorry, our database is currently overloaded. Please try reloading once more, and if that still doesn't work, please try again in a couple hours. For full transparency, we are currently using a database that has a limited number of reads and writes per day due to lack of funding. Thank you for your patience as we work on scaling our services. At the mean time, feel free to use other MovieVerse features!"; - noUserSelected.style.height = '350px'; - } - hideSpinner(); - } - } -}); - -async function accountExists(email) { - const q = query(collection(db, "MovieVerseUsers"), where("email", "==", email)); - const querySnapshot = await getDocs(q); - return !querySnapshot.empty; -} diff --git a/MovieVerse-Mobile/app/js/favorites.js b/MovieVerse-Mobile/app/js/favorites.js deleted file mode 100644 index 8a10308a..00000000 --- a/MovieVerse-Mobile/app/js/favorites.js +++ /dev/null @@ -1,1949 +0,0 @@ -import { initializeApp } from 'https://www.gstatic.com/firebasejs/9.6.10/firebase-app.js'; -import { getFirestore, doc, setDoc, collection, updateDoc, getDocs, getDoc, query, where, orderBy, writeBatch, deleteDoc } from 'https://www.gstatic.com/firebasejs/9.6.10/firebase-firestore.js'; - -let initialMoviesSelection = []; -let initialTVSeriesSelection = []; - -function translateFBC(value) { - return atob(value); -} - -function getFBConfig1() { - const fbConfig1 = "QUl6YVN5REw2a1FuU2ZVZDhVdDhIRnJwS3VpdnF6MXhkWG03aw=="; - return translateFBC(fbConfig1); -} - -function getFBConfig2() { - const fbConfig2 = "bW92aWV2ZXJzZS1hcHAuZmlyZWJhc2VhcHAuY29t"; - return translateFBC(fbConfig2); -} - -function getFBConfig3() { - const fbConfig3 = "bW92aWV2ZXJzZS1hcHAuYXBwc3BvdC5jb20="; - return translateFBC(fbConfig3); -} - -function getFBConfig4() { - const fbConfig4 = "ODAyOTQzNzE4ODcx"; - return translateFBC(fbConfig4); -} - -function getFBConfig5() { - const fbConfig5 = "MTo4MDI5NDM3MTg4NzE6d2ViOjQ4YmM5MTZjYzk5ZTI3MjQyMTI3OTI="; - return translateFBC(fbConfig5); -} - -const firebaseConfig = { - apiKey: getFBConfig1(), - authDomain: getFBConfig2(), - projectId: "movieverse-app", - storageBucket: getFBConfig3(), - messagingSenderId: getFBConfig4(), - appId: getFBConfig5() -}; - -const app = initializeApp(firebaseConfig); -const db = getFirestore(app); - -document.addEventListener("DOMContentLoaded", function() { - loadWatchLists(); -}); - -const tvCode = { - part1: 'YzVhMjBjODY=', - part2: 'MWFjZjdiYjg=', - part3: 'ZDllOTg3ZGNjN2YxYjU1OA==' -}; - -function getMovieCode() { - return atob(tvCode.part1) + atob(tvCode.part2) + atob(tvCode.part3); -} - -function generateMovieNames(input) { - return String.fromCharCode(97, 112, 105, 95, 107, 101, 121, 61); -} - -document.addEventListener('DOMContentLoaded', function() { - adjustButtonMargin(); - document.getElementById('how-to-use-btn').addEventListener('click', function() { - let howToUseSection = document.getElementById('how-to-use-section'); - if (howToUseSection.style.display === 'none') { - howToUseSection.style.display = 'block'; - window.location.href = '#how-to-use-section'; - document.getElementById('how-to-use-btn').textContent = 'Hide Tutorial'; - document.getElementById('how-to-use-btn').style.marginBottom = '0'; - } - else { - howToUseSection.style.display = 'none'; - document.getElementById('how-to-use-btn').textContent = 'How to Use'; - document.getElementById('how-to-use-btn').style.marginBottom = '180px'; - } - }); -}); - -function adjustButtonMargin() { - let howToUseSection = document.getElementById('how-to-use-section'); - if (howToUseSection.style.display === 'none' || !howToUseSection.style.display) { - document.getElementById('how-to-use-btn').style.marginBottom = '200px'; - } - else { - document.getElementById('how-to-use-btn').style.marginBottom = '0'; - } -} - -async function ensureGenreMapIsAvailable() { - if (!localStorage.getItem('genreMap')) { - await fetchGenreMap(); - } -} - -async function fetchGenreMap() { - const url = `https://${getMovieVerseData()}/3/genre/movie/list?${generateMovieNames()}${getMovieCode()}`; - try { - const response = await fetch(url); - const data = await response.json(); - const genreMap = data.genres.reduce((map, genre) => { - map[genre.id] = genre.name; - return map; - }, {}); - localStorage.setItem('genreMap', JSON.stringify(genreMap)); - } - catch (error) { - console.log('Error fetching genre map:', error); - } -} - -async function rotateUserStats() { - await ensureGenreMapIsAvailable(); - - const stats = [ - { - label: "Your Current Time", - getValue: () => { - const now = new Date(); - let hours = now.getHours(); - let minutes = now.getMinutes(); - hours = hours < 10 ? '0' + hours : hours; - minutes = minutes < 10 ? '0' + minutes : minutes; - return `${hours}:${minutes}`; - } - }, - { label: "Most Visited Movie", getValue: getMostVisitedMovie }, - { label: "Most Visited Director", getValue: getMostVisitedDirector }, - { label: "Most Visited Actor", getValue: getMostVisitedActor }, - { - label: "Movies Discovered", - getValue: () => { - const viewedMovies = JSON.parse(localStorage.getItem('uniqueMoviesViewed')) || []; - return viewedMovies.length; - } - }, - { - label: "Favorite Movies", - getValue: () => { - const favoritedMovies = JSON.parse(localStorage.getItem('moviesFavorited')) || []; - return favoritedMovies.length; - } - }, - { - label: "Favorite Genre", - getValue: () => { - const mostCommonGenreCode = getMostCommonGenre(); - const genreMapString = localStorage.getItem('genreMap'); - if (!genreMapString) { - console.log('No genre map found in localStorage.'); - return 'Not Available'; - } - - let genreMap; - try { - genreMap = JSON.parse(genreMapString); - } - catch (e) { - console.log('Error parsing genre map:', e); - return 'Not Available'; - } - - let genreObject; - if (Array.isArray(genreMap)) { - genreObject = genreMap.reduce((acc, genre) => { - acc[genre.id] = genre.name; - return acc; - }, {}); - } - else if (typeof genreMap === 'object' && genreMap !== null) { - genreObject = genreMap; - } - else { - console.log('genreMap is neither an array nor a proper object:', genreMap); - return 'Not Available'; - } - - return genreObject[mostCommonGenreCode] || 'Not Available'; - } - }, - { label: "Watchlists Created", getValue: () => localStorage.getItem('watchlistsCreated') || 0 }, - { label: "Average Movie Rating", getValue: () => localStorage.getItem('averageMovieRating') || 'Not Rated' }, - { - label: "Directors Discovered", - getValue: () => { - const viewedDirectors = JSON.parse(localStorage.getItem('uniqueDirectorsViewed')) || []; - return viewedDirectors.length; - } - }, - { - label: "Actors Discovered", - getValue: () => { - const viewedActors = JSON.parse(localStorage.getItem('uniqueActorsViewed')) || []; - return viewedActors.length; - } - }, - { label: "Your Trivia Accuracy", getValue: getTriviaAccuracy }, - ]; - - let currentStatIndex = 0; - - function updateStatDisplay() { - const currentStat = stats[currentStatIndex]; - document.getElementById('stats-label').textContent = currentStat.label + ':'; - document.getElementById('stats-display').textContent = currentStat.getValue(); - currentStatIndex = (currentStatIndex + 1) % stats.length; - } - - updateStatDisplay(); - - const localTimeDiv = document.getElementById('local-time'); - let statRotationInterval = setInterval(updateStatDisplay, 3000); - - localTimeDiv.addEventListener('click', () => { - clearInterval(statRotationInterval); - updateStatDisplay(); - statRotationInterval = setInterval(updateStatDisplay, 3000); - }); -} - -function updateMovieVisitCount(movieId, movieTitle) { - let movieVisits = JSON.parse(localStorage.getItem('movieVisits')) || {}; - if (!movieVisits[movieId]) { - movieVisits[movieId] = { count: 0, title: movieTitle }; - } - movieVisits[movieId].count += 1; - localStorage.setItem('movieVisits', JSON.stringify(movieVisits)); -} - -function getMostVisitedMovie() { - const movieVisits = JSON.parse(localStorage.getItem('movieVisits')) || {}; - let mostVisitedMovie = ''; - let maxVisits = 0; - - for (const movieId in movieVisits) { - if (movieVisits[movieId].count > maxVisits) { - mostVisitedMovie = movieVisits[movieId].title; - maxVisits = movieVisits[movieId].count; - } - } - - return mostVisitedMovie || 'Not Available'; -} - -function getMostVisitedActor() { - const actorVisits = JSON.parse(localStorage.getItem('actorVisits')) || {}; - let mostVisitedActor = ''; - let maxVisits = 0; - - for (const actorId in actorVisits) { - if (actorVisits[actorId].count > maxVisits) { - mostVisitedActor = actorVisits[actorId].name; - maxVisits = actorVisits[actorId].count; - } - } - - return mostVisitedActor || 'Not Available'; -} - -function getMostVisitedDirector() { - const directorVisits = JSON.parse(localStorage.getItem('directorVisits')) || {}; - let mostVisitedDirector = ''; - let maxVisits = 0; - - for (const directorId in directorVisits) { - if (directorVisits[directorId].count > maxVisits) { - mostVisitedDirector = directorVisits[directorId].name; - maxVisits = directorVisits[directorId].count; - } - } - - return mostVisitedDirector || 'Not Available'; -} - -function getTriviaAccuracy() { - let triviaStats = JSON.parse(localStorage.getItem('triviaStats')) || { totalCorrect: 0, totalAttempted: 0 }; - if (triviaStats.totalAttempted === 0) { - return 'No trivia attempted'; - } - let accuracy = (triviaStats.totalCorrect / triviaStats.totalAttempted) * 100; - return `${accuracy.toFixed(1)}% accuracy`; -} - -function getMostCommonGenre() { - const favoriteGenresArray = JSON.parse(localStorage.getItem('favoriteGenres')) || []; - const genreCounts = favoriteGenresArray.reduce((acc, genre) => { - acc[genre] = (acc[genre] || 0) + 1; - return acc; - }, {}); - - let mostCommonGenre = ''; - let maxCount = 0; - - for (const genre in genreCounts) { - if (genreCounts[genre] > maxCount) { - mostCommonGenre = genre; - maxCount = genreCounts[genre]; - } - } - - return mostCommonGenre || 'Not Available'; -} - -document.addEventListener('DOMContentLoaded', rotateUserStats); - -function getMovieVerseData(input) { - return String.fromCharCode(97, 112, 105, 46, 116, 104, 101, 109, 111, 118, 105, 101, 100, 98, 46, 111, 114, 103); -} - -async function showMovieOfTheDay() { - const year = new Date().getFullYear(); - const url = `https://${getMovieVerseData()}/3/discover/movie?${generateMovieNames()}${getMovieCode()}&sort_by=vote_average.desc&vote_count.gte=100&primary_release_year=${year}&vote_average.gte=7`; - - try { - const response = await fetch(url); - const data = await response.json(); - const movies = data.results; - - if (movies.length > 0) { - const randomMovie = movies[Math.floor(Math.random() * movies.length)]; - localStorage.setItem('selectedMovieId', randomMovie.id); - window.location.href = 'movie-details.html'; - } - else { - fallbackMovieSelection(); - } - } - catch (error) { - fallbackMovieSelection(); - } -} - -function fallbackMovieSelection() { - const fallbackMovies = [432413, 299534, 1726, 562, 118340, 455207, 493922, 447332, 22970, 530385, 27205, 264660, 120467, 603, 577922, 76341, 539, 419704, 515001, 118340, 424, 98]; - const randomFallbackMovie = fallbackMovies[Math.floor(Math.random() * fallbackMovies.length)]; - localStorage.setItem('selectedMovieId', randomFallbackMovie); - window.location.href = 'movie-details.html'; -} - -function openModal(modalId) { - document.getElementById(modalId).style.display = 'block'; -} - -document.addEventListener('DOMContentLoaded', () => { - const closeButtons = document.querySelectorAll('.close-button'); - - closeButtons.forEach(button => { - button.addEventListener('click', function() { - const modalId = this.closest('.modal').id; - closeModal(modalId); - }); - }); -}); - -function closeModal(modalId) { - document.getElementById(modalId).style.display = 'none'; -} - -document.getElementById('delete-watchlist-btn').addEventListener('click', () => openModal('delete-watchlist-modal')); - -async function getMovieTitle(movieId) { - const apiKey = `${getMovieCode()}`; - const url = `https://${getMovieVerseData()}/3/movie/${movieId}?${generateMovieNames()}${apiKey}`; - - try { - const response = await fetch(url); - const movie = await response.json(); - return movie.title; - } - catch (error) { - return 'Unknown Movie'; - } -} - -async function populateCreateModalWithFavorites() { - try { - let currentUserEmail = localStorage.getItem('currentlySignedInMovieVerseUser') || ''; - - if (!currentUserEmail) { - const moviesFavorited = JSON.parse(localStorage.getItem('moviesFavorited')) || []; - const favoritesTVSeries = JSON.parse(localStorage.getItem('favoritesTVSeries')) || []; - - let container = document.getElementById('favorites-container'); - if (!container) { - container = document.createElement('div'); - container.id = 'favorites-container'; - document.getElementById('create-watchlist-form').insertBefore(container, document.querySelector('button[type="submit"]')); - } - else { - container.innerHTML = ''; - } - - let moviesLabel = document.createElement('label'); - moviesLabel.textContent = 'Select favorite movies to include in watchlist:'; - container.appendChild(moviesLabel); - - let moviesContainer = document.createElement('div'); - moviesContainer.id = 'movies-container'; - moviesContainer.style.marginTop = '-20px'; - container.appendChild(moviesContainer); - - if (moviesFavorited.length === 0) { - moviesContainer.innerHTML = '

No Favorite Movies Added Yet.

'; - } - else { - for (const movieId of moviesFavorited) { - const movieTitle = await getMovieTitle(movieId); - appendCheckbox(moviesContainer, movieId, movieTitle, 'favoritedMovies'); - } - } - - let tvSeriesLabel = document.createElement('label'); - tvSeriesLabel.textContent = 'Select favorite TV series to include in watchlist:'; - container.appendChild(tvSeriesLabel); - - let tvSeriesContainer = document.createElement('div'); - tvSeriesContainer.id = 'tvseries-container'; - tvSeriesContainer.style.marginTop = '-20px'; - container.appendChild(tvSeriesContainer); - - if (favoritesTVSeries.length === 0) { - tvSeriesContainer.innerHTML = '

No Favorite TV Series Added Yet.

'; - } - else { - for (const seriesId of favoritesTVSeries) { - const seriesTitle = await getTVSeriesTitle(seriesId); - appendCheckbox(tvSeriesContainer, seriesId, seriesTitle, 'favoritedTVSeries'); - } - } - return; - } - - const usersRef = query(collection(db, "MovieVerseUsers"), where("email", "==", currentUserEmail)); - const userSnapshot = await getDocs(usersRef); - - const createForm = document.getElementById('create-watchlist-form'); - - let container = document.getElementById('favorites-container'); - if (!container) { - container = document.createElement('div'); - container.id = 'favorites-container'; - createForm.insertBefore(container, createForm.querySelector('button[type="submit"]')); - } - else { - container.innerHTML = ''; - } - - if (!userSnapshot.empty) { - const userData = userSnapshot.docs[0].data(); - const moviesFavorited = userData.favoritesMovies || []; - const favoritesTVSeries = userData.favoritesTVSeries || []; - - let moviesLabel = document.createElement('label'); - moviesLabel.textContent = 'Select favorite movies to include in watchlist:'; - container.appendChild(moviesLabel); - - let moviesContainer = document.createElement('div'); - moviesContainer.id = 'movies-container'; - moviesContainer.style.marginTop = '-20px'; - container.appendChild(moviesContainer); - - if (moviesFavorited.length === 0) { - moviesContainer.innerHTML = '

No Favorite Movies Added Yet.

'; - } - else { - for (const movieId of moviesFavorited) { - const movieTitle = await getMovieTitle(movieId); - appendCheckbox(moviesContainer, movieId, movieTitle, 'favoritedMovies'); - } - } - - let tvSeriesLabel = document.createElement('label'); - tvSeriesLabel.textContent = 'Select favorite TV series to include in watchlist:'; - container.appendChild(tvSeriesLabel); - - let tvSeriesContainer = document.createElement('div'); - tvSeriesContainer.id = 'tvseries-container'; - tvSeriesContainer.style.marginTop = '-20px'; - container.appendChild(tvSeriesContainer); - - if (favoritesTVSeries.length === 0) { - tvSeriesContainer.innerHTML = '

No Favorite TV Series Added Yet.

'; - } - else { - for (const seriesId of favoritesTVSeries) { - const seriesTitle = await getTVSeriesTitle(seriesId); - appendCheckbox(tvSeriesContainer, seriesId, seriesTitle, 'favoritedTVSeries'); - } - } - } - else { - container.innerHTML = '

No favorites found. Please add some favorites first.

'; - } - } - catch (error) { - if (error.code === 'resource-exhausted') { - console.log('Firebase quota exceeded. Using localStorage for favorites.'); - const moviesFavorited = JSON.parse(localStorage.getItem('moviesFavorited')) || []; - const favoritesTVSeries = JSON.parse(localStorage.getItem('favoritesTVSeries')) || []; - - let container = document.getElementById('favorites-container'); - if (!container) { - container = document.createElement('div'); - container.id = 'favorites-container'; - document.getElementById('create-watchlist-form').insertBefore(container, document.querySelector('button[type="submit"]')); - } - else { - container.innerHTML = ''; - } - - let moviesLabel = document.createElement('label'); - moviesLabel.textContent = 'Select favorite movies to include in watchlist:'; - container.appendChild(moviesLabel); - - let moviesContainer = document.createElement('div'); - moviesContainer.id = 'movies-container'; - moviesContainer.style.marginTop = '-20px'; - container.appendChild(moviesContainer); - - if (moviesFavorited.length === 0) { - moviesContainer.innerHTML = '

No Favorite Movies Added Yet.

'; - } - else { - for (const movieId of moviesFavorited) { - const movieTitle = await getMovieTitle(movieId); - appendCheckbox(moviesContainer, movieId, movieTitle, 'favoritedMovies'); - } - } - - let tvSeriesLabel = document.createElement('label'); - tvSeriesLabel.textContent = 'Select favorite TV series to include in watchlist:'; - container.appendChild(tvSeriesLabel); - - let tvSeriesContainer = document.createElement('div'); - tvSeriesContainer.id = 'tvseries-container'; - tvSeriesContainer.style.marginTop = '-20px'; - container.appendChild(tvSeriesContainer); - - if (favoritesTVSeries.length === 0) { - tvSeriesContainer.innerHTML = '

No Favorite TV Series Added Yet.

'; - } - else { - for (const seriesId of favoritesTVSeries) { - const seriesTitle = await getTVSeriesTitle(seriesId); - appendCheckbox(tvSeriesContainer, seriesId, seriesTitle, 'favoritedTVSeries'); - } - } - } - } - document.addEventListener('keydown', function(event) { - if (event.key === "Escape") { - closeModal('create-watchlist-modal'); - } - }); -} - -document.getElementById('create-watchlist-form').addEventListener('submit', async function(e) { - try { - showSpinner(); - e.preventDefault(); - - const name = document.getElementById('new-watchlist-name').value; - const description = document.getElementById('new-watchlist-description').value; - const selectedMovies = Array.from(document.querySelectorAll('#movies-container input:checked')).map(checkbox => checkbox.value); - const selectedTVSeries = Array.from(document.querySelectorAll('#tvseries-container input:checked')).map(checkbox => checkbox.value); - const currentUserEmail = localStorage.getItem('currentlySignedInMovieVerseUser'); - const q = query(collection(db, "watchlists"), where("userEmail", "==", currentUserEmail)); - const querySnapshot = await getDocs(q); - let maxOrder = querySnapshot.docs.reduce((max, docSnapshot) => Math.max(max, docSnapshot.data().order || 0), 0); - - if (currentUserEmail) { - const newWatchlistRef = doc(collection(db, 'watchlists')); - await setDoc(newWatchlistRef, { - userEmail: currentUserEmail, - name, - description, - movies: selectedMovies, - tvSeries: selectedTVSeries, - pinned: false, - createdAt: new Date().toISOString(), - order: maxOrder + 1, - }); - } - else { - const localWatchlists = JSON.parse(localStorage.getItem('localWatchlists')) || []; - localWatchlists.push({ - id: `local-${new Date().getTime()}`, - userEmail: "", - name, - description, - movies: selectedMovies, - tvSeries: selectedTVSeries, - pinned: false, - createdAt: new Date().toISOString() - }); - localStorage.setItem('localWatchlists', JSON.stringify(localWatchlists)); - } - - closeModal('create-watchlist-modal'); - loadWatchLists(); - hideSpinner(); - window.location.reload(); - } - catch (error) { - if (error.code === 'resource-exhausted') { - console.log('Firebase quota exceeded. Using localStorage for watchlists.'); - const name = document.getElementById('new-watchlist-name').value; - const description = document.getElementById('new-watchlist-description').value; - const selectedMovies = Array.from(document.querySelectorAll('#movies-container input:checked')).map(checkbox => checkbox.value); - const selectedTVSeries = Array.from(document.querySelectorAll('#tvseries-container input:checked')).map(checkbox => checkbox.value); - const localWatchlists = JSON.parse(localStorage.getItem('localWatchlists')) || []; - localWatchlists.push({ - id: `local-${new Date().getTime()}`, - userEmail: "", - name, - description, - movies: selectedMovies, - tvSeries: selectedTVSeries, - pinned: false, - createdAt: new Date().toISOString() - }); - localStorage.setItem('localWatchlists', JSON.stringify(localWatchlists)); - closeModal('create-watchlist-modal'); - loadWatchLists(); - hideSpinner(); - window.location.reload(); - } - } -}); - -async function getTVSeriesTitle(seriesId) { - const apiKey = `${getMovieCode()}`; - const url = `https://${getMovieVerseData()}/3/tv/${seriesId}?${generateMovieNames()}${apiKey}`; - - try { - const response = await fetch(url); - const series = await response.json(); - return series.name; - } - catch (error) { - return 'Unknown Series'; - } -} - -function appendCheckbox(container, id, title, name, isChecked = false) { - const item = document.createElement('div'); - item.classList.add('favorite-item'); - item.style.display = 'flex'; - item.style.alignItems = 'center'; - - const checkbox = document.createElement('input'); - checkbox.type = 'checkbox'; - checkbox.id = `${name}-${id}`; - checkbox.value = id; - checkbox.name = name; - checkbox.checked = isChecked; - - const label = document.createElement('label'); - label.htmlFor = `${name}-${id}`; - label.textContent = title; - label.style.marginTop = '12px'; - label.style.marginLeft = '10px'; - - item.appendChild(checkbox); - item.appendChild(label); - container.appendChild(item); -} - -document.getElementById('create-watchlist-btn').addEventListener('click', function() { - document.getElementById('create-watchlist-form').reset(); - populateCreateModalWithFavorites(); - openModal('create-watchlist-modal'); - updateWatchlistsCreated(); -}); - -function generateUniqueId() { - return Date.now().toString(36) + Math.random().toString(36).substr(2); -} - -document.getElementById('edit-watchlist-btn').addEventListener('click', async function() { - await populateEditModal(); - openModal('edit-watchlist-modal'); -}); - -async function populateEditModal() { - try { - let currentUserEmail = localStorage.getItem('currentlySignedInMovieVerseUser'); - - let watchlists = []; - let moviesFavorited = []; - let favoritesTVSeries = []; - - if (currentUserEmail) { - const qWatchlists = query(collection(db, "watchlists"), where("userEmail", "==", currentUserEmail)); - const qUsers = query(collection(db, "MovieVerseUsers"), where("email", "==", currentUserEmail)); - - const [watchlistsSnapshot, usersSnapshot] = await Promise.all([ - getDocs(qWatchlists), - getDocs(qUsers) - ]); - - watchlists = watchlistsSnapshot.docs.map(doc => ({id: doc.id, ...doc.data()})); - - if (!usersSnapshot.empty) { - const userData = usersSnapshot.docs[0].data(); - moviesFavorited = userData.favoritesMovies || []; - favoritesTVSeries = userData.favoritesTVSeries || []; - } - } - else { - watchlists = JSON.parse(localStorage.getItem('localWatchlists')) || []; - moviesFavorited = JSON.parse(localStorage.getItem('moviesFavorited')) || []; - favoritesTVSeries = JSON.parse(localStorage.getItem('favoritesTVSeries')) || []; - } - - const editForm = document.getElementById('edit-watchlist-form'); - editForm.innerHTML = ''; - - if (watchlists.length === 0) { - const noWatchlistMsg = document.createElement('div'); - noWatchlistMsg.textContent = 'No Watch Lists Available for Edit'; - noWatchlistMsg.style.textAlign = 'center'; - noWatchlistMsg.style.marginTop = '30px'; - noWatchlistMsg.style.color = 'white'; - editForm.appendChild(noWatchlistMsg); - return; - } - - const selectLabel = document.createElement('label'); - selectLabel.textContent = 'Select A Watch List:'; - selectLabel.setAttribute("for", "watchlist-select"); - editForm.appendChild(selectLabel); - - const select = document.createElement('select'); - select.id = 'watchlist-select'; - select.style.font = 'inherit'; - watchlists.forEach((watchlist) => { - const option = document.createElement('option'); - option.value = watchlist.id; - option.textContent = watchlist.name; - select.appendChild(option); - }); - - const nameLabel = document.createElement('label'); - nameLabel.textContent = 'Watch List Name:'; - const nameInput = document.createElement('input'); - nameInput.type = 'text'; - nameInput.id = 'edit-watchlist-name'; - nameInput.style.font = 'inherit'; - nameInput.placeholder = 'New Watchlist Name'; - - const descLabel = document.createElement('label'); - descLabel.textContent = 'Description:'; - const descInput = document.createElement('textarea'); - descInput.id = 'edit-watchlist-description'; - descInput.style.font = 'inherit'; - descInput.placeholder = 'New Watchlist Description'; - - const moviesContainer = document.createElement('div'); - moviesContainer.id = 'edit-movies-container'; - const moviesLabel = document.createElement('label'); - moviesLabel.textContent = 'Select favorite movies to include in watchlist:'; - editForm.appendChild(select); - editForm.appendChild(nameLabel); - editForm.appendChild(nameInput); - editForm.appendChild(descLabel); - editForm.appendChild(descInput); - editForm.appendChild(moviesLabel); - editForm.appendChild(moviesContainer); - - const tvSeriesContainer = document.createElement('div'); - tvSeriesContainer.id = 'edit-tvseries-container'; - const tvSeriesLabel = document.createElement('label'); - tvSeriesLabel.textContent = 'Select favorite TV series to include in watchlist:'; - tvSeriesLabel.style.marginTop = '20px'; - editForm.appendChild(tvSeriesLabel); - editForm.appendChild(tvSeriesContainer); - - const updateForm = async (watchlist) => { - nameInput.value = watchlist.name; - descInput.value = watchlist.description; - moviesContainer.innerHTML = ''; - tvSeriesContainer.innerHTML = ''; - - initialMoviesSelection = watchlist.movies.slice(); - initialTVSeriesSelection = watchlist.tvSeries.slice(); - - if (!moviesFavorited || moviesFavorited.length === 0) { - moviesContainer.innerHTML = '

No Favorite Movies Added Yet.

'; - } - else { - for (const movieId of moviesFavorited) { - const movieTitle = await getMovieTitle(movieId); - const isChecked = watchlist.movies.includes(movieId); - appendCheckbox(moviesContainer, movieId, movieTitle, 'favoritedMovies', isChecked); - } - } - - if (!favoritesTVSeries || favoritesTVSeries.length === 0) { - tvSeriesContainer.innerHTML = '

No Favorite TV Series Added Yet.

'; - } - else { - for (const seriesId of favoritesTVSeries) { - const seriesTitle = await getTVSeriesTitle(seriesId); - const isChecked = watchlist.tvSeries.includes(seriesId); - appendCheckbox(tvSeriesContainer, seriesId, seriesTitle, 'favoritedTVSeries', isChecked); - } - } - }; - - select.addEventListener('change', function () { - const selectedWatchlist = watchlists.find(watchlist => watchlist.id === this.value); - updateForm(selectedWatchlist); - }); - - selectLabel.addEventListener('click', function () { - updateForm(watchlists[select.value]); - }); - - if (watchlists.length > 0) { - updateForm(watchlists[0]); - } - - const submitButton = document.createElement('button'); - submitButton.type = 'submit'; - submitButton.textContent = 'Save Changes'; - editForm.appendChild(submitButton); - - const cancelButton = document.createElement('button'); - cancelButton.type = 'button'; - cancelButton.textContent = 'Cancel Changes'; - cancelButton.style.marginTop = '20px'; - cancelButton.onclick = () => closeModal('edit-watchlist-modal'); - editForm.appendChild(cancelButton); - } - catch (error) { - if (error.code === 'resource-exhausted') { - console.log('Firebase quota exceeded. Using localStorage for watchlists.'); - let watchlists = JSON.parse(localStorage.getItem('localWatchlists')) || []; - let moviesFavorited = JSON.parse(localStorage.getItem('moviesFavorited')) || []; - let favoritesTVSeries = JSON.parse(localStorage.getItem('favoritesTVSeries')) || []; - - const editForm = document.getElementById('edit-watchlist-form'); - editForm.innerHTML = ''; - - if (watchlists.length === 0) { - const noWatchlistMsg = document.createElement('div'); - noWatchlistMsg.textContent = 'No Watch Lists Available for Edit'; - noWatchlistMsg.style.textAlign = 'center'; - noWatchlistMsg.style.marginTop = '30px'; - noWatchlistMsg.style.color = 'white'; - editForm.appendChild(noWatchlistMsg); - return; - } - - const selectLabel = document.createElement('label'); - selectLabel.textContent = 'Select A Watch List:'; - selectLabel.setAttribute("for", "watchlist-select"); - editForm.appendChild(selectLabel); - - const select = document.createElement('select'); - select.id = 'watchlist-select'; - select.style.font = 'inherit'; - watchlists.forEach((watchlist) => { - const option = document.createElement('option'); - option.value = watchlist.id; - option.textContent = watchlist.name; - select.appendChild(option); - }); - - const nameLabel = document.createElement('label'); - nameLabel.textContent = 'Watch List Name:'; - const nameInput = document.createElement('input'); - nameInput.type = 'text'; - nameInput.id = 'edit-watchlist-name'; - nameInput.style.font = 'inherit'; - nameInput.placeholder = 'New Watchlist Name'; - - const descLabel = document.createElement('label'); - descLabel.textContent = 'Description:'; - const descInput = document.createElement('textarea'); - descInput.id = 'edit-watchlist-description'; - descInput.style.font = 'inherit'; - descInput.placeholder = 'New Watchlist Description'; - - const moviesContainer = document.createElement('div'); - moviesContainer.id = 'edit-movies-container'; - const moviesLabel = document.createElement('label'); - moviesLabel.textContent = 'Select favorite movies to include in watchlist:'; - editForm.appendChild(select); - editForm.appendChild(nameLabel); - editForm.appendChild(nameInput); - editForm.appendChild(descLabel); - editForm.appendChild(descInput); - editForm.appendChild(moviesLabel); - editForm.appendChild(moviesContainer); - - const tvSeriesContainer = document.createElement('div'); - tvSeriesContainer.id = 'edit-tvseries-container'; - const tvSeriesLabel = document.createElement('label'); - tvSeriesLabel.textContent = 'Select favorite TV series to include in watchlist:'; - tvSeriesLabel.style.marginTop = '20px'; - editForm.appendChild(tvSeriesLabel); - editForm.appendChild(tvSeriesContainer); - - const updateForm = async (watchlist) => { - nameInput.value = watchlist.name; - descInput.value = watchlist.description; - moviesContainer.innerHTML = ''; - tvSeriesContainer.innerHTML = ''; - - initialMoviesSelection = watchlist.movies.slice(); - initialTVSeriesSelection = watchlist.tvSeries.slice(); - - if (!moviesFavorited || moviesFavorited.length === 0) { - moviesContainer.innerHTML = '

No Favorite Movies Added Yet.

'; - } - else { - for (const movieId of moviesFavorited) { - const movieTitle = await getMovieTitle(movieId); - const isChecked = watchlist.movies.includes(movieId); - appendCheckbox(moviesContainer, movieId, movieTitle, 'favoritedMovies', isChecked); - } - } - - if (!favoritesTVSeries || favoritesTVSeries.length === 0) { - tvSeriesContainer.innerHTML = '

No Favorite TV Series Added Yet.

'; - } - else { - for (const seriesId of favoritesTVSeries) { - const seriesTitle = await getTVSeriesTitle(seriesId); - const isChecked = watchlist.tvSeries.includes(seriesId); - appendCheckbox(tvSeriesContainer, seriesId, seriesTitle, 'favoritedTVSeries', isChecked); - } - } - }; - - select.addEventListener('change', function () { - const selectedWatchlist = watchlists.find(watchlist => watchlist.id === this.value); - updateForm(selectedWatchlist); - }); - - selectLabel.addEventListener('click', function () { - updateForm(watchlists[select.value]); - }); - - if (watchlists.length > 0) { - updateForm(watchlists[0]); - } - - const submitButton = document.createElement('button'); - submitButton.type = 'submit'; - submitButton.textContent = 'Save Changes'; - editForm.appendChild(submitButton); - - const cancelButton = document.createElement('button'); - cancelButton.type = 'button'; - cancelButton.textContent = 'Cancel Changes'; - cancelButton.style.marginTop = '20px'; - cancelButton.onclick = () => closeModal('edit-watchlist-modal'); - editForm.appendChild(cancelButton); - } - } - document.addEventListener('keydown', function(event) { - if (event.key === "Escape") { - closeModal('edit-watchlist-modal'); - } - }); -} - -document.getElementById('edit-watchlist-form').addEventListener('submit', async function(e) { - try { - showSpinner(); - e.preventDefault(); - - const currentUserEmail = localStorage.getItem('currentlySignedInMovieVerseUser'); - const selectedOption = document.getElementById('watchlist-select'); - const watchlistId = selectedOption.value; - const newName = document.getElementById('edit-watchlist-name').value; - const newDescription = document.getElementById('edit-watchlist-description').value; - - let selectedMovies; - let selectedTVSeries; - - const currentMoviesSelection = Array.from(document.querySelectorAll('#edit-movies-container input[type="checkbox"]:checked')).map(checkbox => checkbox.value); - const currentTVSeriesSelection = Array.from(document.querySelectorAll('#edit-tvseries-container input[type="checkbox"]:checked')).map(checkbox => checkbox.value); - - const moviesSelectionChanged = !(initialMoviesSelection.length === currentMoviesSelection.length && initialMoviesSelection.every(value => currentMoviesSelection.includes(value))); - const tvSeriesSelectionChanged = !(initialTVSeriesSelection.length === currentTVSeriesSelection.length && initialTVSeriesSelection.every(value => currentTVSeriesSelection.includes(value))); - - if (moviesSelectionChanged) { - selectedMovies = currentMoviesSelection; - } - else { - selectedMovies = initialMoviesSelection; - } - - if (tvSeriesSelectionChanged) { - selectedTVSeries = currentTVSeriesSelection; - } - else { - selectedTVSeries = initialTVSeriesSelection; - } - - if (currentUserEmail) { - const q = query(collection(db, "watchlists"), where("userEmail", "==", currentUserEmail)); - const querySnapshot = await getDocs(q); - - const watchlistRef = doc(db, 'watchlists', watchlistId); - await updateDoc(watchlistRef, { - name: newName, - description: newDescription, - movies: selectedMovies, - tvSeries: selectedTVSeries - }); - } - else { - let localWatchlists = JSON.parse(localStorage.getItem('localWatchlists')) || []; - let watchlistIndex = localWatchlists.findIndex(watchlist => watchlist.id === watchlistId); - if (watchlistIndex !== -1) { - localWatchlists[watchlistIndex] = { - ...localWatchlists[watchlistIndex], - name: newName, - description: newDescription, - movies: selectedMovies, - tvSeries: selectedTVSeries - }; - localStorage.setItem('localWatchlists', JSON.stringify(localWatchlists)); - } - } - - closeModal('edit-watchlist-modal'); - loadWatchLists(); - hideSpinner(); - window.location.reload(); - } - catch (error) { - if (error.code === 'resource-exhausted') { - showSpinner(); - - e.preventDefault(); - - const currentUserEmail = localStorage.getItem('currentlySignedInMovieVerseUser'); - const selectedOption = document.getElementById('watchlist-select'); - const watchlistId = selectedOption.value; - const newName = document.getElementById('edit-watchlist-name').value; - const newDescription = document.getElementById('edit-watchlist-description').value; - - let selectedMovies; - let selectedTVSeries; - - const currentMoviesSelection = Array.from(document.querySelectorAll('#edit-movies-container input[type="checkbox"]:checked')).map(checkbox => checkbox.value); - const currentTVSeriesSelection = Array.from(document.querySelectorAll('#edit-tvseries-container input[type="checkbox"]:checked')).map(checkbox => checkbox.value); - - const moviesSelectionChanged = !(initialMoviesSelection.length === currentMoviesSelection.length && initialMoviesSelection.every(value => currentMoviesSelection.includes(value))); - const tvSeriesSelectionChanged = !(initialTVSeriesSelection.length === currentTVSeriesSelection.length && initialTVSeriesSelection.every(value => currentTVSeriesSelection.includes(value))); - - if (moviesSelectionChanged) { - selectedMovies = currentMoviesSelection; - } - else { - selectedMovies = initialMoviesSelection; - } - - if (tvSeriesSelectionChanged) { - selectedTVSeries = currentTVSeriesSelection; - } - else { - selectedTVSeries = initialTVSeriesSelection; - } - - let localWatchlists = JSON.parse(localStorage.getItem('localWatchlists')) || []; - let watchlistIndex = localWatchlists.findIndex(watchlist => watchlist.id === watchlistId); - if (watchlistIndex !== -1) { - localWatchlists[watchlistIndex] = { - ...localWatchlists[watchlistIndex], - name: newName, - description: newDescription, - movies: selectedMovies, - tvSeries: selectedTVSeries - }; - localStorage.setItem('localWatchlists', JSON.stringify(localWatchlists)); - } - - closeModal('edit-watchlist-modal'); - loadWatchLists(); - hideSpinner(); - window.location.reload(); - } - } -}); - -async function populateDeleteModal() { - try { - let currentUserEmail = localStorage.getItem('currentlySignedInMovieVerseUser'); - - const deleteForm = document.getElementById('delete-watchlist-form'); - deleteForm.innerHTML = ''; - - let watchlists = []; - - if (currentUserEmail) { - const q = query(collection(db, "watchlists"), where("userEmail", "==", currentUserEmail)); - const querySnapshot = await getDocs(q); - watchlists = querySnapshot.docs.map(doc => ({id: doc.id, ...doc.data()})); - } else { - watchlists = JSON.parse(localStorage.getItem('localWatchlists')) || []; - } - - if (watchlists.length === 0) { - deleteForm.innerHTML = '

No Watchlists Available to Delete.

'; - return; - } - - const checkboxesContainer = document.createElement('div'); - checkboxesContainer.id = 'delete-watchlist-checkboxes-container'; - - watchlists.forEach(watchlist => { - appendCheckbox(checkboxesContainer, watchlist.id, watchlist.name, 'watchlistToDelete'); - }); - - deleteForm.appendChild(checkboxesContainer); - - const deleteButton = document.createElement('button'); - deleteButton.type = 'button'; - deleteButton.textContent = 'Delete Selected'; - deleteButton.onclick = deleteSelectedWatchlists; - deleteForm.appendChild(deleteButton); - } - catch (error) { - if (error.code === 'resource-exhausted') { - console.log('Firebase quota exceeded. Using localStorage for watchlists.'); - let watchlists = JSON.parse(localStorage.getItem('localWatchlists')) || []; - - const deleteForm = document.getElementById('delete-watchlist-form'); - deleteForm.innerHTML = ''; - - if (watchlists.length === 0) { - deleteForm.innerHTML = '

No Watchlists Available to Delete.

'; - return; - } - - const checkboxesContainer = document.createElement('div'); - checkboxesContainer.id = 'delete-watchlist-checkboxes-container'; - - watchlists.forEach(watchlist => { - appendCheckbox(checkboxesContainer, watchlist.id, watchlist.name, 'watchlistToDelete'); - }); - - deleteForm.appendChild(checkboxesContainer); - - const deleteButton = document.createElement('button'); - deleteButton.type = 'button'; - deleteButton.textContent = 'Delete Selected'; - deleteButton.onclick = deleteSelectedWatchlists; - deleteForm.appendChild(deleteButton); - } - } - document.addEventListener('keydown', function(event) { - if (event.key === "Escape") { - closeModal('delete-watchlist-modal'); - } - }); -} - -async function deleteSelectedWatchlists() { - try { - showSpinner(); - const currentUserEmail = localStorage.getItem('currentlySignedInMovieVerseUser'); - const selectedCheckboxes = document.querySelectorAll('#delete-watchlist-checkboxes-container input[type="checkbox"]:checked'); - const selectedIds = Array.from(selectedCheckboxes).map(checkbox => checkbox.value); - - if (currentUserEmail) { - const q = query(collection(db, "watchlists"), where("userEmail", "==", currentUserEmail)); - const querySnapshot = await getDocs(q); - - for (const id of selectedIds) { - await deleteDoc(doc(db, 'watchlists', id)); - } - } - else { - let watchlists = JSON.parse(localStorage.getItem('localWatchlists')) || []; - watchlists = watchlists.filter(watchlist => !selectedIds.includes(watchlist.id)); - localStorage.setItem('localWatchlists', JSON.stringify(watchlists)); - } - - closeModal('delete-watchlist-modal'); - loadWatchLists(); - hideSpinner(); - window.location.reload(); - } - catch (error) { - if (error.code === 'resource-exhausted') { - showSpinner(); - const selectedCheckboxes = document.querySelectorAll('#delete-watchlist-checkboxes-container input[type="checkbox"]:checked'); - const selectedIds = Array.from(selectedCheckboxes).map(checkbox => checkbox.value); - - let watchlists = JSON.parse(localStorage.getItem('localWatchlists')) || []; - watchlists = watchlists.filter(watchlist => !selectedIds.includes(watchlist.id)); - localStorage.setItem('localWatchlists', JSON.stringify(watchlists)); - - closeModal('delete-watchlist-modal'); - loadWatchLists(); - hideSpinner(); - window.location.reload(); - } - } -} - -document.getElementById('delete-watchlist-btn').addEventListener('click', populateDeleteModal); - -async function fetchMovieDetails(movieId) { - const code = `${getMovieCode()}`; - const url = `https://${getMovieVerseData()}/3/movie/${movieId}?${generateMovieNames()}${code}&append_to_response=credits,keywords,similar`; - - try { - const response = await fetch(url); - const movie = await response.json(); - const movieCard = createMovieCard(movie); - movieCard.setAttribute('data-movie-title', movie.title); - return movieCard; - } - catch (error) { - const errorDiv = document.createElement('div'); - errorDiv.textContent = 'Error loading movie card. Please try refreshing the page.'; - return errorDiv; - } -} - -function createMovieCard(movie) { - const movieEl = document.createElement('div'); - movieEl.classList.add('movie'); - movieEl.style.cursor = 'pointer'; - - movieEl.innerHTML = ` - ${movie.title} -
-

${movie.title}

- ${movie.vote_average.toFixed(1)} -
-
-

Movie Overview:

- ${movie.overview} -
`; - movieEl.addEventListener('click', () => { - localStorage.setItem('selectedMovieId', movie.id); - window.location.href = 'movie-details.html'; - updateMovieVisitCount(movie.id, movie.title); - }); - - return movieEl; -} - -function getClassByRate(vote){ - if (vote >= 8) { - return 'green'; - } - else if (vote >= 5) { - return 'orange'; - } - else { - return 'red'; - } -} - -const searchForm = document.getElementById('form'); - -searchForm.addEventListener('submit', (e) => { - e.preventDefault(); - const searchQuery = document.getElementById('search').value; - localStorage.setItem('searchQuery', searchQuery); - window.location.href = 'search.html'; -}); - -function handleSearch() { - const searchQuery = document.getElementById('search').value; - localStorage.setItem('searchQuery', searchQuery); - window.location.href = 'search.html'; -} - -async function getMovies(url) { - const numberOfMovies = calculateMoviesToDisplay(); - const pagesToFetch = numberOfMovies <= 20 ? 1 : 2; - let allMovies = []; - - for (let page = 1; page <= pagesToFetch; page++) { - const response = await fetch(`${url}&page=${page}`); - const data = await response.json(); - allMovies = allMovies.concat(data.results); - } - - const popularityThreshold = 0.5; - - allMovies.sort((a, b) => { - const popularityDifference = Math.abs(a.popularity - b.popularity); - if (popularityDifference < popularityThreshold) { - return b.vote_average - a.vote_average; - } - return b.popularity - a.popularity; - }); - - if (allMovies.length > 0) { - showMovies(allMovies.slice(0, numberOfMovies)); - } - else { - searchResultsMain.innerHTML = `

No movie with the specified search term found. Please try again.

`; - } -} - -function showMovies(movies){ - searchResultsMain.innerHTML = ''; - movies.forEach((movie) => { - const { id, poster_path, title, vote_average, overview } = movie; - const movieE1 = document.createElement('div'); - const voteAverage = vote_average.toFixed(1); - movieE1.classList.add('movie'); - - const movieImage = poster_path - ? `${title}` - : `
Image Not Available
`; - - movieE1.innerHTML = ` - ${movieImage} -
-

${title}

- ${voteAverage} -
-
-

Movie Overview:

- ${overview} -
`; - - movieE1.addEventListener('click', () => { - localStorage.setItem('selectedMovieId', id); - window.location.href = 'movie-details.html'; - updateMovieVisitCount(id, title); - }); - - searchResultsMain.appendChild(movieE1); - }); -} - -function calculateMoviesToDisplay() { - const screenWidth = window.innerWidth; - if (screenWidth <= 689.9) return 10; - if (screenWidth <= 1021.24) return 20; - if (screenWidth <= 1353.74) return 21; - if (screenWidth <= 1684.9) return 20; - if (screenWidth <= 2017.49) return 20; - if (screenWidth <= 2349.99) return 18; - if (screenWidth <= 2681.99) return 21; - if (screenWidth <= 3014.49) return 24; - if (screenWidth <= 3345.99) return 27; - if (screenWidth <= 3677.99) return 20; - if (screenWidth <= 4009.99) return 22; - if (screenWidth <= 4340.99) return 24; - if (screenWidth <= 4673.49) return 26; - if (screenWidth <= 5005.99) return 28; - if (screenWidth <= 5337.99) return 30; - if (screenWidth <= 5669.99) return 32; - if (screenWidth <= 6001.99) return 34; - if (screenWidth <= 6333.99) return 36; - if (screenWidth <= 6665.99) return 38; - if (screenWidth <= 6997.99) return 40; - if (screenWidth <= 7329.99) return 42; - if (screenWidth <= 7661.99) return 44; - if (screenWidth <= 7993.99) return 46; - if (screenWidth <= 8325.99) return 48; - return 20; -} - -async function loadWatchLists() { - const displaySection = document.getElementById('watchlists-display-section'); - - try { - showSpinner(); - - const currentUserEmail = localStorage.getItem('currentlySignedInMovieVerseUser'); - - if (currentUserEmail) { - const q = query(collection(db, "watchlists"), where("userEmail", "==", currentUserEmail)); - const querySnapshot = await getDocs(q); - const watchlists = querySnapshot.docs.map(doc => ({id: doc.id, ...doc.data()})); - - if (watchlists.length === 0) { - displaySection.innerHTML = '

No watch lists found. Click on "Create Watch Lists" to start adding movies.

'; - } - else { - watchlists.sort((a, b) => a.order - b.order); - watchlists.sort((a, b) => (b.pinned === a.pinned) ? 0 : b.pinned ? 1 : -1); - for (const watchlist of watchlists) { - const watchlistDiv = await createWatchListDiv(watchlist); - if (watchlist.pinned) { - watchlistDiv.classList.add('pinned'); - } - displaySection.appendChild(watchlistDiv); - } - } - } - else { - let localWatchlists = JSON.parse(localStorage.getItem('localWatchlists')) || []; - - if (localWatchlists.length === 0) { - displaySection.innerHTML = '

No watch lists found. Start by adding movies to your watchlist.

'; - } - else { - localWatchlists.sort((a, b) => (b.pinned === a.pinned) ? 0 : b.pinned ? 1 : -1); - for (const watchlist of localWatchlists) { - const watchlistDiv = await createWatchListDiv(watchlist); - if (watchlist.pinned) { - watchlistDiv.classList.add('pinned'); - } - displaySection.appendChild(watchlistDiv); - } - } - } - - let favorites = []; - let favoritesTVSeries = []; - - if (currentUserEmail) { - const usersRef = query(collection(db, "MovieVerseUsers"), where("email", "==", currentUserEmail)); - const userSnapshot = await getDocs(usersRef); - - if (!userSnapshot.empty) { - const userData = userSnapshot.docs[0].data(); - favorites = userData.favoritesMovies || []; - favoritesTVSeries = userData.favoritesTVSeries || []; - } - } - else { - favorites = JSON.parse(localStorage.getItem('moviesFavorited')) || []; - favoritesTVSeries = JSON.parse(localStorage.getItem('favoritesTVSeries')) || []; - } - - if (favorites.length > 0) { - const favoritesDiv = document.createElement('div'); - favoritesDiv.className = 'watchlist'; - favoritesDiv.id = 'favorites-watchlist'; - - const title = document.createElement('h3'); - title.textContent = "Favorite Movies"; - title.className = 'watchlist-title'; - - const description = document.createElement('p'); - description.textContent = "A collection of your favorite movies."; - description.className = 'watchlist-description'; - - favoritesDiv.appendChild(title); - favoritesDiv.appendChild(description); - - const moviesContainer = document.createElement('div'); - moviesContainer.className = 'movies-container'; - - for (const movieId of favorites) { - const movieCard = await fetchMovieDetails(movieId); - moviesContainer.appendChild(movieCard); - } - - favoritesDiv.appendChild(moviesContainer); - displaySection.appendChild(favoritesDiv); - } - else { - const favoritesDiv = document.createElement('div'); - favoritesDiv.className = 'watchlist'; - favoritesDiv.id = 'favorites-watchlist'; - favoritesDiv.innerHTML = '

Favorite Movies

No favorite movies added yet.

'; - displaySection.appendChild(favoritesDiv); - } - - if (favoritesTVSeries.length > 0) { - const favoritesDiv = document.createElement('div'); - favoritesDiv.className = 'watchlist'; - favoritesDiv.id = 'favorites-tvseries-watchlist'; - - const title = document.createElement('h3'); - title.textContent = "Favorite TV Series"; - title.className = 'watchlist-title'; - - const description = document.createElement('p'); - description.textContent = "A collection of your favorite TV series."; - description.className = 'watchlist-description'; - - favoritesDiv.appendChild(title); - favoritesDiv.appendChild(description); - - const moviesContainer = document.createElement('div'); - moviesContainer.className = 'movies-container'; - - for (const tvSeriesId of favoritesTVSeries) { - const tvSeriesCard = await fetchTVSeriesDetails(tvSeriesId); - moviesContainer.appendChild(tvSeriesCard); - } - - favoritesDiv.appendChild(moviesContainer); - displaySection.appendChild(favoritesDiv); - } - else { - const favoritesDiv = document.createElement('div'); - favoritesDiv.className = 'watchlist'; - favoritesDiv.id = 'favorites-tvseries-watchlist'; - favoritesDiv.innerHTML = '

Favorite TV Series

No favorite TV series added yet.

'; - displaySection.appendChild(favoritesDiv); - } - - hideSpinner(); - } - catch (error) { - if (error.code === 'resource-exhausted') { - let localWatchlists = JSON.parse(localStorage.getItem('localWatchlists')) || []; - - if (localWatchlists.length === 0) { - displaySection.innerHTML = '

No watch lists found. Start by adding movies to your watchlist.

'; - } - else { - localWatchlists.sort((a, b) => (b.pinned === a.pinned) ? 0 : b.pinned ? 1 : -1); - for (const watchlist of localWatchlists) { - const watchlistDiv = await createWatchListDiv(watchlist); - if (watchlist.pinned) { - watchlistDiv.classList.add('pinned'); - } - displaySection.appendChild(watchlistDiv); - } - } - - let favorites = []; - let favoritesTVSeries = []; - - favorites = JSON.parse(localStorage.getItem('moviesFavorited')) || []; - favoritesTVSeries = JSON.parse(localStorage.getItem('favoritesTVSeries')) || []; - - if (favorites.length > 0) { - const favoritesDiv = document.createElement('div'); - favoritesDiv.className = 'watchlist'; - favoritesDiv.id = 'favorites-watchlist'; - - const title = document.createElement('h3'); - title.textContent = "Favorite Movies"; - title.className = 'watchlist-title'; - - const description = document.createElement('p'); - description.textContent = "A collection of your favorite movies."; - description.className = 'watchlist-description'; - - favoritesDiv.appendChild(title); - favoritesDiv.appendChild(description); - - const moviesContainer = document.createElement('div'); - moviesContainer.className = 'movies-container'; - - for (const movieId of favorites) { - const movieCard = await fetchMovieDetails(movieId); - moviesContainer.appendChild(movieCard); - } - - favoritesDiv.appendChild(moviesContainer); - displaySection.appendChild(favoritesDiv); - } - else { - const favoritesDiv = document.createElement('div'); - favoritesDiv.className = 'watchlist'; - favoritesDiv.id = 'favorites-watchlist'; - favoritesDiv.innerHTML = '

Favorite Movies

No favorite movies added yet.

'; - displaySection.appendChild(favoritesDiv); - } - - if (favoritesTVSeries.length > 0) { - const favoritesDiv = document.createElement('div'); - favoritesDiv.className = 'watchlist'; - favoritesDiv.id = 'favorites-tvseries-watchlist'; - - const title = document.createElement('h3'); - title.textContent = "Favorite TV Series"; - title.className = 'watchlist-title'; - - const description = document.createElement('p'); - description.textContent = "A collection of your favorite TV series."; - description.className = 'watchlist-description'; - - favoritesDiv.appendChild(title); - favoritesDiv.appendChild(description); - - const moviesContainer = document.createElement('div'); - moviesContainer.className = 'movies-container'; - - for (const tvSeriesId of favoritesTVSeries) { - const tvSeriesCard = await fetchTVSeriesDetails(tvSeriesId); - moviesContainer.appendChild(tvSeriesCard); - } - - favoritesDiv.appendChild(moviesContainer); - displaySection.appendChild(favoritesDiv); - hideSpinner(); - } - } - else { - console.error('An error occurred:', error); - } - } -} - -async function fetchTVSeriesDetails(tvSeriesId) { - const code = `${getMovieCode()}`; - const url = `https://${getMovieVerseData()}/3/tv/${tvSeriesId}?${generateMovieNames()}${code}&append_to_response=credits,keywords,similar`; - - try { - const response = await fetch(url); - const series = await response.json(); - const seriesCard = createTVSeriesCard(series); - seriesCard.setAttribute('data-series-title', series.name); - return seriesCard; - } - catch (error) { - const errorDiv = document.createElement('div'); - errorDiv.textContent = 'Error loading series details. Please try refreshing the page.'; - return errorDiv; - } -} - -function createTVSeriesCard(movie) { - const movieEl = document.createElement('div'); - movieEl.classList.add('movie'); - movieEl.style.cursor = 'pointer'; - - movieEl.innerHTML = ` - ${movie.title} -
-

${movie.name}

- ${movie.vote_average.toFixed(1)} -
-
-

Movie Overview:

- ${movie.overview} -
`; - movieEl.addEventListener('click', () => { - localStorage.setItem('selectedTvSeriesId', movie.id); - window.location.href = 'tv-details.html'; - updateMovieVisitCount(movie.id, movie.title); - }); - - return movieEl; -} - -function showSpinner() { - document.getElementById('myModal').classList.add('modal-visible'); -} - -function hideSpinner() { - document.getElementById('myModal').classList.remove('modal-visible'); -} - -async function isListPinned(watchlistId) { - const currentUserEmail = localStorage.getItem('currentlySignedInMovieVerseUser'); - if (currentUserEmail) { - try { - const watchlistRef = doc(db, 'watchlists', watchlistId); - const watchlistDoc = await getDoc(watchlistRef); - if (watchlistDoc.exists()) { - const watchlistData = watchlistDoc.data(); - return watchlistData.pinned || false; - } - else { - return false; - } - } - catch (error) { - return false; - } - } - else { - const watchlists = JSON.parse(localStorage.getItem('localWatchlists')) || []; - const watchlist = watchlists.find(watchlist => watchlist.id === watchlistId); - return watchlist ? watchlist.pinned : false; - } -} - -function addWatchListControls(watchlistDiv, watchlistId) { - if (!watchlistId) { - return; - } - - const controlContainer = document.createElement('div'); - controlContainer.className = 'watchlist-controls'; - - const pinBtn = document.createElement('button'); - pinBtn.innerHTML = ''; - pinBtn.classList.add('pin-btn'); - - isListPinned(watchlistId).then(isPinned => { - pinBtn.title = isPinned ? 'Unpin this watch list' : 'Pin this watch list'; - if (isPinned) { - pinBtn.classList.add('pinned'); - } - else { - pinBtn.classList.remove('pinned'); - } - pinBtn.onclick = function() { - pinWatchList(watchlistDiv, watchlistId); - }; - }); - - const moveUpBtn = document.createElement('button'); - moveUpBtn.innerHTML = ''; - moveUpBtn.onclick = function() { moveWatchList(watchlistDiv, true); }; - moveUpBtn.title = 'Move this watch list up'; - - const moveDownBtn = document.createElement('button'); - moveDownBtn.innerHTML = ''; - moveDownBtn.onclick = function() { moveWatchList(watchlistDiv, false); }; - moveDownBtn.title = 'Move this watch list down'; - - const shareBtn = document.createElement('button'); - shareBtn.innerHTML = ''; - shareBtn.title = 'Share this watch list'; - shareBtn.onclick = function() { shareWatchList(watchlistDiv); }; - - controlContainer.appendChild(pinBtn); - controlContainer.appendChild(moveUpBtn); - controlContainer.appendChild(moveDownBtn); - controlContainer.appendChild(shareBtn); - watchlistDiv.appendChild(controlContainer); -} - -function shareWatchList(watchlistDiv) { - const watchlistTitle = watchlistDiv.querySelector('.watchlist-title').textContent; - let itemsToShare = `Explore my curated watchlist, "${watchlistTitle}", which contains:\n`; - let finalLine = 'Happy Watching! 🍿🎬🎥\n\n' - - const movieCards = watchlistDiv.querySelectorAll('[data-movie-title]'); - const tvSeriesCards = watchlistDiv.querySelectorAll('[data-series-title]'); - - movieCards.forEach(movieCard => { - itemsToShare += `- ${movieCard.getAttribute('data-movie-title')}\n`; - }); - - tvSeriesCards.forEach(seriesCard => { - itemsToShare += `- ${seriesCard.getAttribute('data-series-title')}\n`; - }); - - itemsToShare += finalLine; - - if (navigator.share) { - navigator.share({ - title: `Share Watchlist: ${watchlistTitle}`, - text: itemsToShare - }).catch(err => { - console.error('Error sharing the watchlist:', err); - }); - } - else { - downloadWatchlist(watchlistTitle, itemsToShare); - } -} - -function downloadWatchlist(title, content) { - const encodedContent = encodeURIComponent(content); - const dataUri = `data:text/plain;charset=utf-8,${encodedContent}`; - - const element = document.createElement('a'); - element.setAttribute('href', dataUri); - element.setAttribute('download', `${title.replace(/[\s]+/g, '_')}.txt`); - - element.style.display = 'none'; - document.body.appendChild(element); - - element.click(); - document.body.removeChild(element); -} - -function createWatchListDiv(watchlist) { - const watchlistDiv = document.createElement('div'); - watchlistDiv.className = 'watchlist'; - watchlistDiv.setAttribute('data-watchlist-id', watchlist.id); - - const title = document.createElement('h3'); - title.textContent = watchlist.name; - title.className = 'watchlist-title'; - - const description = document.createElement('p'); - description.textContent = watchlist.description; - description.className = 'watchlist-description'; - - watchlistDiv.appendChild(title); - watchlistDiv.appendChild(description); - - const moviesContainer = document.createElement('div'); - moviesContainer.className = 'movies-container'; - moviesContainer.style.flexWrap = 'wrap'; - - if (watchlist.movies === undefined) { - moviesContainer.innerHTML = ''; - } - else { - watchlist.movies.forEach(movieId => { - fetchMovieDetails(movieId).then(movieCard => moviesContainer.appendChild(movieCard)); - }); - } - - if (watchlist.tvSeries === undefined) { - moviesContainer.innerHTML = ''; - } - else { - watchlist.tvSeries.forEach(tvSeriesId => { - fetchTVSeriesDetails(tvSeriesId).then(tvSeriesCard => moviesContainer.appendChild(tvSeriesCard)); - }); - } - - watchlistDiv.appendChild(moviesContainer); - addWatchListControls(watchlistDiv, watchlist.id); - return watchlistDiv; -} - -function updateWatchlistsOrderInLS() { - const watchlistsDivs = document.querySelectorAll('#watchlists-display-section > .watchlist'); - let watchlists = JSON.parse(localStorage.getItem('localWatchlists')) || []; - const newOrder = Array.from(watchlistsDivs).map(div => div.getAttribute('data-watchlist-id')); - - watchlists.sort((a, b) => newOrder.indexOf(a.id) - newOrder.indexOf(b.id)); - localStorage.setItem('localWatchlists', JSON.stringify(watchlists)); -} - -async function moveWatchList(watchlistDiv, moveUp) { - showSpinner(); - - const currentUserEmail = localStorage.getItem('currentlySignedInMovieVerseUser'); - const watchlistId = watchlistDiv.getAttribute('data-watchlist-id'); - - if (currentUserEmail) { - try { - const watchlistsQuery = query(collection(db, "watchlists"), where("userEmail", "==", currentUserEmail), orderBy("order", "asc")); - const snapshot = await getDocs(watchlistsQuery); - let watchlists = snapshot.docs.map(doc => { - return { docId: doc.id, ...doc.data() }; - }); - - const index = watchlists.findIndex(watchlist => watchlist.docId === watchlistId); - - if (index === -1 || watchlists.length < 2) { - hideSpinner(); - return; - } - - const swapIndex = moveUp ? index - 1 : index + 1; - if (swapIndex < 0 || swapIndex >= watchlists.length) { - hideSpinner(); - return; - } - - let currentOrder = watchlists[index].order; - let swapOrder = watchlists[swapIndex].order; - - const batch = writeBatch(db); - batch.update(doc(db, "watchlists", watchlists[index].docId), { order: swapOrder }); - batch.update(doc(db, "watchlists", watchlists[swapIndex].docId), { order: currentOrder }); - - await batch.commit(); - } - catch (error) { - hideSpinner(); - } - hideSpinner(); - } - else { - const sibling = moveUp ? watchlistDiv.previousElementSibling : watchlistDiv.nextElementSibling; - if (sibling) { - const parent = watchlistDiv.parentNode; - if (moveUp) { - parent.insertBefore(watchlistDiv, sibling); - } - else { - parent.insertBefore(sibling, watchlistDiv); - } - updateWatchlistsOrderInLS(); - } - hideSpinner(); - } - - loadWatchLists(); - window.location.reload(); -} - -async function pinWatchList(watchlistDiv, watchlistId) { - showSpinner(); - - const isPinned = watchlistDiv.classList.contains('pinned'); - const currentUserEmail = localStorage.getItem('currentlySignedInMovieVerseUser'); - - if (currentUserEmail) { - const watchlistRef = doc(db, 'watchlists', watchlistId); - await updateDoc(watchlistRef, { - pinned: !isPinned - }); - hideSpinner(); - } - else { - let watchlists = JSON.parse(localStorage.getItem('localWatchlists')) || []; - watchlists.forEach(watchlist => { - if (watchlist.id === watchlistId) { - watchlist.pinned = !isPinned; - } - }); - - localStorage.setItem('localWatchlists', JSON.stringify(watchlists)); - hideSpinner(); - } - - loadWatchLists(); - - window.location.reload(); -} - -document.getElementById('settings-btn').addEventListener('click', () => { - window.location.href = 'settings.html'; -}); - -document.addEventListener('DOMContentLoaded', () => { - applySettings(); - - function applySettings() { - const savedBg = localStorage.getItem('backgroundImage'); - const savedTextColor = localStorage.getItem('textColor'); - const savedFontSize = localStorage.getItem('fontSize'); - - if (savedBg) { - document.body.style.backgroundImage = `url('${savedBg}')`; - } - - if (savedTextColor) { - document.querySelectorAll('h1, h2, h3, p, a, span, div, button, input, select, textarea, label, li').forEach(element => { - element.style.color = savedTextColor; - }); - } - - if (savedFontSize) { - const size = savedFontSize === 'small' ? '12px' : savedFontSize === 'medium' ? '16px' : '20px'; - document.body.style.fontSize = size; - } - } -}); - -function updateWatchlistsCreated() { - let watchlistsCount = parseInt(localStorage.getItem('watchlistsCreated')) || 0; - watchlistsCount++; - localStorage.setItem('watchlistsCreated', watchlistsCount.toString()); -} diff --git a/MovieVerse-Mobile/app/js/firebase.js b/MovieVerse-Mobile/app/js/firebase.js deleted file mode 100644 index 590efb98..00000000 --- a/MovieVerse-Mobile/app/js/firebase.js +++ /dev/null @@ -1,50 +0,0 @@ -import { initializeApp, getApps, getApp } from "https://www.gstatic.com/firebasejs/10.8.0/firebase-app.js"; -import { getFirestore } from "https://www.gstatic.com/firebasejs/10.8.0/firebase-firestore.js"; - -function translateFBC(value) { - return atob(value); -} - -function getFBConfig1() { - const fbConfig1 = "QUl6YVN5REw2a1FuU2ZVZDhVdDhIRnJwS3VpdnF6MXhkWG03aw=="; - return translateFBC(fbConfig1); -} - -const movieCode = { - part1: 'YzVhMjBjODY=', - part2: 'MWFjZjdiYjg=', - part3: 'ZDllOTg3ZGNjN2YxYjU1OA==' -}; - -function getFBConfig2() { - const fbConfig2 = "bW92aWV2ZXJzZS1hcHAuZmlyZWJhc2VhcHAuY29t"; - return translateFBC(fbConfig2); -} - -function getFBConfig3() { - const fbConfig3 = "bW92aWV2ZXJzZS1hcHAuYXBwc3BvdC5jb20="; - return translateFBC(fbConfig3); -} - -function getFBConfig4() { - const fbConfig4 = "ODAyOTQzNzE4ODcx"; - return translateFBC(fbConfig4); -} - -function getFBConfig5() { - const fbConfig5 = "MTo4MDI5NDM3MTg4NzE6d2ViOjQ4YmM5MTZjYzk5ZTI3MjQyMTI3OTI="; - return translateFBC(fbConfig5); -} - -const firebaseConfig = { - apiKey: getFBConfig1(), - authDomain: getFBConfig2(), - projectId: "movieverse-app", - storageBucket: getFBConfig3(), - messagingSenderId: getFBConfig4(), - appId: getFBConfig5() -}; - -export const app = !getApps().length ? initializeApp(firebaseConfig) : getApp(); - -export const db = getFirestore(app); diff --git a/MovieVerse-Mobile/app/js/inception.js b/MovieVerse-Mobile/app/js/inception.js deleted file mode 100644 index 410660ef..00000000 --- a/MovieVerse-Mobile/app/js/inception.js +++ /dev/null @@ -1,1264 +0,0 @@ -const movieCode = { - part1: 'YzVhMjBjODY=', - part2: 'MWFjZjdiYjg=', - part3: 'ZDllOTg3ZGNjN2YxYjU1OA==' -}; - -function getMovieCode() { - return atob(movieCode.part1) + atob(movieCode.part2) + atob(movieCode.part3); -} - -function generateMovieNames(input) { - return String.fromCharCode(97, 112, 105, 95, 107, 101, 121, 61); -} - -const search = document.getElementById("search"); -const searchButton = document.getElementById("button-search"); -const form = document.getElementById("form1"); -const SEARCHPATH = `https://${getMovieVerseData()}/3/search/movie?&${generateMovieNames()}${getMovieCode()}&query=`; - -const main = document.getElementById("main"); -const IMGPATH = "https://image.tmdb.org/t/p/w1280"; -const favoriteButton = document.getElementById("favorite-btn"); -const searchTitle = document.getElementById("search-title"); - -let trailerUrlGlobal; -let initialMainContent; -let trailerButton; - -form.addEventListener('submit', (e) => { - e.preventDefault(); - const searchQuery = document.getElementById('search').value; - localStorage.setItem('searchQuery', searchQuery); - window.location.href = 'search.html'; -}); - -function handleSearch() { - const searchQuery = document.getElementById('search').value; - localStorage.setItem('searchQuery', searchQuery); - window.location.href = 'search.html'; -} - -async function ensureGenreMapIsAvailable() { - if (!localStorage.getItem('genreMap')) { - await fetchGenreMap(); - } -} - -async function fetchGenreMap() { - const url = `https://${getMovieVerseData()}/3/genre/movie/list?${generateMovieNames()}${getMovieCode()}`; - try { - const response = await fetch(url); - const data = await response.json(); - const genreMap = data.genres.reduce((map, genre) => { - map[genre.id] = genre.name; - return map; - }, {}); - localStorage.setItem('genreMap', JSON.stringify(genreMap)); - } - catch (error) { - console.log('Error fetching genre map:', error); - } -} - -async function rotateUserStats() { - await ensureGenreMapIsAvailable(); - - const stats = [ - { - label: "Your Current Time", - getValue: () => { - const now = new Date(); - let hours = now.getHours(); - let minutes = now.getMinutes(); - hours = hours < 10 ? '0' + hours : hours; - minutes = minutes < 10 ? '0' + minutes : minutes; - return `${hours}:${minutes}`; - } - }, - { label: "Most Visited Movie", getValue: getMostVisitedMovie }, - { label: "Most Visited Director", getValue: getMostVisitedDirector }, - { label: "Most Visited Actor", getValue: getMostVisitedActor }, - { - label: "Movies Discovered", - getValue: () => { - const viewedMovies = JSON.parse(localStorage.getItem('uniqueMoviesViewed')) || []; - return viewedMovies.length; - } - }, - { - label: "Favorite Movies", - getValue: () => { - const favoritedMovies = JSON.parse(localStorage.getItem('moviesFavorited')) || []; - return favoritedMovies.length; - } - }, - { - label: "Favorite Genre", - getValue: () => { - const mostCommonGenreCode = getMostCommonGenre(); - const genreMapString = localStorage.getItem('genreMap'); - if (!genreMapString) { - console.log('No genre map found in localStorage.'); - return 'Not Available'; - } - - let genreMap; - try { - genreMap = JSON.parse(genreMapString); - } - catch (e) { - console.log('Error parsing genre map:', e); - return 'Not Available'; - } - - let genreObject; - if (Array.isArray(genreMap)) { - genreObject = genreMap.reduce((acc, genre) => { - acc[genre.id] = genre.name; - return acc; - }, {}); - } - else if (typeof genreMap === 'object' && genreMap !== null) { - genreObject = genreMap; - } - else { - console.log('genreMap is neither an array nor a proper object:', genreMap); - return 'Not Available'; - } - - return genreObject[mostCommonGenreCode] || 'Not Available'; - } - }, - { label: "Watchlists Created", getValue: () => localStorage.getItem('watchlistsCreated') || 0 }, - { label: "Average Movie Rating", getValue: () => localStorage.getItem('averageMovieRating') || 'Not Rated' }, - { - label: "Directors Discovered", - getValue: () => { - const viewedDirectors = JSON.parse(localStorage.getItem('uniqueDirectorsViewed')) || []; - return viewedDirectors.length; - } - }, - { - label: "Actors Discovered", - getValue: () => { - const viewedActors = JSON.parse(localStorage.getItem('uniqueActorsViewed')) || []; - return viewedActors.length; - } - }, - { label: "Your Trivia Accuracy", getValue: getTriviaAccuracy }, - ]; - - let currentStatIndex = 0; - - function updateStatDisplay() { - const currentStat = stats[currentStatIndex]; - document.getElementById('stats-label').textContent = currentStat.label + ':'; - document.getElementById('stats-display').textContent = currentStat.getValue(); - currentStatIndex = (currentStatIndex + 1) % stats.length; - } - - updateStatDisplay(); - - const localTimeDiv = document.getElementById('local-time'); - let statRotationInterval = setInterval(updateStatDisplay, 3000); - - localTimeDiv.addEventListener('click', () => { - clearInterval(statRotationInterval); - updateStatDisplay(); - statRotationInterval = setInterval(updateStatDisplay, 3000); - }); -} - -function updateMovieVisitCount(movieId, movieTitle) { - let movieVisits = JSON.parse(localStorage.getItem('movieVisits')) || {}; - - if (!movieVisits[movieId]) { - movieVisits[movieId] = { count: 0, title: movieTitle }; - } - movieVisits[movieId].count += 1; - localStorage.setItem('movieVisits', JSON.stringify(movieVisits)); -} - -function getMostVisitedDirector() { - const directorVisits = JSON.parse(localStorage.getItem('directorVisits')) || {}; - let mostVisitedDirector = ''; - let maxVisits = 0; - - for (const directorId in directorVisits) { - if (directorVisits[directorId].count > maxVisits) { - mostVisitedDirector = directorVisits[directorId].name; - maxVisits = directorVisits[directorId].count; - } - } - - return mostVisitedDirector || 'Not Available'; -} - -function getMostVisitedMovie() { - const movieVisits = JSON.parse(localStorage.getItem('movieVisits')) || {}; - let mostVisitedMovie = ''; - let maxVisits = 0; - - for (const movieId in movieVisits) { - if (movieVisits[movieId].count > maxVisits) { - mostVisitedMovie = movieVisits[movieId].title; - maxVisits = movieVisits[movieId].count; - } - } - - return mostVisitedMovie || 'Not Available'; -} - -function getMostVisitedActor() { - const actorVisits = JSON.parse(localStorage.getItem('actorVisits')) || {}; - let mostVisitedActor = ''; - let maxVisits = 0; - - for (const actorId in actorVisits) { - if (actorVisits[actorId].count > maxVisits) { - mostVisitedActor = actorVisits[actorId].name; - maxVisits = actorVisits[actorId].count; - } - } - - return mostVisitedActor || 'Not Available'; -} - -function getTriviaAccuracy() { - let triviaStats = JSON.parse(localStorage.getItem('triviaStats')) || { totalCorrect: 0, totalAttempted: 0 }; - if (triviaStats.totalAttempted === 0) { - return 'No trivia attempted'; - } - - let accuracy = (triviaStats.totalCorrect / triviaStats.totalAttempted) * 100; - return `${accuracy.toFixed(1)}% accuracy`; -} - -function getMostCommonGenre() { - const favoriteGenresArray = JSON.parse(localStorage.getItem('favoriteGenres')) || []; - const genreCounts = favoriteGenresArray.reduce((acc, genre) => { - acc[genre] = (acc[genre] || 0) + 1; - return acc; - }, {}); - - let mostCommonGenre = ''; - let maxCount = 0; - - for (const genre in genreCounts) { - if (genreCounts[genre] > maxCount) { - mostCommonGenre = genre; - maxCount = genreCounts[genre]; - } - } - - return mostCommonGenre || 'Not Available'; -} - -document.addEventListener('DOMContentLoaded', rotateUserStats); - -function setStarRating(rating) { - const stars = document.querySelectorAll('.rating .star'); - stars.forEach(star => { - star.style.color = star.dataset.value > rating ? 'white' : 'gold'; - }); - - document.getElementById('rating-value').textContent = `${rating}.0/5.0`; -} - -document.querySelectorAll('.rating .star').forEach(star => { - star.addEventListener('mouseover', (e) => { - setStarRating(e.target.dataset.value); - }); - - star.addEventListener('mouseout', () => { - const movieId = localStorage.getItem('selectedMovieId'); - const savedRatings = JSON.parse(localStorage.getItem('movieRatings')) || {}; - const movieRating = savedRatings[movieId] || 0; - setStarRating(movieRating); - }); - - star.addEventListener('click', (e) => { - const movieId = localStorage.getItem('selectedMovieId'); - const rating = e.target.dataset.value; - const savedRatings = JSON.parse(localStorage.getItem('movieRatings')) || {}; - savedRatings[movieId] = rating; - localStorage.setItem('movieRatings', JSON.stringify(savedRatings)); - setStarRating(rating); - updateAverageMovieRating(movieId, rating); - window.location.reload(); - }); -}); - -function updateUniqueDirectorsViewed(directorId) { - let viewedDirectors = JSON.parse(localStorage.getItem('uniqueDirectorsViewed')) || []; - if (!viewedDirectors.includes(directorId)) { - viewedDirectors.push(directorId); - localStorage.setItem('uniqueDirectorsViewed', JSON.stringify(viewedDirectors)); - } -} - -function updateActorVisitCount(actorId, actorName) { - let actorVisits = JSON.parse(localStorage.getItem('actorVisits')) || {}; - if (!actorVisits[actorId]) { - actorVisits[actorId] = { count: 0, name: actorName }; - } - - actorVisits[actorId].count += 1; - localStorage.setItem('actorVisits', JSON.stringify(actorVisits)); -} - -function updateDirectorVisitCount(directorId, directorName) { - let directorVisits = JSON.parse(localStorage.getItem('directorVisits')) || {}; - if (!directorVisits[directorId]) { - directorVisits[directorId] = { count: 0, name: directorName }; - } - - directorVisits[directorId].count += 1; - localStorage.setItem('directorVisits', JSON.stringify(directorVisits)); -} - -document.addEventListener('DOMContentLoaded', () => { - initialMainContent = document.getElementById('main').innerHTML; - - const movieId = localStorage.getItem('selectedMovieId'); - if (movieId) { - fetchMovieDetails(movieId); - } - else { - document.getElementById('movie-details-container').innerHTML = ` -
-

Movie details not found.

-
`; - } - - document.getElementById('clear-search-btn').style.display = 'none'; - - const savedRatings = JSON.parse(localStorage.getItem('movieRatings')) || {}; - const movieRating = savedRatings[movieId] || 0; - setStarRating(movieRating); -}); - -document.getElementById('clear-search-btn').addEventListener('click', () => { - location.reload(); -}); - -function handleSignInOut() { - const isSignedIn = JSON.parse(localStorage.getItem('isSignedIn')) || false; - - if (isSignedIn) { - localStorage.setItem('isSignedIn', JSON.stringify(false)); - alert('You have been signed out.'); - } - else { - window.location.href = 'sign-in.html'; - return; - } - - updateSignInButtonState(); -} - -function updateSignInButtonState() { - const isSignedIn = JSON.parse(localStorage.getItem('isSignedIn')) || false; - - const signInText = document.getElementById('signInOutText'); - const signInIcon = document.getElementById('signInIcon'); - const signOutIcon = document.getElementById('signOutIcon'); - - if (isSignedIn) { - signInText.textContent = 'Sign Out'; - signInIcon.style.display = 'none'; - signOutIcon.style.display = 'inline-block'; - } - else { - signInText.textContent = 'Sign In'; - signInIcon.style.display = 'inline-block'; - signOutIcon.style.display = 'none'; - } -} - -document.addEventListener("DOMContentLoaded", function() { - updateSignInButtonState(); - document.getElementById('googleSignInBtn').addEventListener('click', handleSignInOut); -}); - -const twoLetterLangCodes = [ - { "code": "aa", "name": "Afar" }, - { "code": "ab", "name": "Abkhazian" }, - { "code": "ae", "name": "Avestan" }, - { "code": "af", "name": "Afrikaans" }, - { "code": "ak", "name": "Akan" }, - { "code": "am", "name": "Amharic" }, - { "code": "an", "name": "Aragonese" }, - { "code": "ar", "name": "Arabic" }, - { "code": "as", "name": "Assamese" }, - { "code": "av", "name": "Avaric" }, - { "code": "ay", "name": "Aymara" }, - { "code": "az", "name": "Azerbaijani" }, - { "code": "ba", "name": "Bashkir" }, - { "code": "be", "name": "Belarusian" }, - { "code": "bg", "name": "Bulgarian" }, - { "code": "bh", "name": "Bihari languages" }, - { "code": "bi", "name": "Bislama" }, - { "code": "bm", "name": "Bambara" }, - { "code": "bn", "name": "Bengali" }, - { "code": "bo", "name": "Tibetan" }, - { "code": "br", "name": "Breton" }, - { "code": "bs", "name": "Bosnian" }, - { "code": "ca", "name": "Catalan; Valencian" }, - { "code": "ce", "name": "Chechen" }, - { "code": "ch", "name": "Chamorro" }, - { "code": "co", "name": "Corsican" }, - { "code": "cr", "name": "Cree" }, - { "code": "cs", "name": "Czech" }, - { - "code": "cu", - "name": "Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic" - }, - { "code": "cv", "name": "Chuvash" }, - { "code": "cy", "name": "Welsh" }, - { "code": "da", "name": "Danish" }, - { "code": "de", "name": "German" }, - { "code": "dv", "name": "Divehi; Dhivehi; Maldivian" }, - { "code": "dz", "name": "Dzongkha" }, - { "code": "ee", "name": "Ewe" }, - { "code": "el", "name": "Greek, Modern (1453-)" }, - { "code": "en", "name": "English" }, - { "code": "eo", "name": "Esperanto" }, - { "code": "es", "name": "Spanish; Castilian" }, - { "code": "et", "name": "Estonian" }, - { "code": "eu", "name": "Basque" }, - { "code": "fa", "name": "Persian" }, - { "code": "ff", "name": "Fulah" }, - { "code": "fi", "name": "Finnish" }, - { "code": "fj", "name": "Fijian" }, - { "code": "fo", "name": "Faroese" }, - { "code": "fr", "name": "French" }, - { "code": "fy", "name": "Western Frisian" }, - { "code": "ga", "name": "Irish" }, - { "code": "gd", "name": "Gaelic; Scomttish Gaelic" }, - { "code": "gl", "name": "Galician" }, - { "code": "gn", "name": "Guarani" }, - { "code": "gu", "name": "Gujarati" }, - { "code": "gv", "name": "Manx" }, - { "code": "ha", "name": "Hausa" }, - { "code": "he", "name": "Hebrew" }, - { "code": "hi", "name": "Hindi" }, - { "code": "ho", "name": "Hiri Motu" }, - { "code": "hr", "name": "Croatian" }, - { "code": "ht", "name": "Haitian; Haitian Creole" }, - { "code": "hu", "name": "Hungarian" }, - { "code": "hy", "name": "Armenian" }, - { "code": "hz", "name": "Herero" }, - { - "code": "ia", - "name": "Interlingua (International Auxiliary Language Association)" - }, - { "code": "id", "name": "Indonesian" }, - { "code": "ie", "name": "Interlingue; Occidental" }, - { "code": "ig", "name": "Igbo" }, - { "code": "ii", "name": "Sichuan Yi; Nuosu" }, - { "code": "ik", "name": "Inupiaq" }, - { "code": "io", "name": "Ido" }, - { "code": "is", "name": "Icelandic" }, - { "code": "it", "name": "Italian" }, - { "code": "iu", "name": "Inuktitut" }, - { "code": "ja", "name": "Japanese" }, - { "code": "jv", "name": "Javanese" }, - { "code": "ka", "name": "Georgian" }, - { "code": "kg", "name": "Kongo" }, - { "code": "ki", "name": "Kikuyu; Gikuyu" }, - { "code": "kj", "name": "Kuanyama; Kwanyama" }, - { "code": "kk", "name": "Kazakh" }, - { "code": "kl", "name": "Kalaallisut; Greenlandic" }, - { "code": "km", "name": "Central Khmer" }, - { "code": "kn", "name": "Kannada" }, - { "code": "ko", "name": "Korean" }, - { "code": "kr", "name": "Kanuri" }, - { "code": "ks", "name": "Kashmiri" }, - { "code": "ku", "name": "Kurdish" }, - { "code": "kv", "name": "Komi" }, - { "code": "kw", "name": "Cornish" }, - { "code": "ky", "name": "Kirghiz; Kyrgyz" }, - { "code": "la", "name": "Latin" }, - { "code": "lb", "name": "Luxembourgish; Letzeburgesch" }, - { "code": "lg", "name": "Ganda" }, - { "code": "li", "name": "Limburgan; Limburger; Limburgish" }, - { "code": "ln", "name": "Lingala" }, - { "code": "lo", "name": "Lao" }, - { "code": "lt", "name": "Lithuanian" }, - { "code": "lu", "name": "Luba-Katanga" }, - { "code": "lv", "name": "Latvian" }, - { "code": "mg", "name": "Malagasy" }, - { "code": "mh", "name": "Marshallese" }, - { "code": "mi", "name": "Maori" }, - { "code": "mk", "name": "Macedonian" }, - { "code": "ml", "name": "Malayalam" }, - { "code": "mn", "name": "Mongolian" }, - { "code": "mr", "name": "Marathi" }, - { "code": "ms", "name": "Malay" }, - { "code": "mt", "name": "Maltese" }, - { "code": "my", "name": "Burmese" }, - { "code": "na", "name": "Nauru" }, - { - "code": "nb", - "name": "Bokmål, Norwegian; Norwegian Bokmål" - }, - { "code": "nd", "name": "Ndebele, North; North Ndebele" }, - { "code": "ne", "name": "Nepali" }, - { "code": "ng", "name": "Ndonga" }, - { "code": "nl", "name": "Dutch; Flemish" }, - { "code": "nn", "name": "Norwegian Nynorsk; Nynorsk, Norwegian" }, - { "code": "no", "name": "Norwegian" }, - { "code": "nr", "name": "Ndebele, South; South Ndebele" }, - { "code": "nv", "name": "Navajo; Navaho" }, - { "code": "ny", "name": "Chichewa; Chewa; Nyanja" }, - { "code": "oc", "name": "Occitan (post 1500)" }, - { "code": "oj", "name": "Ojibwa" }, - { "code": "om", "name": "Oromo" }, - { "code": "or", "name": "Oriya" }, - { "code": "os", "name": "Ossetian; Ossetic" }, - { "code": "pa", "name": "Panjabi; Punjabi" }, - { "code": "pi", "name": "Pali" }, - { "code": "pl", "name": "Polish" }, - { "code": "ps", "name": "Pushto; Pashto" }, - { "code": "pt", "name": "Portuguese" }, - { "code": "qu", "name": "Quechua" }, - { "code": "rm", "name": "Romansh" }, - { "code": "rn", "name": "Rundi" }, - { "code": "ro", "name": "Romanian; Moldavian; Moldovan" }, - { "code": "ru", "name": "Russian" }, - { "code": "rw", "name": "Kinyarwanda" }, - { "code": "sa", "name": "Sanskrit" }, - { "code": "sc", "name": "Sardinian" }, - { "code": "sd", "name": "Sindhi" }, - { "code": "se", "name": "Northern Sami" }, - { "code": "sg", "name": "Sango" }, - { "code": "si", "name": "Sinhala; Sinhalese" }, - { "code": "sk", "name": "Slovak" }, - { "code": "sl", "name": "Slovenian" }, - { "code": "sm", "name": "Samoan" }, - { "code": "sn", "name": "Shona" }, - { "code": "so", "name": "Somali" }, - { "code": "sq", "name": "Albanian" }, - { "code": "sr", "name": "Serbian" }, - { "code": "ss", "name": "Swati" }, - { "code": "st", "name": "Sotho, Southern" }, - { "code": "su", "name": "Sundanese" }, - { "code": "sv", "name": "Swedish" }, - { "code": "sw", "name": "Swahili" }, - { "code": "ta", "name": "Tamil" }, - { "code": "te", "name": "Telugu" }, - { "code": "tg", "name": "Tajik" }, - { "code": "th", "name": "Thai" }, - { "code": "ti", "name": "Tigrinya" }, - { "code": "tk", "name": "Turkmen" }, - { "code": "tl", "name": "Tagalog" }, - { "code": "tn", "name": "Tswana" }, - { "code": "to", "name": "Tonga (Tonga Islands)" }, - { "code": "tr", "name": "Turkish" }, - { "code": "ts", "name": "Tsonga" }, - { "code": "tt", "name": "Tatar" }, - { "code": "tw", "name": "Twi" }, - { "code": "ty", "name": "Tahitian" }, - { "code": "ug", "name": "Uighur; Uyghur" }, - { "code": "uk", "name": "Ukrainian" }, - { "code": "ur", "name": "Urdu" }, - { "code": "uz", "name": "Uzbek" }, - { "code": "ve", "name": "Venda" }, - { "code": "vi", "name": "Vietnamese" }, - { "code": "vo", "name": "Volapük" }, - { "code": "wa", "name": "Walloon" }, - { "code": "wo", "name": "Wolof" }, - { "code": "xh", "name": "Xhosa" }, - { "code": "yi", "name": "Yiddish" }, - { "code": "yo", "name": "Yoruba" }, - { "code": "za", "name": "Zhuang; Chuang" }, - { "code": "zh", "name": "Chinese" }, - { "code": "zu", "name": "Zulu" } -]; - -document.addEventListener("DOMContentLoaded", function() { - updateSignInButton(); - initClient(); - applySettings(); -}); - -async function fetchMovieDetails(movieId) { - const code = `${getMovieCode()}`; - const url = `https://${getMovieVerseData()}/3/movie/27205?${generateMovieNames()}${code}&append_to_response=credits,keywords,similar`; - const url2 = `https://${getMovieVerseData()}/3/movie/27205?${generateMovieNames()}${code}&append_to_response=videos`; - const imdbUrl = `https://${getMovieVerseData()}/3/movie/27205?${generateMovieNames()}${code}&append_to_response=external_ids`; - - try { - const response = await fetch(url); - const movie = await response.json(); - const imdbId = movie.imdb_id; - - fetchMovieRatings(imdbId, movie); - - const response2 = await fetch(url2); - const movie2 = await response2.json(); - const trailers = movie2.videos.results.filter(video => video.type === 'Trailer'); - - if (trailers.length > 0) { - const trailerUrl = `https://www.youtube.com/watch?v=${trailers[0].key}`; - trailerButton = createTrailerButton(trailerUrl); - positionTrailerButton(); - } - updateBrowserURL(movie.title); - } - catch (error) { - console.log('Error fetching movie details:', error); - } -} - -function getRatingDetails(rating) { - let details = { color: 'black', text: rating, description: '' }; - - switch (rating) { - case 'R': - details = { - color: 'red', - text: 'R (Restricted)', - description: ' - No one 17 and under admitted' - }; - break; - case 'PG-13': - details = { - color: 'yellow', - text: 'PG-13 (Parents Strongly Cautioned)', - description: ' - May be inappropriate for children under 13' - }; - break; - case 'PG': - details = { - color: 'orange', - text: 'PG (Parental Guidance Suggested)', - description: ' - May not be suitable for children' - }; - break; - case 'G': - details = { - color: 'green', - text: 'G (General Audiences)', - description: ' - All ages admitted' - }; - break; - case 'NC-17': - details = { - color: 'darkred', - text: 'NC-17 (Adults Only)', - description: ' - No one 17 and under admitted' - }; - break; - case 'TV-Y': - details = { - color: 'lightgreen', - text: 'TV-Y (All Children)', - description: ' - Appropriate for all children' - }; - break; - case 'TV-Y7': - details = { - color: 'lightblue', - text: 'TV-Y7 (Directed to Older Children)', - description: ' - Suitable for children ages 7 and up' - }; - break; - case 'TV-G': - details = { - color: 'green', - text: 'TV-G (General Audience)', - description: ' - Suitable for all ages' - }; - break; - case 'TV-PG': - details = { - color: 'orange', - text: 'TV-PG (Parental Guidance Suggested)', - description: ' - May not be suitable for younger children' - }; - break; - case 'TV-14': - details = { - color: 'yellow', - text: 'TV-14 (Parents Strongly Cautioned)', - description: ' - May be inappropriate for children under 14' - }; - break; - case 'TV-MA': - details = { - color: 'red', - text: 'TV-MA (Mature Audience Only)', - description: ' - Specifically designed to be viewed by adults' - }; - break; - case 'NR': - details = { - color: 'grey', - text: 'NR (Not Rated)', - description: ' - Movie has not been officially rated' - }; - break; - case 'UR': - case 'Unrated': - details = { - color: 'grey', - text: 'UR (Unrated)', - description: ' - Contains content not used in the rated version' - }; - break; - default: - details = { - color: 'white', - text: rating, - description: ' - Rating information not available' - }; - break; - } - - return details; -} - -async function fetchMovieRatings(imdbId, tmdbMovieData) { - const omdbApiKey = '2ba8e536'; - const omdbUrl = `https://www.omdbapi.com/?i=${imdbId}&apikey=${omdbApiKey}`; - - try { - const response = await fetch(omdbUrl); - const data = await response.json(); - - let imdbRating = data.imdbRating ? data.imdbRating : 'N/A'; - - if (imdbRating === 'N/A' && tmdbMovieData.vote_average) { - imdbRating = (tmdbMovieData.vote_average / 2).toFixed(1) * 2; - } - - const rtRatingObj = data.Ratings.find(rating => rating.Source === "Rotten Tomatoes"); - let rtRating = rtRatingObj ? rtRatingObj.Value : 'N/A'; - - let metascore = data.Metascore ? `${data.Metascore}/100` : 'N/A'; - let awards = data.Awards; - let rated = data.Rated ? data.Rated : 'Rating information unavailable'; - - if (awards === 'N/A') { - awards = 'No awards information available'; - } - - if (metascore === 'N/A/100') { - const metacriticsRatingValue = imdbRating !== 'N/A' ? parseFloat(imdbRating) : (tmdbMovieData.vote_average / 2); - metascore = calculateFallbackMetacriticsRating(metacriticsRatingValue, tmdbMovieData.vote_average) + '/100'; - } - - if (rtRating === 'N/A') { - const imdbRatingValue = imdbRating !== 'N/A' ? parseFloat(imdbRating) : (tmdbMovieData.vote_average / 2); - rtRating = calculateFallbackRTRating(imdbRatingValue, tmdbMovieData.vote_average) - } - populateMovieDetails(tmdbMovieData, imdbRating, rtRating, metascore, awards, rated); - } - catch (error) { - console.log('Error fetching movie ratings:', error); - const fallbackImdbRating = (tmdbMovieData.vote_average / 2).toFixed(1) * 2; - populateMovieDetails(tmdbMovieData, fallbackImdbRating, 'N/A', 'No metascore information available', 'No awards information available'); - } -} - -function updateBrowserURL(title) { - const nameSlug = createNameSlug(title); - const newURL = window.location.protocol + "//" + window.location.host + window.location.pathname + '?' + nameSlug; - window.history.replaceState({ path: newURL }, '', newURL); -} - -function createNameSlug(title) { - return title.toLowerCase().replace(/ /g, '-').replace(/[^\w-]/g, ''); -} - -function calculateFallbackRTRating(imdbRating, tmdbRating) { - const normalizedImdbRating = imdbRating * 10; - const normalizedTmdbRating = tmdbRating * 10; - - const weightImdb = 0.8; - const weightTmdb = 0.1; - - return ((normalizedImdbRating * weightImdb) + (normalizedTmdbRating * weightTmdb)).toFixed(0) + '%'; // Calculate fallback RT rating out of 100% scale (in case data is not available from OMDB) -} - -function calculateFallbackMetacriticsRating(imdbRating, tmdbRating) { - const normalizedImdbRating = imdbRating * 10; - const normalizedTmdbRating = tmdbRating * 10; - - const weightImdb = 0.8; - const weightTmdb = 0.1; - - return ((normalizedImdbRating * weightImdb) + (normalizedTmdbRating * weightTmdb)).toFixed(0); // Calculate fallback Metacritics rating out of 100 scale (in case data is not available from OMDB) -} - -let trailerIframeDisplayed = false; - -function createTrailerButton(trailerUrl) { - const trailerButton = document.createElement('button'); - trailerButton.textContent = 'Watch Trailer'; - trailerButton.title = 'Click to watch the trailer of this movie'; - - trailerButton.addEventListener('click', function() { - if (!trailerIframeDisplayed) { - showTrailerIframe(trailerUrl); - trailerButton.textContent = 'Close Trailer'; - trailerButton.title = 'Click to close the trailer'; - } - else { - closeTrailerIframe(); - trailerButton.textContent = 'Watch Trailer'; - trailerButton.title = 'Click to watch the trailer of this movie'; - } - }); - - trailerButton.classList.add('trailer-button'); - trailerButton.style.font = 'inherit'; - - return trailerButton; -} - -function closeTrailerIframe() { - const iframeContainer = document.querySelector('.trailer-button + div'); - - if (iframeContainer) { - iframeContainer.style.height = '0'; - setTimeout(() => iframeContainer.remove(), 500); - } - trailerIframeDisplayed = false; -} - -function getYouTubeVideoId(url) { - const urlObj = new URL(url); - return urlObj.searchParams.get('v'); -} - -function positionTrailerButton() { - if (!trailerButton) - return; - - if (window.innerWidth <= 900) { - const movieDescription = document.getElementById('movie-description'); - movieDescription.parentNode.insertBefore(trailerButton, movieDescription); - } - else { - const movieRating = document.getElementById('movie-rating'); - movieRating.parentNode.insertBefore(trailerButton, movieRating.nextSibling); - } -} - -document.addEventListener('DOMContentLoaded', positionTrailerButton); - -function showTrailerIframe(trailerUrl) { - trailerUrlGlobal = trailerUrl; - - const iframeContainer = document.createElement('div'); - iframeContainer.style.position = 'relative'; - iframeContainer.style.width = '400px'; - iframeContainer.style.margin = '0 auto'; - iframeContainer.style.overflow = 'hidden'; - iframeContainer.style.height = '0'; - iframeContainer.style.transition = 'height 0.5s ease-in-out'; - - const iframe = document.createElement('iframe'); - iframe.setAttribute('src', `https://www.youtube.com/embed/${getYouTubeVideoId(trailerUrl)}?autoplay=1`); - iframe.setAttribute('width', '100%'); - iframe.setAttribute('height', '315'); - iframe.setAttribute('frameborder', '0'); - iframe.setAttribute('allow', 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture'); - iframe.setAttribute('allowfullscreen', true); - - iframeContainer.appendChild(iframe); - - const trailerButton = document.querySelector('.trailer-button'); - trailerButton.parentNode.insertBefore(iframeContainer, trailerButton.nextSibling); - - setTimeout(() => iframeContainer.style.height = '315px', 50); - - trailerIframeDisplayed = true; -} - -function toggleFavorite(movie) { - let favorites = JSON.parse(localStorage.getItem('favorites')) || []; - let favoriteGenres = JSON.parse(localStorage.getItem('favoriteGenres')) || {}; - - if (favorites.includes(movie.id)) { - favorites = favorites.filter(favId => favId !== movie.id); - movie.genres.forEach(genre => { - favoriteGenres[genre.name] = favoriteGenres[genre.name] ? favoriteGenres[genre.name] - 1 : 0; - }); - } - else { - favorites.push(movie.id); - movie.genres.forEach(genre => { - favoriteGenres[genre.name] = favoriteGenres[genre.name] ? favoriteGenres[genre.name] + 1 : 1; - }); - } - - localStorage.setItem('favorites', JSON.stringify(favorites)); - localStorage.setItem('favoriteGenres', JSON.stringify(favoriteGenres)); - - updateFavoriteButton(movie.id); -} - -function updateFavoriteButton(movieId) { - const favorites = JSON.parse(localStorage.getItem('favorites')) || []; - const favoriteButton = document.getElementById('favorite-btn'); - - if (favorites.includes(movieId)) { - favoriteButton.classList.add('favorited'); - favoriteButton.style.backgroundColor = 'grey'; - favoriteButton.title = 'Remove from favorites'; - } - else { - favoriteButton.classList.remove('favorited'); - favoriteButton.style.background = 'transparent'; - favoriteButton.title = 'Add to favorites'; - } -} - -function getRtSlug(title) { - return title.toLowerCase() - .replace(/:/g, '') - .replace(/part one/g, 'part_1') - .replace(/-/g, '') - .replace(/&/g, 'and') - .replace(/ /g, '_') - .replace(/[^\w-]/g, ''); -} - -function createMetacriticSlug(title) { - return title.toLowerCase() - .replace(/part\sone/g, 'part-1') - .replace(/:|_|-|\s/g, '-') - .replace(/&/g, 'and') - .replace(/--+/g, '-') - .replace(/[^\w-]/g, ''); -} - -function populateMovieDetails(movie, imdbRating, rtRating, metascore, awards, rated) { - document.getElementById('movie-image').src = `https://image.tmdb.org/t/p/w1280${movie.poster_path}`; - document.getElementById('movie-title').textContent = movie.title; - - const movieRating = movie.vote_average.toFixed(1); - const imdbLink = `https://www.imdb.com/title/${movie.imdb_id}`; - - const rtLink = rtRating !== 'N/A' ? `https://www.rottentomatoes.com/m/${getRtSlug(movie.title)}` : '#'; - const metaCriticsLink = metascore !== 'N/A' ? `https://www.metacritic.com/movie/${createMetacriticSlug(movie.title)}` : '#'; - - const ratingDetails = getRatingDetails(rated); - const ratedElement = rated ? `

Rated: ${ratingDetails.text}${ratingDetails.description}

` : ''; - - document.getElementById('movie-rating').innerHTML = ` - IMDB Rating: ${imdbRating} - `; - document.getElementById('movie-rating').style.marginTop = '120px'; - document.title = movie.title + " - Movie Details"; - - const movieImage = document.getElementById('movie-image'); - const movieDescription = document.getElementById('movie-description'); - - const metascoreElement = metascore ? `

Metascore: ${metascore}

` : ''; - const awardsElement = awards ? `

Awards: ${awards}

` : ''; - - if (movie.poster_path) { - movieImage.src = IMGPATH + movie.poster_path; - movieImage.alt = movie.title; - } - else { - movieImage.style.display = 'none'; - const noImageText = document.createElement('h2'); - noImageText.textContent = 'Movie Image Not Available'; - noImageText.style.textAlign = 'center'; - document.querySelector('.movie-left').appendChild(noImageText); - } - - const fullLanguage = twoLetterLangCodes.find(lang => lang.code === movie.original_language).name; - const overview = movie.overview; - const genres = movie.genres.map(genre => genre.name).join(', '); - const releaseDate = movie.release_date; - - const budget = movie.budget === 0 ? 'Information Not Available' : `$${movie.budget.toLocaleString()}`; - const revenue = movie.revenue <= 1000 ? 'Information Not Available' : `$${movie.revenue.toLocaleString()}`; - const tagline = movie.tagline ? movie.tagline : 'No tagline found'; - const languages = movie.spoken_languages.map(lang => lang.name).join(', '); - - const countries = movie.production_countries.map(country => country.name).join(', '); - const originalLanguage = fullLanguage; - const popularityScore = movie.popularity.toFixed(0); - const status = movie.status; - - const voteCount = movie.vote_count.toLocaleString(); - let keywords = movie.keywords ? movie.keywords.keywords.map(kw => kw.name).join(', ') : 'None Available'; - const similarTitles = movie.similar ? movie.similar.results.map(m => m.title).join(', ') : 'None Available'; - const scaledRating = (movie.vote_average / 2).toFixed(1); - - if (keywords.length === 0) { - keywords = 'None Available'; - } - - const popularityThreshold = 80; - const isPopular = movie.popularity >= popularityThreshold; - const popularityText = isPopular ? `${popularityScore} (This movie is popular)` : `${popularityScore} (This movie is unpopular)`; - - const adultContentIndicator = movie.adult - ? `Adult Content` - : `General Audience`; - - const movieStatus = `

Status: ${movie.status}

`; - - const runtime = movie.runtime > 0 - ? movie.runtime + ' minutes' - : 'Runtime Info Not Available'; - - document.getElementById('movie-description').innerHTML += ` -

Description: ${overview}

-

Genres: ${genres}

- ${ratedElement} - ${movieStatus} -

Release Date: ${releaseDate}

-

Runtime: ${runtime}

-

Budget: ${budget}

-

Revenue: ${revenue}

-

Languages: ${languages}

-

Countries of Production: ${countries}

-

Original Language: ${originalLanguage}

-

Popularity Score: ${popularityText}

-

Averaged User Ratings: ${scaledRating}/5.0 (based on ${movie.vote_count} votes)

- ${awardsElement} - ${metascoreElement} -

Rotten Tomatoes: ${rtRating}

-

Tagline: ${tagline}

- `; - - if (movie.credits && movie.credits.crew) { - const director = movie.credits.crew.find(member => member.job === 'Director'); - if (director) { - const directorAge = director.birthday ? calculateAge(director.birthday) : 'N/A'; - const directorElement = document.createElement('p'); - directorElement.innerHTML = `Director: ${director.name}`; - directorElement.querySelector('.director-link').addEventListener('click', (e) => { - e.preventDefault(); - localStorage.setItem('selectedDirectorId', director.id); - document.title = `${director.name} - Director's Details`; - window.location.href = 'director-details.html'; - updateUniqueDirectorsViewed(director.id); - updateDirectorVisitCount(director.id, director.name); - }); - document.getElementById('movie-description').appendChild(directorElement); - } - } - - const castHeading = document.createElement('p'); - castHeading.innerHTML = 'Cast: '; - document.getElementById('movie-description').appendChild(castHeading); - - if (movie.credits && movie.credits.cast.length > 0) { - const topTenCast = movie.credits.cast.slice(0, 10); - topTenCast.forEach((actor, index) => { - const actorLink = document.createElement('span'); - actorLink.textContent = actor.name; - actorLink.classList.add('actor-link'); - actorLink.addEventListener('click', () => { - localStorage.setItem('selectedActorId', actor.id); - window.location.href = 'actor-details.html'; - updateUniqueActorsViewed(actor.id); - updateActorVisitCount(actor.id, actor.name); - }); - - castHeading.appendChild(actorLink); - - if (index < topTenCast.length - 1) { - castHeading.appendChild(document.createTextNode(', ')); - } - }); - } - else { - castHeading.appendChild(document.createTextNode('None available.')); - } - - const productionCompanies = movie.production_companies; - const productionCompaniesElement = document.createElement('p'); - productionCompaniesElement.innerHTML = 'Production Companies: '; - - if (productionCompanies.length === 0) { - productionCompaniesElement.innerHTML += 'None available.'; - } - productionCompanies.forEach((company, index) => { - const companyLink = document.createElement('a'); - companyLink.textContent = company.name; - companyLink.style.cursor = 'pointer'; - companyLink.style.textDecoration = 'underline'; - companyLink.href = '#'; - companyLink.classList.add('company-link'); - companyLink.addEventListener('click', (e) => { - e.preventDefault(); - localStorage.setItem('selectedCompanyId', company.id); - window.location.href = 'company-details.html'; - updateUniqueCompaniesViewed(company.id); - }); - - productionCompaniesElement.appendChild(companyLink); - - if (index < productionCompanies.length - 1) { - productionCompaniesElement.appendChild(document.createTextNode(', ')); - } - }); - - document.getElementById('movie-description').appendChild(productionCompaniesElement); - const similarMoviesHeading = document.createElement('p'); - - similarMoviesHeading.innerHTML = 'Similar Movies: '; - document.getElementById('movie-description').appendChild(similarMoviesHeading); - - if (movie.similar && movie.similar.results.length > 0) { - movie.similar.results.forEach((similarMovie, index) => { - const movieLink = document.createElement('span'); - movieLink.textContent = similarMovie.title; - movieLink.style.cursor = 'pointer'; - movieLink.style.textDecoration = 'underline'; - movieLink.addEventListener('mouseenter', () => { - movieLink.style.color = '#f509d9'; - }); - - movieLink.addEventListener('mouseleave', () => { - movieLink.style.color = getSavedTextColor(); - }); - - movieLink.addEventListener('click', () => { - localStorage.setItem('selectedMovieId', similarMovie.id); - window.location.href = 'movie-details.html'; - }); - - similarMoviesHeading.appendChild(movieLink); - - if (index < movie.similar.results.length - 1) { - similarMoviesHeading.appendChild(document.createTextNode(', ')); - } - }); - } - else { - similarMoviesHeading.appendChild(document.createTextNode('None available.')); - } - - const keywordsElement = document.createElement('p'); - keywordsElement.innerHTML = `Keywords: ${keywords}`; - - movieDescription.appendChild(keywordsElement); - updateFavoriteButton(movie.id); - - favoriteButton.addEventListener('click', () => { - toggleFavorite(movie); - updateMoviesFavorited(movie.id); - window.location.reload(); - }); - - updateMoviesFavorited(movie.id); - applySettings(); -} - -function getSavedTextColor() { - return localStorage.getItem('textColor') || 'white'; -} - -function updateMoviesFavorited(movieId) { - let favoritedMovies = JSON.parse(localStorage.getItem('moviesFavorited')) || []; - if (!favoritedMovies.includes(movieId)) { - favoritedMovies.push(movieId); - localStorage.setItem('moviesFavorited', JSON.stringify(favoritedMovies)); - } -} - -function updateAverageMovieRating(movieId, newRating) { - const savedRatings = JSON.parse(localStorage.getItem('movieRatings')) || {}; - - savedRatings[movieId] = newRating; - localStorage.setItem('movieRatings', JSON.stringify(savedRatings)); - - let totalRating = 0; - let totalMoviesRated = 0; - - for (let id in savedRatings) { - totalRating += parseFloat(savedRatings[id]); - totalMoviesRated++; - } - let averageRating = totalMoviesRated > 0 ? (totalRating / totalMoviesRated) : 0; - localStorage.setItem('averageMovieRating', averageRating.toFixed(1).toString()); -} - -async function showMovieOfTheDay() { - const year = new Date().getFullYear(); - const url = `https://${getMovieVerseData()}/3/discover/movie?${generateMovieNames()}${getMovieCode()}&sort_by=vote_average.desc&vote_count.gte=100&primary_release_year=${year}&vote_average.gte=7`; - - try { - const response = await fetch(url); - const data = await response.json(); - const movies = data.results; - - if (movies.length > 0) { - const randomMovie = movies[Math.floor(Math.random() * movies.length)]; - localStorage.setItem('selectedMovieId', randomMovie.id); - window.location.href = 'movie-details.html'; - } - else { - fallbackMovieSelection(); - } - } - catch (error) { - console.log('Error fetching movie:', error); - fallbackMovieSelection(); - } -} - -function updateUniqueActorsViewed(actorId) { - let viewedActors = JSON.parse(localStorage.getItem('uniqueActorsViewed')) || []; - if (!viewedActors.includes(actorId)) { - viewedActors.push(actorId); - localStorage.setItem('uniqueActorsViewed', JSON.stringify(viewedActors)); - } -} - -function updateUniqueCompaniesViewed(companyId) { - let viewedCompanies = JSON.parse(localStorage.getItem('uniqueCompaniesViewed')) || []; - if (!viewedCompanies.includes(companyId)) { - viewedCompanies.push(companyId); - localStorage.setItem('uniqueCompaniesViewed', JSON.stringify(viewedCompanies)); - } -} - -function getMovieVerseData(input) { - return String.fromCharCode(97, 112, 105, 46, 116, 104, 101, 109, 111, 118, 105, 101, 100, 98, 46, 111, 114, 103); -} - -function fallbackMovieSelection() { - const fallbackMovies = [432413, 299534, 1726, 562, 118340, 455207, 493922, 447332, 22970, 530385, 27205, 264660, 120467, 603, 577922, 76341, 539, 419704, 515001, 118340, 424, 98]; - const randomFallbackMovie = fallbackMovies[Math.floor(Math.random() * fallbackMovies.length)]; - localStorage.setItem('selectedMovieId', randomFallbackMovie); - window.location.href = 'movie-details.html'; -} - -function applySettings() { - const savedBg = localStorage.getItem('backgroundImage'); - const savedTextColor = localStorage.getItem('textColor'); - const savedFontSize = localStorage.getItem('fontSize'); - - if (savedBg) { - document.body.style.backgroundImage = `url('${savedBg}')`; - } - if (savedTextColor) { - applyTextColor(savedTextColor); - } - if (savedFontSize) { - const size = savedFontSize === 'small' ? '12px' : savedFontSize === 'medium' ? '16px' : '20px'; - document.body.style.fontSize = size; - } -} - -function applyTextColor(color) { - document.querySelectorAll('h1, h2, h3, p, a, span, div, button, input, select, textarea, label, li') - .forEach(element => { - element.style.color = color; - }); -} \ No newline at end of file diff --git a/MovieVerse-Mobile/app/js/index.ejs b/MovieVerse-Mobile/app/js/index.ejs deleted file mode 100644 index 3689fa2f..00000000 --- a/MovieVerse-Mobile/app/js/index.ejs +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - The MovieVerse Database - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
- - - - - -
-
-
-

The MovieVerse Database

-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/MovieVerse-Mobile/app/js/movie-details.js b/MovieVerse-Mobile/app/js/movie-details.js deleted file mode 100644 index 13a604c8..00000000 --- a/MovieVerse-Mobile/app/js/movie-details.js +++ /dev/null @@ -1,1520 +0,0 @@ -const search = document.getElementById("search"); -const searchButton = document.getElementById("button-search"); - -function showSpinner() { - document.getElementById('myModal').classList.add('modal-visible'); -} - -function hideSpinner() { - document.getElementById('myModal').classList.remove('modal-visible'); -} - -const movieCode = { - part1: 'YzVhMjBjODY=', - part2: 'MWFjZjdiYjg=', - part3: 'ZDllOTg3ZGNjN2YxYjU1OA==' -}; - -function getMovieCode() { - return atob(movieCode.part1) + atob(movieCode.part2) + atob(movieCode.part3); -} - -function generateMovieNames(input) { - return String.fromCharCode(97, 112, 105, 95, 107, 101, 121, 61); -} - -const form = document.getElementById("form1"); -const SEARCHPATH = `https://${getMovieVerseData()}/3/search/movie?&${generateMovieNames()}${getMovieCode()}&query=`; - -const main = document.getElementById("main"); -const IMGPATH = "https://image.tmdb.org/t/p/w780"; -const favoriteButton = document.getElementById("favorite-btn"); -const searchTitle = document.getElementById("search-title"); - -let trailerUrlGlobal; -let initialMainContent; -let trailerButton; - -function getClassByRate(vote){ - if (vote >= 8) { - return 'green'; - } - else if (vote >= 5) { - return 'orange'; - } - else { - return 'red'; - } -} - -form.addEventListener('submit', (e) => { - e.preventDefault(); - const searchQuery = document.getElementById('search').value; - localStorage.setItem('searchQuery', searchQuery); - window.location.href = 'search.html'; -}); - -function handleSearch() { - const searchQuery = document.getElementById('search').value; - localStorage.setItem('searchQuery', searchQuery); - window.location.href = 'search.html'; -} - -async function ensureGenreMapIsAvailable() { - if (!localStorage.getItem('genreMap')) { - await fetchGenreMap(); - } -} - -async function fetchGenreMap() { - const url = `https://${getMovieVerseData()}/3/genre/movie/list?${generateMovieNames()}${getMovieCode()}`; - try { - const response = await fetch(url); - const data = await response.json(); - const genreMap = data.genres.reduce((map, genre) => { - map[genre.id] = genre.name; - return map; - }, {}); - localStorage.setItem('genreMap', JSON.stringify(genreMap)); - console.log(genreMap) - } - catch (error) { - console.log('Error fetching genre map:', error); - } -} - -async function rotateUserStats() { - await ensureGenreMapIsAvailable(); - - const stats = [ - { - label: "Your Current Time", - getValue: () => { - const now = new Date(); - let hours = now.getHours(); - let minutes = now.getMinutes(); - hours = hours < 10 ? '0' + hours : hours; - minutes = minutes < 10 ? '0' + minutes : minutes; - return `${hours}:${minutes}`; - } - }, - { label: "Most Visited Movie", getValue: getMostVisitedMovie }, - { label: "Most Visited Director", getValue: getMostVisitedDirector }, - { label: "Most Visited Actor", getValue: getMostVisitedActor }, - { - label: "Movies Discovered", - getValue: () => { - const viewedMovies = JSON.parse(localStorage.getItem('uniqueMoviesViewed')) || []; - return viewedMovies.length; - } - }, - { - label: "Favorite Movies", - getValue: () => { - const favoritedMovies = JSON.parse(localStorage.getItem('moviesFavorited')) || []; - return favoritedMovies.length; - } - }, - { - label: "Favorite Genre", - getValue: () => { - const mostCommonGenreCode = getMostCommonGenre(); - const genreMapString = localStorage.getItem('genreMap'); - if (!genreMapString) { - console.log('No genre map found in localStorage.'); - return 'Not Available'; - } - - let genreMap; - try { - genreMap = JSON.parse(genreMapString); - } - catch (e) { - console.log('Error parsing genre map:', e); - return 'Not Available'; - } - - let genreObject; - if (Array.isArray(genreMap)) { - genreObject = genreMap.reduce((acc, genre) => { - acc[genre.id] = genre.name; - return acc; - }, {}); - } - else if (typeof genreMap === 'object' && genreMap !== null) { - genreObject = genreMap; - } - else { - console.log('genreMap is neither an array nor a proper object:', genreMap); - return 'Not Available'; - } - - return genreObject[mostCommonGenreCode] || 'Not Available'; - } - }, - { label: "Watchlists Created", getValue: () => localStorage.getItem('watchlistsCreated') || 0 }, - { label: "Average Movie Rating", getValue: () => localStorage.getItem('averageMovieRating') || 'Not Rated' }, - { - label: "Directors Discovered", - getValue: () => { - const viewedDirectors = JSON.parse(localStorage.getItem('uniqueDirectorsViewed')) || []; - return viewedDirectors.length; - } - }, - { - label: "Actors Discovered", - getValue: () => { - const viewedActors = JSON.parse(localStorage.getItem('uniqueActorsViewed')) || []; - return viewedActors.length; - } - }, - { label: "Your Trivia Accuracy", getValue: getTriviaAccuracy }, - ]; - - let currentStatIndex = 0; - - function updateStatDisplay() { - const currentStat = stats[currentStatIndex]; - document.getElementById('stats-label').textContent = currentStat.label + ':'; - document.getElementById('stats-display').textContent = currentStat.getValue(); - currentStatIndex = (currentStatIndex + 1) % stats.length; - } - - updateStatDisplay(); - - const localTimeDiv = document.getElementById('local-time'); - let statRotationInterval = setInterval(updateStatDisplay, 3000); - - localTimeDiv.addEventListener('click', () => { - clearInterval(statRotationInterval); - updateStatDisplay(); - statRotationInterval = setInterval(updateStatDisplay, 3000); - }); -} - -function updateMovieVisitCount(movieId, movieTitle) { - let movieVisits = JSON.parse(localStorage.getItem('movieVisits')) || {}; - let uniqueMoviesViewed = JSON.parse(localStorage.getItem('uniqueMoviesViewed')) || []; - - if (!movieVisits[movieId]) { - movieVisits[movieId] = { count: 0, title: movieTitle }; - } - movieVisits[movieId].count += 1; - - if (!uniqueMoviesViewed.includes(movieId)) { - uniqueMoviesViewed.push(movieId); - } - - localStorage.setItem('movieVisits', JSON.stringify(movieVisits)); - localStorage.setItem('uniqueMoviesViewed', JSON.stringify(uniqueMoviesViewed)); -} - -function getMostVisitedDirector() { - const directorVisits = JSON.parse(localStorage.getItem('directorVisits')) || {}; - let mostVisitedDirector = ''; - let maxVisits = 0; - - for (const directorId in directorVisits) { - if (directorVisits[directorId].count > maxVisits) { - mostVisitedDirector = directorVisits[directorId].name; - maxVisits = directorVisits[directorId].count; - } - } - - return mostVisitedDirector || 'Not Available'; -} - -function getMostVisitedMovie() { - const movieVisits = JSON.parse(localStorage.getItem('movieVisits')) || {}; - let mostVisitedMovie = ''; - let maxVisits = 0; - - for (const movieId in movieVisits) { - if (movieVisits[movieId].count > maxVisits) { - mostVisitedMovie = movieVisits[movieId].title; - maxVisits = movieVisits[movieId].count; - } - } - - return mostVisitedMovie || 'Not Available'; -} - -function getMostVisitedActor() { - const actorVisits = JSON.parse(localStorage.getItem('actorVisits')) || {}; - let mostVisitedActor = ''; - let maxVisits = 0; - - for (const actorId in actorVisits) { - if (actorVisits[actorId].count > maxVisits) { - mostVisitedActor = actorVisits[actorId].name; - maxVisits = actorVisits[actorId].count; - } - } - - return mostVisitedActor || 'Not Available'; -} - -function getTriviaAccuracy() { - let triviaStats = JSON.parse(localStorage.getItem('triviaStats')) || { totalCorrect: 0, totalAttempted: 0 }; - if (triviaStats.totalAttempted === 0) { - return 'No trivia attempted'; - } - - let accuracy = (triviaStats.totalCorrect / triviaStats.totalAttempted) * 100; - return `${accuracy.toFixed(1)}% accuracy`; -} - -function getMostCommonGenre() { - const favoriteGenresArray = JSON.parse(localStorage.getItem('favoriteGenres')) || []; - const genreCounts = favoriteGenresArray.reduce((acc, genre) => { - acc[genre] = (acc[genre] || 0) + 1; - return acc; - }, {}); - - let mostCommonGenre = ''; - let maxCount = 0; - - for (const genre in genreCounts) { - if (genreCounts[genre] > maxCount) { - mostCommonGenre = genre; - maxCount = genreCounts[genre]; - } - } - - return mostCommonGenre || 'Not Available'; -} - -document.addEventListener('DOMContentLoaded', rotateUserStats); - -function updateUniqueDirectorsViewed(directorId) { - let viewedDirectors = JSON.parse(localStorage.getItem('uniqueDirectorsViewed')) || []; - if (!viewedDirectors.includes(directorId)) { - viewedDirectors.push(directorId); - localStorage.setItem('uniqueDirectorsViewed', JSON.stringify(viewedDirectors)); - } -} - -function updateActorVisitCount(actorId, actorName) { - let actorVisits = JSON.parse(localStorage.getItem('actorVisits')) || {}; - if (!actorVisits[actorId]) { - actorVisits[actorId] = { count: 0, name: actorName }; - } - - actorVisits[actorId].count += 1; - localStorage.setItem('actorVisits', JSON.stringify(actorVisits)); -} - -function updateDirectorVisitCount(directorId, directorName) { - let directorVisits = JSON.parse(localStorage.getItem('directorVisits')) || {}; - if (!directorVisits[directorId]) { - directorVisits[directorId] = { count: 0, name: directorName }; - } - - directorVisits[directorId].count += 1; - localStorage.setItem('directorVisits', JSON.stringify(directorVisits)); -} - -document.addEventListener('DOMContentLoaded', () => { - showSpinner(); - initialMainContent = document.getElementById('main').innerHTML; - - const movieId = localStorage.getItem('selectedMovieId'); - if (movieId) { - fetchMovieDetails(movieId); - } - else { - fetchMovieDetails(1011985) - } - - hideSpinner(); -}); - -function handleSignInOut() { - const isSignedIn = JSON.parse(localStorage.getItem('isSignedIn')) || false; - - if (isSignedIn) { - localStorage.setItem('isSignedIn', JSON.stringify(false)); - alert('You have been signed out.'); - } - else { - window.location.href = 'sign-in.html'; - return; - } - - updateSignInButtonState(); -} - -function updateSignInButtonState() { - const isSignedIn = JSON.parse(localStorage.getItem('isSignedIn')) || false; - - const signInText = document.getElementById('signInOutText'); - const signInIcon = document.getElementById('signInIcon'); - const signOutIcon = document.getElementById('signOutIcon'); - - if (isSignedIn) { - signInText.textContent = 'Sign Out'; - signInIcon.style.display = 'none'; - signOutIcon.style.display = 'inline-block'; - } - else { - signInText.textContent = 'Sign In'; - signInIcon.style.display = 'inline-block'; - signOutIcon.style.display = 'none'; - } -} - -document.addEventListener("DOMContentLoaded", function() { - showSpinner(); - updateSignInButtonState(); - document.getElementById('googleSignInBtn').addEventListener('click', handleSignInOut); - hideSpinner(); -}); - -const twoLetterLangCodes = [ - { "code": "aa", "name": "Afar" }, - { "code": "ab", "name": "Abkhazian" }, - { "code": "ae", "name": "Avestan" }, - { "code": "af", "name": "Afrikaans" }, - { "code": "ak", "name": "Akan" }, - { "code": "am", "name": "Amharic" }, - { "code": "an", "name": "Aragonese" }, - { "code": "ar", "name": "Arabic" }, - { "code": "as", "name": "Assamese" }, - { "code": "av", "name": "Avaric" }, - { "code": "ay", "name": "Aymara" }, - { "code": "az", "name": "Azerbaijani" }, - { "code": "ba", "name": "Bashkir" }, - { "code": "be", "name": "Belarusian" }, - { "code": "bg", "name": "Bulgarian" }, - { "code": "bh", "name": "Bihari languages" }, - { "code": "bi", "name": "Bislama" }, - { "code": "bm", "name": "Bambara" }, - { "code": "bn", "name": "Bengali" }, - { "code": "bo", "name": "Tibetan" }, - { "code": "br", "name": "Breton" }, - { "code": "bs", "name": "Bosnian" }, - { "code": "ca", "name": "Catalan; Valencian" }, - { "code": "ce", "name": "Chechen" }, - { "code": "ch", "name": "Chamorro" }, - { "code": "co", "name": "Corsican" }, - { "code": "cr", "name": "Cree" }, - { "code": "cs", "name": "Czech" }, - { - "code": "cu", - "name": "Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic" - }, - { "code": "cv", "name": "Chuvash" }, - { "code": "cy", "name": "Welsh" }, - { "code": "da", "name": "Danish" }, - { "code": "de", "name": "German" }, - { "code": "dv", "name": "Divehi; Dhivehi; Maldivian" }, - { "code": "dz", "name": "Dzongkha" }, - { "code": "ee", "name": "Ewe" }, - { "code": "el", "name": "Greek, Modern (1453-)" }, - { "code": "en", "name": "English" }, - { "code": "eo", "name": "Esperanto" }, - { "code": "es", "name": "Spanish; Castilian" }, - { "code": "et", "name": "Estonian" }, - { "code": "eu", "name": "Basque" }, - { "code": "fa", "name": "Persian" }, - { "code": "ff", "name": "Fulah" }, - { "code": "fi", "name": "Finnish" }, - { "code": "fj", "name": "Fijian" }, - { "code": "fo", "name": "Faroese" }, - { "code": "fr", "name": "French" }, - { "code": "fy", "name": "Western Frisian" }, - { "code": "ga", "name": "Irish" }, - { "code": "gd", "name": "Gaelic; Scomttish Gaelic" }, - { "code": "gl", "name": "Galician" }, - { "code": "gn", "name": "Guarani" }, - { "code": "gu", "name": "Gujarati" }, - { "code": "gv", "name": "Manx" }, - { "code": "ha", "name": "Hausa" }, - { "code": "he", "name": "Hebrew" }, - { "code": "hi", "name": "Hindi" }, - { "code": "ho", "name": "Hiri Motu" }, - { "code": "hr", "name": "Croatian" }, - { "code": "ht", "name": "Haitian; Haitian Creole" }, - { "code": "hu", "name": "Hungarian" }, - { "code": "hy", "name": "Armenian" }, - { "code": "hz", "name": "Herero" }, - { - "code": "ia", - "name": "Interlingua (International Auxiliary Language Association)" - }, - { "code": "id", "name": "Indonesian" }, - { "code": "ie", "name": "Interlingue; Occidental" }, - { "code": "ig", "name": "Igbo" }, - { "code": "ii", "name": "Sichuan Yi; Nuosu" }, - { "code": "ik", "name": "Inupiaq" }, - { "code": "io", "name": "Ido" }, - { "code": "is", "name": "Icelandic" }, - { "code": "it", "name": "Italian" }, - { "code": "iu", "name": "Inuktitut" }, - { "code": "ja", "name": "Japanese" }, - { "code": "jv", "name": "Javanese" }, - { "code": "ka", "name": "Georgian" }, - { "code": "kg", "name": "Kongo" }, - { "code": "ki", "name": "Kikuyu; Gikuyu" }, - { "code": "kj", "name": "Kuanyama; Kwanyama" }, - { "code": "kk", "name": "Kazakh" }, - { "code": "kl", "name": "Kalaallisut; Greenlandic" }, - { "code": "km", "name": "Central Khmer" }, - { "code": "kn", "name": "Kannada" }, - { "code": "ko", "name": "Korean" }, - { "code": "kr", "name": "Kanuri" }, - { "code": "ks", "name": "Kashmiri" }, - { "code": "ku", "name": "Kurdish" }, - { "code": "kv", "name": "Komi" }, - { "code": "kw", "name": "Cornish" }, - { "code": "ky", "name": "Kirghiz; Kyrgyz" }, - { "code": "la", "name": "Latin" }, - { "code": "lb", "name": "Luxembourgish; Letzeburgesch" }, - { "code": "lg", "name": "Ganda" }, - { "code": "li", "name": "Limburgan; Limburger; Limburgish" }, - { "code": "ln", "name": "Lingala" }, - { "code": "lo", "name": "Lao" }, - { "code": "lt", "name": "Lithuanian" }, - { "code": "lu", "name": "Luba-Katanga" }, - { "code": "lv", "name": "Latvian" }, - { "code": "mg", "name": "Malagasy" }, - { "code": "mh", "name": "Marshallese" }, - { "code": "mi", "name": "Maori" }, - { "code": "mk", "name": "Macedonian" }, - { "code": "ml", "name": "Malayalam" }, - { "code": "mn", "name": "Mongolian" }, - { "code": "mr", "name": "Marathi" }, - { "code": "ms", "name": "Malay" }, - { "code": "mt", "name": "Maltese" }, - { "code": "my", "name": "Burmese" }, - { "code": "na", "name": "Nauru" }, - { - "code": "nb", - "name": "Bokmål, Norwegian; Norwegian Bokmål" - }, - { "code": "nd", "name": "Ndebele, North; North Ndebele" }, - { "code": "ne", "name": "Nepali" }, - { "code": "ng", "name": "Ndonga" }, - { "code": "nl", "name": "Dutch; Flemish" }, - { "code": "nn", "name": "Norwegian Nynorsk; Nynorsk, Norwegian" }, - { "code": "no", "name": "Norwegian" }, - { "code": "nr", "name": "Ndebele, South; South Ndebele" }, - { "code": "nv", "name": "Navajo; Navaho" }, - { "code": "ny", "name": "Chichewa; Chewa; Nyanja" }, - { "code": "oc", "name": "Occitan (post 1500)" }, - { "code": "oj", "name": "Ojibwa" }, - { "code": "om", "name": "Oromo" }, - { "code": "or", "name": "Oriya" }, - { "code": "os", "name": "Ossetian; Ossetic" }, - { "code": "pa", "name": "Panjabi; Punjabi" }, - { "code": "pi", "name": "Pali" }, - { "code": "pl", "name": "Polish" }, - { "code": "ps", "name": "Pushto; Pashto" }, - { "code": "pt", "name": "Portuguese" }, - { "code": "qu", "name": "Quechua" }, - { "code": "rm", "name": "Romansh" }, - { "code": "rn", "name": "Rundi" }, - { "code": "ro", "name": "Romanian; Moldavian; Moldovan" }, - { "code": "ru", "name": "Russian" }, - { "code": "rw", "name": "Kinyarwanda" }, - { "code": "sa", "name": "Sanskrit" }, - { "code": "sc", "name": "Sardinian" }, - { "code": "sd", "name": "Sindhi" }, - { "code": "se", "name": "Northern Sami" }, - { "code": "sg", "name": "Sango" }, - { "code": "si", "name": "Sinhala; Sinhalese" }, - { "code": "sk", "name": "Slovak" }, - { "code": "sl", "name": "Slovenian" }, - { "code": "sm", "name": "Samoan" }, - { "code": "sn", "name": "Shona" }, - { "code": "so", "name": "Somali" }, - { "code": "sq", "name": "Albanian" }, - { "code": "sr", "name": "Serbian" }, - { "code": "ss", "name": "Swati" }, - { "code": "st", "name": "Sotho, Southern" }, - { "code": "su", "name": "Sundanese" }, - { "code": "sv", "name": "Swedish" }, - { "code": "sw", "name": "Swahili" }, - { "code": "ta", "name": "Tamil" }, - { "code": "te", "name": "Telugu" }, - { "code": "tg", "name": "Tajik" }, - { "code": "th", "name": "Thai" }, - { "code": "ti", "name": "Tigrinya" }, - { "code": "tk", "name": "Turkmen" }, - { "code": "tl", "name": "Tagalog" }, - { "code": "tn", "name": "Tswana" }, - { "code": "to", "name": "Tonga (Tonga Islands)" }, - { "code": "tr", "name": "Turkish" }, - { "code": "ts", "name": "Tsonga" }, - { "code": "tt", "name": "Tatar" }, - { "code": "tw", "name": "Twi" }, - { "code": "ty", "name": "Tahitian" }, - { "code": "ug", "name": "Uighur; Uyghur" }, - { "code": "uk", "name": "Ukrainian" }, - { "code": "ur", "name": "Urdu" }, - { "code": "uz", "name": "Uzbek" }, - { "code": "ve", "name": "Venda" }, - { "code": "vi", "name": "Vietnamese" }, - { "code": "vo", "name": "Volapük" }, - { "code": "wa", "name": "Walloon" }, - { "code": "wo", "name": "Wolof" }, - { "code": "xh", "name": "Xhosa" }, - { "code": "yi", "name": "Yiddish" }, - { "code": "yo", "name": "Yoruba" }, - { "code": "za", "name": "Zhuang; Chuang" }, - { "code": "zh", "name": "Chinese" }, - { "code": "zu", "name": "Zulu" } -]; - -document.addEventListener("DOMContentLoaded", function() { - applySettings(); -}); - -async function fetchMovieDetails(movieId) { - showSpinner(); - const code = `${getMovieCode()}`; - const url = `https://${getMovieVerseData()}/3/movie/${movieId}?${generateMovieNames()}${code}&append_to_response=credits,keywords,similar`; - const url2 = `https://${getMovieVerseData()}/3/movie/${movieId}?${generateMovieNames()}${code}&append_to_response=videos`; - - try { - const response = await fetch(url); - const movie = await response.json(); - const imdbId = movie.imdb_id; - - fetchMovieRatings(imdbId, movie); - - const response2 = await fetch(url2); - const movie2 = await response2.json(); - const trailers = movie2.videos.results.filter(video => video.type === 'Trailer'); - - if (trailers.length > 0) { - const trailerUrl = `https://www.youtube.com/watch?v=${trailers[0].key}`; - trailerButton = createTrailerButton(trailerUrl); - positionTrailerButton(); - } - updateBrowserURL(movie.title); - hideSpinner(); - } - catch (error) { - document.getElementById('movie-details-container').innerHTML = ` -
-

Movie details not found - Try again with a different movie

-
`; - console.log('Error fetching movie details:', error); - hideSpinner(); - } -} - -function getRatingDetails(rating) { - let details = { color: 'black', text: rating, description: '' }; - - switch (rating) { - case 'R': - details = { - color: 'red', - text: 'R (Restricted)', - description: ' - No one 17 and under admitted' - }; - break; - case 'PG-13': - details = { - color: 'yellow', - text: 'PG-13 (Parents Strongly Cautioned)', - description: ' - May be inappropriate for children under 13' - }; - break; - case 'PG': - details = { - color: 'orange', - text: 'PG (Parental Guidance Suggested)', - description: ' - May not be suitable for children' - }; - break; - case 'G': - details = { - color: 'green', - text: 'G (General Audiences)', - description: ' - All ages admitted' - }; - break; - case 'NC-17': - details = { - color: 'darkred', - text: 'NC-17 (Adults Only)', - description: ' - No one 17 and under admitted' - }; - break; - case 'TV-Y': - details = { - color: 'lightgreen', - text: 'TV-Y (All Children)', - description: ' - Appropriate for all children' - }; - break; - case 'TV-Y7': - details = { - color: 'lightblue', - text: 'TV-Y7 (Directed to Older Children)', - description: ' - Suitable for children ages 7 and up' - }; - break; - case 'TV-G': - details = { - color: 'green', - text: 'TV-G (General Audience)', - description: ' - Suitable for all ages' - }; - break; - case 'TV-PG': - details = { - color: 'orange', - text: 'TV-PG (Parental Guidance Suggested)', - description: ' - May not be suitable for younger children' - }; - break; - case 'TV-14': - details = { - color: 'yellow', - text: 'TV-14 (Parents Strongly Cautioned)', - description: ' - May be inappropriate for children under 14' - }; - break; - case 'TV-MA': - details = { - color: 'red', - text: 'TV-MA (Mature Audience Only)', - description: ' - Specifically designed to be viewed by adults' - }; - break; - case 'NR': - details = { - color: 'white', - text: 'NR (Not Rated)', - description: ' - Movie has not been officially rated' - }; - break; - case 'UR': - case 'Unrated': - details = { - color: 'white', - text: 'UR (Unrated)', - description: ' - Contains content not used in the rated version' - }; - break; - default: - details = { - color: 'white', - text: rating, - description: ' - Rating information not available' - }; - break; - } - - return details; -} - -async function fetchMovieRatings(imdbId, tmdbMovieData) { - showSpinner(); - - const apiKeys = [ - await getMovieCode2(), - '58efe859', - '60a09d79', - '956e468a' - ]; - - const baseURL = `https://${getMovieActor()}/?i=${imdbId}&${getMovieName()}`; - - async function tryFetch(apiKey) { - const url = `${baseURL}${apiKey}`; - try { - const response = await fetch(url); - if (!response.ok) throw new Error('API limit reached or other error'); - return await response.json(); - } - catch (error) { - return null; - } - } - - let data; - for (const key of apiKeys) { - data = await tryFetch(key); - if (data) break; - } - - if (!data) { - populateMovieDetails(tmdbMovieData, tmdbMovieData.vote_average, 'N/A', 'Metascore information unavailable, click to search on Metacritics', 'Awards information unavailable'); - return; - } - - let imdbRating = data.imdbRating ? data.imdbRating : 'N/A'; - if (imdbRating === 'N/A' || imdbRating === '0.0') { - imdbRating = 'N/A'; - } - - let rtRating = 'N/A'; - - let metascore = data.Metascore ? `${data.Metascore}/100` : 'N/A'; - let awards = data.Awards; - let rated = data.Rated ? data.Rated : 'Rating information unavailable'; - - if (awards === 'N/A') { - awards = 'Awards information unavailable'; - } - - if (metascore === 'N/A/100') { - const metacriticsRatingValue = imdbRating !== 'N/A' ? parseFloat(imdbRating) : (tmdbMovieData.vote_average / 2); - metascore = calculateFallbackMetacriticsRating(metacriticsRatingValue, tmdbMovieData.vote_average) + '/100'; - } - - if (rtRating === 'N/A') { - const imdbRatingValue = imdbRating !== 'N/A' ? parseFloat(imdbRating) : (tmdbMovieData.vote_average / 2); - rtRating = calculateFallbackRTRating(imdbRatingValue, tmdbMovieData.vote_average) - } - - populateMovieDetails(tmdbMovieData, imdbRating, rtRating, metascore, awards, rated); - hideSpinner(); -} - -function updateBrowserURL(title) { - const nameSlug = createNameSlug(title); - const newURL = window.location.protocol + "//" + window.location.host + window.location.pathname + '?' + nameSlug; - window.history.replaceState({ path: newURL }, '', newURL); -} - -function createNameSlug(title) { - return title.toLowerCase().replace(/ /g, '-').replace(/[^\w-]/g, ''); -} - -function calculateFallbackRTRating(imdbRating, tmdbRating) { - const normalizedImdbRating = imdbRating * 10; - const normalizedTmdbRating = tmdbRating * 10; - - const weightImdb = 0.8; - const weightTmdb = 0.1; - - return ((normalizedImdbRating * weightImdb) + (normalizedTmdbRating * weightTmdb)).toFixed(0) + '%'; -} - -function calculateFallbackMetacriticsRating(imdbRating, tmdbRating) { - const normalizedImdbRating = imdbRating * 10; - const normalizedTmdbRating = tmdbRating * 10; - - const weightImdb = 0.8; - const weightTmdb = 0.1; - - return ((normalizedImdbRating * weightImdb) + (normalizedTmdbRating * weightTmdb)).toFixed(0); -} - -let trailerIframeDisplayed = false; - -function createTrailerButton(trailerUrl) { - const trailerButton = document.createElement('button'); - trailerButton.textContent = 'Watch Trailer'; - trailerButton.title = 'Click to watch the trailer of this movie'; - trailerButton.id = 'trailerButton'; - - trailerButton.addEventListener('click', function() { - if (!trailerIframeDisplayed) { - showTrailerIframe(trailerUrl); - trailerButton.textContent = 'Close Trailer'; - trailerButton.title = 'Click to close the trailer'; - } - else { - closeTrailerIframe(); - trailerButton.textContent = 'Watch Trailer'; - trailerButton.title = 'Click to watch the trailer of this movie'; - } - }); - - trailerButton.classList.add('trailer-button'); - trailerButton.style.font = 'inherit'; - - return trailerButton; -} - -function closeTrailerIframe() { - const iframeContainer = document.querySelector('.trailer-button + div'); - - if (iframeContainer) { - iframeContainer.style.height = '0'; - setTimeout(() => iframeContainer.remove(), 500); - } - trailerIframeDisplayed = false; -} - -function getYouTubeVideoId(url) { - const urlObj = new URL(url); - return urlObj.searchParams.get('v'); -} - -function positionTrailerButton() { - showSpinner(); - if (!trailerButton) - return; - - if (window.innerWidth <= 900) { - const movieDescription = document.getElementById('movie-description'); - movieDescription.parentNode.insertBefore(trailerButton, movieDescription); - } - else { - const movieRating = document.getElementById('movie-rating'); - movieRating.parentNode.insertBefore(trailerButton, movieRating.nextSibling); - } - hideSpinner(); -} - -document.addEventListener('DOMContentLoaded', positionTrailerButton); - -function showTrailerIframe(trailerUrl) { - trailerUrlGlobal = trailerUrl; - - const iframeContainer = document.createElement('div'); - iframeContainer.style.position = 'relative'; - iframeContainer.style.width = '400px'; - iframeContainer.style.margin = '0 auto'; - iframeContainer.style.overflow = 'hidden'; - iframeContainer.style.height = '0'; - iframeContainer.style.transition = 'height 0.5s ease-in-out'; - iframeContainer.style.borderRadius = '8px'; - - const iframe = document.createElement('iframe'); - iframe.setAttribute('src', `https://www.youtube.com/embed/${getYouTubeVideoId(trailerUrl)}?autoplay=1`); - iframe.setAttribute('width', '100%'); - iframe.setAttribute('height', '315'); - iframe.setAttribute('frameborder', '0'); - iframe.setAttribute('allow', 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture'); - iframe.setAttribute('allowfullscreen', true); - - iframeContainer.appendChild(iframe); - - const trailerButton = document.querySelector('.trailer-button'); - trailerButton.parentNode.insertBefore(iframeContainer, trailerButton.nextSibling); - trailerButton.id = 'trailerButton'; - - setTimeout(() => iframeContainer.style.height = '315px', 50); - - trailerIframeDisplayed = true; -} - -function getRtSlug(title) { - return title.toLowerCase() - .replace(/:/g, '') - .replace(/part one/g, 'part_1') - .replace(/-/g, '') - .replace(/&/g, 'and') - .replace(/ /g, '_') - .replace(/[^\w-]/g, ''); -} - -function createMetacriticSlug(title) { - return title.toLowerCase() - .replace(/part\sone/g, 'part-1') - .replace(/:|_|-|\s/g, '-') - .replace(/&/g, 'and') - .replace(/--+/g, '-') - .replace(/[^\w-]/g, ''); -} - -async function fetchStreamingLinks(movieId) { - const url = `https://${getMovieVerseData()}/3/movie/${movieId}/watch/providers?${generateMovieNames()}${getMovieCode()}`; - - try { - const response = await fetch(url); - const data = await response.json(); - const results = data.results || {}; - let providersMap = {}; - - Object.values(results).forEach(region => { - if (region.flatrate) { - region.flatrate.forEach(provider => { - providersMap[provider.provider_id] = provider; - }); - } - }); - - return Object.values(providersMap).slice(0, 7); - } - catch (error) { - console.error('Error fetching streaming links:', error); - return []; - } -} - -async function populateMovieDetails(movie, imdbRating, rtRating, metascore, awards, rated) { - showSpinner(); - document.getElementById('movie-title').textContent = movie.title; - - const imdbLink = `https://www.imdb.com/title/${movie.imdb_id}`; - const streamingProviders = await fetchStreamingLinks(movie.id); - const movieTitleEncoded = encodeURIComponent(movie.title); - - const streamingHTML = streamingProviders.length > 0 ? streamingProviders.map(provider => { - let providerLink; - switch(provider.provider_name.toLowerCase()) { - case 'netflix': - providerLink = `https://www.netflix.com/search?q=${movieTitleEncoded}`; - break; - case 'disney plus': - providerLink = `https://www.disneyplus.com/search?q=${movieTitleEncoded}`; - break; - case 'hbo max': - providerLink = `https://www.hbomax.com/search?q=${movieTitleEncoded}`; - break; - case 'hulu': - providerLink = `https://www.hulu.com/search?q=${movieTitleEncoded}`; - break; - case 'amazon prime video': - providerLink = `https://www.amazon.com/s?k=${movieTitleEncoded}`; - break; - case 'apple tv plus': - providerLink = `https://tv.apple.com/search?term=${movieTitleEncoded}`; - break; - case 'stan': - providerLink = `https://www.stan.com.au/search?q=${movieTitleEncoded}`; - break; - case 'player': - providerLink = `https://player.pl/szukaj?search=${movieTitleEncoded}`; - break; - default: - providerLink = `https://www.google.com/search?q=watch+${movieTitleEncoded}+on+${encodeURIComponent(provider.provider_name)}`; - break; - } - - return ` - ${provider.provider_name} - `; - }).join('') + ` - JustWatch - ` : 'No streaming options available.'; - - const metaCriticsLink = metascore !== 'N/A' ? `https://www.metacritic.com/search/${createMetacriticSlug(movie.title)}` : '#'; - const ratingDetails = getRatingDetails(rated); - const ratedElement = rated ? `

Rated: ${ratingDetails.text}${ratingDetails.description}

` : ''; - - document.getElementById('movie-rating').innerHTML = ``; - document.title = movie.title + " - Movie Details"; - - const movieDescription = document.getElementById('movie-description'); - const metascoreElement = metascore ? `

Metascore: ${metascore}

` : ''; - const awardsElement = awards ? `

Awards: ${awards}

` : ''; - - const overview = movie.overview ? movie.overview : 'No overview available'; - const genres = movie.genres.map(genre => genre.name).join(', '); - const releaseDate = movie.release_date ? movie.release_date : 'Release date not available'; - - const budget = movie.budget === 0 ? 'Information Not Available' : `$${movie.budget.toLocaleString()}`; - const revenue = movie.revenue <= 1000 ? 'Information Not Available' : `$${movie.revenue.toLocaleString()}`; - const tagline = movie.tagline ? movie.tagline : 'No tagline found'; - const languages = movie.spoken_languages.map(lang => lang.name).join(', '); - - const countries = movie.production_countries.map(country => country.name).join(', '); - const popularityScore = movie.popularity.toFixed(0); - - let keywords = movie.keywords ? movie.keywords.keywords.map(kw => kw.name).join(', ') : 'None Available'; - const scaledRating = (movie.vote_average / 2).toFixed(1); - - if (keywords.length === 0) { - keywords = 'No keywords have been added'; - } - - const popularityThreshold = 80; - const isPopular = movie.popularity >= popularityThreshold; - const popularityText = isPopular ? `${popularityScore} (This movie is popular)` : `${popularityScore} (This movie is unpopular)`; - - const movieStatus = `

Status: ${movie.status}

`; - const runtime = movie.runtime > 0 - ? movie.runtime + ' minutes' - : 'Runtime Info Not Available'; - - const originalTitle = movie.original_title !== movie.title ? `

Original Title: ${movie.original_title}

` : `

Original Title: ${movie.title}

`; - const tmdbRating = movie.vote_average.toFixed(1); - - document.getElementById('movie-description').innerHTML += ` -

Description: ${overview}

- ${originalTitle} -

Tagline: ${tagline}

-

Genres: ${genres}

- ${ratedElement} - ${movieStatus} -

Release Date: ${releaseDate}

-

Runtime: ${runtime}

-

Budget: ${budget}

-

Revenue: ${revenue}

-

Languages: ${languages}

-

Countries of Production: ${countries}

-

Popularity Score: ${popularityText}

-

MovieVerse User Rating: ${scaledRating}/5.0 (based on ${movie.vote_count} votes)

- ${awardsElement} -

TMDb Rating: ${tmdbRating}/10.0

- ${metascoreElement} - `; - - if (movie.credits && movie.credits.crew) { - const directors = movie.credits.crew.filter(member => member.job === 'Director'); - - if (directors.length > 0) { - const directorsLinks = directors.map(director => - `${director.name}` - ).join(', '); - - const directorsElement = document.createElement('p'); - directorsElement.innerHTML = `Director: ${directorsLinks}`; - document.getElementById('movie-description').appendChild(directorsElement); - } - else { - const noDirectorsElement = document.createElement('p'); - noDirectorsElement.innerHTML = `Director: Information not available`; - document.getElementById('movie-description').appendChild(noDirectorsElement); - } - } - - const castHeading = document.createElement('p'); - castHeading.innerHTML = 'Cast: '; - document.getElementById('movie-description').appendChild(castHeading); - - if (movie.credits && movie.credits.cast.length > 0) { - const topTenCast = movie.credits.cast.slice(0, 10); - topTenCast.forEach((actor, index) => { - const actorLink = document.createElement('a'); - actorLink.innerHTML = `${actor.name}`; - castHeading.appendChild(actorLink); - if (index < topTenCast.length - 1) { - castHeading.appendChild(document.createTextNode(', ')); - } - }); - } - else { - castHeading.appendChild(document.createTextNode('None available.')); - } - - if (movie.production_companies && movie.production_companies.length > 0) { - let companiesHTML = movie.production_companies.map(company => { - return `${company.name}`; - }).join(', '); - - const productionCompaniesElement = document.createElement('p'); - productionCompaniesElement.innerHTML = `Production Companies: ${companiesHTML}`; - document.getElementById('movie-description').appendChild(productionCompaniesElement); - } - else { - const noCompaniesElement = document.createElement('p'); - noCompaniesElement.innerHTML = `Production Companies: Information not available`; - document.getElementById('movie-description').appendChild(noCompaniesElement); - } - - if (movie.similar && movie.similar.results && movie.similar.results.length > 0) { - let similarMoviesHTML = movie.similar.results.map(similarMovie => { - return `${similarMovie.title}`; - }).join(', '); - - const similarMoviesElement = document.createElement('p'); - similarMoviesElement.innerHTML = `Similar Movies: ${similarMoviesHTML}`; - document.getElementById('movie-description').appendChild(similarMoviesElement); - } - else { - const noSimilarMoviesElement = document.createElement('p'); - noSimilarMoviesElement.innerHTML = `Similar Movies: None available`; - document.getElementById('movie-description').appendChild(noSimilarMoviesElement); - } - - document.getElementById('movie-description').innerHTML += ` -

Streaming Options: ${streamingHTML}

`; - - const homepage = document.createElement('p'); - homepage.innerHTML = movie.homepage ? `Homepage: Visit homepage` : `Homepage: Information unavailable`; - movieDescription.appendChild(homepage); - - const keywordsElement = document.createElement('p'); - keywordsElement.innerHTML = `Keywords: ${keywords}`; - movieDescription.appendChild(keywordsElement); - - createImdbRatingCircle(imdbRating, imdbLink); - - const mediaUrl = `https://${getMovieVerseData()}/3/movie/${movie.id}/images?${generateMovieNames()}${getMovieCode()}`; - const mediaResponse = await fetch(mediaUrl); - const mediaData = await mediaResponse.json(); - const images = mediaData.backdrops; - - const detailsContainer = document.getElementById('movie-description'); - - const mediaContainer = document.createElement('div'); - mediaContainer.id = 'media-container'; - mediaContainer.style = ` - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - position: relative; - width: 90vw; - max-width: 450px; - margin: 20px auto; - overflow: hidden; - box-sizing: border-box; - `; - - const mediaTitle = document.createElement('p'); - mediaTitle.textContent = 'Media:'; - mediaTitle.style = ` - font-weight: bold; - align-self: start; - margin-bottom: 5px; - `; - - detailsContainer.appendChild(mediaTitle); - detailsContainer.appendChild(mediaContainer); - - const imageWrapper = document.createElement('div'); - imageWrapper.style = ` - width: 100%; - max-height: 210px; - border-radius: 16px; - overflow: hidden; - display: flex; - justify-content: center; - align-items: center; - `; - - const imageElement = document.createElement('img'); - imageElement.style = ` - width: 100%; - height: auto; - transition: opacity 0.5s ease-in-out; - opacity: 1; - cursor: pointer; - object-fit: contain; - `; - if (images.length > 0) { - imageElement.src = `https://image.tmdb.org/t/p/w780${images[0].file_path}`; - } - imageWrapper.appendChild(imageElement); - mediaContainer.appendChild(imageWrapper); - - imageElement.addEventListener('click', function() { - let imageUrl = this.src.replace('w780', 'w1280'); - const modalHtml = ` -
- Movie Image - × -
- `; - document.body.insertAdjacentHTML('beforeend', modalHtml); - const modal = document.getElementById('image-modal'); - const closeModalBtn = document.getElementById('removeBtn'); - - closeModalBtn.onclick = function() { - modal.remove(); - }; - - modal.addEventListener('click', function(event) { - if (event.target === this) { - this.remove(); - } - }); - }); - - const prevButton = document.createElement('button'); - prevButton.innerHTML = ''; - prevButton.style = ` - position: absolute; - left: 5px; - top: 50%; - transform: translateY(-50%); - background-color: #7378c5; - color: white; - border-radius: 8px; - height: 30px; - width: 30px; - border: none; - cursor: pointer; - z-index: 10; - `; - prevButton.onmouseover = () => prevButton.style.backgroundColor = '#ff8623'; - prevButton.onmouseout = () => prevButton.style.backgroundColor = '#7378c5'; - prevButton.onclick = () => navigateMedia(images, imageElement, -1); - mediaContainer.appendChild(prevButton); - - const nextButton = document.createElement('button'); - nextButton.innerHTML = ''; - nextButton.style = ` - position: absolute; - right: 5px; - top: 50%; - transform: translateY(-50%); - background-color: #7378c5; - color: white; - border-radius: 8px; - height: 30px; - width: 30px; - border: none; - cursor: pointer; - z-index: 10; - `; - nextButton.onmouseover = () => nextButton.style.backgroundColor = '#ff8623'; - nextButton.onmouseout = () => nextButton.style.backgroundColor = '#7378c5'; - nextButton.onclick = () => navigateMedia(images, imageElement, 1); - mediaContainer.appendChild(nextButton); - - let currentIndex = 0; - function navigateMedia(images, imgElement, direction) { - currentIndex += direction; - if (currentIndex < 0) { - currentIndex = images.length - 1; - } - else if (currentIndex >= images.length) { - currentIndex = 0; - } - imgElement.style.opacity = '0'; - setTimeout(() => { - imgElement.src = `https://image.tmdb.org/t/p/w780${images[currentIndex].file_path}`; - imgElement.style.opacity = '1'; - }, 420); - } - - if (images.length === 0) { - mediaContainer.innerHTML = '

No media available

'; - } - - const movieImage = document.getElementById('movie-image'); - if (movie.poster_path) { - movieImage.src = IMGPATH + movie.poster_path; - movieImage.alt = movie.title; - movieImage.loading = 'lazy'; - } - else { - movieImage.style.display = 'none'; - const noImageText = document.createElement('h2'); - noImageText.textContent = 'Movie Image Not Available'; - noImageText.style.textAlign = 'center'; - noImageText.style.height = '800px'; - document.querySelector('.movie-left').appendChild(noImageText); - } - - hideSpinner(); -} - -function createImdbRatingCircle(imdbRating, imdbId) { - if (imdbRating === 'N/A' || imdbRating === null || imdbRating === undefined) { - imdbRating = 'N/A'; - } - - let circleContainer = document.getElementById('imdbRatingCircleContainer'); - if (!circleContainer) { - circleContainer = document.createElement('div'); - circleContainer.id = 'imdbRatingCircleContainer'; - circleContainer.className = 'progress-container'; - const imdbLink = `${imdbId}`; - circleContainer.innerHTML = ` - -
IMDb Rating
-
- - - - ${imdbRating} - - `; - - if (imdbRating === 'N/A') { - circleContainer.innerHTML += `

Rating information currently unavailable

`; - } - - document.getElementById('movie-description').appendChild(circleContainer); - } - else { - const text = document.getElementById('imdbRatingText'); - text.textContent = `${imdbRating}`; - } - - const circle = circleContainer.querySelector('.progress-ring__progress'); - const text = document.getElementById('imdbRatingText'); - setProgress(circle, text, imdbRating); -} - -function setProgress(circle, text, rating) { - const radius = circle.r.baseVal.value; - const circumference = radius * 2 * Math.PI; - - circle.style.transition = 'none'; - circle.style.strokeDasharray = `${circumference} ${circumference}`; - circle.style.strokeDashoffset = circumference; - - circle.getBoundingClientRect(); - - setTimeout(() => { - const offset = circumference - (rating / 10) * circumference; - circle.style.transition = 'stroke-dashoffset 0.6s ease-out, stroke 0.6s ease'; - circle.style.strokeDashoffset = offset; - circle.style.setProperty('--progress-color', rating <= 5 ? '#FF0000' : (rating >= 7.5 ? '#4CAF50' : '#2196F3')); - text.textContent = `${rating}`; - }, 10); -} - -function retriggerAnimation(imdbRating) { - const circle = document.querySelector('.progress-ring__progress'); - const text = document.getElementById('imdbRatingText'); - setProgress(circle, text, imdbRating); -} - -function getSavedTextColor() { - return localStorage.getItem('textColor') || 'white'; -} - -function handleDirectorClick(directorId, directorName) { - localStorage.setItem('selectedDirectorId', directorId); - document.title = `${directorName} - Director's Details`; - updateUniqueDirectorsViewed(directorId); - updateDirectorVisitCount(directorId, directorName); - window.location.href = 'director-details.html'; -} - -function selectActorId(actorId, actorName) { - const actorVisits = JSON.parse(localStorage.getItem('actorVisits')) || {}; - const uniqueActorsViewed = JSON.parse(localStorage.getItem('uniqueActorsViewed')) || []; - - if (!uniqueActorsViewed.includes(actorId)) { - uniqueActorsViewed.push(actorId); - localStorage.setItem('uniqueActorsViewed', JSON.stringify(uniqueActorsViewed)); - } - - if (actorVisits[actorId]) { - actorVisits[actorId].count++; - } - else { - actorVisits[actorId] = { count: 1, name: actorName }; - } - - localStorage.setItem('actorVisits', JSON.stringify(actorVisits)); - - localStorage.setItem('selectedActorId', actorId); - window.location.href = 'actor-details.html'; -} - -function handleCompanyClick(companyId, companyName) { - localStorage.setItem('selectedCompanyId', companyId); - document.title = `${companyName} - Company Details`; - window.location.href = 'company-details.html'; - updateUniqueCompaniesViewed(companyId); -} - -function handleSimilarMovieClick(movieId, movieTitle) { - localStorage.setItem('selectedMovieId', movieId); - document.title = `${movieTitle} - Movie Details`; - window.location.href = 'movie-details.html'; - updateMovieVisitCount(movieId, movieTitle); -} - -function updateMoviesFavorited(movieId) { - let favoritedMovies = JSON.parse(localStorage.getItem('moviesFavorited')) || []; - if (!favoritedMovies.includes(movieId)) { - favoritedMovies.push(movieId); - localStorage.setItem('moviesFavorited', JSON.stringify(favoritedMovies)); - } -} - -function getMovieCode2() { - const codeOfMovie = "MmJhOGU1MzY="; - return atob(codeOfMovie); -} - -function getMovieName() { - const moviename = "YXBpa2V5PQ=="; - return atob(moviename); -} - -function getMovieActor() { - const actor = "d3d3Lm9tZGJhcGkuY29t"; - return atob(actor); -} - -function updateAverageMovieRating(movieId, newRating) { - const savedRatings = JSON.parse(localStorage.getItem('movieRatings')) || {}; - - savedRatings[movieId] = newRating; - localStorage.setItem('movieRatings', JSON.stringify(savedRatings)); - - let totalRating = 0; - let totalMoviesRated = 0; - - for (let id in savedRatings) { - totalRating += parseFloat(savedRatings[id]); - totalMoviesRated++; - } - let averageRating = totalMoviesRated > 0 ? (totalRating / totalMoviesRated) : 0; - localStorage.setItem('averageMovieRating', averageRating.toFixed(1).toString()); -} - -async function showMovieOfTheDay() { - const year = new Date().getFullYear(); - const url = `https://${getMovieVerseData()}/3/discover/movie?${generateMovieNames()}${getMovieCode()}&sort_by=vote_average.desc&vote_count.gte=100&primary_release_year=${year}&vote_average.gte=7`; - - try { - const response = await fetch(url); - const data = await response.json(); - const movies = data.results; - - if (movies.length > 0) { - const randomMovie = movies[Math.floor(Math.random() * movies.length)]; - localStorage.setItem('selectedMovieId', randomMovie.id); - window.location.href = 'movie-details.html'; - } - else { - fallbackMovieSelection(); - } - } - catch (error) { - fallbackMovieSelection(); - } -} - -function updateUniqueActorsViewed(actorId) { - let viewedActors = JSON.parse(localStorage.getItem('uniqueActorsViewed')) || []; - if (!viewedActors.includes(actorId)) { - viewedActors.push(actorId); - localStorage.setItem('uniqueActorsViewed', JSON.stringify(viewedActors)); - } -} - -function updateUniqueCompaniesViewed(companyId) { - let viewedCompanies = JSON.parse(localStorage.getItem('uniqueCompaniesViewed')) || []; - if (!viewedCompanies.includes(companyId)) { - viewedCompanies.push(companyId); - localStorage.setItem('uniqueCompaniesViewed', JSON.stringify(viewedCompanies)); - } -} - -function fallbackMovieSelection() { - const fallbackMovies = [432413, 299534, 1726, 562, 118340, 455207, 493922, 447332, 22970, 530385, 27205, 264660, 120467, 603, 577922, 76341, 539, 419704, 515001, 118340, 424, 98]; - const randomFallbackMovie = fallbackMovies[Math.floor(Math.random() * fallbackMovies.length)]; - localStorage.setItem('selectedMovieId', randomFallbackMovie); - window.location.href = 'movie-details.html'; -} - -function getMovieVerseData(input) { - return String.fromCharCode(97, 112, 105, 46, 116, 104, 101, 109, 111, 118, 105, 101, 100, 98, 46, 111, 114, 103); -} - -function applySettings() { - const savedBg = localStorage.getItem('backgroundImage'); - const savedTextColor = localStorage.getItem('textColor'); - const savedFontSize = localStorage.getItem('fontSize'); - - if (savedBg) { - document.body.style.backgroundImage = `url('${savedBg}')`; - } - if (savedTextColor) { - applyTextColor(savedTextColor); - } - if (savedFontSize) { - const size = savedFontSize === 'small' ? '12px' : savedFontSize === 'medium' ? '16px' : '20px'; - document.body.style.fontSize = size; - } -} - -function applyTextColor(color) { - document.querySelectorAll('h1, h2, h3, p, a, span, div, button, input, select, textarea, label, li') - .forEach(element => { - element.style.color = color; - }); -} diff --git a/MovieVerse-Mobile/app/js/movie-match.js b/MovieVerse-Mobile/app/js/movie-match.js deleted file mode 100644 index db6cf0e0..00000000 --- a/MovieVerse-Mobile/app/js/movie-match.js +++ /dev/null @@ -1,475 +0,0 @@ -const main = document.getElementById('movie-match-form'); -const search = document.getElementById("search"); -const searchButton = document.getElementById("button-search"); -const searchTitle = document.getElementById("search-title"); -const otherTitle = document.getElementById("other1"); - -document.getElementById('movie-match-form').addEventListener('submit', function(event) { - event.preventDefault(); - const mood = document.getElementById('mood').value; - const genre = document.getElementById('genre').value; - const period = document.getElementById('period').value; - - findMovieMatch(mood, genre, period); -}); - -async function ensureGenreMapIsAvailable() { - if (!localStorage.getItem('genreMap')) { - await fetchGenreMap(); - } -} - -async function showMovieOfTheDay() { - const year = new Date().getFullYear(); - const url = `https://api.themoviedb.org/3/discover/movie?${generateMovieNames()}${getMovieCode()}&sort_by=vote_average.desc&vote_count.gte=100&primary_release_year=${year}&vote_average.gte=7`; - - try { - const response = await fetch(url); - const data = await response.json(); - const movies = data.results; - - if (movies.length > 0) { - const randomMovie = movies[Math.floor(Math.random() * movies.length)]; - localStorage.setItem('selectedMovieId', randomMovie.id); - window.location.href = 'movie-details.html'; - } - else { - fallbackMovieSelection(); - } - } - catch (error) { - console.log('Error fetching movie:', error); - fallbackMovieSelection(); - } -} - -async function fetchGenreMap() { - const url = `https://${getMovieVerseData()}/3/genre/movie/list?${generateMovieNames()}${getMovieCode()}`; - try { - const response = await fetch(url); - const data = await response.json(); - const genreMap = data.genres.reduce((map, genre) => { - map[genre.id] = genre.name; - return map; - }, {}); - localStorage.setItem('genreMap', JSON.stringify(genreMap)); - } - catch (error) { - console.log('Error fetching genre map:', error); - } -} - -async function rotateUserStats() { - await ensureGenreMapIsAvailable(); - - const stats = [ - { - label: "Your Current Time", - getValue: () => { - const now = new Date(); - let hours = now.getHours(); - let minutes = now.getMinutes(); - hours = hours < 10 ? '0' + hours : hours; - minutes = minutes < 10 ? '0' + minutes : minutes; - return `${hours}:${minutes}`; - } - }, - { label: "Most Visited Movie", getValue: getMostVisitedMovie }, - { label: "Most Visited Director", getValue: getMostVisitedDirector }, - { label: "Most Visited Actor", getValue: getMostVisitedActor }, - { - label: "Movies Discovered", - getValue: () => { - const viewedMovies = JSON.parse(localStorage.getItem('uniqueMoviesViewed')) || []; - return viewedMovies.length; - } - }, - { - label: "Favorite Movies", - getValue: () => { - const favoritedMovies = JSON.parse(localStorage.getItem('moviesFavorited')) || []; - return favoritedMovies.length; - } - }, - { - label: "Favorite Genre", - getValue: () => { - const mostCommonGenreCode = getMostCommonGenre(); - const genreMapString = localStorage.getItem('genreMap'); - if (!genreMapString) { - console.log('No genre map found in localStorage.'); - return 'Not Available'; - } - - let genreMap; - try { - genreMap = JSON.parse(genreMapString); - } - catch (e) { - console.log('Error parsing genre map:', e); - return 'Not Available'; - } - - let genreObject; - if (Array.isArray(genreMap)) { - genreObject = genreMap.reduce((acc, genre) => { - acc[genre.id] = genre.name; - return acc; - }, {}); - } - else if (typeof genreMap === 'object' && genreMap !== null) { - genreObject = genreMap; - } - else { - console.log('genreMap is neither an array nor a proper object:', genreMap); - return 'Not Available'; - } - - return genreObject[mostCommonGenreCode] || 'Not Available'; - } - }, - { label: "Watchlists Created", getValue: () => localStorage.getItem('watchlistsCreated') || 0 }, - { label: "Average Movie Rating", getValue: () => localStorage.getItem('averageMovieRating') || 'Not Rated' }, - { - label: "Directors Discovered", - getValue: () => { - const viewedDirectors = JSON.parse(localStorage.getItem('uniqueDirectorsViewed')) || []; - return viewedDirectors.length; - } - }, - { - label: "Actors Discovered", - getValue: () => { - const viewedActors = JSON.parse(localStorage.getItem('uniqueActorsViewed')) || []; - return viewedActors.length; - } - }, - { label: "Your Trivia Accuracy", getValue: getTriviaAccuracy }, - ]; - - let currentStatIndex = 0; - - function updateStatDisplay() { - const currentStat = stats[currentStatIndex]; - document.getElementById('stats-label').textContent = currentStat.label + ':'; - document.getElementById('stats-display').textContent = currentStat.getValue(); - currentStatIndex = (currentStatIndex + 1) % stats.length; - } - - updateStatDisplay(); - - const localTimeDiv = document.getElementById('local-time'); - let statRotationInterval = setInterval(updateStatDisplay, 3000); - - localTimeDiv.addEventListener('click', () => { - clearInterval(statRotationInterval); - updateStatDisplay(); - statRotationInterval = setInterval(updateStatDisplay, 3000); - }); -} - -function updateMovieVisitCount(movieId, movieTitle) { - let movieVisits = JSON.parse(localStorage.getItem('movieVisits')) || {}; - if (!movieVisits[movieId]) { - movieVisits[movieId] = { count: 0, title: movieTitle }; - } - movieVisits[movieId].count += 1; - localStorage.setItem('movieVisits', JSON.stringify(movieVisits)); -} - -function getMostVisitedMovie() { - const movieVisits = JSON.parse(localStorage.getItem('movieVisits')) || {}; - let mostVisitedMovie = ''; - let maxVisits = 0; - - for (const movieId in movieVisits) { - if (movieVisits[movieId].count > maxVisits) { - mostVisitedMovie = movieVisits[movieId].title; - maxVisits = movieVisits[movieId].count; - } - } - - return mostVisitedMovie || 'Not Available'; -} - -function getMostVisitedActor() { - const actorVisits = JSON.parse(localStorage.getItem('actorVisits')) || {}; - let mostVisitedActor = ''; - let maxVisits = 0; - - for (const actorId in actorVisits) { - if (actorVisits[actorId].count > maxVisits) { - mostVisitedActor = actorVisits[actorId].name; - maxVisits = actorVisits[actorId].count; - } - } - - return mostVisitedActor || 'Not Available'; -} - -function getMostVisitedDirector() { - const directorVisits = JSON.parse(localStorage.getItem('directorVisits')) || {}; - let mostVisitedDirector = ''; - let maxVisits = 0; - - for (const directorId in directorVisits) { - if (directorVisits[directorId].count > maxVisits) { - mostVisitedDirector = directorVisits[directorId].name; - maxVisits = directorVisits[directorId].count; - } - } - - return mostVisitedDirector || 'Not Available'; -} - -function getTriviaAccuracy() { - let triviaStats = JSON.parse(localStorage.getItem('triviaStats')) || { totalCorrect: 0, totalAttempted: 0 }; - if (triviaStats.totalAttempted === 0) { - return 'No trivia attempted'; - } - let accuracy = (triviaStats.totalCorrect / triviaStats.totalAttempted) * 100; - return `${accuracy.toFixed(1)}% accuracy`; -} - -function getMostCommonGenre() { - const favoriteGenresArray = JSON.parse(localStorage.getItem('favoriteGenres')) || []; - const genreCounts = favoriteGenresArray.reduce((acc, genre) => { - acc[genre] = (acc[genre] || 0) + 1; - return acc; - }, {}); - - let mostCommonGenre = ''; - let maxCount = 0; - - for (const genre in genreCounts) { - if (genreCounts[genre] > maxCount) { - mostCommonGenre = genre; - maxCount = genreCounts[genre]; - } - } - - return mostCommonGenre || 'Not Available'; -} - -document.addEventListener('DOMContentLoaded', rotateUserStats); - -function findMovieMatch(mood, genre, period) { - const movieDatabase = [ - // Movies starting with the mood "happy" - { id: "432413", title: "The Avengers", mood: "happy", genre: "action", period: "2010s" }, - { id: "299534", title: "Avengers: Endgame", mood: "happy", genre: "action", period: "2020s" }, - { id: "1726", title: "Iron Man", mood: "happy", genre: "action", period: "2000s" }, - { id: "562", title: "Die Hard", mood: "happy", genre: "action", period: "90s" }, - { id: "89", title: "Indiana Jones and the Last Crusade", mood: "happy", genre: "action", period: "80s" }, - - { id: "620", title: "Ghostbusters", mood: "happy", genre: "comedy", period: "80s" }, - { id: "105", title: "Back to the Future", mood: "happy", genre: "comedy", period: "90s" }, - { id: "18785", title: "The Hangover", mood: "happy", genre: "comedy", period: "2000s" }, - { id: "284053", title: "Thor: Ragnarok", mood: "happy", genre: "comedy", period: "2010s" }, - { id: "515001", title: "Jojo Rabbit", mood: "happy", genre: "comedy", period: "2020s" }, - - { id: "773", title: "Little Miss Sunshine", mood: "happy", genre: "drama", period: "2000s" }, - { id: "1402", title: "The Pursuit of Happyness", mood: "happy", genre: "drama", period: "2010s" }, - { id: "508442", title: "Soul", mood: "happy", genre: "drama", period: "2020s" }, - { id: "489", title: "Good Will Hunting", mood: "happy", genre: "drama", period: "90s" }, - { id: "207", title: "Dead Poets Society", mood: "happy", genre: "drama", period: "80s" }, - - { id: "118340", title: "Guardians of the Galaxy", mood: "happy", genre: "sci-fi", period: "2010s" }, - { id: "607", title: "Men in Black", mood: "happy", genre: "sci-fi", period: "90s" }, - { id: "601", title: "E.T. the Extra-Terrestrial", mood: "happy", genre: "sci-fi", period: "80s" }, - { id: "333339", title: "Ready Player One", mood: "happy", genre: "sci-fi", period: "2000s" }, - { id: "438631", title: "Dune", mood: "happy", genre: "sci-fi", period: "2020s" }, - - { id: "50646", title: "Crazy Stupid Love", mood: "happy", genre: "romance", period: "2010s" }, - { id: "1581", title: "The Holiday", mood: "happy", genre: "romance", period: "2000s" }, - { id: "114", title: "Pretty Woman", mood: "happy", genre: "romance", period: "90s" }, - { id: "2028", title: "Say Anything...", mood: "happy", genre: "romance", period: "80s" }, - { id: "614409", title: "To All the Boys: Always and Forever", mood: "happy", genre: "romance", period: "2020s" }, - - // Movies starting with the mood "sad" - { id: "424", title: "Schindler's List", mood: "sad", genre: "drama", period: "90s" }, - { id: "334541", title: "Manchester by the Sea", mood: "sad", genre: "drama", period: "2010s" }, - { id: "4148", title: "Revolutionary Road", mood: "sad", genre: "drama", period: "2000s" }, - { id: "16619", title: "Ordinary People", mood: "sad", genre: "drama", period: "80s" }, - { id: "1135095", title: "Pieces of a Woman", mood: "sad", genre: "drama", period: "2020s" }, - - { id: "38", title: "Eternal Sunshine of the Spotless Mind", mood: "sad", genre: "romance", period: "2000s" }, - { id: "46705", title: "Blue Valentine", mood: "sad", genre: "romance", period: "2010s" }, - { id: "222935", title: "The Fault in Our Stars", mood: "sad", genre: "romance", period: "2010s" }, - { id: "142", title: "Brokeback Mountain", mood: "sad", genre: "romance", period: "2000s" }, - { id: "589049", title: "The Photograph", mood: "sad", genre: "romance", period: "2020s" }, - - { id: "335984", title: "Blade Runner 2049", mood: "sad", genre: "sci-fi", period: "2010s" }, - { id: "644", title: "A.I. Artificial Intelligence", mood: "sad", genre: "sci-fi", period: "2000s" }, - { id: "152601", title: "Her", mood: "sad", genre: "sci-fi", period: "2010s" }, - { id: "9426", title: "The Fly", mood: "sad", genre: "sci-fi", period: "80s" }, - { id: "419704", title: "Ad Astra", mood: "sad", genre: "sci-fi", period: "2020s" }, - - { id: "637", title: "Life Is Beautiful", mood: "sad", genre: "comedy", period: "90s" }, - { id: "9428", title: "The Royal Tenenbaums", mood: "sad", genre: "comedy", period: "2000s" }, - { id: "153", title: "Lost in Translation", mood: "sad", genre: "comedy", period: "2000s" }, - { id: "9675", title: "Sideways", mood: "sad", genre: "comedy", period: "2000s" }, - { id: "7326", title: "Juno", mood: "sad", genre: "comedy", period: "2000s" }, - - { id: "263115", title: "Logan", mood: "sad", genre: "action", period: "2010s" }, - { id: "70", title: "Million Dollar Baby", mood: "sad", genre: "action", period: "2000s" }, - { id: "49026", title: "The Dark Knight Rises", mood: "sad", genre: "action", period: "2010s" }, - { id: "475557", title: "Joker", mood: "sad", genre: "action", period: "2010s" }, - { id: "98", title: "Gladiator", mood: "sad", genre: "action", period: "2000s" }, - - // Movies starting with the mood "adventurous" - { id: "85", title: "Indiana Jones and the Raiders of the Lost Ark", mood: "adventurous", genre: "action", period: "80s" }, - { id: "76341", title: "Mad Max: Fury Road", mood: "adventurous", genre: "action", period: "2010s" }, - { id: "98", title: "Gladiator", mood: "adventurous", genre: "action", period: "2000s" }, - { id: "562", title: "Die Hard", mood: "adventurous", genre: "action", period: "90s" }, - { id: "438631", title: "Dune", mood: "adventurous", genre: "action", period: "2020s" }, - - { id: "620", title: "Ghostbusters", mood: "adventurous", genre: "comedy", period: "80s" }, - { id: "353486", title: "Jumanji: Welcome to the Jungle", mood: "adventurous", genre: "comedy", period: "2010s" }, - { id: "22", title: "Pirates of the Caribbean", mood: "adventurous", genre: "comedy", period: "2000s" }, - { id: "607", title: "Men in Black", mood: "adventurous", genre: "comedy", period: "90s" }, - { id: "550988", title: "Free Guy", mood: "adventurous", genre: "comedy", period: "2020s" }, - - { id: "281957", title: "The Revenant", mood: "adventurous", genre: "drama", period: "2010s" }, - { id: "8358", title: "Cast Away", mood: "adventurous", genre: "drama", period: "2000s" }, - { id: "947", title: "Lawrence of Arabia", mood: "adventurous", genre: "drama", period: "80s" }, - { id: "13", title: "Forrest Gump", mood: "adventurous", genre: "drama", period: "90s" }, - { id: "581734", title: "Nomadland", mood: "adventurous", genre: "drama", period: "2020s" }, - - { id: "11", title: "Star Wars", mood: "adventurous", genre: "sci-fi", period: "80s" }, - { id: "19995", title: "Avatar", mood: "adventurous", genre: "sci-fi", period: "2000s" }, - { id: "27205", title: "Inception", mood: "adventurous", genre: "sci-fi", period: "2010s" }, - { id: "335984", title: "Blade Runner", mood: "adventurous", genre: "sci-fi", period: "90s" }, - { id: "438631", title: "Dune", mood: "adventurous", genre: "sci-fi", period: "2020s" }, - - { id: "2493", title: "The Princess Bride", mood: "adventurous", genre: "romance", period: "80s" }, - { id: "313369", title: "La La Land", mood: "adventurous", genre: "romance", period: "2010s" }, - { id: "24420", title: "The Time Traveler's Wife", mood: "adventurous", genre: "romance", period: "2000s" }, - { id: "597", title: "Titanic", mood: "adventurous", genre: "romance", period: "90s" }, - { id: "672647", title: "The Map of Tiny Perfect Things", mood: "adventurous", genre: "romance", period: "2020s" }, - - // Movies starting with the mood "romantic" - { id: "11036", title: "The Notebook", mood: "romantic", genre: "drama", period: "2000s" }, - { id: "332562", title: "A Star is Born", mood: "romantic", genre: "drama", period: "2010s" }, - { id: "4348", title: "Pride and Prejudice", mood: "romantic", genre: "drama", period: "2000s" }, - { id: "289", title: "Casablanca", mood: "romantic", genre: "drama", period: "classic" }, - { id: "398818", title: "Call Me by Your Name", mood: "romantic", genre: "drama", period: "2010s" }, - - { id: "194", title: "Amélie", mood: "romantic", genre: "romance", period: "2000s" }, - { id: "313369", title: "La La Land", mood: "romantic", genre: "romance", period: "2010s" }, - { id: "76", title: "Before Sunrise", mood: "romantic", genre: "romance", period: "90s" }, - { id: "416477", title: "The Big Sick", mood: "romantic", genre: "romance", period: "2010s" }, - { id: "531428", title: "Portrait of a Lady on Fire", mood: "romantic", genre: "romance", period: "2020s" }, - - { id: "152601", title: "Her", mood: "romantic", genre: "sci-fi", period: "2010s" }, - { id: "38050", title: "The Adjustment Bureau", mood: "romantic", genre: "sci-fi", period: "2010s" }, - { id: "38", title: "Eternal Sunshine of the Spotless Mind", mood: "romantic", genre: "sci-fi", period: "2000s" }, - { id: "274870", title: "Passengers", mood: "romantic", genre: "sci-fi", period: "2010s" }, - { id: "122906", title: "About Time", mood: "romantic", genre: "sci-fi", period: "2010s" }, - - { id: "639", title: "When Harry Met Sally", mood: "romantic", genre: "comedy", period: "80s" }, - { id: "455207", title: "Crazy Rich Asians", mood: "romantic", genre: "comedy", period: "2010s" }, - { id: "509", title: "Notting Hill", mood: "romantic", genre: "comedy", period: "90s" }, - { id: "4951", title: "10 Things I Hate About You", mood: "romantic", genre: "comedy", period: "90s" }, - { id: "18240", title: "The Proposal", mood: "romantic", genre: "comedy", period: "2000s" }, - - { id: "787", title: "Mr. & Mrs. Smith", mood: "romantic", genre: "action", period: "2000s" }, - { id: "36955", title: "True Lies", mood: "romantic", genre: "action", period: "90s" }, - { id: "10529", title: "Outlander", mood: "romantic", genre: "action", period: "2000s" }, - { id: "2493", title: "The Princess Bride", mood: "romantic", genre: "action", period: "80s" }, - { id: "547016", title: "The Old Guard", mood: "romantic", genre: "action", period: "2020s" }, - - // Movies starting with the mood "scary" - { id: "493922", title: "Hereditary", mood: "scary", genre: "drama", period: "2010s" }, - { id: "274", title: "The Silence of the Lambs", mood: "scary", genre: "drama", period: "90s" }, - { id: "539", title: "Psycho", mood: "scary", genre: "drama", period: "classic" }, - { id: "44214", title: "Black Swan", mood: "scary", genre: "drama", period: "2000s" }, - { id: "503919", title: "The Lighthouse", mood: "scary", genre: "drama", period: "2020s" }, - - { id: "310131", title: "The Witch", mood: "scary", genre: "horror", period: "2010s" }, - { id: "694", title: "The Shining", mood: "scary", genre: "horror", period: "80s" }, - { id: "377", title: "A Nightmare on Elm Street", mood: "scary", genre: "horror", period: "80s" }, - { id: "419430", title: "Get Out", mood: "scary", genre: "horror", period: "2010s" }, - { id: "565", title: "The Ring", mood: "scary", genre: "horror", period: "2000s" }, - - { id: "8413", title: "Event Horizon", mood: "scary", genre: "sci-fi", period: "90s" }, - { id: "348", title: "Alien", mood: "scary", genre: "sci-fi", period: "80s" }, - { id: "300668", title: "Annihilation", mood: "scary", genre: "sci-fi", period: "2010s" }, - { id: "447332", title: "A Quiet Place", mood: "scary", genre: "sci-fi", period: "2010s" }, - { id: "443791", title: "Underwater", mood: "scary", genre: "sci-fi", period: "2020s" }, - - { id: "747", title: "Shaun of the Dead", mood: "scary", genre: "comedy", period: "2000s" }, - { id: "19908", title: "Zombieland", mood: "scary", genre: "comedy", period: "2000s" }, - { id: "4011", title: "Beetlejuice", mood: "scary", genre: "comedy", period: "80s" }, - { id: "22970", title: "The Cabin in the Woods", mood: "scary", genre: "comedy", period: "2010s" }, - { id: "425909", title: "Ghostbusters: Afterlife", mood: "scary", genre: "comedy", period: "2020s" }, - - { id: "72190", title: "World War Z", mood: "scary", genre: "action", period: "2010s" }, - { id: "6479", title: "I Am Legend", mood: "scary", genre: "action", period: "2000s" }, - { id: "106", title: "Predator", mood: "scary", genre: "action", period: "80s" }, - { id: "396535", title: "Train to Busan", mood: "scary", genre: "action", period: "2010s" }, - { id: "503736", title: "Army of the Dead", mood: "scary", genre: "action", period: "2020s" }, - - // Movies starting with the mood "thoughtful" - { id: "8967", title: "The Tree of Life", mood: "thoughtful", genre: "drama", period: "2010s" }, - { id: "14", title: "American Beauty", mood: "thoughtful", genre: "drama", period: "90s" }, - { id: "453", title: "A Beautiful Mind", mood: "thoughtful", genre: "drama", period: "2000s" }, - { id: "595", title: "To Kill a Mockingbird", mood: "thoughtful", genre: "drama", period: "classic" }, - { id: "581734", title: "Nomadland", mood: "thoughtful", genre: "drama", period: "2020s" }, - - { id: "419430", title: "Get Out", mood: "thoughtful", genre: "horror", period: "2010s" }, - { id: "1933", title: "The Others", mood: "thoughtful", genre: "horror", period: "2000s" }, - { id: "745", title: "The Sixth Sense", mood: "thoughtful", genre: "horror", period: "90s" }, - { id: "805", title: "Rosemary's Baby", mood: "thoughtful", genre: "horror", period: "classic" }, - { id: "530385", title: "Midsommar", mood: "thoughtful", genre: "horror", period: "2020s" }, - - { id: "335984", title: "Blade Runner 2049", mood: "thoughtful", genre: "sci-fi", period: "2010s" }, - { id: "27205", title: "Inception", mood: "thoughtful", genre: "sci-fi", period: "2010s" }, - { id: "141", title: "Donnie Darko", mood: "thoughtful", genre: "sci-fi", period: "2000s" }, - { id: "62", title: "2001: A Space Odyssey", mood: "thoughtful", genre: "sci-fi", period: "classic" }, - { id: "264660", title: "Ex Machina", mood: "thoughtful", genre: "sci-fi", period: "2020s" }, - - { id: "120467", title: "The Grand Budapest Hotel", mood: "thoughtful", genre: "comedy", period: "2010s" }, - { id: "153", title: "Lost in Translation", mood: "thoughtful", genre: "comedy", period: "2000s" }, - { id: "137", title: "Groundhog Day", mood: "thoughtful", genre: "comedy", period: "90s" }, - { id: "935", title: "Dr. Strangelove", mood: "thoughtful", genre: "comedy", period: "classic" }, - { id: "515001", title: "Jojo Rabbit", mood: "thoughtful", genre: "comedy", period: "2020s" }, - - { id: "603", title: "The Matrix", mood: "thoughtful", genre: "action", period: "90s" }, - { id: "76341", title: "Mad Max: Fury Road", mood: "thoughtful", genre: "action", period: "2010s" }, - { id: "9693", title: "Children of Men", mood: "thoughtful", genre: "action", period: "2000s" }, - { id: "577922", title: "Tenet", mood: "thoughtful", genre: "action", period: "2020s" }, - { id: "335984", title: "Blade Runner", mood: "thoughtful", genre: "action", period: "80s" }, - ]; - - const filteredMovies = movieDatabase.filter(movie => - movie.mood === mood && movie.genre === genre && movie.period === period); - - if (filteredMovies.length > 0) { - const randomIndex = Math.floor(Math.random() * filteredMovies.length); - const matchedMovie = filteredMovies[randomIndex]; - - localStorage.setItem('selectedMovieId', matchedMovie.id); - window.location.href = 'movie-details.html'; - } - else { - alert('No match found. Try different criteria.'); - } -} - -const form = document.getElementById('form1'); -const IMGPATH = "https://image.tmdb.org/t/p/w1280"; -const SEARCHPATH = `https://${getMovieVerseData()}/3/search/movie?&${generateMovieNames()}${getMovieCode()}&query=`; - -form.addEventListener('submit', (e) => { - e.preventDefault(); - const searchQuery = document.getElementById('search').value; - localStorage.setItem('searchQuery', searchQuery); - window.location.href = 'search.html'; -}); - -function handleSearch() { - const searchQuery = document.getElementById('search').value; - localStorage.setItem('searchQuery', searchQuery); - window.location.href = 'search.html'; -} diff --git a/MovieVerse-Mobile/app/js/movie-timeline.js b/MovieVerse-Mobile/app/js/movie-timeline.js deleted file mode 100644 index eabe2e25..00000000 --- a/MovieVerse-Mobile/app/js/movie-timeline.js +++ /dev/null @@ -1,506 +0,0 @@ -let alertShown = false; - -function showSpinner() { - document.getElementById('myModal').classList.add('modal-visible'); -} - -function hideSpinner() { - document.getElementById('myModal').classList.remove('modal-visible'); -} - -document.getElementById('start-year').addEventListener('keydown', function(event) { - if (event.key === 'Enter') { - event.preventDefault(); - updateMovies(); - } -}); - -document.getElementById('end-year').addEventListener('keydown', function(event) { - if (event.key === 'Enter') { - event.preventDefault(); - updateMovies(); - } -}); - -const movieCode = { - part1: 'YzVhMjBjODY=', - part2: 'MWFjZjdiYjg=', - part3: 'ZDllOTg3ZGNjN2YxYjU1OA==' -}; - -function getMovieCode() { - return atob(movieCode.part1) + atob(movieCode.part2) + atob(movieCode.part3); -} - -function generateMovieNames(input) { - return String.fromCharCode(97, 112, 105, 95, 107, 101, 121, 61); -} - -const IMGPATH = "https://image.tmdb.org/t/p/w500"; -const SEARCHPATH = `https://${getMovieVerseData()}/3/search/movie?&${generateMovieNames()}${getMovieCode()}&query=`; -const searchTitle = document.getElementById("select-text"); -const searchButton = document.getElementById("button-search"); -const search = document.getElementById("search"); -const main = document.getElementById("results"); - -async function ensureGenreMapIsAvailable() { - if (!localStorage.getItem('genreMap')) { - await fetchGenreMap(); - } -} - -async function fetchGenreMap() { - const url = `https://${getMovieVerseData()}/3/genre/movie/list?${generateMovieNames()}${getMovieCode()}`; - try { - const response = await fetch(url); - const data = await response.json(); - const genreMap = data.genres.reduce((map, genre) => { - map[genre.id] = genre.name; - return map; - }, {}); - localStorage.setItem('genreMap', JSON.stringify(genreMap)); - } - catch (error) { - console.log('Error fetching genre map:', error); - } -} - -async function rotateUserStats() { - await ensureGenreMapIsAvailable(); - - const stats = [ - { - label: "Your Current Time", - getValue: () => { - const now = new Date(); - let hours = now.getHours(); - let minutes = now.getMinutes(); - hours = hours < 10 ? '0' + hours : hours; - minutes = minutes < 10 ? '0' + minutes : minutes; - return `${hours}:${minutes}`; - } - }, - { label: "Most Visited Movie", getValue: getMostVisitedMovie }, - { label: "Most Visited Director", getValue: getMostVisitedDirector }, - { label: "Most Visited Actor", getValue: getMostVisitedActor }, - { - label: "Movies Discovered", - getValue: () => { - const viewedMovies = JSON.parse(localStorage.getItem('uniqueMoviesViewed')) || []; - return viewedMovies.length; - } - }, - { - label: "Favorite Movies", - getValue: () => { - const favoritedMovies = JSON.parse(localStorage.getItem('moviesFavorited')) || []; - return favoritedMovies.length; - } - }, - { - label: "Favorite Genre", - getValue: () => { - const mostCommonGenreCode = getMostCommonGenre(); - const genreMapString = localStorage.getItem('genreMap'); - if (!genreMapString) { - console.log('No genre map found in localStorage.'); - return 'Not Available'; - } - - let genreMap; - try { - genreMap = JSON.parse(genreMapString); - } - catch (e) { - console.log('Error parsing genre map:', e); - return 'Not Available'; - } - - let genreObject; - if (Array.isArray(genreMap)) { - genreObject = genreMap.reduce((acc, genre) => { - acc[genre.id] = genre.name; - return acc; - }, {}); - } - else if (typeof genreMap === 'object' && genreMap !== null) { - genreObject = genreMap; - } - else { - console.log('genreMap is neither an array nor a proper object:', genreMap); - return 'Not Available'; - } - - return genreObject[mostCommonGenreCode] || 'Not Available'; - } - }, - { label: "Watchlists Created", getValue: () => localStorage.getItem('watchlistsCreated') || 0 }, - { label: "Average Movie Rating", getValue: () => localStorage.getItem('averageMovieRating') || 'Not Rated' }, - { - label: "Directors Discovered", - getValue: () => { - const viewedDirectors = JSON.parse(localStorage.getItem('uniqueDirectorsViewed')) || []; - return viewedDirectors.length; - } - }, - { - label: "Actors Discovered", - getValue: () => { - const viewedActors = JSON.parse(localStorage.getItem('uniqueActorsViewed')) || []; - return viewedActors.length; - } - }, - { label: "Your Trivia Accuracy", getValue: getTriviaAccuracy }, - ]; - - let currentStatIndex = 0; - - function updateStatDisplay() { - const currentStat = stats[currentStatIndex]; - document.getElementById('stats-label').textContent = currentStat.label + ':'; - document.getElementById('stats-display').textContent = currentStat.getValue(); - currentStatIndex = (currentStatIndex + 1) % stats.length; - } - - updateStatDisplay(); - - const localTimeDiv = document.getElementById('local-time'); - let statRotationInterval = setInterval(updateStatDisplay, 3000); - - localTimeDiv.addEventListener('click', () => { - clearInterval(statRotationInterval); - updateStatDisplay(); - statRotationInterval = setInterval(updateStatDisplay, 3000); - }); -} - -function updateMovieVisitCount(movieId, movieTitle) { - let movieVisits = JSON.parse(localStorage.getItem('movieVisits')) || {}; - if (!movieVisits[movieId]) { - movieVisits[movieId] = { count: 0, title: movieTitle }; - } - movieVisits[movieId].count += 1; - localStorage.setItem('movieVisits', JSON.stringify(movieVisits)); -} - -function getMostVisitedMovie() { - const movieVisits = JSON.parse(localStorage.getItem('movieVisits')) || {}; - let mostVisitedMovie = ''; - let maxVisits = 0; - - for (const movieId in movieVisits) { - if (movieVisits[movieId].count > maxVisits) { - mostVisitedMovie = movieVisits[movieId].title; - maxVisits = movieVisits[movieId].count; - } - } - - return mostVisitedMovie || 'Not Available'; -} - -function getMostVisitedActor() { - const actorVisits = JSON.parse(localStorage.getItem('actorVisits')) || {}; - let mostVisitedActor = ''; - let maxVisits = 0; - - for (const actorId in actorVisits) { - if (actorVisits[actorId].count > maxVisits) { - mostVisitedActor = actorVisits[actorId].name; - maxVisits = actorVisits[actorId].count; - } - } - - return mostVisitedActor || 'Not Available'; -} - -function getMostVisitedDirector() { - const directorVisits = JSON.parse(localStorage.getItem('directorVisits')) || {}; - let mostVisitedDirector = ''; - let maxVisits = 0; - - for (const directorId in directorVisits) { - if (directorVisits[directorId].count > maxVisits) { - mostVisitedDirector = directorVisits[directorId].name; - maxVisits = directorVisits[directorId].count; - } - } - - return mostVisitedDirector || 'Not Available'; -} - -function getTriviaAccuracy() { - let triviaStats = JSON.parse(localStorage.getItem('triviaStats')) || { totalCorrect: 0, totalAttempted: 0 }; - if (triviaStats.totalAttempted === 0) { - return 'No trivia attempted'; - } - let accuracy = (triviaStats.totalCorrect / triviaStats.totalAttempted) * 100; - return `${accuracy.toFixed(1)}% accuracy`; -} - -function getMostCommonGenre() { - const favoriteGenresArray = JSON.parse(localStorage.getItem('favoriteGenres')) || []; - const genreCounts = favoriteGenresArray.reduce((acc, genre) => { - acc[genre] = (acc[genre] || 0) + 1; - return acc; - }, {}); - - let mostCommonGenre = ''; - let maxCount = 0; - - for (const genre in genreCounts) { - if (genreCounts[genre] > maxCount) { - mostCommonGenre = genre; - maxCount = genreCounts[genre]; - } - } - - return mostCommonGenre || 'Not Available'; -} - -document.addEventListener('DOMContentLoaded', rotateUserStats); - -async function getMovies(url) { - clearMovieDetails(); - const numberOfMovies = calculateMoviesToDisplay(); - const pagesToFetch = numberOfMovies <= 20 ? 1 : 2; - let allMovies = []; - - for (let page = 1; page <= pagesToFetch; page++) { - const response = await fetch(`${url}&page=${page}`); - const data = await response.json(); - allMovies = allMovies.concat(data.results); - } - - const popularityThreshold = 0.5; - - allMovies.sort((a, b) => { - const popularityDifference = Math.abs(a.popularity - b.popularity); - if (popularityDifference < popularityThreshold) { - return b.vote_average - a.vote_average; - } - return b.popularity - a.popularity; - }); - - if (allMovies.length > 0) { - showMovies(allMovies.slice(0, numberOfMovies), main); - } - else { - main.innerHTML = `

No movie with the specified search term found. Please try again.

`; - } -} - -function clearMovieDetails() { - const movieDetailsContainer = document.getElementById('movie-details-container'); - if (movieDetailsContainer) { - movieDetailsContainer.innerHTML = ''; - } -} - -const form = document.getElementById('form1'); - -form.addEventListener('submit', (e) => { - e.preventDefault(); - const searchQuery = document.getElementById('search').value; - localStorage.setItem('searchQuery', searchQuery); - window.location.href = 'search.html'; -}); - -function handleSearch() { - const searchQuery = document.getElementById('search').value; - localStorage.setItem('searchQuery', searchQuery); - window.location.href = 'search.html'; -} - -function updateMovies() { - showSpinner(); - let startYear = document.getElementById('start-year').value; - let endYear = document.getElementById('end-year').value; - let currentYear = new Date().getFullYear(); - if (startYear && endYear && startYear <= endYear && endYear <= currentYear && startYear >= 1900 && startYear <= currentYear) { - fetchMoviesByTimePeriod(startYear, endYear); - hideSpinner(); - alertShown = false; - } - else { - if (!alertShown) { - alert('Please ensure the start year is before the end year, the start year is later than the year 1900, and both are not later than the current year.'); - alertShown = true; - } - hideSpinner(); - } -} - -function showMovies(movies, mainElement) { - mainElement.innerHTML = ''; - movies.forEach(movie => { - const movieEl = document.createElement('div'); - movieEl.classList.add('movie'); - const movieImage = movie.poster_path - ? `${movie.title}` - : `
Image Not Available
`; - const voteAvg = movie.vote_average.toFixed(1); - const ratingClass = getClassByRate(movie.vote_average); - let title = movie.title; - const words = title.split(' '); - if (words.length >= 9) { - words[8] = '...'; - title = words.slice(0, 9).join(' '); - } - let overview = movie.overview; - if (overview === '') { - overview = 'No overview available.'; - } - movieEl.innerHTML = ` - ${movieImage} -
-

${title}

- ${voteAvg} -
-
-

Overview:

- ${overview} -
`; - movieEl.addEventListener('click', () => { - localStorage.setItem('selectedMovieId', movie.id); - window.location.href = 'movie-details.html'; - updateMovieVisitCount(movie.id, movie.title); - }); - movieEl.style.cursor = 'pointer'; - mainElement.appendChild(movieEl); - }); -} - -document.getElementById('clear-search-btn').addEventListener('click', () => { - location.reload(); -}); - -async function fetchMoviesByTimePeriod(startYear, endYear) { - const url = `https://${getMovieVerseData()}/3/discover/movie?${generateMovieNames()}${getMovieCode()}&primary_release_date.gte=${startYear}-01-01&primary_release_date.lte=${endYear}-12-31`; - const response = await fetch(url); - const data = await response.json(); - const numberOfMovies = calculateMoviesToDisplay(); - const moviesToShow = data.results.slice(0, numberOfMovies); - showMovies(moviesToShow, document.getElementById('results')); -} - -document.getElementById('load-movies').addEventListener('click', () => { - showSpinner(); - updateMovies(); - alertShown = false; - hideSpinner(); -}); - -function calculateMoviesToDisplay() { - const screenWidth = window.innerWidth; - if (screenWidth <= 689.9) return 10; // 1 movie per row - if (screenWidth <= 1021.24) return 20; // 2 movies per row - if (screenWidth <= 1353.74) return 21; // 3 movies per row - if (screenWidth <= 1684.9) return 20; // 4 movies per row - if (screenWidth <= 2017.49) return 20; // 5 movies per row - if (screenWidth <= 2349.99) return 18; // 6 movies per row - if (screenWidth <= 2681.99) return 21; // 7 movies per row - if (screenWidth <= 3014.49) return 24; // 8 movies per row - if (screenWidth <= 3345.99) return 27; // 9 movies per row - if (screenWidth <= 3677.99) return 20; // 10 movies per row - if (screenWidth <= 4009.99) return 22; // 11 movies per row - if (screenWidth <= 4340.99) return 24; // 12 movies per row - if (screenWidth <= 4673.49) return 26; // 13 movies per row - if (screenWidth <= 5005.99) return 28; // 14 movies per row - if (screenWidth <= 5337.99) return 30; // 15 movies per row - if (screenWidth <= 5669.99) return 32; // 16 movies per row - if (screenWidth <= 6001.99) return 34; // 17 movies per row - if (screenWidth <= 6333.99) return 36; // 18 movies per row - if (screenWidth <= 6665.99) return 38; // 19 movies per row - if (screenWidth <= 6997.99) return 40; // 20 movies per row - if (screenWidth <= 7329.99) return 42; // 21 movies per row - if (screenWidth <= 7661.99) return 44; // 22 movies per row - if (screenWidth <= 7993.99) return 46; // 23 movies per row - if (screenWidth <= 8325.99) return 48; // 24 movies per row - return 20; -} - -function getClassByRate(vote) { - if (vote >= 8) { - return 'green'; - } - else if (vote >= 5) { - return 'orange'; - } - else { - return 'red'; - } -} - -async function showMovieOfTheDay() { - const year = new Date().getFullYear(); - const url = `https://${getMovieVerseData()}/3/discover/movie?${generateMovieNames()}${getMovieCode()}&sort_by=vote_average.desc&vote_count.gte=100&primary_release_year=${year}&vote_average.gte=7`; - - try { - const response = await fetch(url); - const data = await response.json(); - const movies = data.results; - - if (movies.length > 0) { - const randomMovie = movies[Math.floor(Math.random() * movies.length)]; - localStorage.setItem('selectedMovieId', randomMovie.id); - window.location.href = 'movie-details.html'; - } - else { - fallbackMovieSelection(); - } - } - catch (error) { - console.log('Error fetching movie:', error); - fallbackMovieSelection(); - } -} - -function handleSignInOut() { - const isSignedIn = JSON.parse(localStorage.getItem('isSignedIn')) || false; - - if (isSignedIn) { - localStorage.setItem('isSignedIn', JSON.stringify(false)); - alert('You have been signed out.'); - } - else { - window.location.href = 'sign-in.html'; - return; - } - - updateSignInButtonState(); -} - -function getMovieVerseData(input) { - return String.fromCharCode(97, 112, 105, 46, 116, 104, 101, 109, 111, 118, 105, 101, 100, 98, 46, 111, 114, 103); -} - -function updateSignInButtonState() { - const isSignedIn = JSON.parse(localStorage.getItem('isSignedIn')) || false; - - const signInText = document.getElementById('signInOutText'); - const signInIcon = document.getElementById('signInIcon'); - const signOutIcon = document.getElementById('signOutIcon'); - - if (isSignedIn) { - signInText.textContent = 'Sign Out'; - signInIcon.style.display = 'none'; - signOutIcon.style.display = 'inline-block'; - } - else { - signInText.textContent = 'Sign In'; - signInIcon.style.display = 'inline-block'; - signOutIcon.style.display = 'none'; - } -} - -document.addEventListener("DOMContentLoaded", function() { - updateSignInButtonState(); - document.getElementById('googleSignInBtn').addEventListener('click', handleSignInOut); -}); - -function fallbackMovieSelection() { - const fallbackMovies = [432413, 299534, 1726, 562, 118340, 455207, 493922, 447332, 22970, 530385, 27205, 264660, 120467, 603, 577922, 76341, 539, 419704, 515001, 118340, 424, 98]; - const randomFallbackMovie = fallbackMovies[Math.floor(Math.random() * fallbackMovies.length)]; - localStorage.setItem('selectedMovieId', randomFallbackMovie); - window.location.href = 'movie-details.html'; -} diff --git a/MovieVerse-Mobile/app/js/notifications.js b/MovieVerse-Mobile/app/js/notifications.js deleted file mode 100644 index 39223f01..00000000 --- a/MovieVerse-Mobile/app/js/notifications.js +++ /dev/null @@ -1,177 +0,0 @@ -const movieCode = { - part1: 'YzVhMjBjODY=', - part2: 'MWFjZjdiYjg=', - part3: 'ZDllOTg3ZGNjN2YxYjU1OA==' -}; - -function getMovieCode() { - return atob(movieCode.part1) + atob(movieCode.part2) + atob(movieCode.part3); -} - -document.addEventListener('DOMContentLoaded', () => { - const today = new Date(); - fetchReleasesByCategory('releasesSinceLastVisit', new Date(localStorage.getItem('lastVisit')), today, true); - fetchReleasesByCategory('releasesThisMonth', new Date(today.getFullYear(), today.getMonth(), 1), today, false); - fetchReleasesByCategory('releasesThisYear', new Date(today.getFullYear(), 0, 1), today, false); - fetchRecommendedReleases(); -}); - -async function fetchReleasesByCategory(elementId, startDate, endDate, isLastVisit) { - const list = document.getElementById(elementId); - list.innerHTML = ''; - - let movies = await fetchMovies(startDate, endDate); - - movies = movies.sort((a, b) => new Date(b.release_date) - new Date(a.release_date)); - - populateList(elementId, movies.slice(0, 5)); -} - -async function fetchMovies(startDate, endDate) { - const formattedStartDate = `${startDate.getFullYear()}-${(startDate.getMonth() + 1).toString().padStart(2, '0')}-${startDate.getDate().toString().padStart(2, '0')}`; - const formattedEndDate = `${endDate.getFullYear()}-${(endDate.getMonth() + 1).toString().padStart(2, '0')}-${endDate.getDate().toString().padStart(2, '0')}`; - - const url = `https://${getMovieVerseData()}/3/discover/movie?${generateMovieNames()}${getMovieCode()}&release_date.gte=${formattedStartDate}&release_date.lte=${formattedEndDate}`; - - try { - const response = await fetch(url); - const data = await response.json(); - return data.results; - } - catch (error) { - console.log('Failed to fetch movies for', elementId + ':', error); - return []; - } -} - -function generateMovieNames(input) { - return String.fromCharCode(97, 112, 105, 95, 107, 101, 121, 61); -} - -async function getMostVisitedMovieGenre() { - const movieVisits = JSON.parse(localStorage.getItem('movieVisits')) || {}; - let mostVisitedGenre = null; - let maxVisits = 0; - for (const movieId in movieVisits) { - const visits = movieVisits[movieId]; - if (visits.count > maxVisits) { - maxVisits = visits.count; - mostVisitedGenre = await fetchGenreForMovie(movieId); - } - } - return mostVisitedGenre; -} - -async function fetchGenreForMovie(movieId) { - const movieDetailsUrl = `https://${getMovieVerseData()}/3/movie/${movieId}?${generateMovieNames()}${getMovieCode()}`; - const response = await fetch(movieDetailsUrl); - const movieDetails = await response.json(); - return movieDetails.genres[0] ? movieDetails.genres[0].id : null; -} - -async function fetchRecommendedReleases() { - let url; - - const mostCommonGenre = getMostCommonGenre(); - const mostVisitedMovieGenre = await getMostVisitedMovieGenre(); - - try { - const genreId = mostVisitedMovieGenre || mostCommonGenre; - if (!genreId) { - throw new Error('Genre ID is not valid.'); - } - url = `https://${getMovieVerseData()}/3/discover/movie?${generateMovieNames()}${getMovieCode()}&with_genres=${genreId}`; - } - catch (error) { - console.log('Fetching recommended movies failed or data issues:', error); - url = `https://${getMovieVerseData()}/3/movie/popular?${generateMovieNames()}${getMovieCode()}&language=en-US&page=1`; - } - - try { - const response = await fetch(url); - const data = await response.json(); - populateList('recommendedReleases', data.results.slice(0, 5)); - } - catch (error) { - console.log('Failed to fetch movies:', error); - } -} - -function populateList(elementId, movies) { - const list = document.getElementById(elementId); - list.innerHTML = ''; - movies.forEach(movie => { - const li = document.createElement('li'); - li.style.cursor = 'pointer'; - li.addEventListener('click', () => { - localStorage.setItem('selectedMovieId', movie.id.toString()); - window.location.href = 'movie-details.html'; - }); - - const title = document.createElement('span'); - title.textContent = movie.title; - title.style.color = 'black'; - li.appendChild(title); - list.appendChild(li); - }); -} - -document.addEventListener('DOMContentLoaded', () => { - populateActors(); - populateDirectors(); -}); - -function populateActors() { - const actors = [ - { name: "Robert Downey Jr.", id: 3223 }, - { name: "Scarlett Johansson", id: 1245 }, - { name: "Denzel Washington", id: 5292 }, - { name: "Meryl Streep", id: 5064 }, - { name: "Leonardo DiCaprio", id: 6193 }, - { name: "Sandra Bullock", id: 18277 }, - { name: "Tom Hanks", id: 31 } - ]; - - const list = document.getElementById('popularActors').querySelector('ul'); - actors.forEach(actor => { - const li = document.createElement('li'); - li.style.cursor = 'pointer'; - li.addEventListener('click', () => { - localStorage.setItem('selectedActorId', actor.id.toString()); - window.location.href = 'actor-details.html'; - }); - - const name = document.createElement('span'); - name.textContent = actor.name; - li.appendChild(name); - list.appendChild(li); - }); -} - -function populateDirectors() { - const directors = [ - {name: "Steven Spielberg", id: 488}, - {name: "Martin Scorsese", id: 1032}, - {name: "Christopher Nolan", id: 525}, - {name: "Quentin Tarantino", id: 138}, - {name: "Kathryn Bigelow", id: 14392}, - {name: "James Cameron", id: 2710}, - {name: "Sofia Coppola", id: 1776} - ]; - - const list = document.getElementById('popularDirectors').querySelector('ul'); - directors.forEach(director => { - const li = document.createElement('li'); - li.style.cursor = 'pointer'; - li.addEventListener('click', () => { - localStorage.setItem('selectedDirectorId', director.id.toString()); - window.location.href = 'director-details.html'; - }); - - const name = document.createElement('span'); - name.textContent = director.name; - li.appendChild(name); - - list.appendChild(li); - }); -} diff --git a/MovieVerse-Mobile/app/js/quiz.js b/MovieVerse-Mobile/app/js/quiz.js deleted file mode 100644 index a674b85e..00000000 --- a/MovieVerse-Mobile/app/js/quiz.js +++ /dev/null @@ -1,341 +0,0 @@ -import { updateTriviaStats } from './triviaModule.js'; - -const questionBank = [ - { question: "What movie won the Academy Award for Best Picture in 2020?", options: ["Joker", "1917", "Parasite"], answer: "Parasite" }, - { question: "Who directed the movie 'The Godfather'?", options: ["Steven Spielberg", "Francis Ford Coppola", "Martin Scorsese"], answer: "Francis Ford Coppola" }, - { question: "What was the first feature-length animated movie ever released?", options: ["Snow White and the Seven Dwarfs", "Bambi", "Pinocchio"], answer: "Snow White and the Seven Dwarfs" }, - { question: "What was the highest-grossing movie of all time before the release of 'Avatar'?", options: ["Titanic", "Star Wars: The Force Awakens", "Avengers: Endgame"], answer: "Titanic" }, - { question: "Who played the lead role in the movie 'Forrest Gump'?", options: ["Tom Hanks", "Brad Pitt", "Leonardo DiCaprio"], answer: "Tom Hanks" }, - { question: "What movie won the Academy Award for Best Picture in 2019?", options: ["Bohemian Rhapsody", "Green Book", "Roma"], answer: "Green Book" }, - { question: "Who played the character of John McClane in the Die Hard movie series?", options: ["Arnold Schwarzenegger", "Sylvester Stallone", "Bruce Willis"], answer: "Bruce Willis" }, - { question: "What movie is based on a novel by Stephen King and features a character named Jack Torrance?", options: ["Carrie", "The Shining", "Misery"], answer: "The Shining" }, - { question: "Who directed the movie 'Forrest Gump'?", options: ["Steven Spielberg", "Robert Zemeckis", "Martin Scorsese"], answer: "Robert Zemeckis" }, - { question: "What is the highest-grossing movie of all time (as of 2021)?", options: ["Avatar", "Avengers: Endgame", "Titanic"], answer: "Avatar" }, - { question: "What movie features the line 'You can't handle the truth!'?", options: ["The Shawshank Redemption", "A Few Good Men", "Goodfellas"], answer: "A Few Good Men" }, - { question: "Who played the character of Tony Stark/Iron Man in the Marvel Cinematic Universe?", options: ["Chris Hemsworth", "Mark Ruffalo", "Robert Downey Jr."], answer: "Robert Downey Jr." }, - { question: "In which movie did Tom Hanks say, 'Houston, we have a problem'?", options: ["Apollo 13", "Cast Away", "The Terminal"], answer: "Apollo 13" }, - { question: "What is the name of the hobbit played by Elijah Wood in the Lord of the Rings movies?", options: ["Frodo", "Sam", "Merry"], answer: "Frodo" }, - { question: "What is the name of the kingdom where the 2013 animated movie 'Frozen' is set?", options: ["Arendelle", "Genovia", "DunBroch"], answer: "Arendelle" }, - { question: "Which 1997 science fiction movie stars Will Smith and Tommy Lee Jones?", options: ["Independence Day", "Men in Black", "Wild Wild West"], answer: "Men in Black" }, - { question: "Which movie features Bruce Willis as a child psychologist?", options: ["Die Hard", "The Sixth Sense", "Unbreakable"], answer: "The Sixth Sense" }, - { question: "In 'The Matrix', does Neo take the blue pill or the red pill?", options: ["Blue", "Red", "Green"], answer: "Red" }, - { question: "Which actress played Katniss Everdeen in 'The Hunger Games' movies?", options: ["Jennifer Lawrence", "Emma Watson", "Shailene Woodley"], answer: "Jennifer Lawrence" }, - { question: "Who directed 'Jurassic Park'?", options: ["James Cameron", "Steven Spielberg", "George Lucas"], answer: "Steven Spielberg" }, - { question: "What 1980s movie was the highest grossing film of the decade?", options: ["E.T. the Extra-Terrestrial", "Star Wars: Episode V", "Back to the Future"], answer: "E.T. the Extra-Terrestrial" }, - { question: "Which movie features the song 'My Heart Will Go On'?", options: ["The Bodyguard", "Titanic", "Romeo + Juliet"], answer: "Titanic" }, - { question: "What was the first Pixar movie?", options: ["Toy Story", "A Bug's Life", "Monsters, Inc."], answer: "Toy Story" }, - { question: "Who played Wolverine in the X-Men movies?", options: ["Hugh Jackman", "Liam Hemsworth", "Chris Evans"], answer: "Hugh Jackman" }, - { question: "Which film did NOT win the Academy Award for Best Picture?", options: ["The Shawshank Redemption", "The Godfather", "Forrest Gump"], answer: "The Shawshank Redemption" }, - { question: "What is Indiana Jones' real first name?", options: ["Henry", "John", "Walter"], answer: "Henry" }, - { question: "In 'The Wizard of Oz', what did the Scarecrow want from the wizard?", options: ["Heart", "Brain", "Courage"], answer: "Brain" }, - { question: "Who is the only actor to receive an Oscar nomination for acting in a Lord of the Rings movie?", options: ["Viggo Mortensen", "Ian McKellen", "Elijah Wood"], answer: "Ian McKellen" }, - { question: "Which movie features an iconic dance scene between Uma Thurman and John Travolta?", options: ["Pulp Fiction", "Kill Bill", "Saturday Night Fever"], answer: "Pulp Fiction" }, - { question: "What is the highest-grossing R-rated movie of all time?", options: ["Deadpool", "Joker", "The Matrix"], answer: "Joker" }, - { question: "Which Alfred Hitchcock movie is notorious for its shower scene?", options: ["Vertigo", "Psycho", "Rear Window"], answer: "Psycho" }, - { question: "What is Darth Vader's real name?", options: ["Anakin Skywalker", "Luke Skywalker", "Obi-Wan Kenobi"], answer: "Anakin Skywalker" }, - { question: "Who directed 'Schindler's List'?", options: ["Martin Scorsese", "Steven Spielberg", "Ridley Scott"], answer: "Steven Spielberg" }, - { question: "In which movie does Tom Cruise perform his own stunts climbing the Burj Khalifa?", options: ["Mission: Impossible - Rogue Nation", "Mission: Impossible - Ghost Protocol", "Edge of Tomorrow"], answer: "Mission: Impossible - Ghost Protocol" }, - { question: "What is the name of the fictional African country where 'Black Panther' is set?", options: ["Wakanda", "Genovia", "Zamunda"], answer: "Wakanda" }, - { question: "Who directed 'Inception' and 'Interstellar'?", options: ["Christopher Nolan", "James Cameron", "Steven Spielberg"], answer: "Christopher Nolan" }, - { question: "In 'The Hunger Games', what district do Katniss and Peeta represent?", options: ["District 12", "District 9", "District 7"], answer: "District 12" }, - { question: "Which movie features a character named Tyler Durden?", options: ["Fight Club", "Gone Girl", "Seven"], answer: "Fight Club" }, - { question: "What is the name of the island in 'Jurassic Park'?", options: ["Isla Nublar", "Isla Sorna", "Skull Island"], answer: "Isla Nublar" }, - { question: "Who played the Joker in 'The Dark Knight'?", options: ["Heath Ledger", "Joaquin Phoenix", "Jared Leto"], answer: "Heath Ledger" }, - { question: "In which movie is the fictional company Initech featured?", options: ["Office Space", "The Social Network", "Wall Street"], answer: "Office Space" }, - { question: "What year was the first 'Harry Potter' movie released?", options: ["2001", "2003", "1999"], answer: "2001" }, - { question: "What fictional country is 'Wonder Woman' from?", options: ["Themyscira", "Asgard", "Genovia"], answer: "Themyscira" }, - { question: "Which movie is known for the quote 'Here's looking at you, kid'?", options: ["Casablanca", "Gone with the Wind", "The Maltese Falcon"], answer: "Casablanca" }, - { question: "In 'The Lion King', what is Simba's mother's name?", options: ["Nala", "Sarabi", "Shenzi"], answer: "Sarabi" }, - { question: "Who directed 'Avengers: Endgame'?", options: ["The Russo Brothers", "Joss Whedon", "Jon Favreau"], answer: "The Russo Brothers" }, - { question: "What is the name of the kingdom in 'Tangled'?", options: ["Corona", "Far Far Away", "Arendelle"], answer: "Corona" }, - { question: "Which film features a famous dance scene with Uma Thurman and John Travolta?", options: ["Pulp Fiction", "Saturday Night Fever", "Kill Bill"], answer: "Pulp Fiction" }, - { question: "Who played Jack Dawson in 'Titanic'?", options: ["Leonardo DiCaprio", "Brad Pitt", "Johnny Depp"], answer: "Leonardo DiCaprio" }, - { question: "What is the highest-grossing film of all time?", options: ["Avengers: Endgame", "Avatar", "Titanic"], answer: "Avatar" }, - { question: "In which movie does the character Neo appear?", options: ["The Matrix", "John Wick", "Speed"], answer: "The Matrix" }, - { question: "What is the real name of the Black Panther in the Marvel Cinematic Universe?", options: ["T'Challa", "M'Baku", "N'Jadaka"], answer: "T'Challa" }, - { question: "Who directed 'Mad Max: Fury Road'?", options: ["George Miller", "Ridley Scott", "Peter Jackson"], answer: "George Miller" }, - { question: "What animated film features a character named 'Hiccup'?", options: ["Brave", "How to Train Your Dragon", "Shrek"], answer: "How to Train Your Dragon" }, - { question: "In which film is the fictional mineral 'Unobtainium' sought after?", options: ["Avatar", "The Core", "Transformers"], answer: "Avatar" }, - { question: "What is the name of the fictional city where the Batman movies take place?", options: ["Gotham City", "Metropolis", "Star City"], answer: "Gotham City" }, - { question: "Who directed 'The Dark Knight'?", options: ["Christopher Nolan", "Martin Scorsese", "Steven Spielberg"], answer: "Christopher Nolan" }, - { question: "Who won the Best Actress award at the Oscars in 2021?", options: ["Viola Davis", "Frances McDormand", "Carey Mulligan"], answer: "Frances McDormand" }, - { question: "Which movie features a dystopian future divided into faction-based societies?", options: ["The Hunger Games", "Divergent", "The Maze Runner"], answer: "Divergent" }, - { question: "What is the name of the spaceship in 'Alien' (1979)?", options: ["Nostromo", "Serenity", "Millennium Falcon"], answer: "Nostromo" }, - { question: "Which director is known for the 'Dark Knight' trilogy?", options: ["Christopher Nolan", "Tim Burton", "Joel Schumacher"], answer: "Christopher Nolan" }, - { question: "In 'The Terminator', what is the name of the company that created Skynet?", options: ["Cyberdyne Systems", "Wayland Industries", "Oscorp"], answer: "Cyberdyne Systems" }, - { question: "What 1994 film revitalized John Travolta's career?", options: ["Get Shorty", "Pulp Fiction", "Face/Off"], answer: "Pulp Fiction" }, - { question: "Which movie was incorrectly announced as the Best Picture winner at the 2017 Academy Awards?", options: ["La La Land", "Moonlight", "Manchester by the Sea"], answer: "La La Land" }, - { question: "What animated film was Disney's first ever full-length feature?", options: ["Snow White and the Seven Dwarfs", "Cinderella", "The Little Mermaid"], answer: "Snow White and the Seven Dwarfs" }, - { question: "Who directed 'E.T. the Extra-Terrestrial'?", options: ["Steven Spielberg", "George Lucas", "Ridley Scott"], answer: "Steven Spielberg" }, - { question: "Which film contains the quote, 'There's no place like home'?", options: ["The Wizard of Oz", "Gone with the Wind", "Casablanca"], answer: "The Wizard of Oz" }, - { question: "What is the highest grossing film of all time (not adjusted for inflation) as of 2023?", options: ["Avengers: Endgame", "Avatar", "Titanic"], answer: "Avatar" }, - { question: "Who composed the score for 'The Lion King' (1994)?", options: ["John Williams", "Hans Zimmer", "Alan Menken"], answer: "Hans Zimmer" }, - { question: "Which movie did Leonardo DiCaprio win his first Oscar for Best Actor?", options: ["The Revenant", "The Wolf of Wall Street", "Inception"], answer: "The Revenant" }, - { question: "In which film does the character Maximus Decimus Meridius appear?", options: ["300", "Gladiator", "Troy"], answer: "Gladiator" }, - { question: "What is the name of the fictional British spy in the film series created by Ian Fleming?", options: ["James Bond", "Jason Bourne", "Jack Ryan"], answer: "James Bond" }, - { question: "Which movie won the Academy Award for Best Animated Feature in 2021?", options: ["Onward", "Soul", "Wolfwalkers"], answer: "Soul" }, - { question: "Who played the role of Michael Corleone in 'The Godfather'?", options: ["Al Pacino", "Robert De Niro", "Marlon Brando"], answer: "Al Pacino" }, - { question: "What 2009 film is known for pioneering modern 3D cinema technology?", options: ["Inception", "Avatar", "The Hurt Locker"], answer: "Avatar" }, - { question: "Which 2012 film features a protagonist who survives a shipwreck with a tiger?", options: ["Life of Pi", "Cast Away", "The Revenant"], answer: "Life of Pi" }, - { question: "What is the main theme of the movie 'Inception'?", options: ["Time travel", "Dream manipulation", "Space exploration"], answer: "Dream manipulation" }, - { question: "Which film features the character Sarah Connor, who is central to the plot?", options: ["The Terminator", "Aliens", "Jurassic Park"], answer: "The Terminator" }, - { question: "What 1999 movie is famous for the quote, 'I see dead people'?", options: ["The Sixth Sense", "Ghost", "The Others"], answer: "The Sixth Sense" }, - { question: "Who directed 'Titanic', which won the Academy Award for Best Picture in 1997?", options: ["James Cameron", "Steven Spielberg", "Martin Scorsese"], answer: "James Cameron" }, - { question: "Which film did NOT feature Leonardo DiCaprio?", options: ["Titanic", "The Great Gatsby", "The Prestige"], answer: "The Prestige" }, - { question: "In which movie do characters compete in the 'Hunger Games'?", options: ["Catching Fire", "The Hunger Games", "Battle Royale"], answer: "The Hunger Games" }, - { question: "What film, released in 1982, features a character named E.T.?", options: ["Star Wars", "Close Encounters of the Third Kind", "E.T. the Extra-Terrestrial"], answer: "E.T. the Extra-Terrestrial" }, - { question: "Who starred as the lead in the 2018 film 'Black Panther'?", options: ["Chadwick Boseman", "Michael B. Jordan", "Denzel Washington"], answer: "Chadwick Boseman" }, - { question: "What iconic 1980s movie features the quote, 'Say hello to my little friend!'?", options: ["Scarface", "The Godfather", "Goodfellas"], answer: "Scarface" }, - { question: "Which film features a unique spinning top in its final scene?", options: ["Inception", "Minority Report", "The Matrix"], answer: "Inception" }, - { question: "What movie, featuring a journey to Mordor, won the Academy Award for Best Picture in 2003?", options: ["The Lord of the Rings: The Two Towers", "The Lord of the Rings: The Return of the King", "The Lord of the Rings: The Fellowship of the Ring"], answer: "The Lord of the Rings: The Return of the King" }, - { question: "Which movie features a giant monster known as Godzilla?", options: ["Pacific Rim", "Godzilla", "Cloverfield"], answer: "Godzilla" }, - { question: "What classic film was remade in 2005 starring Naomi Watts and Jack Black?", options: ["King Kong", "Godzilla", "Planet of the Apes"], answer: "King Kong" }, - { question: "Who directed the 1994 crime film 'Pulp Fiction'?", options: ["Quentin Tarantino", "Steven Spielberg", "Martin Scorsese"], answer: "Quentin Tarantino" }, - { question: "Which movie includes a character named Norman Bates?", options: ["Psycho", "Rebecca", "The Birds"], answer: "Psycho" }, - { question: "What is the name of the fictional theme park in 'Jurassic Park'?", options: ["Dinosaur Land", "Jurassic World", "Isla Nublar"], answer: "Isla Nublar" }, - { question: "Who played the role of Clarice Starling in the film 'The Silence of the Lambs'?", options: ["Jodie Foster", "Julianne Moore", "Sigourney Weaver"], answer: "Jodie Foster" }, - { question: "Which film is famous for the line, 'May the Force be with you'?", options: ["Star Trek", "Star Wars", "Guardians of the Galaxy"], answer: "Star Wars" }, - { question: "What 1975 thriller is known for its menacing shark and famous soundtrack?", options: ["Deep Blue Sea", "Jaws", "Sharknado"], answer: "Jaws" }, - { question: "Which film did Tom Hanks win his first Academy Award for Best Actor?", options: ["Big", "Philadelphia", "Forrest Gump"], answer: "Philadelphia" }, - { question: "What is the name of the ring in 'The Lord of the Rings'?", options: ["The Ring of Power", "The One Ring", "The Master Ring"], answer: "The One Ring" }, - { question: "Who directed 'Avatar', the groundbreaking sci-fi movie released in 2009?", options: ["James Cameron", "George Lucas", "Steven Spielberg"], answer: "James Cameron" }, - { question: "Which 1988 animated film features a dystopian future and psychic powers?", options: ["Ghost in the Shell", "Akira", "Blade Runner"], answer: "Akira" }, - { question: "Who played the role of Hermione Granger in the Harry Potter films?", options: ["Emma Watson", "Emma Stone", "Emily Blunt"], answer: "Emma Watson" }, - { question: "Which film features a group of friends who use a map to find a pirate's treasure?", options: ["The Goonies", "Treasure Island", "Pirates of the Caribbean"], answer: "The Goonies" }, - { question: "What was the first animated film to receive a Best Picture nomination at the Oscars?", options: ["Beauty and the Beast", "The Lion King", "Up"], answer: "Beauty and the Beast" }, - { question: "What is the fictional sport played in the 'Harry Potter' series?", options: ["Quidditch", "Bludgers", "Snitchball"], answer: "Quidditch" }, - { question: "Who composed the iconic score for 'Star Wars'?", options: ["Hans Zimmer", "John Williams", "Danny Elfman"], answer: "John Williams" }, - { question: "What 2000 film, directed by Ridley Scott, features a Roman general turned gladiator?", options: ["Spartacus", "Gladiator", "Ben-Hur"], answer: "Gladiator" }, - { question: "Which movie's plot centers around a unique wooden board game?", options: ["Clue", "Jumanji", "Zathura"], answer: "Jumanji" }, - { question: "Who directed the 1980 horror film 'The Shining'?", options: ["Stanley Kubrick", "Alfred Hitchcock", "Stephen King"], answer: "Stanley Kubrick" }, - { question: "What 1993 science fiction film directed by Steven Spielberg features dinosaurs brought back to life through cloning?", options: ["Jurassic Park", "The Lost World", "Dinosaur"], answer: "Jurassic Park" }, - { question: "Who voiced the character of Woody in the 'Toy Story' movies?", options: ["Tom Hanks", "Tim Allen", "Billy Crystal"], answer: "Tom Hanks" }, - { question: "Which 2010 film directed by Christopher Nolan explores dream-sharing technology?", options: ["Inception", "Interstellar", "Memento"], answer: "Inception" }, - { question: "What film series features a secret British spy agency known as Kingsman?", options: ["James Bond", "Kingsman", "Johnny English"], answer: "Kingsman" }, - { question: "Who played the role of Jack Sparrow in the 'Pirates of the Caribbean' film series?", options: ["Johnny Depp", "Orlando Bloom", "Keira Knightley"], answer: "Johnny Depp" }, - { question: "Which 2001 film, based on a J.R.R. Tolkien novel, follows a hobbit's quest to destroy a powerful ring?", options: ["The Hobbit", "The Lord of the Rings: The Fellowship of the Ring", "The Lord of the Rings: The Two Towers"], answer: "The Lord of the Rings: The Fellowship of the Ring" }, - { question: "What 2003 animated film features a fish named Nemo?", options: ["Shark Tale", "Finding Nemo", "The Little Mermaid"], answer: "Finding Nemo" }, - { question: "Which 2017 film is based on a DC Comics character and set during World War I?", options: ["Wonder Woman", "Captain America: The First Avenger", "Justice League"], answer: "Wonder Woman" }, - { question: "Who directed the 1994 film 'Pulp Fiction'?", options: ["Quentin Tarantino", "Martin Scorsese", "Ridley Scott"], answer: "Quentin Tarantino" }, - { question: "What movie introduced the character of Hannibal Lecter?", options: ["Silence of the Lambs", "Hannibal", "Manhunter"], answer: "Manhunter" }, - { question: "Which 2016 film tells the story of a group of rebels who plan to steal plans for the Death Star?", options: ["Star Wars: The Force Awakens", "Rogue One: A Star Wars Story", "Star Wars: The Last Jedi"], answer: "Rogue One: A Star Wars Story" }, - { question: "What is the name of the fictional African kingdom in 'Coming to America'?", options: ["Wakanda", "Zamunda", "Genovia"], answer: "Zamunda" }, - { question: "Who directed the 2017 movie 'Get Out'?", options: ["Jordan Peele", "Spike Lee", "John Singleton"], answer: "Jordan Peele" }, - { question: "Which movie features an AI character named HAL 9000?", options: ["Blade Runner", "Ex Machina", "2001: A Space Odyssey"], answer: "2001: A Space Odyssey" }, - { question: "What 1980s movie is known for the quote 'Nobody puts Baby in a corner'?", options: ["Dirty Dancing", "Footloose", "Flashdance"], answer: "Dirty Dancing" }, - { question: "What 1995 film directed by Michael Mann stars Robert De Niro and Al Pacino?", options: ["Heat", "The Godfather", "Scarface"], answer: "Heat" }, - { question: "Who starred as the titular character in the 2014 film 'Maleficent'?", options: ["Angelina Jolie", "Charlize Theron", "Nicole Kidman"], answer: "Angelina Jolie" }, - { question: "Which film is about a board game that becomes real for the players?", options: ["Zathura", "Jumanji", "The Game"], answer: "Jumanji" }, - { question: "In which movie does a group of archaeologists find a frozen prehistoric man?", options: ["Encino Man", "Ice Age", "The Thing"], answer: "Encino Man" }, - { question: "What movie features a theme park filled with cloned dinosaurs?", options: ["Jurassic Park", "Westworld", "Prehistoric Park"], answer: "Jurassic Park" } -]; - -const movieCode = { - part1: 'YzVhMjBjODY=', - part2: 'MWFjZjdiYjg=', - part3: 'ZDllOTg3ZGNjN2YxYjU1OA==' -}; - -function getMovieCode() { - return atob(movieCode.part1) + atob(movieCode.part2) + atob(movieCode.part3); -} - -function generateMovieNames(input) { - return String.fromCharCode(97, 112, 105, 95, 107, 101, 121, 61); -} - -const form = document.getElementById("form"); - -form.addEventListener('submit', (e) => { - e.preventDefault(); - const searchQuery = document.getElementById('search').value; - localStorage.setItem('searchQuery', searchQuery); - window.location.href = 'search.html'; -}); - -function handleSearch() { - const searchQuery = document.getElementById('search').value; - localStorage.setItem('searchQuery', searchQuery); - window.location.href = 'search.html'; -} - -function generateRandomQuestions() { - const questionsToDisplay = 10; - const shuffledQuestions = questionBank.sort(() => 0.5 - Math.random()); - let selectedQuestions = shuffledQuestions.slice(0, questionsToDisplay); - - const quizContainer = document.getElementById('quiz-container'); - quizContainer.innerHTML = ''; - - selectedQuestions.forEach((question, index) => { - const questionElement = document.createElement('div'); - questionElement.innerHTML = ` -

Question ${index + 1}:

-

${question.question}

- ${question.options.map((option, i) => `
`).join('')} -
`; - quizContainer.appendChild(questionElement); - - const headerElement = questionElement.querySelector(`h2`); - - headerElement.addEventListener('click', function(e) { - e.preventDefault(); - - headerElement.scrollIntoView({ behavior: 'smooth' }); - }); - - headerElement.style.cursor = 'pointer'; - }); -} - -document.getElementById('regenerate-questions').addEventListener('click', generateRandomQuestions); -generateRandomQuestions(); - -async function showMovieOfTheDay() { - const year = new Date().getFullYear(); - const url = `https://${getMovieVerseData()}/3/discover/movie?${generateMovieNames()}${getMovieCode()}&sort_by=vote_average.desc&vote_count.gte=100&primary_release_year=${year}&vote_average.gte=7`; - - try { - const response = await fetch(url); - const data = await response.json(); - const movies = data.results; - - if (movies.length > 0) { - const randomMovie = movies[Math.floor(Math.random() * movies.length)]; - localStorage.setItem('selectedMovieId', randomMovie.id); - window.location.href = 'movie-details.html'; - } - else { - fallbackMovieSelection(); - } - } - catch (error) { - console.log('Error fetching movie:', error); - fallbackMovieSelection(); - } -} - -function getMovieVerseData(input) { - return String.fromCharCode(97, 112, 105, 46, 116, 104, 101, 109, 111, 118, 105, 101, 100, 98, 46, 111, 114, 103); -} - -function fallbackMovieSelection() { - const fallbackMovies = [432413, 299534, 1726, 562, 118340, 455207, 493922, 447332, 22970, 530385, 27205, 264660, 120467, 603, 577922, 76341, 539, 419704, 515001, 118340, 424, 98]; - const randomFallbackMovie = fallbackMovies[Math.floor(Math.random() * fallbackMovies.length)]; - localStorage.setItem('selectedMovieId', randomFallbackMovie); - window.location.href = 'movie-details.html'; -} - -function handleSignInOut() { - const isSignedIn = JSON.parse(localStorage.getItem('isSignedIn')) || false; - - if (isSignedIn) { - localStorage.setItem('isSignedIn', JSON.stringify(false)); - alert('You have been signed out.'); - } - else { - window.location.href = 'sign-in.html'; - return; - } - - updateSignInButtonState(); -} - -function updateSignInButtonState() { - const isSignedIn = JSON.parse(localStorage.getItem('isSignedIn')) || false; - - const signInText = document.getElementById('signInOutText'); - const signInIcon = document.getElementById('signInIcon'); - const signOutIcon = document.getElementById('signOutIcon'); - - if (isSignedIn) { - signInText.textContent = 'Sign Out'; - signInIcon.style.display = 'none'; - signOutIcon.style.display = 'inline-block'; - } - else { - signInText.textContent = 'Sign In'; - signInIcon.style.display = 'inline-block'; - signOutIcon.style.display = 'none'; - } -} - -document.addEventListener("DOMContentLoaded", function() { - updateSignInButtonState(); - document.getElementById('googleSignInBtn').addEventListener('click', handleSignInOut); -}); - -document.getElementById('quiz-form').addEventListener('submit', function(event) { - event.preventDefault(); - - let answeredQuestions = 0; - - for (let i = 0; i < 10; i++) { - if (document.querySelector(`input[name="q${i}"]:checked`)) { - answeredQuestions++; - } - } - - if (answeredQuestions < 10) { - const confirmSubmit = confirm(`You have only answered ${answeredQuestions} questions. Are you sure you want to submit?`); - if (!confirmSubmit) { - return; - } - } - - calculateAndDisplayResults(); -}); - -function calculateAndDisplayResults() { - let score = 0; - const totalQuestions = 10; - - questionBank.forEach((question, index) => { - const selectedAnswer = document.querySelector(`input[name="q${index}"]:checked`); - if (selectedAnswer && selectedAnswer.value === question.answer) { - score++; - } - }); - - const currentUserEmail = localStorage.getItem('currentlySignedInMovieVerseUser') || null; - - updateTriviaStats(currentUserEmail, score, totalQuestions); - - displayResults(score); -} - -function displayResults(score) { - let accuracy = (score / 10) * 100; - let progress = 0; - - document.getElementById('progress-circle').style.setProperty('--progress', `${progress}%`); - document.getElementById('correct-answers').textContent = score; - document.getElementById('result-text').textContent = `Your score is ${score} out of 10 (${accuracy.toFixed(1)}% accuracy)`; - - const interval = setInterval(() => { - if (progress < accuracy) { - progress++; - document.getElementById('progress-circle').style.setProperty('--progress', `${progress}%`); - } - else { - clearInterval(interval); - } - }, 20); - - showModal(); -} - -function showModal() { - const modal = document.getElementById('result-modal'); - modal.style.display = "block"; - - modal.querySelector('.close-button').addEventListener('click', function() { - modal.style.display = "none"; - }); - - window.addEventListener('click', function(event) { - if (event.target == modal) { - modal.style.display = "none"; - } - }); -} diff --git a/MovieVerse-Mobile/app/js/ratings-module.js b/MovieVerse-Mobile/app/js/ratings-module.js deleted file mode 100644 index 37bd576f..00000000 --- a/MovieVerse-Mobile/app/js/ratings-module.js +++ /dev/null @@ -1,80 +0,0 @@ -import { initializeApp } from "https://www.gstatic.com/firebasejs/10.8.0/firebase-app.js"; -import { getFirestore, doc, setDoc, getDoc } from "https://www.gstatic.com/firebasejs/10.8.0/firebase-firestore.js"; - -const firebaseConfig = { - apiKey: atob("QUl6YVN5REw2a1FuU2ZVZDhVdDhIRnJwS3VpdnF6MXhkWG03aw=="), - authDomain: atob("bW92aWV2ZXJzZS1hcHAuZmlyZWJhc2VhcHAuY29t"), - projectId: "movieverse-app", - storageBucket: atob("bW92aWV2ZXJzZS1hcHAuYXBwc3BvdC5jb20="), - messagingSenderId: atob("ODAyOTQzNzE4ODcx"), - appId: atob("MTo4MDI5NDM3MTg4NzE6d2ViOjQ4YmM5MTZjYzk5ZTI3MjQyMTI3OTI=") -}; - -const app = initializeApp(firebaseConfig); -const db = getFirestore(app); - -export async function loadUserRatings(currentUserEmail) { - if (currentUserEmail) { - const ratingsRef = doc(db, 'userRatings', currentUserEmail); - const docSnap = await getDoc(ratingsRef); - return docSnap.exists() ? docSnap.data().ratings : {}; - } - else { - return JSON.parse(localStorage.getItem('movieRatings')) || {}; - } -} - -export async function updateAverageMovieRating(currentUserEmail, movieId, newRating) { - if (!currentUserEmail) { - console.error("No user signed in, using localStorage to save ratings."); - const savedRatings = JSON.parse(localStorage.getItem('movieRatings')) || {}; - savedRatings[movieId] = newRating; - localStorage.setItem('movieRatings', JSON.stringify(savedRatings)); - updateLocalAverage(savedRatings); - } - else { - console.log("User signed in, saving ratings to Firebase."); - const ratingsRef = doc(db, 'userRatings', currentUserEmail); - const docSnap = await getDoc(ratingsRef); - let ratings = docSnap.exists() ? docSnap.data().ratings || {} : {}; - ratings[movieId] = newRating; - - await setDoc(ratingsRef, { ratings: ratings }, { merge: true }); - updateFirebaseAverage(ratings, ratingsRef); - updateLocalAverage(ratings); - } -} - -function updateLocalAverage(savedRatings) { - let totalRating = 0; - let totalMoviesRated = 0; - Object.values(savedRatings).forEach(rating => { - totalRating += parseFloat(rating); - totalMoviesRated++; - }); - const averageRating = totalMoviesRated > 0 ? (totalRating / totalMoviesRated) : 0; - localStorage.setItem('averageMovieRating', averageRating.toFixed(1)); -} - -async function updateFirebaseAverage(ratings, ratingsRef) { - let totalRating = 0; - let totalMoviesRated = 0; - Object.values(ratings).forEach(rating => { - totalRating += parseFloat(rating); - totalMoviesRated++; - }); - const averageRating = totalMoviesRated > 0 ? (totalRating / totalMoviesRated) : 0; - await setDoc(ratingsRef, { averageRating: averageRating }, { merge: true }); -} - -export async function getAverageMovieRating(currentUserEmail) { - if (!currentUserEmail) { - console.error("No user signed in, retrieving average rating from localStorage."); - return localStorage.getItem('averageMovieRating') || 0; - } - else { - const ratingsRef = doc(db, 'userRatings', currentUserEmail); - const docSnap = await getDoc(ratingsRef); - return docSnap.exists() && docSnap.data().averageRating ? docSnap.data().averageRating : 0; - } -} diff --git a/MovieVerse-Mobile/app/js/reset-password.js b/MovieVerse-Mobile/app/js/reset-password.js deleted file mode 100644 index d167c366..00000000 --- a/MovieVerse-Mobile/app/js/reset-password.js +++ /dev/null @@ -1,131 +0,0 @@ -import { initializeApp } from "https://www.gstatic.com/firebasejs/10.8.0/firebase-app.js"; -import { getFirestore, collection, query, where, getDocs, doc, updateDoc } from "https://www.gstatic.com/firebasejs/10.8.0/firebase-firestore.js"; - -function translateFBC(value) { - return atob(value); -} - -function getFBConfig1() { - const fbConfig1 = "QUl6YVN5REw2a1FuU2ZVZDhVdDhIRnJwS3VpdnF6MXhkWG03aw=="; - return translateFBC(fbConfig1); -} - -function getFBConfig2() { - const fbConfig2 = "bW92aWV2ZXJzZS1hcHAuZmlyZWJhc2VhcHAuY29t"; - return translateFBC(fbConfig2); -} - -function getFBConfig3() { - const fbConfig3 = "bW92aWV2ZXJzZS1hcHAuYXBwc3BvdC5jb20="; - return translateFBC(fbConfig3); -} - -function getFBConfig4() { - const fbConfig4 = "ODAyOTQzNzE4ODcx"; - return translateFBC(fbConfig4); -} - -function getFBConfig5() { - const fbConfig5 = "MTo4MDI5NDM3MTg4NzE6d2ViOjQ4YmM5MTZjYzk5ZTI3MjQyMTI3OTI="; - return translateFBC(fbConfig5); -} - -const firebaseConfig = { - apiKey: getFBConfig1(), - authDomain: getFBConfig2(), - projectId: "movieverse-app", - storageBucket: getFBConfig3(), - messagingSenderId: getFBConfig4(), - appId: getFBConfig5() -}; - -const app = initializeApp(firebaseConfig); -const db = getFirestore(app); - -document.getElementById('resetPasswordForm').addEventListener('submit', async function(event) { - try { - event.preventDefault(); - const resetEmail = document.getElementById('resetEmail').value; - - const q = query(collection(db, "MovieVerseUsers"), where("email", "==", resetEmail)); - const querySnapshot = await getDocs(q); - - if (querySnapshot.empty) { - alert("No account with such credentials exists in our database, or you might have mistyped something. Please try again."); - return; - } - - document.getElementById('newPasswordFields').style.display = 'block'; - } - catch (error) { - console.error("Error fetching user list: ", error); - if (error.code === 'resource-exhausted') { - const noUserSelected = document.getElementById('password-reset-form-container'); - if (noUserSelected) { - noUserSelected.innerHTML = "Sorry, our database is currently overloaded. Please try reloading once more, and if that still doesn't work, please try again in a couple hours. For full transparency, we are currently using a database that has a limited number of reads and writes per day due to lack of funding. Thank you for your patience as we work on scaling our services. At the mean time, feel free to use other MovieVerse features!"; - noUserSelected.style.height = '350px'; - } - hideSpinner(); - } - } -}); - -async function updatePassword() { - const resetEmail = document.getElementById('resetEmail').value; - const newPassword = document.getElementById('newPassword').value; - const confirmNewPassword = document.getElementById('confirmNewPassword').value; - - if (!isValidPassword(newPassword)) { - alert('New password does not meet the security requirements.\n\n' + - 'Your password must include:\n' + - '- At least 8 characters\n' + - '- At least one uppercase letter\n' + - '- At least one lowercase letter\n' + - '- At least one number\n' + - '- At least one special character (e.g., !@#$%^&*)'); - return; - } - - if (newPassword !== confirmNewPassword) { - alert("Passwords do not match."); - return; - } - - const q = query(collection(db, "MovieVerseUsers"), where("email", "==", resetEmail)); - const querySnapshot = await getDocs(q); - - if (!querySnapshot.empty) { - querySnapshot.forEach(async (docSnapshot) => { - await updateDoc(doc(db, "MovieVerseUsers", docSnapshot.id), { - password: newPassword - }).then(() => { - alert("Password updated successfully!"); - window.location.href = 'sign-in.html'; - }).catch((error) => { - console.log("Error updating password: ", error); - alert("Failed to update password. Please try again."); - }); - }); - } - else { - alert("Failed to find account. Please try again."); - } -} - -document.getElementById('updatePasswordButton').addEventListener('click', updatePassword); - -function isValidPassword(password) { - const minLength = 8; - const hasUppercase = /[A-Z]/.test(password); - const hasLowercase = /[a-z]/.test(password); - const hasNumbers = /\d/.test(password); - const hasSpecialChar = /[!@#$%^&*(),.?":{}|<>]/.test(password); - - return ( - password.length >= minLength && - hasUppercase && - hasLowercase && - hasNumbers && - hasSpecialChar - ); -} diff --git a/MovieVerse-Mobile/app/js/root-config.js b/MovieVerse-Mobile/app/js/root-config.js deleted file mode 100644 index e2755ba9..00000000 --- a/MovieVerse-Mobile/app/js/root-config.js +++ /dev/null @@ -1,66 +0,0 @@ -import { registerApplication, start } from 'single-spa'; - -// Defines a function that takes a location and returns true if the location should be active -function pathPrefix(prefix) { - return function(location) { - return location.pathname.startsWith(prefix); - } -} - -// Load React Microfrontend for the homepage -registerApplication( - 'home', - () => System.import('http://localhost:8080/home.js'), - pathPrefix('/home') -); - -// Load React Microfrontend for the about page -registerApplication( - 'about', - () => System.import('http://localhost:8083/about.js'), - pathPrefix('/about') -); - -// Load React Microfrontend for the trivia page -registerApplication( - 'quiz', - () => System.import('http://localhost:8084/quiz.js'), - pathPrefix('/contact') -); - -// Load React Microfrontend for the favorites / watchlist page -registerApplication( - 'favorites', - () => System.import('http://localhost:8085/favorites.js'), - pathPrefix('/favorites') -); - -// Load React Microfrontend for the movie match page -registerApplication( - 'movie-match', - () => System.import('http://localhost:8086/movie-match.js'), - pathPrefix('/movie-match') -); - -// Load React Microfrontend for the movie timeline page -registerApplication( - 'movie-timeline', - () => System.import('http://localhost:8087/movie-timeline.js'), - pathPrefix('/movie-details') -); - -// Load Vue Microfrontend for the movie listing -registerApplication( - 'movies', - () => System.import('http://localhost:8081/movies.js'), - pathPrefix('/movies') -); - -// Load Vue Microfrontend for the navbar -registerApplication( - 'navbar', - () => System.import('http://localhost:8082/navbar.js'), - pathPrefix('/navbar') - ); - -start(); diff --git a/MovieVerse-Mobile/app/js/router.js b/MovieVerse-Mobile/app/js/router.js deleted file mode 100644 index 54809074..00000000 --- a/MovieVerse-Mobile/app/js/router.js +++ /dev/null @@ -1,51 +0,0 @@ -import Vue from 'vue'; -import Router from 'vue-router'; - -import HomePage from './components/HomePage.vue'; -import MovieDetails from './components/MovieDetails.vue'; -import AboutPage from './components/AboutPage.vue'; -import MovieMatch from './components/MovieMatch.vue'; -import MovieTimeline from './components/MovieTimeline.vue'; -import MovieOfTheDay from './components/MovieOfTheDay.vue'; - -Vue.use(Router); - -export default new Router({ - mode: 'history', - routes: [ - { - path: '/', - name: 'Home', - component: HomePage - }, - { - path: '/movie/:id', - name: 'MovieDetails', - component: MovieDetails - }, - { - path: '/about', - name: 'About', - component: AboutPage - }, - { - path: '/movie-match', - name: 'MovieMatch', - component: MovieMatch - }, - { - path: '/movie-timeline', - name: 'MovieTimeline', - component: MovieTimeline - }, - { - path: '/movie-of-the-day', - name: 'MovieOfTheDay', - component: MovieOfTheDay - }, - { - path: '*', // This wildcard route is for 404 Not Found pages - redirect: '/' - } - ] -}); diff --git a/MovieVerse-Mobile/app/js/search.js b/MovieVerse-Mobile/app/js/search.js deleted file mode 100644 index 085e0e8e..00000000 --- a/MovieVerse-Mobile/app/js/search.js +++ /dev/null @@ -1,909 +0,0 @@ -const form = document.getElementById('form1'); -const IMGPATH = "https://image.tmdb.org/t/p/w500"; - -function showSpinner() { - document.getElementById('myModal').classList.add('modal-visible'); -} - -function hideSpinner() { - document.getElementById('myModal').classList.remove('modal-visible'); -} - -document.addEventListener('DOMContentLoaded', () => { - showResults('movie'); - updateCategoryButtonStyles('movie'); - attachEventListeners(); - attachArrowKeyNavigation(); - - document.getElementById('form1').addEventListener('submit', function(event) { - event.preventDefault(); - handleSearch(); - }); -}); - -async function ensureGenreMapIsAvailable() { - if (!localStorage.getItem('genreMap')) { - await fetchGenreMap(); - } -} - -document.addEventListener('DOMContentLoaded', () => { - showResults('movie'); - updateCategoryButtonStyles('movie'); - attachEventListeners(); - attachArrowKeyNavigation(); - fetchGenreMap(); - fetchTvGenreMap(); - fetchLanguages(); - fetchTvLanguages(); - - document.getElementById('form1').addEventListener('submit', function(event) { - event.preventDefault(); - handleSearch(); - }); -}); - -async function fetchTvLanguages() { - const url = `https://${getMovieVerseData()}/3/configuration/languages?${generateMovieNames()}${getMovieCode()}`; - - try { - const response = await fetch(url); - let languages = await response.json(); - languages = languages.sort((a, b) => a.english_name.localeCompare(b.english_name)); - populateTvLanguageFilter(languages); - } - catch (error) { - console.log('Error fetching languages:', error); - } -} - -function populateTvLanguageFilter(languages) { - const languageFilter = document.getElementById('language-tv-filter'); - languageFilter.innerHTML = ''; - - languages.forEach(language => { - const option = document.createElement('option'); - option.value = language.iso_639_1; - option.textContent = language.english_name; - languageFilter.appendChild(option); - }); -} - -async function fetchLanguages() { - const url = `https://${getMovieVerseData()}/3/configuration/languages?${generateMovieNames()}${getMovieCode()}`; - - try { - const response = await fetch(url); - let languages = await response.json(); - languages = languages.sort((a, b) => a.english_name.localeCompare(b.english_name)); - populateLanguageFilter(languages); - } - catch (error) { - console.log('Error fetching languages:', error); - } -} - -function populateLanguageFilter(languages) { - const languageFilter = document.getElementById('language-filter'); - languageFilter.innerHTML = ''; - - languages.forEach(language => { - const option = document.createElement('option'); - option.value = language.iso_639_1; - option.textContent = language.english_name; - languageFilter.appendChild(option); - }); -} - -async function fetchGenreMap() { - const code = getMovieCode(); - const url = `https://${getMovieVerseData()}/3/genre/movie/list?${generateMovieNames()}${code}`; - - try { - const response = await fetch(url); - const data = await response.json(); - localStorage.setItem('genreMap', JSON.stringify(data.genres)); - populateGenreFilter(data.genres); - } - catch (error) { - console.log('Error fetching genre map:', error); - } -} - -async function fetchTvGenreMap() { - const code = getMovieCode(); - const url = `https://${getMovieVerseData()}/3/genre/tv/list?${generateMovieNames()}${code}`; - - try { - const response = await fetch(url); - const data = await response.json(); - localStorage.setItem('tvGenreMap', JSON.stringify(data.genres)); - populateTvGenreFilter(data.genres); - } - catch (error) { - console.log('Error fetching TV genre map:', error); - } -} - -function populateGenreFilter(genres) { - const genreFilter = document.getElementById('genre-filter'); - genreFilter.innerHTML = ''; - - genres.forEach(genre => { - const option = document.createElement('option'); - option.value = genre.id; - option.textContent = genre.name; - genreFilter.appendChild(option); - }); -} - -function populateTvGenreFilter(genres) { - const genreFilter = document.getElementById('genre-tv-filter'); - genreFilter.innerHTML = ''; - - genres.forEach(genre => { - const option = document.createElement('option'); - option.value = genre.id; - option.textContent = genre.name; - genreFilter.appendChild(option); - }); -} - -async function rotateUserStats() { - await ensureGenreMapIsAvailable(); - - const stats = [ - { - label: "Your Current Time", - getValue: () => { - const now = new Date(); - let hours = now.getHours(); - let minutes = now.getMinutes(); - hours = hours < 10 ? '0' + hours : hours; - minutes = minutes < 10 ? '0' + minutes : minutes; - return `${hours}:${minutes}`; - } - }, - { label: "Most Visited Movie", getValue: getMostVisitedMovie }, - { label: "Most Visited Director", getValue: getMostVisitedDirector }, - { label: "Most Visited Actor", getValue: getMostVisitedActor }, - { - label: "Movies Discovered", - getValue: () => { - const viewedMovies = JSON.parse(localStorage.getItem('uniqueMoviesViewed')) || []; - return viewedMovies.length; - } - }, - { - label: "Favorite Movies", - getValue: () => { - const favoritedMovies = JSON.parse(localStorage.getItem('moviesFavorited')) || []; - return favoritedMovies.length; - } - }, - { - label: "Favorite Genre", - getValue: () => { - const mostCommonGenreCode = getMostCommonGenre(); - const genreMapString = localStorage.getItem('genreMap'); - if (!genreMapString) { - console.log('No genre map found in localStorage.'); - return 'Not Available'; - } - - let genreMap; - try { - genreMap = JSON.parse(genreMapString); - } - catch (e) { - console.log('Error parsing genre map:', e); - return 'Not Available'; - } - - let genreObject; - if (Array.isArray(genreMap)) { - genreObject = genreMap.reduce((acc, genre) => { - acc[genre.id] = genre.name; - return acc; - }, {}); - } - else if (typeof genreMap === 'object' && genreMap !== null) { - genreObject = genreMap; - } - else { - console.log('genreMap is neither an array nor a proper object:', genreMap); - return 'Not Available'; - } - - return genreObject[mostCommonGenreCode] || 'Not Available'; - } - }, - { label: "Watchlists Created", getValue: () => localStorage.getItem('watchlistsCreated') || 0 }, - { label: "Average Movie Rating", getValue: () => localStorage.getItem('averageMovieRating') || 'Not Rated' }, - { - label: "Directors Discovered", - getValue: () => { - const viewedDirectors = JSON.parse(localStorage.getItem('uniqueDirectorsViewed')) || []; - return viewedDirectors.length; - } - }, - { - label: "Actors Discovered", - getValue: () => { - const viewedActors = JSON.parse(localStorage.getItem('uniqueActorsViewed')) || []; - return viewedActors.length; - } - }, - { label: "Your Trivia Accuracy", getValue: getTriviaAccuracy }, - ]; - - let currentStatIndex = 0; - - function updateStatDisplay() { - const currentStat = stats[currentStatIndex]; - document.getElementById('stats-label').textContent = currentStat.label + ':'; - document.getElementById('stats-display').textContent = currentStat.getValue(); - currentStatIndex = (currentStatIndex + 1) % stats.length; - } - - updateStatDisplay(); - - const localTimeDiv = document.getElementById('local-time'); - let statRotationInterval = setInterval(updateStatDisplay, 3000); - - localTimeDiv.addEventListener('click', () => { - clearInterval(statRotationInterval); - updateStatDisplay(); - statRotationInterval = setInterval(updateStatDisplay, 3000); - }); -} - -function updateMovieVisitCount(movieId, movieTitle) { - let movieVisits = JSON.parse(localStorage.getItem('movieVisits')) || {}; - let uniqueMoviesViewed = JSON.parse(localStorage.getItem('uniqueMoviesViewed')) || []; - - if (!movieVisits[movieId]) { - movieVisits[movieId] = { count: 0, title: movieTitle }; - } - movieVisits[movieId].count += 1; - - if (!uniqueMoviesViewed.includes(movieId)) { - uniqueMoviesViewed.push(movieId); - } - - localStorage.setItem('movieVisits', JSON.stringify(movieVisits)); - localStorage.setItem('uniqueMoviesViewed', JSON.stringify(uniqueMoviesViewed)); -} - -function getMostVisitedMovie() { - const movieVisits = JSON.parse(localStorage.getItem('movieVisits')) || {}; - let mostVisitedMovie = ''; - let maxVisits = 0; - - for (const movieId in movieVisits) { - if (movieVisits[movieId].count > maxVisits) { - mostVisitedMovie = movieVisits[movieId].title; - maxVisits = movieVisits[movieId].count; - } - } - - return mostVisitedMovie || 'Not Available'; -} - -function getMostVisitedActor() { - const actorVisits = JSON.parse(localStorage.getItem('actorVisits')) || {}; - let mostVisitedActor = ''; - let maxVisits = 0; - - for (const actorId in actorVisits) { - if (actorVisits[actorId].count > maxVisits) { - mostVisitedActor = actorVisits[actorId].name; - maxVisits = actorVisits[actorId].count; - } - } - - return mostVisitedActor || 'Not Available'; -} - -function getMostVisitedDirector() { - const directorVisits = JSON.parse(localStorage.getItem('directorVisits')) || {}; - let mostVisitedDirector = ''; - let maxVisits = 0; - - for (const directorId in directorVisits) { - if (directorVisits[directorId].count > maxVisits) { - mostVisitedDirector = directorVisits[directorId].name; - maxVisits = directorVisits[directorId].count; - } - } - - return mostVisitedDirector || 'Not Available'; -} - -function getTriviaAccuracy() { - let triviaStats = JSON.parse(localStorage.getItem('triviaStats')) || { totalCorrect: 0, totalAttempted: 0 }; - - if (triviaStats.totalAttempted === 0) { - return 'No trivia attempted'; - } - - let accuracy = (triviaStats.totalCorrect / triviaStats.totalAttempted) * 100; - return `${accuracy.toFixed(1)}% accuracy`; -} - -function getMostCommonGenre() { - const favoriteGenresArray = JSON.parse(localStorage.getItem('favoriteGenres')) || []; - const genreCounts = favoriteGenresArray.reduce((acc, genre) => { - acc[genre] = (acc[genre] || 0) + 1; - return acc; - }, {}); - - let mostCommonGenre = ''; - let maxCount = 0; - - for (const genre in genreCounts) { - if (genreCounts[genre] > maxCount) { - mostCommonGenre = genre; - maxCount = genreCounts[genre]; - } - } - - return mostCommonGenre || 'Not Available'; -} - -document.addEventListener('DOMContentLoaded', rotateUserStats); - -function attachEventListeners() { - const movieBtn = document.querySelector('[data-category="movie"]'); - const tvBtn = document.querySelector('[data-category="tv"]'); - const peopleBtn = document.querySelector('[data-category="person"]'); - const toggleFiltersBtn = document.getElementById('toggle-filters-btn'); - - const movieFilters = document.getElementById('movie-tv-filters'); - const tvFilters = document.getElementById('tv-filters'); - const peopleFilters = document.getElementById('people-filters'); - - const genreMovieFilter = document.getElementById('genre-filter'); - const yearMovieFilter = document.getElementById('year-filter'); - const ratingMovieFilter = document.getElementById('rating-filter'); - const languageFilter = document.getElementById('language-filter'); - - const genreTvFilter = document.getElementById('genre-tv-filter'); - const yearTvFilter = document.getElementById('year-tv-filter'); - const ratingTvFilter = document.getElementById('rating-tv-filter'); - const languageTvFilter = document.getElementById('language-tv-filter'); - - const professionFilter = document.getElementById('profession-filter'); - const genderFilter = document.getElementById('gender-filter'); - const popularityFilter = document.getElementById('popularity-filter'); - - const ratingValueSpan = document.getElementById('rating-value'); - const ratingTvValueSpan = document.getElementById('rating-tv-value'); - const popularityValueSpan = document.getElementById('popularity-value'); - - movieFilters.style.display = 'none'; - tvFilters.style.display = 'none'; - peopleFilters.style.display = 'none'; - - function setFilterDisplayValues() { - ratingValueSpan.textContent = `Rating: ${ratingMovieFilter.value} and above`; - ratingTvValueSpan.textContent = `Rating: ${ratingTvFilter.value} and above`; - popularityValueSpan.textContent = `Popularity: ${popularityFilter.value} and above`; - } - - function showCorrectFilters(category) { - movieFilters.style.display = category === 'movie' ? 'block' : 'none'; - tvFilters.style.display = category === 'tv' ? 'block' : 'none'; - peopleFilters.style.display = category === 'person' ? 'block' : 'none'; - } - - movieBtn.addEventListener('click', () => { - showResults('movie'); - updateCategoryButtonStyles('movie'); - showCorrectFilters('movie'); - movieFilters.style.display = 'none'; - tvFilters.style.display = 'none'; - peopleFilters.style.display = 'none'; - toggleFiltersBtn.textContent = 'Filter Results'; - }); - - tvBtn.addEventListener('click', () => { - showResults('tv'); - updateCategoryButtonStyles('tv'); - showCorrectFilters('tv'); - movieFilters.style.display = 'none'; - tvFilters.style.display = 'none'; - peopleFilters.style.display = 'none'; - toggleFiltersBtn.textContent = 'Filter Results'; - }); - - peopleBtn.addEventListener('click', () => { - showResults('person'); - updateCategoryButtonStyles('person'); - showCorrectFilters('person'); - movieFilters.style.display = 'none'; - tvFilters.style.display = 'none'; - peopleFilters.style.display = 'none'; - toggleFiltersBtn.textContent = 'Filter Results'; - }); - - toggleFiltersBtn.addEventListener('click', () => { - if (currentCategory === 'movie') { - movieFilters.style.display = movieFilters.style.display === 'none' ? 'block' : 'none'; - } - else if (currentCategory === 'tv') { - tvFilters.style.display = tvFilters.style.display === 'none' ? 'block' : 'none'; - } - else if (currentCategory === 'person') { - peopleFilters.style.display = peopleFilters.style.display === 'none' ? 'block' : 'none'; - } - }); - - genreMovieFilter.addEventListener('change', () => showResults('movie')); - yearMovieFilter.addEventListener('change', () => showResults('movie')); - ratingMovieFilter.addEventListener('input', () => { - ratingValueSpan.textContent = `Rating: ${ratingMovieFilter.value} and above`; - showResults('movie'); - }); - languageFilter.addEventListener('change', () => showResults('movie')); - - genreTvFilter.addEventListener('change', () => showResults('tv')); - yearTvFilter.addEventListener('change', () => showResults('tv')); - ratingTvFilter.addEventListener('input', () => { - ratingTvValueSpan.textContent = `Rating: ${ratingTvFilter.value} and above`; - showResults('tv'); - }); - languageTvFilter.addEventListener('change', () => showResults('tv')); - - genderFilter.addEventListener('change', () => showResults('person')); - professionFilter.addEventListener('change', () => showResults('person')); - popularityFilter.addEventListener('input', () => { - popularityValueSpan.textContent = `Popularity: ${popularityFilter.value} and above`; - showResults('person'); - }); - - const resetMovieFiltersBtn = movieFilters.querySelector('button[id="reset-filters"]'); - const resetTvFiltersBtn = tvFilters.querySelector('button[id="reset-filters"]'); - const resetPeopleFiltersBtn = peopleFilters.querySelector('button[id="reset-filters"]'); - - resetMovieFiltersBtn.addEventListener('click', () => { - genreMovieFilter.selectedIndex = 0; - yearMovieFilter.value = ''; - ratingMovieFilter.value = 5; - languageFilter.selectedIndex = 0; - setFilterDisplayValues(); - showResults('movie'); - }); - - resetTvFiltersBtn.addEventListener('click', () => { - genreTvFilter.selectedIndex = 0; - yearTvFilter.value = ''; - ratingTvFilter.value = 5; - languageTvFilter.selectedIndex = 0; - setFilterDisplayValues(); - showResults('tv'); - }); - - resetPeopleFiltersBtn.addEventListener('click', () => { - professionFilter.selectedIndex = 0; - genderFilter.selectedIndex = 0; - popularityFilter.value = 20; - setFilterDisplayValues(); - showResults('person'); - }); - - setFilterDisplayValues(); - showCorrectFilters(localStorage.getItem('selectedCategory')); -} - -let currentCategory = 'movie'; - -document.addEventListener('DOMContentLoaded', function() { - const toggleFiltersBtn = document.getElementById('toggle-filters-btn'); - const movieTvFilters = document.getElementById('movie-tv-filters'); - const peopleFilters = document.getElementById('people-filters'); - const tvFilters = document.getElementById('tv-filters'); - - movieTvFilters.style.display = 'none'; - peopleFilters.style.display = 'none'; - tvFilters.style.display = 'none'; - - toggleFiltersBtn.addEventListener('click', function() { - if (currentCategory === 'movie') { - movieTvFilters.style.display = movieTvFilters.style.display === 'none' ? 'block' : 'none'; - } - else if (currentCategory === 'person') { - peopleFilters.style.display = peopleFilters.style.display === 'none' ? 'block' : 'none'; - } - else if (currentCategory === 'tv') { - tvFilters.style.display = tvFilters.style.display === 'none' ? 'block' : 'none'; - } - - if ((currentCategory === 'movie') && movieTvFilters.style.display !== 'none') { - toggleFiltersBtn.textContent = 'Close Filters'; - } - else if (currentCategory === 'person' && peopleFilters.style.display !== 'none') { - toggleFiltersBtn.textContent = 'Close Filters'; - } - else if (currentCategory === 'tv' && tvFilters.style.display !== 'none') { - toggleFiltersBtn.textContent = 'Close Filters'; - } - else { - toggleFiltersBtn.textContent = 'Filter Results'; - } - }); - - document.querySelectorAll('.category-buttons button').forEach(button => { - button.addEventListener('click', function() { - currentCategory = this.getAttribute('data-category'); - }); - }); -}); - -function attachArrowKeyNavigation() { - const categories = ['movie', 'tv', 'person']; - let currentIndex = 0; - - document.addEventListener('keydown', (e) => { - switch (e.key) { - case 'ArrowRight': - currentIndex = (currentIndex + 1) % categories.length; - break; - case 'ArrowLeft': - currentIndex = (currentIndex - 1 + categories.length) % categories.length; - break; - default: - return; - } - const selectedCategory = categories[currentIndex]; - showResults(selectedCategory); - updateCategoryButtonStyles(selectedCategory); - e.preventDefault(); - }); -} - -const movieCode = { - part1: 'YzVhMjBjODY=', - part2: 'MWFjZjdiYjg=', - part3: 'ZDllOTg3ZGNjN2YxYjU1OA==' -}; - -function getMovieCode() { - return atob(movieCode.part1) + atob(movieCode.part2) + atob(movieCode.part3); -} - -function generateMovieNames(input) { - return String.fromCharCode(97, 112, 105, 95, 107, 101, 121, 61); -} - -function getMovieVerseData(input) { - return String.fromCharCode(97, 112, 105, 46, 116, 104, 101, 109, 111, 118, 105, 101, 100, 98, 46, 111, 114, 103); -} - -async function showResults(category) { - showSpinner(); - localStorage.setItem('selectedCategory', category); - currentCategory = category; - - const searchQuery = localStorage.getItem('searchQuery') || ''; - document.getElementById('search-results-label').textContent = `Search Results for "${searchQuery}"`; - - const code = getMovieCode(); - const baseApiUrl = `https://${getMovieVerseData()}/3`; - let url = `${baseApiUrl}/search/${category}?${generateMovieNames()}${code}&query=${encodeURIComponent(searchQuery)}`; - - try { - const response = await fetch(url); - let data = await response.json(); - - if (category === 'movie') { - const genre = document.getElementById('genre-filter').value; - const year = category === 'movie' ? document.getElementById('year-filter').value : document.getElementById('year-filter').value; - const rating = parseFloat(document.getElementById('rating-filter').value); - const language = document.getElementById('language-filter').value; - - data.results = data.results.filter(item => { - const itemYear = category === 'movie' ? item.release_date?.substring(0, 4) : item.first_air_date?.substring(0, 4); - const itemRating = item.vote_average; - const itemGenres = item.genre_ids; - const itemLanguage = item.original_language; - - return (!genre || itemGenres.includes(parseInt(genre))) && - (!year || itemYear === year) && - (!rating || itemRating >= rating) && - (!language || itemLanguage === language); - }); - } - else if (category === 'person') { - const profession = document.getElementById('profession-filter').value; - const gender = document.getElementById('gender-filter').value; - - if (profession) { - data.results = data.results.filter(person => person.known_for_department && person.known_for_department.toLowerCase() === profession.toLowerCase()); - } - - if (gender) { - data.results = data.results.filter(person => person.gender.toString() === gender); - } - - const popularity = parseFloat(document.getElementById('popularity-filter').value); - if (!isNaN(popularity) && popularity > 0) { - data.results = data.results.filter(person => person.popularity >= popularity); - } - - data.results.sort((a, b) => b.popularity - a.popularity); - } - else if (category === 'tv') { - const genre = document.getElementById('genre-tv-filter').value; - const year = document.getElementById('year-tv-filter').value; - const rating = parseFloat(document.getElementById('rating-tv-filter').value); - const language = document.getElementById('language-tv-filter').value; - - data.results = data.results.filter(item => { - const itemYear = item.first_air_date?.substring(0, 4); - const itemRating = item.vote_average; - const itemGenres = item.genre_ids; - const itemLanguage = item.original_language; - - return (!genre || itemGenres.includes(parseInt(genre))) && - (!year || itemYear === year) && - (!rating || itemRating >= rating) && - (!language || itemLanguage === language); - }); - } - - displayResults(data.results, category, searchQuery); - } - catch (error) { - console.log('Error fetching search results:', error); - } - finally { - hideSpinner(); - } -} - -document.querySelector('button[onclick="showResults(\'movie\')"]').addEventListener('click', function() { - showResults('movie'); - localStorage.setItem('selectedCategory', 'movie'); - updateCategoryButtonStyles(); -}); - -document.querySelector('button[onclick="showResults(\'tv\')"]').addEventListener('click', function() { - showResults('tv'); - localStorage.setItem('selectedCategory', 'tv'); - updateCategoryButtonStyles(); -}); - -document.querySelector('button[onclick="showResults(\'person\')"]').addEventListener('click', function() { - showResults('person'); - localStorage.setItem('selectedCategory', 'person'); - updateCategoryButtonStyles(); -}); - -function updateCategoryButtonStyles(selectedCategory) { - const movieBtn = document.querySelector('[data-category="movie"]'); - const tvBtn = document.querySelector('[data-category="tv"]'); - const peopleBtn = document.querySelector('[data-category="person"]'); - - movieBtn.style.backgroundColor = ''; - tvBtn.style.backgroundColor = ''; - peopleBtn.style.backgroundColor = ''; - - if (selectedCategory === 'movie') { - movieBtn.style.backgroundColor = '#ff8623'; - } - else if (selectedCategory === 'tv') { - tvBtn.style.backgroundColor = '#ff8623'; - } - else if (selectedCategory === 'person') { - peopleBtn.style.backgroundColor = '#ff8623'; - } -} - -function displayResults(results, category, searchTerm) { - const container = document.getElementById('movie-match-container1'); - container.innerHTML = ''; - - const capitalizedCategory = category.charAt(0).toUpperCase() + category.slice(1); - - if (results.length === 0) { - container.innerHTML = `

No results found for "${searchTerm}" in the ${capitalizedCategory} category or no results with the specified filters found. Please try again with a different query or change your filters.

`; - container.style.height = '800px'; - return; - } - - showMovies(results, container, category); -} - -const main = document.getElementById('movie-match-container1'); - -function showMovies(items, container, category) { - container.innerHTML = ''; - - items.forEach((item) => { - const hasVoteAverage = typeof item.vote_average === 'number'; - const isPerson = !hasVoteAverage; - const isMovie = item.title && hasVoteAverage; - const isTvSeries = item.name && hasVoteAverage && category === 'tv'; - - let title = item.title || item.name || "N/A"; - const words = title.split(' '); - if (words.length >= 9) { - words[8] = '...'; - title = words.slice(0, 9).join(' '); - } - - let overview = item.overview || 'No overview available.'; - const biography = item.biography || 'Click to view the details of this person.'; - - if (overview === '') { - overview = 'No overview available.'; - } - - const { id, profile_path, poster_path } = item; - const imagePath = profile_path || poster_path ? IMGPATH + (profile_path || poster_path) : null; - - const movieEl = document.createElement('div'); - movieEl.classList.add('movie'); - movieEl.style.zIndex = 10000; - - let movieContentHTML = `
`; - - if (imagePath) { - movieContentHTML += `${title}`; - } - else { - movieContentHTML += `
Image Unavailable
`; - } - - movieContentHTML += `
`; - movieContentHTML += `

${title}

`; - - if ((isMovie || isTvSeries) && hasVoteAverage) { - const voteAverage = item.vote_average.toFixed(1); - movieContentHTML += `${voteAverage}`; - } - - movieContentHTML += `
`; - - if (isPerson) { - movieContentHTML += `

Details:

${biography}
`; - } - else { - movieContentHTML += `

Overview:

${overview}
`; - } - - movieEl.innerHTML = movieContentHTML; - - movieEl.addEventListener('click', async () => { - if (isPerson) { - try { - const personDetailsUrl = `https://${getMovieVerseData()}/3/person/${id}?${generateMovieNames()}${getMovieCode()}`; - const response = await fetch(personDetailsUrl); - const personDetails = await response.json(); - if (personDetails.known_for_department === 'Directing') { - const directorVisits = JSON.parse(localStorage.getItem('directorVisits')) || {}; - const uniqueDirectorsViewed = JSON.parse(localStorage.getItem('uniqueDirectorsViewed')) || []; - - if (!uniqueDirectorsViewed.includes(id)) { - uniqueDirectorsViewed.push(id); - localStorage.setItem('uniqueDirectorsViewed', JSON.stringify(uniqueDirectorsViewed)); - } - - if (directorVisits[id]) { - directorVisits[id].count++; - } - else { - directorVisits[id] = { count: 1, name: personDetails.name || 'Unknown' }; - } - - localStorage.setItem('directorVisits', JSON.stringify(directorVisits)); - - localStorage.setItem('selectedDirectorId', id); - window.location.href = 'director-details.html?' + id; - } - else { - const actorVisits = JSON.parse(localStorage.getItem('actorVisits')) || {}; - const uniqueActorsViewed = JSON.parse(localStorage.getItem('uniqueActorsViewed')) || []; - - if (!uniqueActorsViewed.includes(id)) { - uniqueActorsViewed.push(id); - localStorage.setItem('uniqueActorsViewed', JSON.stringify(uniqueActorsViewed)); - } - - if (actorVisits[id]) { - actorVisits[id].count++; - } - else { - actorVisits[id] = { count: 1, name: personDetails.name || 'Unknown' }; - } - - localStorage.setItem('actorVisits', JSON.stringify(actorVisits)); - - localStorage.setItem('selectedActorId', id); - window.location.href = 'actor-details.html?' + id; - } - } - catch (error) { - console.log('Error fetching person details:', error); - } - } - else if (isMovie) { - localStorage.setItem('selectedMovieId', id); - window.location.href = 'movie-details.html?' + id; - updateMovieVisitCount(id, title); - } - else if (isTvSeries) { - localStorage.setItem('selectedTvSeriesId', id); - window.location.href = 'tv-details.html?' + id; - updateMovieVisitCount(id, title); - } - }); - - container.appendChild(movieEl); - }); -} - -function handleDirectorClick(directorId, directorName) { - updateUniqueDirectorsViewed(directorId); - updateDirectorVisitCount(directorId, directorName); - localStorage.setItem('selectedDirectorId', directorId); - document.title = `${directorName} - Director's Details`; - window.location.href = 'director-details.html'; -} - -function updateUniqueDirectorsViewed(directorId) { - let viewedDirectors = JSON.parse(localStorage.getItem('uniqueDirectorsViewed')) || []; - if (!viewedDirectors.includes(directorId)) { - viewedDirectors.push(directorId); - localStorage.setItem('uniqueDirectorsViewed', JSON.stringify(viewedDirectors)); - } -} - -function updateActorVisitCount(actorId, actorName) { - let actorVisits = JSON.parse(localStorage.getItem('actorVisits')) || {}; - if (!actorVisits[actorId]) { - actorVisits[actorId] = { count: 0, name: actorName }; - } - - actorVisits[actorId].count += 1; - localStorage.setItem('actorVisits', JSON.stringify(actorVisits)); -} - -function updateDirectorVisitCount(directorId, directorName) { - let directorVisits = JSON.parse(localStorage.getItem('directorVisits')) || {}; - if (!directorVisits[directorId]) { - directorVisits[directorId] = { count: 0, name: directorName }; - } - - directorVisits[directorId].count += 1; - localStorage.setItem('directorVisits', JSON.stringify(directorVisits)); -} - -function getClassByRate(vote) { - if (vote >= 8) { - return 'green'; - } - else if (vote >= 5) { - return 'orange'; - } - else { - return 'red'; - } -} - -function handleSearch() { - const searchQuery = document.getElementById('search').value; - localStorage.setItem('searchQuery', searchQuery); - window.location.reload(); -} - -function updateBrowserURL(title) { - const nameSlug = createNameSlug(title); - const newURL = window.location.protocol + "//" + window.location.host + window.location.pathname + '?search_query=' + nameSlug; - window.history.replaceState({ path: newURL }, '', newURL); -} - -function createNameSlug(title) { - return title.toLowerCase().replace(/ /g, '-').replace(/[^\w-]/g, ''); -} diff --git a/MovieVerse-Mobile/app/js/service-worker.js b/MovieVerse-Mobile/app/js/service-worker.js deleted file mode 100644 index bcc2087d..00000000 --- a/MovieVerse-Mobile/app/js/service-worker.js +++ /dev/null @@ -1,114 +0,0 @@ -const CACHE_NAME = 'movieverse-cache-v1'; - -const urlsToCache = [ - '/index.html', - '/MovieVerse-Frontend/css/style.css', - '/MovieVerse-Frontend/css/trivia.css', - '/index.js', - '/manifest.json', - '/MovieVerse-Frontend/js/settings.js', - '/images/favicon.ico', - '/images/image.png', - '/MovieVerse-Frontend/js/chatbot.js', - '/MovieVerse-Frontend/js/movie-details.js', - '/MovieVerse-Frontend/js/movie-timeline.js', - '/MovieVerse-Frontend/js/quiz.js', - '/MovieVerse-Frontend/js/actor-details.js', - '/MovieVerse-Frontend/js/director-details.js', - '/MovieVerse-Frontend/html/about.html', - '/MovieVerse-Frontend/html/actor-details.html', - '/MovieVerse-Frontend/html/director-details.html', - '/MovieVerse-Frontend/html/movie-details.html', - '/MovieVerse-Frontend/html/movie-timeline.html', - '/MovieVerse-Frontend/html/notifications.html', - '/MovieVerse-Frontend/html/trivia.html', - '/MovieVerse-Frontend/html/settings.html', - '/MovieVerse-Frontend/html/favorites.html', - '/MovieVerse-Frontend/html/chat.html', - '/MovieVerse-Frontend/html/chatbot.html', - '/MovieVerse-Frontend/html/privacy-policy.html', - '/MovieVerse-Frontend/html/terms-of-service.html', - '/images/black.webp', - '/images/blue.webp', - '/images/brown.webp', - '/images/green.webp', - '/images/gold.webp', - '/images/grey.webp', - '/images/orange.webp', - '/images/pink.webp', - '/images/purple.webp', - '/images/red.webp', - '/images/rose.webp', - '/images/silver.webp', - '/images/universe.webp', - '/images/universe-1.webp', - '/images/universe-1-small.webp', - '/images/universe-1-medium.webp', - '/images/universe-22.webp', - '/images/universe-2.webp', - '/images/universe-23.webp', - '/images/universe-3.webp', - '/images/universe-4.webp', - '/images/universe-5.webp', - '/images/universe-6.webp', - '/images/universe-7.webp', - '/images/universe-8.webp', - '/images/universe-9.webp', - '/images/universe-10.webp', - '/images/universe-11.webp', - '/images/universe-12.webp', - '/images/universe-13.webp', - '/images/universe-14.webp', - '/images/universe-15.webp', - '/images/universe-16.webp', - '/images/universe-17.webp', - '/images/universe-18.webp', - '/images/universe-19.webp', - '/images/universe-20.webp', - '/images/universe-21.webp', - '/images/yellow.webp', - '/MovieVerse-Frontend/js/analytics.js', - '/MovieVerse-Frontend/html/analytics.html', - '/MovieVerse-Frontend/html/offline.html', -]; - -self.addEventListener('install', event => { - event.waitUntil( - caches.open(CACHE_NAME) - .then(cache => { - return cache.addAll(urlsToCache); - }) - ); -}); - -self.addEventListener('fetch', event => { - event.respondWith( - caches.match(event.request) - .then(response => { - if (response) { - return response; - } - return fetch(event.request) - .then(fetchResponse => { - return caches.open(CACHE_NAME) - .then(cache => { - cache.put(event.request, fetchResponse.clone()); - return fetchResponse; - }); - }) - .catch(() => caches.match('/MovieVerse-Frontend/html/offline.html')); - }) - ); -}); - -self.addEventListener('activate', event => { - const cacheWhitelist = [CACHE_NAME]; - event.waitUntil( - caches.keys().then(cacheNames => { - return Promise.all( - cacheNames.filter(cacheName => !cacheWhitelist.includes(cacheName)) - .map(cacheName => caches.delete(cacheName)) - ); - }) - ); -}); \ No newline at end of file diff --git a/MovieVerse-Mobile/app/js/settings.js b/MovieVerse-Mobile/app/js/settings.js deleted file mode 100644 index 3a302e8c..00000000 --- a/MovieVerse-Mobile/app/js/settings.js +++ /dev/null @@ -1,373 +0,0 @@ -const DEFAULT_BACKGROUND_IMAGE = '../../images/universe-1.webp'; - -document.addEventListener('DOMContentLoaded', () => { - const bgSelect = document.getElementById('background-select'); - const textColorInput = document.getElementById('text-color-input'); - const fontSizeSelect = document.getElementById('font-size-select'); - const resetButton = document.getElementById('reset-button'); - const deleteButton = document.getElementById('delete-uploaded-btn'); - const deleteImagesSection = document.getElementById('delete-images-section'); - const customImagesContainer = document.getElementById('custom-images-container'); - const deleteSelectedImagesBtn = document.getElementById('delete-selected-images-btn'); - - loadCustomBackgrounds(); - loadSettings(); - - if (bgSelect) { - bgSelect.addEventListener('change', function() { - document.body.style.backgroundImage = `url('${this.value}')`; - localStorage.setItem('backgroundImage', this.value); - window.location.reload(); - }); - } - - if (textColorInput) { - textColorInput.addEventListener('input', function () { - document.querySelectorAll('h1, h2, h3, p, a, span, div, button, input, select, textarea, label, li').forEach(element => { - element.style.color = this.value; - }); - localStorage.setItem('textColor', this.value); - }); - } - - if (fontSizeSelect) { - fontSizeSelect.addEventListener('change', function () { - const size = this.value === 'small' ? '12px' : this.value === 'medium' ? '16px' : '20px'; - document.body.style.fontSize = size; - localStorage.setItem('fontSize', this.value); - }); - } - - if (resetButton) { - resetButton.addEventListener('click', function () { - localStorage.removeItem('backgroundImage'); - localStorage.setItem('backgroundImage', '../../images/universe-1.webp'); - localStorage.removeItem('textColor'); - localStorage.removeItem('fontSize'); - window.location.reload(); - }); - } - - if (deleteButton) { - deleteButton.addEventListener('click', function() { - if (deleteImagesSection.style.display === 'block') { - deleteImagesSection.style.display = 'none'; - } else { - deleteImagesSection.style.display = 'block'; - updateCustomImagesDisplay(); - } - }); - } - - if (deleteSelectedImagesBtn) { - deleteSelectedImagesBtn.addEventListener('click', () => { - const customImages = JSON.parse(localStorage.getItem('customImages')) || []; - const selectedIndexes = Array.from(document.querySelectorAll('.delete-checkbox:checked')).map(checkbox => parseInt(checkbox.value)); - - const updatedImages = customImages.filter((_, index) => !selectedIndexes.includes(index)); - localStorage.setItem('customImages', JSON.stringify(updatedImages)); - - updateCustomImagesDisplay(); - updateBackgroundSelectOptions(); - alert('Selected images have been deleted.'); - window.location.reload(); - }); - } - - function updateCustomImagesDisplay() { - const customImages = JSON.parse(localStorage.getItem('customImages')) || []; - customImagesContainer.innerHTML = ''; - - if (customImages.length === 0) { - customImagesContainer.innerHTML = '

No custom images uploaded.

'; - deleteSelectedImagesBtn.style.display = 'none'; - return; - } - - customImages.forEach((image, index) => { - const imageContainer = document.createElement('div'); - imageContainer.classList.add('image-container'); - - const checkbox = document.createElement('input'); - checkbox.type = 'checkbox'; - checkbox.classList.add('delete-checkbox'); - checkbox.value = index; - - const img = document.createElement('img'); - img.src = image.dataURL; - img.alt = image.name; - img.style.width = '100px'; - - const imageName = document.createElement('span'); - imageName.classList.add('image-name'); - imageName.textContent = image.name; - - // Toggle checkbox when image container is clicked - imageContainer.addEventListener('click', (e) => { - if (e.target !== checkbox) { // Prevent checkbox click event from toggling twice - checkbox.checked = !checkbox.checked; - } - }); - - imageContainer.appendChild(checkbox); - imageContainer.appendChild(img); - imageContainer.appendChild(imageName); - customImagesContainer.appendChild(imageContainer); - }); - - deleteSelectedImagesBtn.style.display = 'block'; - } - - function loadSettings() { - let savedBg = localStorage.getItem('backgroundImage'); - const customImages = JSON.parse(localStorage.getItem('customImages')) || []; - const savedTextColor = localStorage.getItem('textColor'); - const savedFontSize = localStorage.getItem('fontSize'); - - if (!savedBg) { - savedBg = DEFAULT_BACKGROUND_IMAGE; - } - - const availableBackgrounds = [ - '../../images/universe-1.webp', '../../images/universe-2.webp', '../../images/universe-22.webp', - '../../images/universe-3.webp', '../../images/universe-4.webp', '../../images/universe-5.webp', - '../../images/universe-6.webp', '../../images/universe-7.webp', '../../images/universe-8.webp', - '../../images/universe-9.webp', '../../images/universe-10.webp', '../../images/universe-11.webp', - '../../images/universe-12.webp', '../../images/universe-13.webp', '../../images/universe-14.webp', - '../../images/universe-15.webp', '../../images/universe-16.webp', '../../images/universe-17.webp', - '../../images/universe-18.webp', '../../images/universe-19.webp', '../../images/universe-20.webp', - '../../images/universe-21.webp', '../../images/universe.webp', '../../images/universe-23.webp', - '../../images/black.webp', '../../images/grey.webp', '../../images/blue.webp', - '../../images/silver.webp', '../../images/gold.webp', '../../images/rose.webp', - '../../images/pink.webp', '../../images/red.webp', '../../images/green.webp', - '../../images/brown.webp', '../../images/purple.webp', '../../images/orange.webp', - '../../images/yellow.webp' - ]; - - if (!availableBackgrounds.includes(savedBg) && !customImages.find(image => image.dataURL === savedBg)) { - savedBg = DEFAULT_BACKGROUND_IMAGE; - localStorage.setItem('backgroundImage', savedBg); - } - - if (savedBg) { - let imageUrl = savedBg; - if (savedBg === DEFAULT_BACKGROUND_IMAGE) { - if (window.innerWidth <= 680) { - imageUrl = '../../images/universe-1-small.webp'; - } - else if (window.innerWidth <= 1124) { - imageUrl = '../../images/universe-1-medium.webp'; - } - } - document.body.style.backgroundImage = `url('${imageUrl}')`; - } - - const foundImage = customImages.find(image => image.dataURL === savedBg); - - if (savedTextColor) { - document.querySelectorAll('h1, h2, h3, p, a, span, div, button, input, select, textarea, label, li').forEach(element => { - element.style.color = savedTextColor; - }); - textColorInput.value = savedTextColor; - } - - if (savedFontSize) { - const size = savedFontSize === 'small' ? '12px' : savedFontSize === 'medium' ? '16px' : '20px'; - document.body.style.fontSize = size; - fontSizeSelect.value = savedFontSize; - } - - if (bgSelect) { - bgSelect.value = foundImage ? foundImage.dataURL : savedBg; - } - } - - function loadCustomBackgrounds() { - const bgSelect = document.getElementById('background-select'); - const customImages = JSON.parse(localStorage.getItem('customImages')) || []; - - if (bgSelect) { - customImages.forEach(image => { - const newOption = new Option(image.name, image.dataURL); - bgSelect.add(newOption); - }); - } - } -}); - -document.addEventListener('DOMContentLoaded', () => { - const uploadButton = document.getElementById('upload-bg-btn'); - - if (!uploadButton) { - console.log('Upload button not found'); - return; - } - - uploadButton.addEventListener('click', function() { - const fileInput = document.getElementById('custom-bg-upload'); - const imageNameInput = document.getElementById('custom-bg-name'); - const bgSelect = document.getElementById('background-select'); - - if (fileInput && fileInput.files.length > 0) { - const file = fileInput.files[0]; - const customImages = JSON.parse(localStorage.getItem('customImages')) || []; - const totalSize = customImages.reduce((sum, img) => sum + img.dataURL.length, 0); - const quota = 4.5 * 1024 * 1024; // 4.5 MB - - if (totalSize >= quota) { - handleQuotaExceedance(); - window.location.reload(); - return; - } - - if (file.size > 204800) { // 200 KB - resizeImage(file, 204800, (resizedDataUrl, err) => { - if (err) { - alert(`Error resizing the image due to a limitation in your browser. Browser error: ${err.message} Your image might still appear as the background, but it will not be stable. We recommend deleting it and then using a different browser or uploading an image smaller than 1MB.`); - return; - } - processImageUpload(resizedDataUrl, imageNameInput, bgSelect); - alert('The uploaded image was resized to fit the size limit of 200KB.'); - window.location.reload(); - }); - } - else { - const reader = new FileReader(); - reader.onload = function (e) { - processImageUpload(e.target.result, imageNameInput, bgSelect); - window.location.reload(); - }; - reader.onerror = function () { - alert('Error reading the file.'); - window.location.reload(); - }; - reader.readAsDataURL(file); - } - } - else { - alert('Please select an image to upload.'); - } - }); -}); - -function handleQuotaExceedance() { - const customImages = JSON.parse(localStorage.getItem('customImages')) || []; - if (customImages.length > 0) { - alert('Your custom image storage has exceeded the quota. Please delete at least two images to continue.'); - - deleteImagesPrompt(); - } -} - -function deleteImagesPrompt() { - const customImages = JSON.parse(localStorage.getItem('customImages')) || []; - if (customImages.length === 0) { - alert('No custom images to delete.'); - return; - } - - let message = 'Select images to delete:\n'; - customImages.forEach((image, index) => { - message += `${index + 1}. ${image.name}\n`; - }); - message += 'Enter the numbers of the images to delete (e.g., 1,3):'; - - const input = prompt(message); - if (input) { - const indexesToDelete = input.split(',').map(num => parseInt(num.trim()) - 1); - const updatedImages = customImages.filter((_, index) => !indexesToDelete.includes(index)); - localStorage.setItem('customImages', JSON.stringify(updatedImages)); - updateBackgroundSelectOptions(); - alert('Selected images have been deleted.'); - } -} - -function updateBackgroundSelectOptions() { - const bgSelect = document.getElementById('background-select'); - const customImages = JSON.parse(localStorage.getItem('customImages')) || []; - - Array.from(bgSelect.options).forEach(option => { - if (option.value.startsWith('data:image')) { - bgSelect.remove(option.index); - } - }); - - customImages.forEach(image => { - const newOption = new Option(image.name, image.dataURL); - bgSelect.add(newOption); - }); -} - -function processImageUpload(dataUrl, imageNameInput, bgSelect) { - const customImages = JSON.parse(localStorage.getItem('customImages')) || []; - let imageName = imageNameInput.value.trim(); - - if (!imageName) { - imageName = `User-Added Image ${customImages.length + 1}`; - } - - customImages.push({ name: imageName, dataURL: dataUrl }); - localStorage.setItem('customImages', JSON.stringify(customImages)); - - const newOption = new Option(imageName, dataUrl); - bgSelect.add(newOption); - bgSelect.value = dataUrl; - - document.body.style.backgroundImage = `url('${dataUrl}')`; - localStorage.setItem('backgroundImage', dataUrl); -} - -function resizeImage(file, maxSize, callback) { - if (!(window.FileReader && window.Blob && window.HTMLCanvasElement)) { - callback(null, new Error('Your browser does not support resizing images. Please use a different browser or upload an image smaller than 200KB.')); - return; - } - - const reader = new FileReader(); - reader.onload = function(e) { - const img = new Image(); - img.onload = function() { - try { - let canvas = document.createElement('canvas'); - let ctx = canvas.getContext('2d'); - - let width = img.width; - let height = img.height; - - if (width > height) { - if (width > maxSize) { - height *= maxSize / width; - width = maxSize; - } - } - else { - if (height > maxSize) { - width *= maxSize / height; - height = maxSize; - } - } - - canvas.width = width; - canvas.height = height; - ctx.drawImage(img, 0, 0, width, height); - - callback(canvas.toDataURL('image/jpeg'), null); - - canvas.height = 0; - canvas.width = 0; - canvas = null; - } - catch (error) { - callback(null, error); - } - }; - img.onerror = function() { - callback(null, new Error('Failed to load the image.')); - }; - img.src = e.target.result; - }; - reader.onerror = function() { - callback(null, new Error('Failed to read the image file.')); - }; - reader.readAsDataURL(file); -} diff --git a/MovieVerse-Mobile/app/js/sign-in.js b/MovieVerse-Mobile/app/js/sign-in.js deleted file mode 100644 index 5cd52e60..00000000 --- a/MovieVerse-Mobile/app/js/sign-in.js +++ /dev/null @@ -1,81 +0,0 @@ -import { initializeApp } from "https://www.gstatic.com/firebasejs/10.8.0/firebase-app.js"; -import { getFirestore, collection, query, where, getDocs } from "https://www.gstatic.com/firebasejs/10.8.0/firebase-firestore.js"; - -function translateFBC(value) { - return atob(value); -} - -function getFBConfig1() { - const fbConfig1 = "QUl6YVN5REw2a1FuU2ZVZDhVdDhIRnJwS3VpdnF6MXhkWG03aw=="; - return translateFBC(fbConfig1); -} - -function getFBConfig2() { - const fbConfig2 = "bW92aWV2ZXJzZS1hcHAuZmlyZWJhc2VhcHAuY29t"; - return translateFBC(fbConfig2); -} - -function getFBConfig3() { - const fbConfig3 = "bW92aWV2ZXJzZS1hcHAuYXBwc3BvdC5jb20="; - return translateFBC(fbConfig3); -} - -function getFBConfig4() { - const fbConfig4 = "ODAyOTQzNzE4ODcx"; - return translateFBC(fbConfig4); -} - -function getFBConfig5() { - const fbConfig5 = "MTo4MDI5NDM3MTg4NzE6d2ViOjQ4YmM5MTZjYzk5ZTI3MjQyMTI3OTI="; - return translateFBC(fbConfig5); -} - -const firebaseConfig = { - apiKey: getFBConfig1(), - authDomain: getFBConfig2(), - projectId: "movieverse-app", - storageBucket: getFBConfig3(), - messagingSenderId: getFBConfig4(), - appId: getFBConfig5() -}; - -const app = initializeApp(firebaseConfig); -const db = getFirestore(app); - -document.getElementById('signInForm').addEventListener('submit', async function(event) { - event.preventDefault(); - - try { - - const email = document.getElementById('signInEmail').value; - const password = document.getElementById('signInPassword').value; - - const usersRef = collection(db, "MovieVerseUsers"); - const q = query(usersRef, where("email", "==", email), where("password", "==", password)); - const querySnapshot = await getDocs(q); - - if (!querySnapshot.empty) { - alert('Successfully signed in!'); - localStorage.setItem('isSignedIn', JSON.stringify(true)); - localStorage.setItem('currentlySignedInMovieVerseUser', email); - window.location.href = '../../index.html'; - } else { - alert('Invalid email or password. Ensure that you have entered a correct combination of email and password - one that we have on file.'); - } - } - catch (error) { - console.error("Error fetching user list: ", error); - if (error.code === 'resource-exhausted') { - const noUserSelected = document.getElementById('signInForm'); - if (noUserSelected) { - noUserSelected.innerHTML = "Sorry, our database is currently overloaded. Please try reloading once more, and if that still doesn't work, please try again in a couple hours. For full transparency, we are currently using a database that has a limited number of reads and writes per day due to lack of funding. Thank you for your patience as we work on scaling our services. At the mean time, feel free to use other MovieVerse features!"; - noUserSelected.style.height = '350px'; - } - hideSpinner(); - } - } -}); - -document.getElementById('createAccountBtn').addEventListener('click', function() { - window.location.href = 'create-account.html'; -}); \ No newline at end of file diff --git a/MovieVerse-Mobile/app/js/triviaModule.js b/MovieVerse-Mobile/app/js/triviaModule.js deleted file mode 100644 index 4ae5c28c..00000000 --- a/MovieVerse-Mobile/app/js/triviaModule.js +++ /dev/null @@ -1,69 +0,0 @@ -import { initializeApp } from "https://www.gstatic.com/firebasejs/10.8.0/firebase-app.js"; -import { getFirestore, doc, setDoc, getDoc } from "https://www.gstatic.com/firebasejs/10.8.0/firebase-firestore.js"; - -const firebaseConfig = { - apiKey: atob("QUl6YVN5REw2a1FuU2ZVZDhVdDhIRnJwS3VpdnF6MXhkWG03aw=="), - authDomain: atob("bW92aWV2ZXJzZS1hcHAuZmlyZWJhc2VhcHAuY29t"), - projectId: "movieverse-app", - storageBucket: atob("bW92aWV2ZXJzZS1hcHAuYXBwc3BvdC5jb20="), - messagingSenderId: atob("ODAyOTQzNzE4ODcx"), - appId: atob("MTo4MDI5NDM3MTg4NzE6d2ViOjQ4YmM5MTZjYzk5ZTI3MjQyMTI3OTI=") -}; - -const app = initializeApp(firebaseConfig); - -const db = getFirestore(app); - -export async function updateTriviaStats(currentUserEmail, correctAnswers, totalQuestions) { - if (!currentUserEmail) { - let triviaStats = JSON.parse(localStorage.getItem('triviaStats')) || { totalCorrect: 0, totalAttempted: 0 }; - triviaStats.totalCorrect += correctAnswers; - triviaStats.totalAttempted += totalQuestions; - localStorage.setItem('triviaStats', JSON.stringify(triviaStats)); - } - else { - try { - const statsRef = doc(db, 'userTriviaStats', currentUserEmail); - const docSnap = await getDoc(statsRef); - let triviaStats = docSnap.exists() ? docSnap.data() : {totalCorrect: 0, totalAttempted: 0}; - triviaStats.totalCorrect += correctAnswers; - triviaStats.totalAttempted += totalQuestions; - await setDoc(statsRef, triviaStats, {merge: true}); - localStorage.setItem('triviaStats', JSON.stringify(triviaStats)); - } - catch (error) { - if (error.code === 'resource-exhausted') { - let triviaStats = JSON.parse(localStorage.getItem('triviaStats')) || { totalCorrect: 0, totalAttempted: 0 }; - triviaStats.totalCorrect += correctAnswers; - triviaStats.totalAttempted += totalQuestions; - localStorage.setItem('triviaStats', JSON.stringify(triviaStats)); - } - } - } -} - -export async function getTriviaStats(currentUserEmail) { - if (!currentUserEmail) { - return JSON.parse(localStorage.getItem('triviaStats')) || { totalCorrect: 0, totalAttempted: 0 }; - } - else { - const statsRef = doc(db, 'userTriviaStats', currentUserEmail); - try { - const docSnap = await getDoc(statsRef); - if (docSnap.exists()) { - console.log("Fetched trivia stats from Firebase:", docSnap.data()); - return docSnap.data(); - } - else { - console.log("No trivia stats found in Firebase for:", currentUserEmail); - return { totalCorrect: 0, totalAttempted: 0 }; - } - } - catch (error) { - if (error.code === 'resource-exhausted') { - console.error("Firebase quota exceeded, fetching trivia stats from localStorage."); - return JSON.parse(localStorage.getItem('triviaStats')) || {totalCorrect: 0, totalAttempted: 0}; - } - } - } -} diff --git a/MovieVerse-Mobile/app/js/tv-details.js b/MovieVerse-Mobile/app/js/tv-details.js deleted file mode 100644 index c6d05613..00000000 --- a/MovieVerse-Mobile/app/js/tv-details.js +++ /dev/null @@ -1,1111 +0,0 @@ -const movieCode = { - part1: 'YzVhMjBjODY=', - part2: 'MWFjZjdiYjg=', - part3: 'ZDllOTg3ZGNjN2YxYjU1OA==' -}; - -let globalTrailerKey = ''; - -function getMovieCode() { - return atob(movieCode.part1) + atob(movieCode.part2) + atob(movieCode.part3); -} - -function generateMovieNames(input) { - return String.fromCharCode(97, 112, 105, 95, 107, 101, 121, 61); -} - -const search = document.getElementById("search"); -const searchButton = document.getElementById("button-search"); -const form = document.getElementById("form1"); -const SEARCHPATH = `https://${getMovieVerseData()}/3/search/movie?&${generateMovieNames()}${getMovieCode()}&query=`; - -const main = document.getElementById("main"); -const IMGPATH = "https://image.tmdb.org/t/p/w780"; -const searchTitle = document.getElementById("search-title"); -let initialMainContent; - -form.addEventListener('submit', (e) => { - e.preventDefault(); - const searchQuery = document.getElementById('search').value; - localStorage.setItem('searchQuery', searchQuery); - window.location.href = 'search.html'; -}); - -function handleSearch() { - const searchQuery = document.getElementById('search').value; - localStorage.setItem('searchQuery', searchQuery); - window.location.href = 'search.html'; -} - -async function ensureGenreMapIsAvailable() { - if (!localStorage.getItem('genreMap')) { - await fetchGenreMap(); - } -} - -async function fetchGenreMap() { - const url = `https://${getMovieVerseData()}/3/genre/movie/list?${generateMovieNames()}${getMovieCode()}`; - try { - const response = await fetch(url); - const data = await response.json(); - const genreMap = data.genres.reduce((map, genre) => { - map[genre.id] = genre.name; - return map; - }, {}); - localStorage.setItem('genreMap', JSON.stringify(genreMap)); - } - catch (error) { - console.log('Error fetching genre map:', error); - } -} - -async function rotateUserStats() { - await ensureGenreMapIsAvailable(); - - const stats = [ - { - label: "Your Current Time", - getValue: () => { - const now = new Date(); - let hours = now.getHours(); - let minutes = now.getMinutes(); - hours = hours < 10 ? '0' + hours : hours; - minutes = minutes < 10 ? '0' + minutes : minutes; - return `${hours}:${minutes}`; - } - }, - { label: "Most Visited Movie", getValue: getMostVisitedMovie }, - { label: "Most Visited Director", getValue: getMostVisitedDirector }, - { label: "Most Visited Actor", getValue: getMostVisitedActor }, - { - label: "Movies Discovered", - getValue: () => { - const viewedMovies = JSON.parse(localStorage.getItem('uniqueMoviesViewed')) || []; - return viewedMovies.length; - } - }, - { - label: "Favorite Movies", - getValue: () => { - const favoritedMovies = JSON.parse(localStorage.getItem('moviesFavorited')) || []; - return favoritedMovies.length; - } - }, - { - label: "Favorite Genre", - getValue: () => { - const mostCommonGenreCode = getMostCommonGenre(); - const genreMapString = localStorage.getItem('genreMap'); - if (!genreMapString) { - console.log('No genre map found in localStorage.'); - return 'Not Available'; - } - - let genreMap; - try { - genreMap = JSON.parse(genreMapString); - } - catch (e) { - console.log('Error parsing genre map:', e); - return 'Not Available'; - } - - let genreObject; - if (Array.isArray(genreMap)) { - genreObject = genreMap.reduce((acc, genre) => { - acc[genre.id] = genre.name; - return acc; - }, {}); - } - else if (typeof genreMap === 'object' && genreMap !== null) { - genreObject = genreMap; - } - else { - console.log('genreMap is neither an array nor a proper object:', genreMap); - return 'Not Available'; - } - - return genreObject[mostCommonGenreCode] || 'Not Available'; - } - }, - { label: "Watchlists Created", getValue: () => localStorage.getItem('watchlistsCreated') || 0 }, - { label: "Average Movie Rating", getValue: () => localStorage.getItem('averageMovieRating') || 'Not Rated' }, - { - label: "Directors Discovered", - getValue: () => { - const viewedDirectors = JSON.parse(localStorage.getItem('uniqueDirectorsViewed')) || []; - return viewedDirectors.length; - } - }, - { - label: "Actors Discovered", - getValue: () => { - const viewedActors = JSON.parse(localStorage.getItem('uniqueActorsViewed')) || []; - return viewedActors.length; - } - }, - { label: "Your Trivia Accuracy", getValue: getTriviaAccuracy }, - ]; - - let currentStatIndex = 0; - - function updateStatDisplay() { - const currentStat = stats[currentStatIndex]; - document.getElementById('stats-label').textContent = currentStat.label + ':'; - document.getElementById('stats-display').textContent = currentStat.getValue(); - currentStatIndex = (currentStatIndex + 1) % stats.length; - } - - updateStatDisplay(); - - const localTimeDiv = document.getElementById('local-time'); - let statRotationInterval = setInterval(updateStatDisplay, 3000); - - localTimeDiv.addEventListener('click', () => { - clearInterval(statRotationInterval); - updateStatDisplay(); - statRotationInterval = setInterval(updateStatDisplay, 3000); - }); -} - -function updateMovieVisitCount(movieId, movieTitle) { - let movieVisits = JSON.parse(localStorage.getItem('movieVisits')) || {}; - - if (!movieVisits[movieId]) { - movieVisits[movieId] = { count: 0, title: movieTitle }; - } - movieVisits[movieId].count += 1; - localStorage.setItem('movieVisits', JSON.stringify(movieVisits)); -} - -function getMostVisitedDirector() { - const directorVisits = JSON.parse(localStorage.getItem('directorVisits')) || {}; - let mostVisitedDirector = ''; - let maxVisits = 0; - - for (const directorId in directorVisits) { - if (directorVisits[directorId].count > maxVisits) { - mostVisitedDirector = directorVisits[directorId].name; - maxVisits = directorVisits[directorId].count; - } - } - - return mostVisitedDirector || 'Not Available'; -} - -function getMostVisitedMovie() { - const movieVisits = JSON.parse(localStorage.getItem('movieVisits')) || {}; - let mostVisitedMovie = ''; - let maxVisits = 0; - - for (const movieId in movieVisits) { - if (movieVisits[movieId].count > maxVisits) { - mostVisitedMovie = movieVisits[movieId].title; - maxVisits = movieVisits[movieId].count; - } - } - - return mostVisitedMovie || 'Not Available'; -} - -function getMostVisitedActor() { - const actorVisits = JSON.parse(localStorage.getItem('actorVisits')) || {}; - let mostVisitedActor = ''; - let maxVisits = 0; - - for (const actorId in actorVisits) { - if (actorVisits[actorId].count > maxVisits) { - mostVisitedActor = actorVisits[actorId].name; - maxVisits = actorVisits[actorId].count; - } - } - - return mostVisitedActor || 'Not Available'; -} - -function getTriviaAccuracy() { - let triviaStats = JSON.parse(localStorage.getItem('triviaStats')) || { totalCorrect: 0, totalAttempted: 0 }; - if (triviaStats.totalAttempted === 0) { - return 'No trivia attempted'; - } - - let accuracy = (triviaStats.totalCorrect / triviaStats.totalAttempted) * 100; - return `${accuracy.toFixed(1)}% accuracy`; -} - -function getMostCommonGenre() { - const favoriteGenresArray = JSON.parse(localStorage.getItem('favoriteGenres')) || []; - const genreCounts = favoriteGenresArray.reduce((acc, genre) => { - acc[genre] = (acc[genre] || 0) + 1; - return acc; - }, {}); - - let mostCommonGenre = ''; - let maxCount = 0; - - for (const genre in genreCounts) { - if (genreCounts[genre] > maxCount) { - mostCommonGenre = genre; - maxCount = genreCounts[genre]; - } - } - - return mostCommonGenre || 'Not Available'; -} - -document.addEventListener('DOMContentLoaded', rotateUserStats); - -function setStarRating(rating) { - const stars = document.querySelectorAll('.rating .star'); - stars.forEach(star => { - star.style.color = star.dataset.value > rating ? 'white' : 'gold'; - }); - - document.getElementById('rating-value').textContent = `${rating}.0/5.0`; -} - -function getMovieVerseData(input) { - return String.fromCharCode(97, 112, 105, 46, 116, 104, 101, 109, 111, 118, 105, 101, 100, 98, 46, 111, 114, 103); -} - -document.querySelectorAll('.rating .star').forEach(star => { - star.addEventListener('mouseover', (e) => { - setStarRating(e.target.dataset.value); - }); - - star.addEventListener('mouseout', () => { - const movieId = localStorage.getItem('selectedTvSeriesId'); - const savedRatings = JSON.parse(localStorage.getItem('tvSeriesRatings')) || {}; - const movieRating = savedRatings[movieId] || 0; - setStarRating(movieRating); - }); - - star.addEventListener('click', (e) => { - const tvSeriesId = localStorage.getItem('selectedTvSeriesId'); - if (!tvSeriesId) return; - const rating = e.target.dataset.value; - const savedRatings = JSON.parse(localStorage.getItem('tvSeriesRatings')) || {}; - savedRatings[tvSeriesId] = rating; - localStorage.setItem('tvSeriesRatings', JSON.stringify(savedRatings)); - setStarRating(rating); - window.location.reload(); - }); -}); - -document.getElementById('clear-search-btn').addEventListener('click', () => { - location.reload(); -}); - -function handleSignInOut() { - const isSignedIn = JSON.parse(localStorage.getItem('isSignedIn')) || false; - - if (isSignedIn) { - localStorage.setItem('isSignedIn', JSON.stringify(false)); - alert('You have been signed out.'); - } - else { - window.location.href = 'sign-in.html'; - return; - } - - updateSignInButtonState(); -} - -function updateSignInButtonState() { - const isSignedIn = JSON.parse(localStorage.getItem('isSignedIn')) || false; - - const signInText = document.getElementById('signInOutText'); - const signInIcon = document.getElementById('signInIcon'); - const signOutIcon = document.getElementById('signOutIcon'); - - if (isSignedIn) { - signInText.textContent = 'Sign Out'; - signInIcon.style.display = 'none'; - signOutIcon.style.display = 'inline-block'; - } - else { - signInText.textContent = 'Sign In'; - signInIcon.style.display = 'inline-block'; - signOutIcon.style.display = 'none'; - } -} - -document.addEventListener("DOMContentLoaded", function() { - updateSignInButtonState(); - document.getElementById('googleSignInBtn').addEventListener('click', handleSignInOut); -}); - -document.addEventListener("DOMContentLoaded", function() { - applySettings(); -}); - -const tvCode = `${getMovieCode()}`; - -const twoLetterLangCodes = [ - { "code": "aa", "name": "Afar" }, - { "code": "ab", "name": "Abkhazian" }, - { "code": "ae", "name": "Avestan" }, - { "code": "af", "name": "Afrikaans" }, - { "code": "ak", "name": "Akan" }, - { "code": "am", "name": "Amharic" }, - { "code": "an", "name": "Aragonese" }, - { "code": "ar", "name": "Arabic" }, - { "code": "as", "name": "Assamese" }, - { "code": "av", "name": "Avaric" }, - { "code": "ay", "name": "Aymara" }, - { "code": "az", "name": "Azerbaijani" }, - { "code": "ba", "name": "Bashkir" }, - { "code": "be", "name": "Belarusian" }, - { "code": "bg", "name": "Bulgarian" }, - { "code": "bh", "name": "Bihari languages" }, - { "code": "bi", "name": "Bislama" }, - { "code": "bm", "name": "Bambara" }, - { "code": "bn", "name": "Bengali" }, - { "code": "bo", "name": "Tibetan" }, - { "code": "br", "name": "Breton" }, - { "code": "bs", "name": "Bosnian" }, - { "code": "ca", "name": "Catalan; Valencian" }, - { "code": "ce", "name": "Chechen" }, - { "code": "ch", "name": "Chamorro" }, - { "code": "co", "name": "Corsican" }, - { "code": "cr", "name": "Cree" }, - { "code": "cs", "name": "Czech" }, - { - "code": "cu", - "name": "Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic" - }, - { "code": "cv", "name": "Chuvash" }, - { "code": "cy", "name": "Welsh" }, - { "code": "da", "name": "Danish" }, - { "code": "de", "name": "German" }, - { "code": "dv", "name": "Divehi; Dhivehi; Maldivian" }, - { "code": "dz", "name": "Dzongkha" }, - { "code": "ee", "name": "Ewe" }, - { "code": "el", "name": "Greek, Modern (1453-)" }, - { "code": "en", "name": "English" }, - { "code": "eo", "name": "Esperanto" }, - { "code": "es", "name": "Spanish; Castilian" }, - { "code": "et", "name": "Estonian" }, - { "code": "eu", "name": "Basque" }, - { "code": "fa", "name": "Persian" }, - { "code": "ff", "name": "Fulah" }, - { "code": "fi", "name": "Finnish" }, - { "code": "fj", "name": "Fijian" }, - { "code": "fo", "name": "Faroese" }, - { "code": "fr", "name": "French" }, - { "code": "fy", "name": "Western Frisian" }, - { "code": "ga", "name": "Irish" }, - { "code": "gd", "name": "Gaelic; Scomttish Gaelic" }, - { "code": "gl", "name": "Galician" }, - { "code": "gn", "name": "Guarani" }, - { "code": "gu", "name": "Gujarati" }, - { "code": "gv", "name": "Manx" }, - { "code": "ha", "name": "Hausa" }, - { "code": "he", "name": "Hebrew" }, - { "code": "hi", "name": "Hindi" }, - { "code": "ho", "name": "Hiri Motu" }, - { "code": "hr", "name": "Croatian" }, - { "code": "ht", "name": "Haitian; Haitian Creole" }, - { "code": "hu", "name": "Hungarian" }, - { "code": "hy", "name": "Armenian" }, - { "code": "hz", "name": "Herero" }, - { - "code": "ia", - "name": "Interlingua (International Auxiliary Language Association)" - }, - { "code": "id", "name": "Indonesian" }, - { "code": "ie", "name": "Interlingue; Occidental" }, - { "code": "ig", "name": "Igbo" }, - { "code": "ii", "name": "Sichuan Yi; Nuosu" }, - { "code": "ik", "name": "Inupiaq" }, - { "code": "io", "name": "Ido" }, - { "code": "is", "name": "Icelandic" }, - { "code": "it", "name": "Italian" }, - { "code": "iu", "name": "Inuktitut" }, - { "code": "ja", "name": "Japanese" }, - { "code": "jv", "name": "Javanese" }, - { "code": "ka", "name": "Georgian" }, - { "code": "kg", "name": "Kongo" }, - { "code": "ki", "name": "Kikuyu; Gikuyu" }, - { "code": "kj", "name": "Kuanyama; Kwanyama" }, - { "code": "kk", "name": "Kazakh" }, - { "code": "kl", "name": "Kalaallisut; Greenlandic" }, - { "code": "km", "name": "Central Khmer" }, - { "code": "kn", "name": "Kannada" }, - { "code": "ko", "name": "Korean" }, - { "code": "kr", "name": "Kanuri" }, - { "code": "ks", "name": "Kashmiri" }, - { "code": "ku", "name": "Kurdish" }, - { "code": "kv", "name": "Komi" }, - { "code": "kw", "name": "Cornish" }, - { "code": "ky", "name": "Kirghiz; Kyrgyz" }, - { "code": "la", "name": "Latin" }, - { "code": "lb", "name": "Luxembourgish; Letzeburgesch" }, - { "code": "lg", "name": "Ganda" }, - { "code": "li", "name": "Limburgan; Limburger; Limburgish" }, - { "code": "ln", "name": "Lingala" }, - { "code": "lo", "name": "Lao" }, - { "code": "lt", "name": "Lithuanian" }, - { "code": "lu", "name": "Luba-Katanga" }, - { "code": "lv", "name": "Latvian" }, - { "code": "mg", "name": "Malagasy" }, - { "code": "mh", "name": "Marshallese" }, - { "code": "mi", "name": "Maori" }, - { "code": "mk", "name": "Macedonian" }, - { "code": "ml", "name": "Malayalam" }, - { "code": "mn", "name": "Mongolian" }, - { "code": "mr", "name": "Marathi" }, - { "code": "ms", "name": "Malay" }, - { "code": "mt", "name": "Maltese" }, - { "code": "my", "name": "Burmese" }, - { "code": "na", "name": "Nauru" }, - { - "code": "nb", - "name": "Bokmål, Norwegian; Norwegian Bokmål" - }, - { "code": "nd", "name": "Ndebele, North; North Ndebele" }, - { "code": "ne", "name": "Nepali" }, - { "code": "ng", "name": "Ndonga" }, - { "code": "nl", "name": "Dutch; Flemish" }, - { "code": "nn", "name": "Norwegian Nynorsk; Nynorsk, Norwegian" }, - { "code": "no", "name": "Norwegian" }, - { "code": "nr", "name": "Ndebele, South; South Ndebele" }, - { "code": "nv", "name": "Navajo; Navaho" }, - { "code": "ny", "name": "Chichewa; Chewa; Nyanja" }, - { "code": "oc", "name": "Occitan (post 1500)" }, - { "code": "oj", "name": "Ojibwa" }, - { "code": "om", "name": "Oromo" }, - { "code": "or", "name": "Oriya" }, - { "code": "os", "name": "Ossetian; Ossetic" }, - { "code": "pa", "name": "Panjabi; Punjabi" }, - { "code": "pi", "name": "Pali" }, - { "code": "pl", "name": "Polish" }, - { "code": "ps", "name": "Pushto; Pashto" }, - { "code": "pt", "name": "Portuguese" }, - { "code": "qu", "name": "Quechua" }, - { "code": "rm", "name": "Romansh" }, - { "code": "rn", "name": "Rundi" }, - { "code": "ro", "name": "Romanian; Moldavian; Moldovan" }, - { "code": "ru", "name": "Russian" }, - { "code": "rw", "name": "Kinyarwanda" }, - { "code": "sa", "name": "Sanskrit" }, - { "code": "sc", "name": "Sardinian" }, - { "code": "sd", "name": "Sindhi" }, - { "code": "se", "name": "Northern Sami" }, - { "code": "sg", "name": "Sango" }, - { "code": "si", "name": "Sinhala; Sinhalese" }, - { "code": "sk", "name": "Slovak" }, - { "code": "sl", "name": "Slovenian" }, - { "code": "sm", "name": "Samoan" }, - { "code": "sn", "name": "Shona" }, - { "code": "so", "name": "Somali" }, - { "code": "sq", "name": "Albanian" }, - { "code": "sr", "name": "Serbian" }, - { "code": "ss", "name": "Swati" }, - { "code": "st", "name": "Sotho, Southern" }, - { "code": "su", "name": "Sundanese" }, - { "code": "sv", "name": "Swedish" }, - { "code": "sw", "name": "Swahili" }, - { "code": "ta", "name": "Tamil" }, - { "code": "te", "name": "Telugu" }, - { "code": "tg", "name": "Tajik" }, - { "code": "th", "name": "Thai" }, - { "code": "ti", "name": "Tigrinya" }, - { "code": "tk", "name": "Turkmen" }, - { "code": "tl", "name": "Tagalog" }, - { "code": "tn", "name": "Tswana" }, - { "code": "to", "name": "Tonga (Tonga Islands)" }, - { "code": "tr", "name": "Turkish" }, - { "code": "ts", "name": "Tsonga" }, - { "code": "tt", "name": "Tatar" }, - { "code": "tw", "name": "Twi" }, - { "code": "ty", "name": "Tahitian" }, - { "code": "ug", "name": "Uighur; Uyghur" }, - { "code": "uk", "name": "Ukrainian" }, - { "code": "ur", "name": "Urdu" }, - { "code": "uz", "name": "Uzbek" }, - { "code": "ve", "name": "Venda" }, - { "code": "vi", "name": "Vietnamese" }, - { "code": "vo", "name": "Volapük" }, - { "code": "wa", "name": "Walloon" }, - { "code": "wo", "name": "Wolof" }, - { "code": "xh", "name": "Xhosa" }, - { "code": "yi", "name": "Yiddish" }, - { "code": "yo", "name": "Yoruba" }, - { "code": "za", "name": "Zhuang; Chuang" }, - { "code": "zh", "name": "Chinese" }, - { "code": "zu", "name": "Zulu" } -]; - -async function fetchTvDetails(tvSeriesId) { - showSpinner(); - const baseUrl = `https://${getMovieVerseData()}/3/tv/${tvSeriesId}`; - const urlWithAppend = `${baseUrl}?${generateMovieNames()}${tvCode}&append_to_response=credits,keywords,similar,videos,external_ids`; - - try { - const response = await fetch(urlWithAppend); - const tvSeriesDetails = await response.json(); - const imdbId = tvSeriesDetails.external_ids.imdb_id; - const imdbRating = await fetchTVRatings(imdbId); - - populateTvSeriesDetails(tvSeriesDetails, imdbRating); - updateBrowserURL(tvSeriesDetails.name); - - const trailer = tvSeriesDetails.videos.results.find(video => video.type === 'Trailer' && video.site === 'YouTube'); - if (trailer) { - document.getElementById('trailerButton').style.display = 'block'; - globalTrailerKey = trailer.key; - } - - hideSpinner(); - } - catch (error) { - document.getElementById('movie-details-container').innerHTML = ` -
-

TV series details not found - Try again with another TV series

-
`; - console.log('Error fetching TV series details:', error); - hideSpinner(); - } -} - -async function fetchTVRatings(imdbId) { - const fff = `60a09d79`; - const link = `https://${getMovieActor()}/?i=${imdbId}&${getMovieName()}${fff}`; - - try { - const response = await fetch(link); - const data = await response.json(); - - return data.imdbRating ? data.imdbRating : 'IMDb data unavailable but you can check it out by clicking here'; - } - catch (error) { - console.log('Error fetching TV series ratings:', error); - return 'N/A'; - } -} - -function getLanguageName(code) { - const language = twoLetterLangCodes.find(lang => lang.code === code); - return language ? language.name : 'Unknown Language'; -} - -function getCountryName(code) { - const regionNames = new Intl.DisplayNames(['en'], {type: 'region'}); - return regionNames.of(code); -} - -async function populateTvSeriesDetails(tvSeries, imdbRating) { - const title = tvSeries.name || 'Title not available'; - document.getElementById('movie-title').textContent = title; - document.title = tvSeries.name + " - TV Series Details"; - - const posterPath = tvSeries.poster_path ? `https://image.tmdb.org/t/p/w780${tvSeries.poster_path}` : 'path/to/default/poster.jpg'; - document.getElementById('movie-image').src = posterPath; - document.getElementById('movie-image').alt = `Poster of ${title}`; - - let detailsHTML = `

Overview: ${tvSeries.overview || 'Overview not available.'}

`; - - detailsHTML += `

Original Title: ${tvSeries.original_name || 'Not available'}

`; - - detailsHTML += `

Tagline: ${tvSeries.tagline || 'Not available'}

`; - - const genres = tvSeries.genres && tvSeries.genres.length ? tvSeries.genres.map(genre => genre.name).join(', ') : 'Genres not available'; - detailsHTML += `

Genres: ${genres}

`; - - detailsHTML += `

First Air Date: ${tvSeries.first_air_date || 'Not available'}

`; - - detailsHTML += `

Last Air Date: ${tvSeries.last_air_date || 'Not available'}

`; - - detailsHTML += `

Status: ${tvSeries.status || 'Not available'}

`; - - const networks = tvSeries.networks && tvSeries.networks.length ? tvSeries.networks.map(network => network.name).join(', ') : 'Information not available'; - detailsHTML += `

Networks: ${networks}

`; - - const voteAverage = tvSeries.vote_average ? tvSeries.vote_average.toFixed(1) : 'N/A'; - const voteCount = tvSeries.vote_count ? tvSeries.vote_count.toLocaleString() : 'N/A'; - detailsHTML += `

MovieVerse User Rating: ${(voteAverage / 2).toFixed(1)}/5.0 (based on ${voteCount} votes)

`; - - if (tvSeries.external_ids && tvSeries.external_ids.imdb_id) { - const imdbId = tvSeries.external_ids.imdb_id; - const imdbUrl = `https://www.imdb.com/title/${imdbId}/`; - detailsHTML += `

IMDb Rating: ${imdbRating}

`; - } - else { - detailsHTML += `

IMDb Rating: IMDb rating not available

`; - } - - const tmdbRating = tvSeries.vote_average ? tvSeries.vote_average.toFixed(1) : 'N/A'; - detailsHTML += `

TMDB Rating: ${tmdbRating}/10.0

`; - - const homepage = tvSeries.homepage ? `Visit homepage` : 'Not available'; - detailsHTML += `

Homepage: ${homepage}

`; - - detailsHTML += `

Seasons: ${tvSeries.number_of_seasons || 0}, Episodes: ${tvSeries.number_of_episodes || 0}

`; - - if (tvSeries.origin_country && tvSeries.origin_country.length > 0) { - const countryNames = tvSeries.origin_country.map(code => getCountryName(code)).join(', '); - detailsHTML += `

Country of Origin: ${countryNames}

`; - } - else { - detailsHTML += `

Country of Origin: Information not available

`; - } - - const languageName = getLanguageName(tvSeries.original_language); - detailsHTML += `

Original Language: ${languageName}

`; - - const productionCountries = tvSeries.production_countries && tvSeries.production_countries.length > 0 ? tvSeries.production_countries.map(country => getCountryName(country.iso_3166_1)).join(', ') : 'Information not available'; - detailsHTML += `

Production Countries: ${productionCountries}

`; - - if (tvSeries.created_by && tvSeries.created_by.length) { - const creatorsLinks = tvSeries.created_by.map(creator => - `${creator.name}` - ).join(', '); - detailsHTML += `

Directors: ${creatorsLinks}

`; - } - else { - detailsHTML += `

Directors: Information not available

`; - } - - if (tvSeries.credits && tvSeries.credits.cast && tvSeries.credits.cast.length) { - let castHTML = tvSeries.credits.cast.slice(0, 100).map(castMember => { - const escapedName = castMember.name.replace(/'/g, "\\'"); - return `${castMember.name}`; - }).join(', '); - detailsHTML += `

Cast: ${castHTML}

`; - } - else { - detailsHTML += `

Cast: Information not available

`; - } - - if (tvSeries.production_companies && tvSeries.production_companies.length) { - let companiesHTML = tvSeries.production_companies.map(company => { - return `${company.name}`; - }).join(', '); - detailsHTML += `

Production Companies: ${companiesHTML}

`; - } - else { - detailsHTML += `

Production Companies: Information not available

`; - } - - if (tvSeries.similar && tvSeries.similar.results && tvSeries.similar.results.length) { - let similarTVHTML = tvSeries.similar.results.slice(0, 5).map(similarTv => { - return `${similarTv.name}`; - }).join(', '); - detailsHTML += `

Similar TV Series: ${similarTVHTML}

`; - } - else { - detailsHTML += `

Similar TV Series: Information not available

`; - } - - if (tvSeries.last_episode_to_air) { - detailsHTML += `

Last Episode: ${tvSeries.last_episode_to_air.name || 'Title not available'} - "${tvSeries.last_episode_to_air.overview || 'Overview not available.'}"

`; - } - - const tvSeriesTitleEncoded = encodeURIComponent(title); - const streamingProviders = await fetchTvSeriesStreamingLinks(tvSeries.id); - const streamingHTML = streamingProviders.length > 0 ? streamingProviders.map(provider => { - let providerLink = `https://www.google.com/search?q=watch+${tvSeriesTitleEncoded}+on+${encodeURIComponent(provider.provider_name)}`; - switch(provider.provider_name.toLowerCase()) { - case 'netflix': - providerLink = `https://www.netflix.com/search?q=${tvSeriesTitleEncoded}`; - break; - case 'disney plus': - providerLink = `https://www.disneyplus.com/search?q=${tvSeriesTitleEncoded}`; - break; - case 'hbo max': - providerLink = `https://www.hbomax.com/search?q=${tvSeriesTitleEncoded}`; - break; - case 'hulu': - providerLink = `https://www.hulu.com/search?q=${tvSeriesTitleEncoded}`; - break; - case 'amazon prime video': - providerLink = `https://www.amazon.com/s?k=${tvSeriesTitleEncoded}`; - break; - case 'apple tv plus': - providerLink = `https://tv.apple.com/search?term=${tvSeriesTitleEncoded}`; - break; - case 'stan': - providerLink = `https://www.stan.com.au/search?q=${tvSeriesTitleEncoded}`; - break; - case 'player': - providerLink = `https://player.pl/szukaj?search=${tvSeriesTitleEncoded}`; - break; - } - - return ` - ${provider.provider_name} - `; - }).join('') + ` - JustWatch - ` : 'No streaming options available.'; - - detailsHTML += `

Streaming Options: ${streamingHTML}

`; - - if (tvSeries.keywords && tvSeries.keywords.results && tvSeries.keywords.results.length) { - let keywordsHTML = tvSeries.keywords.results.map(keyword => keyword.name).join(', '); - detailsHTML += `

Keywords: ${keywordsHTML}

`; - } - else { - detailsHTML += `

Keywords: Information not available

`; - } - - const mediaUrl = `https://${getMovieVerseData()}/3/tv/${tvSeries.id}/images?${generateMovieNames()}${getMovieCode()}`; - const mediaResponse = await fetch(mediaUrl); - const mediaData = await mediaResponse.json(); - const images = mediaData.backdrops; - - const detailsContainer = document.getElementById('movie-description'); - - let mediaContainer = document.getElementById('media-container'); - if (!mediaContainer) { - mediaContainer = document.createElement('div'); - mediaContainer.id = 'media-container'; - mediaContainer.style = ` - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - position: relative; - width: 450px; - margin: 20px auto; - overflow: hidden; - max-width: 100%; - box-sizing: border-box; - `; - detailsContainer.appendChild(mediaContainer); - } - - let mediaTitle = document.getElementById('media-title'); - if (!mediaTitle) { - mediaTitle = document.createElement('p'); - mediaTitle.id = 'media-title'; - mediaTitle.textContent = 'Media:'; - mediaTitle.style = ` - font-weight: bold; - align-self: start; - margin-bottom: 5px; - `; - } - - let imageElement = document.getElementById('series-media-image'); - if (!imageElement) { - imageElement = document.createElement('img'); - imageElement.id = 'series-media-image'; - imageElement.style = ` - max-width: 100%; - max-height: 210px; - transition: opacity 0.5s ease-in-out; - opacity: 1; - border-radius: 16px; - cursor: pointer; - `; - imageElement.loading = 'lazy'; - mediaContainer.appendChild(imageElement); - } - - if (images.length > 0) { - imageElement.src = `https://image.tmdb.org/t/p/w780${images[0].file_path}`; - } - - imageElement.addEventListener('click', function() { - let imageUrl = this.src.replace('w780', 'w1280'); - const modalHtml = ` -
- Media Image - × -
- `; - document.body.insertAdjacentHTML('beforeend', modalHtml); - const modal = document.getElementById('image-modal'); - const closeModalBtn = document.getElementById('removeBtn'); - - closeModalBtn.onclick = function() { - modal.remove(); - }; - - modal.addEventListener('click', function(event) { - if (event.target === this) { - this.remove(); - } - }); - }); - - let prevButton = document.getElementById('prev-media-button'); - let nextButton = document.getElementById('next-media-button'); - if (!prevButton || !nextButton) { - prevButton = document.createElement('button'); - nextButton = document.createElement('button'); - prevButton.id = 'prev-media-button'; - nextButton.id = 'next-media-button'; - prevButton.innerHTML = ''; - nextButton.innerHTML = ''; - - [prevButton, nextButton].forEach(button => { - button.style = ` - position: absolute; - top: 50%; - transform: translateY(-50%); - background-color: #7378c5; - color: white; - border-radius: 8px; - height: 30px; - width: 30px; - border: none; - cursor: pointer; - `; - button.onmouseover = () => button.style.backgroundColor = '#ff8623'; - button.onmouseout = () => button.style.backgroundColor = '#7378c5'; - }); - - prevButton.style.left = '0'; - nextButton.style.right = '0'; - - mediaContainer.appendChild(prevButton); - mediaContainer.appendChild(nextButton); - } - - let currentIndex = 0; - prevButton.onclick = () => navigateMedia(images, imageElement, -1); - nextButton.onclick = () => navigateMedia(images, imageElement, 1); - - function navigateMedia(images, imgElement, direction) { - currentIndex += direction; - if (currentIndex < 0) { - currentIndex = images.length - 1; - } else if (currentIndex >= images.length) { - currentIndex = 0; - } - imgElement.style.opacity = '0'; - setTimeout(() => { - imgElement.src = `https://image.tmdb.org/t/p/w780${images[currentIndex].file_path}`; - imgElement.style.opacity = '1'; - }, 420); - } - - if (window.innerWidth <= 767) { - mediaContainer.style.width = 'calc(100% - 40px)'; - } - - if (images.length === 0) { - mediaContainer.innerHTML = '

No media available

'; - } - - document.getElementById('movie-description').innerHTML = detailsHTML; - document.getElementById('movie-description').appendChild(mediaTitle); - document.getElementById('movie-description').appendChild(mediaContainer); -} - -async function fetchTvSeriesStreamingLinks(tvSeriesId) { - const url = `https://${getMovieVerseData()}/3/tv/${tvSeriesId}/watch/providers?${generateMovieNames()}${getMovieCode()}`; - try { - const response = await fetch(url); - const data = await response.json(); - const results = data.results || {}; - let providersMap = {}; - - Object.values(results).forEach(region => { - if (region.flatrate) { - region.flatrate.forEach(provider => { - providersMap[provider.provider_id] = provider; - }); - } - }); - - return Object.values(providersMap).slice(0, 7); - } - catch (error) { - console.error('Error fetching TV series streaming links:', error); - return []; - } -} - -function updateUniqueDirectorsViewed(directorId) { - let viewedDirectors = JSON.parse(localStorage.getItem('uniqueDirectorsViewed')) || []; - if (!viewedDirectors.includes(directorId)) { - viewedDirectors.push(directorId); - localStorage.setItem('uniqueDirectorsViewed', JSON.stringify(viewedDirectors)); - } -} - -function updateActorVisitCount(actorId, actorName) { - let actorVisits = JSON.parse(localStorage.getItem('actorVisits')) || {}; - if (!actorVisits[actorId]) { - actorVisits[actorId] = { count: 0, name: actorName }; - } - - actorVisits[actorId].count += 1; - localStorage.setItem('actorVisits', JSON.stringify(actorVisits)); -} - -function updateDirectorVisitCount(directorId, directorName) { - let directorVisits = JSON.parse(localStorage.getItem('directorVisits')) || {}; - if (!directorVisits[directorId]) { - directorVisits[directorId] = { count: 0, name: directorName }; - } - - directorVisits[directorId].count += 1; - localStorage.setItem('directorVisits', JSON.stringify(directorVisits)); -} - -function selectActorId(actorId, actorName) { - const actorVisits = JSON.parse(localStorage.getItem('actorVisits')) || {}; - const uniqueActorsViewed = JSON.parse(localStorage.getItem('uniqueActorsViewed')) || []; - - if (!uniqueActorsViewed.includes(actorId)) { - uniqueActorsViewed.push(actorId); - localStorage.setItem('uniqueActorsViewed', JSON.stringify(uniqueActorsViewed)); - } - - if (actorVisits[actorId]) { - actorVisits[actorId].count++; - } - else { - actorVisits[actorId] = { count: 1, name: actorName }; - } - - localStorage.setItem('actorVisits', JSON.stringify(actorVisits)); - - localStorage.setItem('selectedActorId', actorId); - window.location.href = 'actor-details.html'; -} - -function selectTvSeriesId(tvSeriesId) { - localStorage.setItem('selectedTvSeriesId', tvSeriesId); - window.location.href = 'tv-details.html'; -} - -function selectCompanyId(companyId) { - localStorage.setItem('selectedCompanyId', companyId); - window.location.href = 'company-details.html'; -} - -function showSpinner() { - document.getElementById('myModal').classList.add('modal-visible'); -} - -function hideSpinner() { - document.getElementById('myModal').classList.remove('modal-visible'); -} - -function handleCreatorClick(creatorId, creatorName) { - localStorage.setItem('selectedDirectorId', creatorId); - document.title = `${creatorName} - Director's Details`; - updateUniqueDirectorsViewed(creatorId); - updateDirectorVisitCount(creatorId, creatorName); - window.location.href = 'director-details.html'; -} - -document.addEventListener('DOMContentLoaded', () => { - const tvSeriesId = localStorage.getItem('selectedTvSeriesId'); - if (tvSeriesId) { - fetchTvDetails(tvSeriesId); - } - else { - fetchTvDetails(100088); - } - - document.getElementById('clear-search-btn').style.display = 'none'; - - const savedRatings = JSON.parse(localStorage.getItem('tvSeriesRatings')) || {}; - const movieRating = savedRatings[tvSeriesId] || 0; - setStarRating(movieRating); -}); - -document.addEventListener('DOMContentLoaded', () => { - document.getElementById('trailerButton').addEventListener('click', () => { - const trailerContainer = document.getElementById('trailerContainer'); - const isOpen = trailerContainer.style.maxHeight !== '0px'; - - if (isOpen) { - trailerContainer.style.maxHeight = '0'; - } - else { - const trailerIframe = ``; - trailerContainer.innerHTML = trailerIframe; - trailerContainer.style.maxWidth = '400px'; - trailerContainer.style.maxHeight = '315px'; - trailerContainer.style.borderRadius = '8px'; - } - }); -}); - -async function showMovieOfTheDay() { - const year = new Date().getFullYear(); - const url = `https://${getMovieVerseData()}/3/discover/movie?${generateMovieNames()}${getMovieCode()}&sort_by=vote_average.desc&vote_count.gte=100&primary_release_year=${year}&vote_average.gte=7`; - - try { - const response = await fetch(url); - const data = await response.json(); - const movies = data.results; - - if (movies.length > 0) { - const randomMovie = movies[Math.floor(Math.random() * movies.length)]; - localStorage.setItem('selectedMovieId', randomMovie.id); - window.location.href = 'movie-details.html'; - } - else { - fallbackMovieSelection(); - } - } - catch (error) { - console.log('Error fetching movie:', error); - fallbackMovieSelection(); - } -} - -function fallbackMovieSelection() { - const fallbackMovies = [432413, 299534, 1726, 562, 118340, 455207, 493922, 447332, 22970, 530385, 27205, 264660, 120467, 603, 577922, 76341, 539, 419704, 515001, 118340, 424, 98]; - const randomFallbackMovie = fallbackMovies[Math.floor(Math.random() * fallbackMovies.length)]; - localStorage.setItem('selectedMovieId', randomFallbackMovie); - window.location.href = 'movie-details.html'; -} - -function applySettings() { - const savedBg = localStorage.getItem('backgroundImage'); - const savedTextColor = localStorage.getItem('textColor'); - const savedFontSize = localStorage.getItem('fontSize'); - - if (savedBg) { - document.body.style.backgroundImage = `url('${savedBg}')`; - } - if (savedTextColor) { - applyTextColor(savedTextColor); - } - if (savedFontSize) { - const size = savedFontSize === 'small' ? '12px' : savedFontSize === 'medium' ? '16px' : '20px'; - document.body.style.fontSize = size; - } -} - -function getMovieCode2() { - const encodedKey = "MmJhOGU1MzY="; - return atob(encodedKey); -} - -function getMovieName() { - const moviename = "YXBpa2V5PQ=="; - return atob(moviename); -} - -function getMovieActor() { - const actor = "d3d3Lm9tZGJhcGkuY29t"; - return atob(actor); -} - -function applyTextColor(color) { - document.querySelectorAll('h1, h2, h3, p, a, span, div, button, input, select, textarea, label, li') - .forEach(element => { - element.style.color = color; - }); -} - -function updateBrowserURL(title) { - const nameSlug = createNameSlug(title); - const newURL = window.location.protocol + "//" + window.location.host + window.location.pathname + '?' + nameSlug; - window.history.replaceState({ path: newURL }, '', newURL); -} - -function createNameSlug(title) { - return title.toLowerCase().replace(/ /g, '-').replace(/[^\w-]/g, ''); -} \ No newline at end of file diff --git a/MovieVerse-Mobile/app/js/user-profile.js b/MovieVerse-Mobile/app/js/user-profile.js deleted file mode 100644 index f5f730f1..00000000 --- a/MovieVerse-Mobile/app/js/user-profile.js +++ /dev/null @@ -1,699 +0,0 @@ -import { initializeApp } from "https://www.gstatic.com/firebasejs/10.8.0/firebase-app.js"; -import { getFirestore, doc, getDoc, setDoc, query, collection, where, getDocs, serverTimestamp, deleteDoc } from "https://www.gstatic.com/firebasejs/10.8.0/firebase-firestore.js"; -import { getAverageMovieRating } from './ratings-module.js'; -import { getTriviaStats } from './triviaModule.js'; - -function showSpinner() { - document.getElementById('myModal').classList.add('modal-visible'); -} - -function hideSpinner() { - document.getElementById('myModal').classList.remove('modal-visible'); -} - -function translateFBC(value) { - return atob(value); -} - -function getFBConfig1() { - const fbConfig1 = "QUl6YVN5REw2a1FuU2ZVZDhVdDhIRnJwS3VpdnF6MXhkWG03aw=="; - return translateFBC(fbConfig1); -} - -function getFBConfig2() { - const fbConfig2 = "bW92aWV2ZXJzZS1hcHAuZmlyZWJhc2VhcHAuY29t"; - return translateFBC(fbConfig2); -} - -function getFBConfig3() { - const fbConfig3 = "bW92aWV2ZXJzZS1hcHAuYXBwc3BvdC5jb20="; - return translateFBC(fbConfig3); -} - -function getFBConfig4() { - const fbConfig4 = "ODAyOTQzNzE4ODcx"; - return translateFBC(fbConfig4); -} - -function getFBConfig5() { - const fbConfig5 = "MTo4MDI5NDM3MTg4NzE6d2ViOjQ4YmM5MTZjYzk5ZTI3MjQyMTI3OTI="; - return translateFBC(fbConfig5); -} - -const firebaseConfig = { - apiKey: getFBConfig1(), - authDomain: getFBConfig2(), - projectId: "movieverse-app", - storageBucket: getFBConfig3(), - messagingSenderId: getFBConfig4(), - appId: getFBConfig5() -}; - -const app = initializeApp(firebaseConfig); -const db = getFirestore(app); - -document.addEventListener('DOMContentLoaded', function() { - handleProfileDisplay(); - setupEventListeners(); - setupSearchListeners(); -}); - -function updateProgressCircles(movieRating, triviaScore) { - const movieRatingPercent = movieRating; - const triviaScorePercent = triviaScore; - - setProgress(document.getElementById('avgMovieRatingCircle'), document.getElementById('avgMovieRatingText'), movieRatingPercent); - setProgress(document.getElementById('avgTriviaScoreCircle'), document.getElementById('avgTriviaScoreText'), triviaScorePercent); -} - -function setProgress(circle, text, percent) { - const radius = circle.r.baseVal.value; - const circumference = radius * 2 * Math.PI; - - circle.style.transition = 'none'; - circle.style.strokeDasharray = `${circumference} ${circumference}`; - circle.style.strokeDashoffset = circumference; - circle.getBoundingClientRect(); - - setTimeout(() => { - const offset = circumference - (percent / 100) * circumference; - circle.style.transition = 'stroke-dashoffset 0.6s ease-out, stroke 0.6s ease'; - circle.style.strokeDashoffset = offset; - circle.style.setProperty('--progress-color', percent > 50 ? '#4CAF50' : '#2196F3'); - text.textContent = `${Math.round(percent)}%`; - text.style.opacity = 1; - }, 10); -} - -function handleProfileDisplay() { - const isSignedIn = JSON.parse(localStorage.getItem('isSignedIn')) || false; - const userEmail = localStorage.getItem('currentlySignedInMovieVerseUser'); - const welcomeMessage = document.getElementById('welcomeMessage'); - const signInPrompt = document.getElementById('signInPrompt'); - const viewMyProfileBtn = document.getElementById('viewMyProfileBtn'); - const profileContainer = document.getElementById('profileContainer'); - profileContainer.style.display = 'none'; - - showSpinner(); - - if (isSignedIn && userEmail) { - loadProfile(userEmail); - viewMyProfileBtn.disabled = false; - viewMyProfileBtn.style.display = 'block'; - } - else { - welcomeMessage.textContent = 'Please sign in to view your profile'; - signInPrompt.style.display = 'block'; - viewMyProfileBtn.disabled = true; - viewMyProfileBtn.style.display = 'none'; - } - - document.getElementById('viewMyProfileBtn').addEventListener('click', () => { - loadCurrentUserProfile(); - }); - - function loadCurrentUserProfile() { - const currentUserEmail = localStorage.getItem('currentlySignedInMovieVerseUser'); - if (currentUserEmail) { - loadProfile(currentUserEmail); - } - else { - console.error("No user is currently signed in"); - } - } - - hideSpinner(); -} - -function setupSearchListeners() { - try { - const searchUserInput = document.getElementById('searchUserInput'); - const searchUserResults = document.getElementById('searchUserResults'); - - searchUserInput.addEventListener('input', () => { - const searchText = searchUserInput.value.trim(); - - if (searchText) { - performSearch(searchText); - } - else { - searchUserResults.innerHTML = ''; - searchUserResults.style.display = 'none'; - } - }); - } - catch (error) { - console.error("Error fetching user list: ", error); - if (error.code === 'resource-exhausted') { - const noUserSelected = document.getElementById('profileContainer'); - if (noUserSelected) { - noUserSelected.innerHTML = "Sorry, our database is currently overloaded. Please try reloading once more, and if that still doesn't work, please try again in a couple hours. For full transparency, we are currently using a database that has a limited number of reads and writes per day due to lack of funding. Thank you for your patience as we work on scaling our services. At the mean time, feel free to use other MovieVerse features!"; - noUserSelected.style.height = '350px'; - } - } - } -} - -async function performSearch(searchText) { - const searchUserResults = document.getElementById('searchUserResults'); - const db = getFirestore(); - showSpinner(); - - try { - const userQuery = query(collection(db, 'profiles'), where('username', '>=', searchText), where('username', '<=', searchText + '\uf8ff')); - const querySnapshot = await getDocs(userQuery); - - searchUserResults.innerHTML = ''; - if (querySnapshot.empty) { - searchUserResults.innerHTML = `
No User with Username "${searchText}" found
`; - searchUserResults.style.display = 'block'; - } - else { - searchUserResults.style.display = 'block'; - querySnapshot.forEach((doc) => { - const user = doc.data(); - const userDiv = document.createElement('div'); - userDiv.className = 'user-search-result'; - userDiv.style.cursor = 'pointer'; - userDiv.addEventListener('click', () => loadProfile(doc.id)); - - const img = document.createElement('img'); - img.src = user.profileImage || '../../images/user-default.png'; - img.style.width = '33%'; - img.style.borderRadius = '8px'; - userDiv.appendChild(img); - - const textDiv = document.createElement('div'); - textDiv.style.width = '67%'; - textDiv.style.textAlign = 'left'; - textDiv.innerHTML = `${user.username}

Bio: ${user.bio || 'Not Set'}

`; - userDiv.appendChild(textDiv); - - searchUserResults.appendChild(userDiv); - }); - } - hideSpinner(); - } - catch (error) { - console.error("Error during search: ", error); - searchUserResults.innerHTML = `
Error in searching: ${error.message}
`; - searchUserResults.style.display = 'block'; - hideSpinner(); - } -} - -document.getElementById('container1').addEventListener('click', async () => { - const userEmail = localStorage.getItem('currentlyViewingProfile'); - - if (!userEmail) { - console.error('No user email found'); - return; - } - - try { - const rating = await getAverageMovieRating(userEmail); - const convertRatingToPercent = (rating / 5) * 100; - const averageRating = convertRatingToPercent.toFixed(1); - - const triviaStats = await getTriviaStats(userEmail); - - let averageTriviaScore = 0; - if (triviaStats.totalAttempted > 0) { - averageTriviaScore = (triviaStats.totalCorrect / triviaStats.totalAttempted) * 100; - } - - updateProgressCircles(averageRating, averageTriviaScore, 'container1'); - } - catch (error) { - console.error('Error updating progress circles:', error); - } -}); - -document.getElementById('container2').addEventListener('click', async () => { - const userEmail = localStorage.getItem('currentlyViewingProfile'); - - if (!userEmail) { - console.error('No user email found'); - return; - } - - try { - const rating = await getAverageMovieRating(userEmail); - const convertRatingToPercent = (rating / 5) * 100; - const averageRating = convertRatingToPercent.toFixed(1); - - const triviaStats = await getTriviaStats(userEmail); - - let averageTriviaScore = 0; - if (triviaStats.totalAttempted > 0) { - averageTriviaScore = (triviaStats.totalCorrect / triviaStats.totalAttempted) * 100; - } - - updateProgressCircles(averageRating, averageTriviaScore, 'container2'); - } - catch (error) { - console.error('Error updating progress circles:', error); - } -}); - -async function loadProfile(userEmail = localStorage.getItem('currentlySignedInMovieVerseUser')) { - try { - showSpinner(); - - document.getElementById('viewMyProfileBtn').disabled = false; - - if (!userEmail) return; - - const welcomeMessage = document.getElementById('welcomeMessage'); - const profileContainer = document.getElementById('profileContainer'); - const changeProfileImageBtn = document.getElementById('changeProfileImageBtn'); - const editProfileBtn = document.getElementById('editProfileBtn'); - const removeProfileImageBtn = document.getElementById('removeProfileImage'); - const profileImage = document.getElementById('profileImage'); - - if (userEmail !== localStorage.getItem('currentlySignedInMovieVerseUser') || !localStorage.getItem('currentlySignedInMovieVerseUser') || !JSON.parse(localStorage.getItem('isSignedIn'))) { - changeProfileImageBtn.style.display = 'none'; - editProfileBtn.style.display = 'none'; - profileImage.removeAttribute('onclick'); - profileImage.style.cursor = 'default'; - profileImage.title = 'Sign in to change profile image'; - } - else { - changeProfileImageBtn.style.display = ''; - editProfileBtn.style.display = ''; - profileImage.setAttribute('onclick', 'document.getElementById("imageUpload").click()'); - profileImage.style.cursor = 'pointer'; - profileImage.title = 'Click to change profile image'; - } - - profileContainer.style.display = 'block'; - - const docRef = doc(db, 'profiles', userEmail); - const isSignedIn = JSON.parse(localStorage.getItem('isSignedIn')) || false; - const currentUserEmail = localStorage.getItem('currentlySignedInMovieVerseUser'); - - let followUnfollowBtn = document.getElementById('followUnfollowBtn'); - if (!followUnfollowBtn) { - followUnfollowBtn = document.createElement('button'); - followUnfollowBtn.id = 'followUnfollowBtn'; - followUnfollowBtn.style.width = '100%'; - profileContainer.appendChild(followUnfollowBtn); - } - - if (currentUserEmail && userEmail !== currentUserEmail && isSignedIn) { - const followingRef = doc(db, 'profiles', currentUserEmail, 'following', userEmail); - const followersRef = doc(db, 'profiles', userEmail, 'followers', currentUserEmail); - - const followSnap = await getDoc(followingRef); - let isFollowing = followSnap.exists(); - - followUnfollowBtn.textContent = isFollowing ? 'Unfollow' : 'Follow'; - followUnfollowBtn.style.display = 'block'; - - followUnfollowBtn.onclick = async () => { - if (isFollowing) { - await deleteDoc(followingRef); - await deleteDoc(followersRef); - followUnfollowBtn.textContent = 'Follow'; - isFollowing = false; - await displayUserList('followers', userEmail); - } - else { - const timestamp = serverTimestamp(); - await setDoc(followingRef, {timestamp: timestamp}); - await setDoc(followersRef, {timestamp: timestamp}); - followUnfollowBtn.textContent = 'Unfollow'; - isFollowing = true; - await displayUserList('followers', userEmail); - } - }; - } - else { - followUnfollowBtn.style.display = 'none'; - } - - const rating = await getAverageMovieRating(userEmail); - const convertRatingToPercent = (rating / 5) * 100; - const averageRating = convertRatingToPercent.toFixed(1); - - const triviaStats = await getTriviaStats(userEmail); - - let averageTriviaScore = 0; - if (triviaStats.totalAttempted > 0) { - averageTriviaScore = (triviaStats.totalCorrect / triviaStats.totalAttempted) * 100; - } - - localStorage.setItem('currentlyViewingProfile', userEmail); - - updateProgressCircles(averageRating, averageTriviaScore); - - try { - const docSnap = await getDoc(docRef); - let profile = { - username: 'N/A', - dob: 'N/A', - bio: 'N/A', - favoriteGenres: 'N/A', - location: 'N/A', - favoriteMovie: 'N/A', - hobbies: 'N/A', - favoriteActor: 'N/A', - favoriteDirector: 'N/A', - personalQuote: 'N/A', - profileImage: '../../images/user-default.png' - }; - - if (docSnap.exists()) { - profile = {...profile, ...docSnap.data()}; - const imageUrl = profile.profileImage || '../../images/user-default.png'; - document.getElementById('profileImage').src = imageUrl; - - if (userEmail !== localStorage.getItem('currentlySignedInMovieVerseUser') || !localStorage.getItem('currentlySignedInMovieVerseUser') || !JSON.parse(localStorage.getItem('isSignedIn')) || profile.profileImage === '../../images/user-default.png') { - removeProfileImageBtn.style.display = 'none'; - } else { - removeProfileImageBtn.style.display = 'inline'; - } - - document.getElementById('usernameDisplay').innerHTML = `Username: ${profile.username}`; - document.getElementById('dobDisplay').innerHTML = `Date of Birth: ${profile.dob}`; - document.getElementById('bioDisplay').innerHTML = `Bio: ${profile.bio}`; - document.getElementById('favoriteGenresDisplay').innerHTML = `Favorite Genres: ${profile.favoriteGenres}`; - document.getElementById('locationDisplay').innerHTML = `Location: ${profile.location}`; - document.getElementById('favoriteMovieDisplay').innerHTML = `Favorite Movie: ${profile.favoriteMovie}`; - document.getElementById('hobbiesDisplay').innerHTML = `Hobbies: ${profile.hobbies}`; - document.getElementById('favoriteActorDisplay').innerHTML = `Favorite Actor: ${profile.favoriteActor}`; - document.getElementById('favoriteDirectorDisplay').innerHTML = `Favorite Director: ${profile.favoriteDirector}`; - document.getElementById('personalQuoteDisplay').innerHTML = `Personal Quote: ${profile.personalQuote}`; - window.document.title = `${profile.username !== 'N/A' ? profile.username : 'User'}'s Profile - The MovieVerse`; - - if (userEmail === localStorage.getItem('currentlySignedInMovieVerseUser')) { - welcomeMessage.textContent = `Welcome, ${profile.username}!`; - } else { - welcomeMessage.textContent = `Viewing ${profile.username}'s profile`; - } - - await displayUserList('following', userEmail); - await displayUserList('followers', userEmail); - } - else { - const imageUrl = profile.profileImage || '../../images/user-default.png'; - document.getElementById('profileImage').src = imageUrl; - - if (userEmail !== localStorage.getItem('currentlySignedInMovieVerseUser') || !localStorage.getItem('currentlySignedInMovieVerseUser') || !JSON.parse(localStorage.getItem('isSignedIn')) || profile.profileImage === '../../images/user-default.png') { - removeProfileImageBtn.style.display = 'none'; - } - else { - removeProfileImageBtn.style.display = 'inline'; - } - - document.getElementById('usernameDisplay').innerHTML = `Username: N/A`; - document.getElementById('dobDisplay').innerHTML = `Date of Birth: N/A`; - document.getElementById('bioDisplay').innerHTML = `Bio: N/A`; - document.getElementById('favoriteGenresDisplay').innerHTML = `Favorite Genres: N/A`; - document.getElementById('locationDisplay').innerHTML = `Location: N/A`; - document.getElementById('favoriteMovieDisplay').innerHTML = `Favorite Movie: N/A`; - document.getElementById('hobbiesDisplay').innerHTML = `Hobbies: N/A`; - document.getElementById('favoriteActorDisplay').innerHTML = `Favorite Actor: N/A`; - document.getElementById('favoriteDirectorDisplay').innerHTML = `Favorite Director: N/A`; - document.getElementById('personalQuoteDisplay').innerHTML = `Personal Quote: N/A`; - window.document.title = `${profile.username !== 'N/A' ? profile.username : 'User'}'s Profile - The MovieVerse`; - - if (userEmail === localStorage.getItem('currentlySignedInMovieVerseUser')) { - welcomeMessage.textContent = `Welcome, ${profile.username}!`; - } - else { - welcomeMessage.textContent = `Viewing ${profile.username}'s profile`; - } - - await displayUserList('following', userEmail); - await displayUserList('followers', userEmail); - } - } - catch (error) { - if (error.code === 'resource-exhausted') { - const noUserSelected = document.getElementById('profileContainer'); - if (noUserSelected) { - noUserSelected.innerHTML = "Sorry, our database is currently overloaded. Please try reloading once more, and if that still doesn't work, please try again in a couple hours. For full transparency, we are currently using a database that has a limited number of reads and writes per day due to lack of funding. Thank you for your patience as we work on scaling our services. At the mean time, feel free to use other MovieVerse features!"; - noUserSelected.style.height = '350px'; - } - hideSpinner(); - } - - document.getElementById('viewMyProfileBtn').disabled = true; - } - - hideSpinner(); - } - catch (error) { - console.error("Error fetching user list: ", error); - if (error.code === 'resource-exhausted') { - const noUserSelected = document.getElementById('profileContainer'); - if (noUserSelected) { - noUserSelected.innerHTML = "Sorry, our database is currently overloaded. Please try reloading once more, and if that still doesn't work, please try again in a couple hours. For full transparency, we are currently using a database that has a limited number of reads and writes per day due to lack of funding. Thank you for your patience as we work on scaling our services. At the mean time, feel free to use other MovieVerse features!"; - noUserSelected.style.height = '350px'; - } - hideSpinner(); - } - - document.getElementById('viewMyProfileBtn').disabled = true; - } -} - -async function displayUserList(listType, userEmail) { - showSpinner(); - - const db = getFirestore(); - const listRef = collection(db, 'profiles', userEmail, listType); - const snapshot = await getDocs(listRef); - const userListSpan = document.getElementById(`${listType}List`); - - userListSpan.innerHTML = ''; - - if (snapshot.empty) { - userListSpan.textContent = 'N/A'; - } - else { - for (let docSnapshot of snapshot.docs) { - const userRef = doc(db, 'profiles', docSnapshot.id); - const userSnap = await getDoc(userRef); - if (userSnap.exists()) { - const userData = userSnap.data(); - - const userLink = document.createElement('a'); - userLink.textContent = userData.username; - userLink.href = '#'; - userLink.id = "userLink" - userLink.style.cursor = 'pointer'; - userLink.onclick = () => loadProfile(docSnapshot.id); - - userListSpan.appendChild(userLink); - userListSpan.appendChild(document.createTextNode(', ')); - } - } - - if (userListSpan.lastChild) { - userListSpan.removeChild(userListSpan.lastChild); - } - } - - hideSpinner(); -} - -async function saveProfileChanges() { - const userEmail = localStorage.getItem('currentlySignedInMovieVerseUser'); - if (!userEmail) return; - - const profileRef = doc(db, 'profiles', userEmail); - const currentDoc = await getDoc(profileRef); - const currentProfile = currentDoc.exists() ? currentDoc.data() : null; - - const newUsername = document.getElementById('editUsername').value.trim(); - - if (currentProfile && currentProfile.username && currentProfile.username !== 'N/A' && !newUsername) { - alert("You cannot delete your username. Please enter a valid username."); - document.getElementById('editUsername').value = currentProfile.username; - return; - } - - const profile = { - username: newUsername || currentProfile.username, - dob: document.getElementById('editDob').value, - bio: document.getElementById('editBio').value, - favoriteGenres: document.getElementById('editFavoriteGenres').value.split(',').map(genre => genre.trim()), - location: document.getElementById('editLocation').value, - favoriteMovie: document.getElementById('editFavoriteMovie').value, - hobbies: document.getElementById('editHobbies').value.split(',').map(hobby => hobby.trim()), - favoriteActor: document.getElementById('editFavoriteActor').value, - favoriteDirector: document.getElementById('editFavoriteDirector').value, - personalQuote: document.getElementById('editPersonalQuote').value, - }; - - try { - await setDoc(profileRef, profile, { merge: true }); - console.log("Profile updated successfully."); - closeModal(); - loadProfile(); - } - catch (error) { - console.log("Error updating profile: ", error); - } -} - -async function removeProfileImage() { - const userEmail = localStorage.getItem('currentlySignedInMovieVerseUser'); - if (!userEmail) return; - - const defaultImageUrl = '../../images/user-default.png'; - - try { - await setDoc(doc(db, 'profiles', userEmail), { profileImage: defaultImageUrl }, { merge: true }); - - document.getElementById('profileImage').src = defaultImageUrl; - document.getElementById('removeProfileImage').style.display = 'none'; - - console.log('Profile image reset to default successfully'); - } - catch (error) { - console.log("Error removing image: ", error); - } -} - -async function uploadImage() { - const userEmail = localStorage.getItem('currentlySignedInMovieVerseUser'); - if (!userEmail) { - alert("You're not signed in."); - return; - } - - const fileInput = document.getElementById('imageUpload'); - const file = fileInput.files[0]; - if (!file) { - alert('No file selected. Please choose an image.'); - return; - } - - try { - const base64Image = await resizeImageAndConvertToBase64(file, 1024, 1024); - - await setDoc(doc(db, 'profiles', userEmail), { profileImage: base64Image }, { merge: true }); - - document.getElementById('profileImage').src = base64Image; - console.log('Image processed and Firestore updated'); - window.location.reload(); - } - catch (error) { - console.log("Error during image processing:", error); - alert('Error during image processing: ' + error.message); - } -} - -function resizeImageAndConvertToBase64(file, maxWidth, maxHeight) { - return new Promise((resolve, reject) => { - const reader = new FileReader(); - reader.onload = (e) => { - const img = new Image(); - img.onload = () => { - const canvas = document.createElement('canvas'); - let width = img.width; - let height = img.height; - - if (width > height) { - if (width > maxWidth) { - height *= maxWidth / width; - width = maxWidth; - } - } - else { - if (height > maxHeight) { - width *= maxHeight / height; - height = maxHeight; - } - } - - canvas.width = width; - canvas.height = height; - const ctx = canvas.getContext('2d'); - ctx.drawImage(img, 0, 0, width, height); - const dataUrl = canvas.toDataURL('image/jpeg', 0.7); - resolve(dataUrl); - }; - img.src = e.target.result; - }; - reader.onerror = error => reject(error); - reader.readAsDataURL(file); - }); -} - -function setupEventListeners() { - document.getElementById('saveChanges').addEventListener('click', async () => { - await saveProfileChanges(); - }); - - document.getElementById('cancelEdit').addEventListener('click', () => { - closeModal(); - }); - - const imageUploadInput = document.getElementById('imageUpload'); - imageUploadInput.addEventListener('change', uploadImage); - - document.getElementById('editProfileBtn').addEventListener('click', async () => { - const userEmail = localStorage.getItem('currentlySignedInMovieVerseUser'); - if (!userEmail) { - alert("You're not signed in."); - return; - } - - try { - const docRef = doc(db, 'profiles', userEmail); - const docSnap = await getDoc(docRef); - - let profile = { - username: 'N/A', - dob: '', - bio: 'N/A', - favoriteGenres: [], - location: 'N/A', - favoriteMovie: 'N/A', - hobbies: ['N/A'], - favoriteActor: 'N/A', - favoriteDirector: 'N/A', - personalQuote: 'N/A', - profileImage: '../../images/user-default.png' - }; - - if (docSnap.exists()) { - profile = docSnap.data(); - profile.hobbies = profile.hobbies.length > 0 ? profile.hobbies : ['N/A']; - } - - document.getElementById('editUsername').value = profile.username; - document.getElementById('editDob').value = profile.dob; - const defaultDOB = new Date(); - defaultDOB.setFullYear(defaultDOB.getFullYear() - 18); - const defaultDOBString = defaultDOB.toISOString().split('T')[0]; - - document.getElementById('editDob').value = profile.dob || defaultDOBString; - document.getElementById('editBio').value = profile.bio; - document.getElementById('editFavoriteGenres').value = profile.favoriteGenres.join(', '); - document.getElementById('editLocation').value = profile.location; - document.getElementById('editFavoriteMovie').value = profile.favoriteMovie; - document.getElementById('editHobbies').value = profile.hobbies.join(', '); - document.getElementById('editFavoriteActor').value = profile.favoriteActor; - document.getElementById('editFavoriteDirector').value = profile.favoriteDirector; - document.getElementById('editPersonalQuote').value = profile.personalQuote; - document.getElementById('profileImage').src = profile.profileImage || '../../images/user-default.png'; - document.getElementById('editProfileModal').style.display = 'block'; - } - catch (error) { - console.log("Error accessing Firestore: ", error); - } - }); - - document.getElementById('imageUpload').addEventListener('change', async () => { - await uploadImage(); - }); - - document.getElementById('removeProfileImage').addEventListener('click', async () => { - await removeProfileImage(); - }); -} diff --git a/index.html b/index.html index 32bb6137..5776a44b 100644 --- a/index.html +++ b/index.html @@ -1569,7 +1569,6 @@

Timeless Classics: Trending Classic Movie searchInput.addEventListener('blur', clearSelection); }); - - \ No newline at end of file + diff --git a/sitemap.xml b/sitemap.xml index 8d058818..09ed22ff 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -2,137 +2,137 @@ https://movie-verse.com/ - 2024-05-15 + 2024-05-25 1.00 https://movie-verse.com/MovieVerse-Frontend/html/about.html - 2024-05-15 + 2024-05-25 0.80 https://movie-verse.com/MovieVerse-Frontend/html/favorites.html - 2024-05-15 + 2024-05-25 0.80 https://movie-verse.com/MovieVerse-Frontend/html/movie-match.html - 2024-05-15 + 2024-05-25 0.80 https://movie-verse.com/MovieVerse-Frontend/html/movie-timeline.html - 2024-05-15 + 2024-05-25 0.80 https://movie-verse.com/MovieVerse-Frontend/html/notifications.html - 2024-05-15 + 2024-05-25 0.80 https://movie-verse.com/MovieVerse-Frontend/html/chatbot.html - 2024-05-15 + 2024-05-25 0.80 https://movie-verse.com/MovieVerse-Frontend/html/trivia.html - 2024-05-15 + 2024-05-25 0.80 https://movie-verse.com/MovieVerse-Frontend/html/settings.html - 2024-05-15 + 2024-05-25 0.80 https://movie-verse.com/MovieVerse-Frontend/html/chat.html - 2024-05-15 + 2024-05-25 0.80 https://movie-verse.com/MovieVerse-Frontend/html/movie-details.html - 2024-05-15 + 2024-05-25 0.80 https://movie-verse.com/MovieVerse-Frontend/html/director-details.html - 2024-05-15 + 2024-05-25 0.80 https://movie-verse.com/MovieVerse-Frontend/html/actor-details.html - 2024-05-15 + 2024-05-25 0.80 https://movie-verse.com/MovieVerse-Frontend/html/company-details.html - 2024-05-15 + 2024-05-25 0.80 https://movie-verse.com/MovieVerse-Frontend/html/sign-in.html - 2024-05-15 + 2024-05-25 0.80 https://movie-verse.com/MovieVerse-Frontend/html/create-account.html - 2024-05-15 + 2024-05-25 0.80 https://movie-verse.com/MovieVerse-Frontend/html/reset-password.html - 2024-05-15 + 2024-05-25 0.80 https://movie-verse.com/MovieVerse-Frontend/html/privacy-policy.html - 2024-05-15 + 2024-05-25 0.60 https://movie-verse.com/MovieVerse-Frontend/html/terms-of-service.html - 2024-05-15 + 2024-05-25 0.60 https://movie-verse.com/MovieVerse-Frontend/html/search.html - 2024-05-15 + 2024-05-25 0.80 https://movie-verse.com/MovieVerse-Frontend/html/analytics.html - 2024-05-15 + 2024-05-25 0.80 https://movie-verse.com/MovieVerse-Frontend/html/feedback.html - 2024-05-15 + 2024-05-25 0.60 https://movie-verse.com/MovieVerse-Frontend/html/support.html - 2024-05-15 + 2024-05-25 0.60 https://movie-verse.com/MovieVerse-Frontend/html/inception.html - 2024-05-15 + 2024-05-25 0.80 https://movie-verse.com/MovieVerse-Frontend/html/user-profile.html - 2024-05-15 + 2024-05-25 0.80 https://movie-verse.com/MovieVerse-Frontend/html/leonardo-dicaprio.html - 2024-05-15 + 2024-05-25 0.80 https://movie-verse.com/MovieVerse-Frontend/html/christopher-nolan.html - 2024-05-15 + 2024-05-25 0.80 \ No newline at end of file