function isObj(obj) { return (obj && typeof obj === 'object' && obj !== null) ? true : false; } function createEl(element = 'div') { return document.createElement(element); } function elem(selector, parent = document){ let elem = parent.querySelector(selector); return elem != false ? elem : false; } function elems(selector, parent = document) { let elems = parent.querySelectorAll(selector); return elems.length ? elems : false; } function pushClass(el, targetClass) { if (isObj(el) && targetClass) { elClass = el.classList; elClass.contains(targetClass) ? false : elClass.add(targetClass); } } function deleteClass(el, targetClass) { if (isObj(el) && targetClass) { elClass = el.classList; elClass.contains(targetClass) ? elClass.remove(targetClass) : false; } } function modifyClass(el, targetClass) { if (isObj(el) && targetClass) { elClass = el.classList; elClass.contains(targetClass) ? elClass.remove(targetClass) : elClass.add(targetClass); } } function containsClass(el, targetClass) { if (isObj(el) && targetClass && el !== document ) { return el.classList.contains(targetClass) ? true : false; } } function isChild(node, parentClass) { let objectsAreValid = isObj(node) && parentClass && typeof parentClass == 'string'; return (objectsAreValid && node.closest(parentClass)) ? true : false; } function getSiblings(el) { return Array.prototype.filter.call(el.parentNode.children, function(child){ return child !== el; }); } function markActive(el, activeClass = active) { const siblings = getSiblings(el); pushClass(el, activeClass); if(siblings.length) { siblings.forEach(element => deleteClass(element, activeClass)); } } function elemAttribute(elem, attr, value = null) { if (value) { elem.setAttribute(attr, value); } else { value = elem.getAttribute(attr); return value ? value : false; } } function deleteChars(str, subs) { let newStr = str; if (Array.isArray(subs)) { for (let i = 0; i < subs.length; i++) { newStr = newStr.replace(subs[i], ''); } } else { newStr = newStr.replace(subs, ''); } return newStr; } function isBlank(str) { return (!str || str.trim().length === 0); } function isMatch(element, selectors) { if(isObj(element)) { if(selectors.isArray) { let matching = selectors.map(function(selector){ return element.matches(selector) }) return matching.includes(true); } return element.matches(selectors) } } function exactMatch(target, criteria) { const isTarget = target.matches(criteria); const isWithinTarget = target.closest(criteria); return isTarget ? isTarget : isWithinTarget;; } const copyToClipboard = str => { let copy, selection, selected; copy = createEl('textarea'); copy.value = str; copy.setAttribute('readonly', ''); copy.style.position = 'absolute'; copy.style.left = '-9999px'; selection = document.getSelection(); doc.appendChild(copy); // check if there is any selected content selected = selection.rangeCount > 0 ? selection.getRangeAt(0) : false; copy.select(); document.execCommand('copy'); doc.removeChild(copy); if (selected) { // if a selection existed before copying selection.removeAllRanges(); // unselect existing selection selection.addRange(selected); // restore the original selection } } function convertToUnderScoreCase(str) { let char, newChar, newStr; newStr = ''; if (typeof str == 'string') { for (let x = 0; x < str.length; x++) { char = str.charAt(x); if (char.match(/^[A-Z]*$/)) { char = char.toLowerCase(); newChar = `_${char}` newStr += newChar; } else { newStr += char; } } return newStr; } } function elementInViewport(el) { var top = el.offsetTop; var left = el.offsetLeft; var width = el.offsetWidth; var height = el.offsetHeight; while(el.offsetParent) { el = el.offsetParent; top += el.offsetTop; left += el.offsetLeft; } return ( top < (window.pageYOffset + window.innerHeight) && left < (window.pageXOffset + window.innerWidth) && (top + height) > window.pageYOffset && (left + width) > window.pageXOffset ); }