Javascript Visual Assistance - 123callumb/case-studies-basic-implementation GitHub Wiki
/Application\wwwroot\js\readability.js
Readability.js gives us the accessibility functionality for visually impaired users.
Initialising the values
let isRBOpen = false;
let fontSizes = { 0: "fnt_small", 1: "fnt_medium", 2: "fnt_large" };
let colorPalettes = { 0: "col_default", 1: "col_highcontr", 2: "col_greyscale" };
let currentFontSize = 0;
let currentColorPalette = 0;
var originalElementFontSizes = [];
var originalBackgroundColors = [];
var originalFontWeights = [];
let isOpenCookie = "accessibility_o"
let fontSizeCookie = "accessibility_fs";
let colourPaletteCookie = "accessibility_cp";
Opens and closes the container, may be triggered on page load if the cookie is set to load it (further on)
//open/close accessibility container
function toggleRB() {
if (isRBOpen == true) {
document.getElementById('rb_content').style.display = "none";
document.getElementById('rb_openBtn').style.display = "initial";
isRBOpen = false;
} else {
document.getElementById('rb_content').style.display = "initial";
document.getElementById('rb_openBtn').style.display = "none";
isRBOpen = true;
}
createCookie(isOpenCookie, isRBOpen, 1);
}
run the initialisation code on page load
//register buttons
window.addEventListener('load', (event) => {
InitAccessibility();
});
The initialisation code - this is run on page load as well as when a new modal is opened. This is needed because of cookie settings altering the settings.
function InitAccessibility() {
originalElementFontSizes = [];
originalBackgroundColors = [];
originalFontWeights = [];
var paletteBtns = document.getElementsByClassName("rb_col");
for (var i = 0; i < paletteBtns.length; i++) {
paletteBtns[i].addEventListener("click", selectPalette);
}
var fontBtns = document.getElementsByClassName("rb_fon");
for (var i = 0; i < fontBtns.length; i++) {
fontBtns[i].addEventListener("click", selectFontSize);
}
//save original elements to reference font sizes to
var elements = document.getElementsByTagName("*");
for (var i = 0; i < elements.length; ++i) {
var fontSize = window.getComputedStyle(elements[i], null).getPropertyValue('font-size');
originalElementFontSizes.push(parseFloat(fontSize));
var fontWeight = window.getComputedStyle(elements[i], null).getPropertyValue('font-weight');
originalFontWeights.push(parseFloat(fontWeight));
var bgColor = window.getComputedStyle(elements[i], null).getPropertyValue('background-color');
originalBackgroundColors.push(bgColor);
}
//handle cookies
var fontCookie = readCookie(fontSizeCookie);
if (fontCookie != null) {
currentFontSize = fontCookie;
} else createCookie(fontSizeCookie, currentFontSize, 1);
var paletteCookie = readCookie(colourPaletteCookie);
if (paletteCookie != null) {
currentColorPalette = paletteCookie;
} else createCookie(colourPaletteCookie, currentColorPalette, 1);
var openCookie = readCookie(isOpenCookie);
if (openCookie != null) {
if (openCookie == "true") toggleRB();
} else createCookie(isOpenCookie, isRBOpen, 1);
//initialise settings
document.getElementById(fontSizes[currentFontSize]).classList.add("rb_selected");
document.getElementById(colorPalettes[currentColorPalette]).classList.add("rb_selected");
ChangeFontSize();
ChangeColorPalette();
}
These functions are used to initialise the font / palette change when a new one is selected.
//change selections
function selectFontSize() { //fonts
var fontBtns = document.getElementsByClassName("rb_fon");
for (var i = 0; i < fontBtns.length; i++) {
fontBtns[i].classList.remove("rb_selected");
}
var arr = Array.from(fontBtns);
currentFontSize = arr.findIndex(x => x.id === this.id);
this.classList.add("rb_selected");
ChangeFontSize();
//edit cookie
createCookie(fontSizeCookie, currentFontSize, 1);
}
function selectPalette() { //palettes
var paletteBtns = document.getElementsByClassName("rb_col");
for (var i = 0; i < paletteBtns.length; i++) {
paletteBtns[i].classList.remove("rb_selected");
}
var arr = Array.from(paletteBtns);
currentColorPalette = arr.findIndex(x => x.id === this.id);
this.classList.add("rb_selected");
ChangeColorPalette();
//edit cookie
createCookie(colourPaletteCookie, currentColorPalette, 1);
}
Here the palette/ fonts are actually changed on DOM side
function ChangeFontSize() {
var elements = document.getElementsByTagName("*");
for (var i = 0; i < elements.length; ++i) {
elements[i].style.fontSize = (originalElementFontSizes[i] + (currentFontSize * 2)) + "px";
if (!elements[i].classList.contains("material-icons") && !elements[i].classList.contains("material-icons-outlined")) {
if (currentFontSize == 1) elements[i].style.fontWeight = 600;
else if (currentFontSize == 2) elements[i].style.fontWeight = 700;
else elements[i].style.fontWeight = originalFontWeights[i];
}
}
}
function ChangeColorPalette() {
var elements = document.getElementsByTagName("*");
for (var i = 0; i < elements.length; ++i) {
elements[i].style.backgroundColor = originalBackgroundColors[i];
var count = elements[i].classList.length;
for (var j = 0; j < count; j++) {
var currentClass = elements[i].classList[j];
if (currentClass.substr(0, 3) == 'cs-') {
if (currentClass.substr(currentClass.length - 3, currentClass.length) == "-hc") {
elements[i].classList.remove(currentClass);
}
//greyscale
if (currentColorPalette == 2) {
elements[i].style.backgroundColor = '#444444';
}
else if (currentColorPalette == 1) {
if (currentClass.substr(currentClass.length - 3, currentClass.length) != "-hc") {
let newClassName = (currentClass + "-hc");
if (!elements[i].classList.contains(newClassName)) {
elements[i].classList.add(newClassName);
}
}
}
}
}
}
}
Cookie helper functions to edit/ create / read cookies. CreateCookie is used for both creating and editing.
//cookie helpers
function createCookie(name, value, days) {
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
var expires = "; expires=" + date.toGMTString();
}
else var expires = "";
document.cookie = name + "=" + value + expires + "; path=/";
}
function readCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') c = c.substring(1, c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
}
return null;
}