//Add function to close button on overlay
document.getElementById("close").addEventListener("click", function (e) {
document.getElementById("overlay").style.display = "none";
overlayOpen = false;
});
//Make clicking outside of overlay also close the overlay
var overlayOpen = false;
document.addEventListener("click", (event) => {
if (!document.getElementById("overlay").contains(event.target) && overlayOpen) {
document.getElementById("overlay").style.display = "none";
overlayOpen = false;
}
});
//preload images
function preload_images(src_list, callback) {
console.log("preloading")
let loaded = 0;
src_list.forEach(function (src) {
img = new Image();
img.onload = function () {
if (++loaded == src_list.length && callback) {
callback();
}
};
img.onerror = function (err) {
console.log("ERROR Preloading:", src)
console.log(err);
};
img.src = src;
});
};
//Check if string is a valid URL
const isValidUrl = urlString => {
try {
return Boolean(new URL(urlString));
}
catch (e) {
return false;
}
}
// Image Category Icons
const getCategoryIcon = (categoryCl) => {
const categoryIcons = [
{
"catID": "AroundtheOffice",
"icon": "building"
},
{
"catID": "Haas",
"icon": "landmark"
},
{
"catID": "InternationalDailyLife",
"icon": "globe"
},
{
"catID": "OfficeTeamMeetings",
"icon": "people-group"
},
{
"catID": "Relationships",
"icon": "handshake"
},
{
"catID": "IllustrationsGraphics",
"icon": "palette"
}
];
const cat = categoryIcons.find(cat => cat.catID === categoryCl);
let { icon } = cat;
return icon;
};
//Spreadsheet Data
const spreadsheetId = '1FnqMmESn65AEc6bqTNM-OePpJLhQWdcJh1PLgVRL-MU'
const parser = new PublicGoogleSheetsParser(spreadsheetId)
parser.parse().then((items) => {
//console.log(items)
var folders = Object.keys(items[0]); //Folder Names
var allURLs = folders.pop(); //Get list of all urls
//Sort folders alphabetically (putting Illustrations/Graphics at the end)
folders.sort();
var graphicsIndex = folders.indexOf("Illustrations/Graphics");
if (graphicsIndex != -1) {
folders.push(folders.splice(graphicsIndex, 1)[0]);
}
//Preloading images
allURLs = allURLs.split(';;');
let starttime = Date.now();
preload_images(allURLs, () => {
console.log("All images preloaded in", Date.now() - starttime, 'ms');
});
//Formatting Files into Array and Creating Header Images
var allImg = {};
var headerImg = {};
var headerHTML = [];
let navHTML = [];
for (var i = 0; i < folders.length; i++) {
allImg[folders[i]] = [];
}
// TODO: load these header category photos first
for (var i = 0; i < items.length; i++) {
for (var j = 0; j < folders.length; j++) {
if (items[i][folders[j]]) {
allImg[folders[j]].push(items[i][folders[j]]);
if (items[i][folders[j]].split(';;')[3].split('/')[0] == "image") {
if (!Object.keys(headerImg).includes(folders[j])) {
var img = items[i][folders[j]].split(";;");
var imgDesc = img[2].split(';');
var imgAlt = imgDesc[0] || `${folders[j]} collection preview`;
let categoryCl = folders[j].replace(/\//g, "").replace(/ /g, "");
let categoryIcon = getCategoryIcon(categoryCl);
headerImg[folders[j]] = "https://lh3.googleusercontent.com/d/" + img[1] + "?sz=200";
headerHTML.push(`
`)
navHTML.push(`
${folders[j]}
`)
}
}
}
}
}
// TODO: Make sure to load and render these images first
document.getElementById("headerCategories").innerHTML = headerHTML.join('');
var headerBlocks = document.getElementsByClassName("headerBlock");
for (var i = 0; i < headerBlocks.length; i++) {
headerBlocks[i].addEventListener("click", function (e) {
document.getElementById(this.classList[1]).scrollIntoView({ behavior: "smooth" });
});
}
document.getElementById("navLinks").innerHTML = navHTML.join('');
// Scroll to top button
const backToTopButton = document.getElementById("back-to-top");
backToTopButton.addEventListener("click", () => {
window.scrollTo(0, 0);
});
// Toggle mobile nav open/close
const navButton = document.getElementById("toggle-mobile-nav");
const navLinks = document.getElementById("navLinks");
navButton.addEventListener("click", () => {
if (!navLinks.classList.contains('open')) {
navLinks.classList.add('open');
} else {
navLinks.classList.remove('open');
}
});
// Only show nav and "back to top" button below the fold
let browserWidth = window.innerWidth;
const el = document.querySelector("nav");
let elTop = el.getBoundingClientRect().top - document.body.getBoundingClientRect().top;
// TODO: refactor, only add event listener if browser width is 1200
window.addEventListener('scroll', () => {
console.log("browserWidth ", browserWidth);
if (browserWidth > 1200) {
if (document.documentElement.scrollTop > elTop) {
el.style.position = 'fixed';
backToTopButton.style.position = 'fixed';
} else {
el.style.position = 'absolute';
backToTopButton.style.position = 'absolute';
}
}
});
//Put images and info on page
var foldersHTML = [];
var attributions = {};
for (var i = 0; i < folders.length; i++) {
var images = allImg[folders[i]];
var imgHTML = [];
var docHTML = [];
for (var j = 0; j < images.length; j++) {
var img = images[j].split(";;");
var imgName = img[0];
var imgID = img[1];
var imgDesc = img[2];
var imgType = img[3].split('/')[0].replace(/;/g, '');
var imgDownloadLink = img[4];
var docText = img[5].split(/\n/);
imgDesc = imgDesc.split(';');
var imgAlt = imgDesc[0];
if (imgDesc.length > 1) {
if (imgDesc[1] == " " || imgDesc[1].toLowerCase() == "n/a") {
attributions[imgDownloadLink] = "";
} else {
attributions[imgDownloadLink] = imgDesc[1];
}
} else {
attributions[imgDownloadLink] = "";
}
if (imgType == "image") {
imgHTML.push(`
`);
} else if (docText != "") {
for (var k = 0; k < docText.length; k++) {
if (isValidUrl(docText[k])) {
var linkName = docText[k].split('www.')[1].split('.')[0];
docHTML.push(`${linkName}`);
}
}
}
}
document.getElementById("photos").innerHTML += `
${folders[i]}
${docHTML.join('')}
${imgHTML.join('')}
`;
}
var imgs = document.getElementsByClassName("collection-image"); // "image" → "collection-image"
for (var i = 0; i < imgs.length; i++) {
imgs[i].addEventListener("click", function (e) {
document.getElementById("enlarged_img").innerHTML = `
`;
document.getElementById("attribution").innerHTML = `${attributions[this.id]}`;
document.getElementById("download_link").innerHTML = `Download`;
document.getElementById("overlay").style.display = "block";
setTimeout(function () {
overlayOpen = true;
}, 1000);
});
}
});