256 lines
7.2 KiB
TypeScript
256 lines
7.2 KiB
TypeScript
/// <reference path="../../node_modules/@types/google.analytics/index.d.ts" />
|
|
/// <reference path="../../node_modules/@types/jsrender/index.d.ts" />
|
|
"use strict";
|
|
|
|
// ReSharper disable once InconsistentNaming
|
|
declare var jsrender: JQueryStatic;
|
|
|
|
module BuildFeed
|
|
{
|
|
let ajax: XMLHttpRequest;
|
|
let timeout: number;
|
|
|
|
export function MobileMenuToggle(this: Element, ev: Event)
|
|
{
|
|
ev.preventDefault();
|
|
|
|
const list = this.nextElementSibling;
|
|
if (list != null)
|
|
{
|
|
list.classList.toggle("open");
|
|
}
|
|
}
|
|
|
|
export function DropdownClick(this: Element, ev: Event)
|
|
{
|
|
ev.preventDefault();
|
|
|
|
const linkParent = this.parentElement;
|
|
if (linkParent == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
const alreadyOpen = linkParent.classList.contains("open");
|
|
|
|
CloseDropdowns(ev);
|
|
|
|
if (!alreadyOpen)
|
|
{
|
|
linkParent.classList.toggle("open");
|
|
|
|
const menuClickCapture = document.getElementById("menu-open-overlay");
|
|
if (menuClickCapture != null)
|
|
{
|
|
menuClickCapture.classList.add("open");
|
|
}
|
|
}
|
|
}
|
|
|
|
export function CloseDropdowns(ev: Event)
|
|
{
|
|
ev.preventDefault();
|
|
|
|
const ddParents = document.getElementsByClassName("dropdown-parent");
|
|
for (let i = 0; i < ddParents.length; i++)
|
|
{
|
|
ddParents[i].classList.remove("open");
|
|
}
|
|
|
|
const menuClickCapture = document.getElementById("menu-open-overlay");
|
|
if (menuClickCapture != null)
|
|
{
|
|
menuClickCapture.classList.remove("open");
|
|
}
|
|
}
|
|
|
|
export function SwitchTheme(this: HTMLElement, ev: Event)
|
|
{
|
|
ev.preventDefault();
|
|
|
|
document.cookie = `bf_theme=${this.dataset["theme"]}; expires=Fri, 31 Dec 9999 23:59:59 GMT; path=/`;
|
|
location.reload(true);
|
|
}
|
|
|
|
export function SwitchLanguage(this: HTMLElement, ev: Event)
|
|
{
|
|
ev.preventDefault();
|
|
|
|
document.cookie = `bf_lang=${this.dataset["lang"]}; expires=Fri, 31 Dec 9999 23:59:59 GMT; path=/`;
|
|
location.reload(true);
|
|
}
|
|
|
|
export function OpenSearch(ev: Event)
|
|
{
|
|
ev.preventDefault();
|
|
|
|
const modal = document.getElementById("modal-search-overlay");
|
|
if (modal != null)
|
|
{
|
|
modal.classList.add("open");
|
|
}
|
|
}
|
|
|
|
export function CloseSearch(ev: Event)
|
|
{
|
|
ev.preventDefault();
|
|
|
|
const modal = document.getElementById("modal-search-overlay");
|
|
if (modal != null)
|
|
{
|
|
modal.classList.remove("open");
|
|
}
|
|
}
|
|
|
|
export function StopClick(ev: Event)
|
|
{
|
|
ev.preventDefault();
|
|
ev.stopPropagation();
|
|
}
|
|
|
|
export function InitiateSearch()
|
|
{
|
|
const resultPane = document.getElementById("modal-search-result");
|
|
if (resultPane == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
resultPane.innerHTML = "";
|
|
|
|
if (typeof (timeout) !== "undefined")
|
|
{
|
|
clearTimeout(timeout);
|
|
}
|
|
|
|
if (typeof (ajax) !== "undefined" && ajax.readyState !== XMLHttpRequest.DONE)
|
|
{
|
|
ajax.abort();
|
|
}
|
|
|
|
timeout = setInterval(SendSearch, 200);
|
|
}
|
|
|
|
export function SendSearch()
|
|
{
|
|
if (typeof (timeout) !== "undefined")
|
|
{
|
|
clearTimeout(timeout);
|
|
}
|
|
|
|
const modalInput = document.getElementById("modal-search-input") as HTMLInputElement;
|
|
|
|
ajax = new XMLHttpRequest();
|
|
ajax.onreadystatechange = CompleteSearch;
|
|
ajax.open("GET", `/api/GetSearchResult/${modalInput.value}/`, true);
|
|
ajax.setRequestHeader("accept", "application/json");
|
|
ajax.send(null);
|
|
}
|
|
|
|
export function CompleteSearch(this: XMLHttpRequest)
|
|
{
|
|
if (this.readyState !== XMLHttpRequest.DONE || this.status !== 200)
|
|
{
|
|
return;
|
|
}
|
|
|
|
const resultPane = document.getElementById("modal-search-result");
|
|
const templateContent = document.getElementById("result-template");
|
|
if (resultPane == null || templateContent == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
const template = jsrender.templates(templateContent.innerHTML);
|
|
const content = template.render(JSON.parse(ajax.responseText));
|
|
resultPane.innerHTML = content;
|
|
|
|
const resultLinks = resultPane.getElementsByTagName("a");
|
|
for (let i = 0; i < resultLinks.length; i++)
|
|
{
|
|
resultLinks[i].addEventListener("click",
|
|
(mev: MouseEvent) =>
|
|
{
|
|
mev.preventDefault();
|
|
const modalInput = document.getElementById("modal-search-input") as HTMLInputElement;
|
|
ga("send", "pageview", `/api/GetSearchResult/${modalInput.value}/`);
|
|
location.assign((mev.currentTarget as HTMLAnchorElement).href);
|
|
});
|
|
}
|
|
}
|
|
|
|
export function BuildFeedSetup()
|
|
{
|
|
const ddParents = document.getElementsByClassName("dropdown-parent");
|
|
for (let i = 0; i < ddParents.length; i++)
|
|
{
|
|
for (let j = 0; j < ddParents[i].childNodes.length; j++)
|
|
{
|
|
const el = ddParents[i].childNodes[j];
|
|
|
|
if (el.nodeName === "A")
|
|
{
|
|
el.addEventListener("click", DropdownClick);
|
|
}
|
|
}
|
|
}
|
|
|
|
const menuClickCapture = document.getElementById("menu-open-overlay");
|
|
if (menuClickCapture != null)
|
|
{
|
|
menuClickCapture.addEventListener("click", CloseDropdowns);
|
|
}
|
|
|
|
const menuTheme = document.getElementById("settings-theme-menu");
|
|
if (menuTheme != null)
|
|
{
|
|
const ddThemes = menuTheme.getElementsByTagName("a");
|
|
for (let i = 0; i < ddThemes.length; i++)
|
|
{
|
|
ddThemes[i].addEventListener("click", SwitchTheme);
|
|
}
|
|
}
|
|
|
|
const menuLang = document.getElementById("settings-lang-menu");
|
|
if (menuLang != null)
|
|
{
|
|
const ddLangs = menuLang.getElementsByTagName("a");
|
|
for (let i = 0; i < ddLangs.length; i++)
|
|
{
|
|
ddLangs[i].addEventListener("click", SwitchLanguage);
|
|
}
|
|
}
|
|
|
|
const btnNav = document.getElementById("page-navigation-toggle");
|
|
if (btnNav != null)
|
|
{
|
|
btnNav.addEventListener("click", MobileMenuToggle);
|
|
}
|
|
|
|
const btnSearch = document.getElementById("page-navigation-search");
|
|
if (btnSearch != null)
|
|
{
|
|
btnSearch.addEventListener("click", OpenSearch);
|
|
}
|
|
|
|
const modalOverlay = document.getElementById("modal-search-overlay");
|
|
if (modalOverlay != null)
|
|
{
|
|
modalOverlay.addEventListener("click", CloseSearch);
|
|
}
|
|
|
|
const modalDialog = document.getElementById("modal-search");
|
|
if (modalDialog != null)
|
|
{
|
|
modalDialog.addEventListener("click", StopClick);
|
|
}
|
|
|
|
const modalInput = document.getElementById("modal-search-input");
|
|
if (modalInput != null)
|
|
{
|
|
modalInput.addEventListener("keyup", InitiateSearch);
|
|
}
|
|
}
|
|
}
|
|
|
|
window.addEventListener("load", BuildFeed.BuildFeedSetup); |