Modrinth/static/js/search.js
2020-06-01 17:01:13 -07:00

294 lines
8.3 KiB
JavaScript

let input = document.getElementById("search-input");
let category_inputs = {
"technology": false,
"adventure": false,
"magic": false,
"utility": false,
"decoration": false,
"library": false,
"worldgen": false,
"cursed": false,
"storage": false,
"food": false,
"equipment": false,
"misc": false,
"forge": false,
"fabric": false,
}
let version_inputs = {};
let selectedType = "relevance";
let resultContainer = document.getElementById("results");
window.onload = function () {
//Add category ghosts
let categories = document.getElementsByClassName("category-badge");
for (let category of categories) {
let ghost = document.createElement('div');
ghost.className = "category-ghost";
ghost.id = category.id + "-ghost";
category.appendChild(ghost);
}
//Set Initial Values based on URL
const urlParams = new URLSearchParams(window.location.search);
if(urlParams.has("q"))
document.getElementById("search-input").value = decodeURIComponent(urlParams.get("q"));
if(urlParams.has("f")) {
let value = decodeURIComponent(urlParams.get("f"));
for (let key in category_inputs) {
if (category_inputs.hasOwnProperty(key)) {
if(value.includes(key)) {
activateCategory(document.getElementById(key))
}
}
}
}
if(urlParams.has("s")) {
let value = decodeURIComponent(urlParams.get("s"));
selectedType = value;
document.getElementById("filters").value = value;
}
let urlVersions = "";
if(urlParams.has("v"))
urlVersions = urlParams.get("v");
// Set Version categories from Mojang Launcher Meta
let releases = document.getElementById("releases");
let snapshots = document.getElementById("snapshots");
let archaic = document.getElementById("archaic");
let xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState === 4 && xmlHttp.status === 200) {
let versions = JSON.parse(xmlHttp.responseText);
for (let version of versions.versions) {
let versionElement = document.createElement('p');
versionElement.className = "version";
versionElement.innerHTML = version.id;
versionElement.id = version.id;
versionElement.setAttribute("onclick", "activateVersion(this)");
version_inputs[version.id] = false;
if(version.type === "release")
releases.appendChild(versionElement)
else if (version.type === "snapshot")
snapshots.appendChild(versionElement)
else if (version.type === "old_alpha" || version.type === "old_beta")
archaic.appendChild(versionElement)
else
versionElement.outerHTML = "";
if(urlVersions.includes(version.id))
activateVersion(versionElement);
}
}
}
xmlHttp.open("GET", "https://launchermeta.mojang.com/mc/game/version_manifest.json", true);
xmlHttp.send(null);
}
function clearFilters() {
for (let key in category_inputs) {
if (category_inputs.hasOwnProperty(key)) {
if(category_inputs[key]) {
let element = document.getElementById(key);
element.style.width = "165px";
element.style.boxShadow = "0 0";
document.getElementById(key + "-ghost").className = "category-ghost";
category_inputs[key] = false;
}
}
}
for (let key in version_inputs) {
if (version_inputs.hasOwnProperty(key)) {
if(version_inputs[key]) {
let element = document.getElementById(key);
element.style.width = "152px";
element.style.boxShadow = "0 0";
version_inputs[key] = false;
}
}
}
handleSearch(0);
}
function toggleVisibility(e) {
let element = e.parentElement.lastElementChild;
if (element.style.display === "none") {
element.style.display = "block";
e.innerHTML = e.innerHTML.replace("+", "-")
}
else {
element.style.display = "none"
e.innerHTML = e.innerHTML.replace("-", "+")
}
}
function activateCategory(element) {
category_inputs[element.id] = !category_inputs[element.id]
if (category_inputs[element.id]) {
element.style.width = "155px";
element.style.boxShadow = "10px 0 " + element.style.color;
document.getElementById(element.id + "-ghost").className = "";
} else {
element.style.width = "165px";
element.style.boxShadow = "0 0";
document.getElementById(element.id + "-ghost").className = "category-ghost";
}
handleSearch(0);
}
function activateVersion(element) {
version_inputs[element.id] = !version_inputs[element.id]
if (version_inputs[element.id]) {
element.style.width = "142px";
element.style.boxShadow = "10px 0" + element.style.color;
} else {
element.style.width = "152px";
element.style.boxShadow = "0 0";
}
handleSearch(0);
}
function changeSortType(element) {
selectedType = element.options[element.selectedIndex].value;
handleSearch(0);
}
let body = document.documentElement;
let backToTop = document.getElementById("backToTop");
let currentlyLoadingExtra = false;
let currentOffset = 0;
function loadExtra() {
if (body.scrollTop > 400) {
backToTop.style.display = "block";
} else {
backToTop.style.display = "none";
}
if(!currentlyLoadingExtra) {
let scrollOffset = (body.scrollTop) / (body.scrollHeight - body.clientHeight);
if(scrollOffset > 0.9) {
currentOffset += 10;
handleSearch(currentOffset);
currentlyLoadingExtra = true;
}
}
}
function handleSearch(index) {
let queryString = "search";
if(input.value.length > 0) {
queryString += "?q=" + encodeURIComponent(input.value).replace(/%20/g,'+');
} else {
queryString += "?q={}{}{}"
}
let filterString = "";
let versionString = "";
for (let key in category_inputs) {
if (category_inputs.hasOwnProperty(key)) {
if(category_inputs[key])
filterString += key + " AND keywords=";
}
}
let filterTakeOffLength = " AND keywords=".length;
if(filterString.length > filterTakeOffLength) {
filterString = filterString.substring(0, filterString.length - filterTakeOffLength)
queryString += "&f=" + encodeURIComponent( "keywords=" + filterString).replace(/%20/g,'+');
}
for (let key in version_inputs)
if (version_inputs.hasOwnProperty(key))
if(version_inputs[key])
versionString += key + " OR versions=";
let versionTakeOffLength = " OR versions=".length;
if(versionString.length > versionTakeOffLength) {
versionString = versionString.substring(0, versionString.length - versionTakeOffLength)
queryString += "&v=" + encodeURIComponent( "versions=" + versionString).replace(/%20/g,'+');
}
if(selectedType)
queryString += "&s=" + encodeURIComponent(selectedType).replace(/%20/g,'+');
if(!queryString.includes("?"))
queryString = queryString.replace("&", "?")
if(index === 0) {
let viewString = queryString;
viewString = viewString.replace("?q={}{}{}", "");
viewString = viewString.replace("&s=relevance", "");
if(!viewString.includes("?"))
viewString = viewString.replace("&", "?")
window.history.pushState('Search', 'Search', viewString);
}
else
queryString += "&o=" + index;
let xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState === 4 && xmlHttp.status === 200) {
if(index === 0) {
resultContainer.innerHTML = xmlHttp.responseText;
currentOffset = 0;
currentlyLoadingExtra = false;
}
else {
resultContainer.innerHTML += xmlHttp.responseText;
currentlyLoadingExtra = false;
}
}
}
xmlHttp.open("POST", queryString, true);
xmlHttp.send(null);
}