{"version":3,"sources":["utility.js"],"names":["define","smallTag","mediumTag","largeTag","mediumBP","largeBP","baseFont","urlRegExp","RegExp","urlAnchorRegExp","deepMerge","target","source","this","result","instance","Object","prototype","toString","call","forEach","child","index","loop","nodeType","cloneNode","Date","key","clone","item","Number","String","Boolean","types","type","keys","trigger","element","eventName","document","createEvent","event","initEvent","dispatchEvent","addClass","classes","classNames","split","classList","className","add","addMeasurements","measurement","measurementArray","i","removeMeasurementSuffix","convertToPx","newNumber","number","noAuto","debounce","func","wait","immediate","timeout","context","args","callNow","clearTimeout","later","apply","escapeHtml","str","createElement","div","appendChild","extend","length","arguments","fade","duration","fadeOptions","variant","displayNone","minFade","maxFade","callback","isNode","contains","style","transition","webkitTransition","opacity","display","fadeIn","timing","setTimeout","timeoutFn","remove","removeProperty","setAttribute","fadeOut","innerTimeoutFn","find","search","results","elements","selector","concat","Array","slice","getAnchor","currentUrl","window","location","href","fullHash","match","partHash","localeCompare","getBreakpoint","tag","body","mediumBreakpoint","FRAMEWORK","fontSize","getComputedStyle","largeBreakpoint","standalone","matches","getData","attribName","data","attrib","attributes","specified","test","name","replace","l","toUpperCase","parse","value","error","hexToRgba","hex","c","substring","join","htmlStringToElement","template","html","trim","innerHTML","firstChild","htmlStringToElements","childNodes","inRange","range","inclusive","min","max","comparitor","originalNumber","exists","Node","ELEMENT_NODE","isOverflown","axis","scrollHeight","hasOverflown","clientHeight","scrollWidth","clientWidth","isVisible","offsetWidth","offsetHeight","makeId","testHidden","newID","poss","possLength","charAt","Math","floor","random","matchesSelector","msMatchesSelector","mozMatchesSelector","webkitMatchesSelector","oMatchesSelector","offset","rect","getBoundingClientRect","top","pageYOffset","left","pageXOffset","outerHeightTrue","height","parseInt","marginTop","marginBottom","outerWidthTrue","width","marginLeft","marginRight","parents","customSelector","currentEl","parentNode","push","processInPageLinks","linkFunction","querySelectorAll","pathname","host","removeClass","newValue","parseFloat","isNaN","resetStyles","styleList","convertedKey","toLowerCase","requestLoadInto","bodyRegex","request","id","tempUrl","requestUrl","XMLHttpRequest","indexOf","origin","onload","elContent","tempEl","responseText","querySelector","outerHTML","responseCallback","status","scrollParent","parent","excludeStaticParent","includeHidden","overflowRegex","position","parentElement","overflow","overflowY","overflowX","setAttributes","attrs","siblings","isSibling","filter","children","slideToggle","options","startHeight","elStyles","startPaddingBottom","startPaddingTop","initialHeight","overlapMargin","toggleOptions","customStartHeight","customEndHeight","overlap","paddingBottom","paddingTop","savedStyles","maxHeight","nextStyles","baseHeight","subtractMeasurements","slideDown","slideUp","endHeight","hide","smoothScroll","xCoord","yCoord","animationTime","scrollArea","scrollTop","scrollLeft","scrollCompleteFunction","smoothScrollSupported","documentElement","scrollBehavior","newAnimationTime","scrollableArea","timings","current","t350ms","animation","ceil","scrollTimeout","removeEventListener","scrollTo","behavior","distanceTop","distanceLeft","unwrap","TEXT_NODE","insertAdjacentElement","removeChild","updateHistory","replaceState","anchor","wrap","wrappingElement","wrapper","wrapInner","contentWrapper","insertBefore"],"mappings":"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","file":"utility.js","sourcesContent":["// eslint-disable-next-line max-lines-per-function\r\ndefine( function run() {\r\n\t'use strict';\r\n\r\n\t/*\r\n\t * FRAMEWORK UTILITY FUNCTIONS\r\n\t * ===========================\r\n\t *\r\n\t * All functions up to date and tested as of v4.13 release\r\n\t * Please quote version number when adding additional functions or updating existing ones\r\n\t *\r\n\t * Functions list:\r\n\t * ---------------\r\n\t * trigger - Trigger event natively\r\n\t * addClass - add specified class to an element\r\n\t * addMeasurements - get sum of measurements in an array\r\n\t * convertToPx - add px suffix to a number\r\n\t * debounce - prevent other functions from being called again too rapidly (eg on page resize)\r\n\t * escapeHTML - safely escape any strings using built-in browser functionality\r\n\t * extend - deep merge multiple objects together\r\n\t * fade - vanilla JS replacement for jQuery's fadeIn / fadeOut functions\r\n\t * find - find elements with a particular selector from within a given set of elements\r\n\t * getAnchor - get anchor href\r\n\t * getBreakpoint - gets viewport's current breakpoint based on standard Framework widths\r\n\t * getData - return an object containing a list of data attributes\r\n\t * hexToRgba - Convert hex value to rgba\r\n\t * htmlStringToElement - Convert an HTML string to a proper DOM element\r\n\t * htmlStringToElements - Convert an HTML string to a node list of elements\r\n\t * inRange - Test if two numbers are within a given range of each other\r\n\t * isNode - Check if the the element passed in is an Element Node\r\n\t * isOverflown - check if the content of an element has overflown its bounding box\r\n\t * isVisible - check if an element is visible\r\n\t * makeId - create a random ID\r\n\t * matches - Find elements with a matching selector\r\n\t * offset - find an element's position\r\n\t * outerHeightTrue - get an element's total outer height (including margins etc)\r\n\t * outerWidthTrue - get an element's total outer width (including margins etc)\r\n\t * parents - return an array of an element's parents\r\n\t * processInPageLinks - find all links with a specific selector and run specified function on them\r\n\t * removeClass - remove specified class to an element\r\n\t * removeMeasurementSuffix - memove measurement suffixes (px/em etc)\r\n\t * resetStyles - Reset styles on an element\r\n\t * requestLoadInto - load content from specified url/anchor into an element\r\n\t * scrollParent - find an element's parent for scrolling purposes\r\n\t * setAttributes - allow daisychaining to set multiple attributes in one go\r\n\t * siblings - find all sibling elements / sibling elements (with a particular selector if specified)\r\n\t * slideToggle - vanilla JS replacement for jQuery's slideUp / slideDown / slideToggle functions\r\n\t * smoothScroll - smooth scroll to position\r\n\t * subtractMeasurements - get remainder from subtracted measurements in an array\r\n\t * unwrap - unwrap an element from its parent (removes parent)\r\n\t * updateHistory - update browser history\r\n\t * wrap - wrap element with a new one\r\n\t * wrapInner - wrap the children of an element within a single new child element\r\n\t */\r\n\r\n\t// Other functions\r\n\treturn {\r\n\t\tsmallTag : 'small',\r\n\t\tmediumTag : 'medium',\r\n\t\tlargeTag : 'large',\r\n\t\tmediumBP : 35,\r\n\t\tlargeBP : 60,\r\n\t\tbaseFont : 16,\r\n\t\turlRegExp : new RegExp( '#[a-zA-Z0-9-._~%!$&\\'()*+,;=:@/?#]+' ),\r\n\t\turlAnchorRegExp : new RegExp( '#[a-zA-Z]+[a-zA-Z0-9-._]*' ), // Only accept character valid in html4 for compatability\r\n\r\n\t\t// eslint-disable-next-line complexity\r\n\t\tdeepMerge : function( target, source ) {\r\n\t\t\tvar instance = this,\r\n\t\t\t\tresult = target;\r\n\r\n\t\t\tif ( !source && typeof source !== 'boolean' ) {\r\n\t\t\t\treturn target; // Null, undefined values check\r\n\t\t\t}\r\n\r\n\t\t\tif ( Object.prototype.toString.call( source ) === '[object Array]' ) {\r\n\t\t\t\tif ( Object.prototype.toString.call( result ) !== '[object Array]' ) {\r\n\t\t\t\t\tresult = [];\r\n\t\t\t\t}\r\n\t\t\t\tsource.forEach( function loop( child, index ) {\r\n\t\t\t\t\tif ( result[ index ] ) {\r\n\t\t\t\t\t\tresult[ index ] = instance.deepMerge( result[ index ], source[ index ] );\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tresult[ index ] = instance.clone( source[ index ] );\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t} else if ( typeof source === 'object' ) {\r\n\t\t\t\t// Testing that this is DOM\r\n\t\t\t\tif ( source.nodeType && typeof source.cloneNode === 'function' ) {\r\n\t\t\t\t\tresult = source.cloneNode( true );\r\n\t\t\t\t} else if ( target.prototype ) {\r\n\t\t\t\t\tresult = source;\r\n\t\t\t\t} else if ( source instanceof Date ) {\r\n\t\t\t\t\t// Check that this is a literal\r\n\t\t\t\t\tresult = new Date( source );\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// It is an object literal\r\n\t\t\t\t\tif ( typeof result !== 'object' ) {\r\n\t\t\t\t\t\tresult = {};\r\n\t\t\t\t\t}\r\n\t\t\t\t\tObject.keys( source ).forEach( function loop( key ) {\r\n\t\t\t\t\t\tif ( result[ key ] ) {\r\n\t\t\t\t\t\t\tresult[ key ] = instance.deepMerge( result[ key ], source[ key ] );\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tresult[ key ] = instance.clone( source[ key ] );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tresult = source;\r\n\t\t\t}\r\n\r\n\t\t\treturn result;\r\n\t\t},\r\n\r\n\t\tclone : function( item ) {\r\n\t\t\tvar instance = this,\r\n\t\t\t\ttypes = [ Number, String, Boolean ],\r\n\t\t\t\tresult;\r\n\r\n\t\t\tif ( !item && typeof item !== 'boolean' ) {\r\n\t\t\t\treturn item; // Null, undefined values check\r\n\t\t\t}\r\n\r\n\t\t\t// Normalizing primitives if someone did new String('aaa'), or new Number('444');\r\n\t\t\ttypes.forEach( function loop( type ) {\r\n\t\t\t\tif ( item instanceof type ) {\r\n\t\t\t\t\tresult = type( item );\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tif ( typeof result === 'undefined' ) {\r\n\t\t\t\tif ( Object.prototype.toString.call( item ) === '[object Array]' ) {\r\n\t\t\t\t\tresult = [];\r\n\t\t\t\t\titem.forEach( function loop( child, index ) {\r\n\t\t\t\t\t\tresult[ index ] = instance.clone( child );\r\n\t\t\t\t\t});\r\n\t\t\t\t} else if ( typeof item === 'object' ) {\r\n\t\t\t\t\t// Testing that this is DOM\r\n\t\t\t\t\tif ( item.nodeType && typeof item.cloneNode === 'function' ) {\r\n\t\t\t\t\t\tresult = item.cloneNode( true );\r\n\t\t\t\t\t} else if ( item.prototype ) {\r\n\t\t\t\t\t\tresult = item;\r\n\t\t\t\t\t} else if ( item instanceof Date ) {\r\n\t\t\t\t\t\t// Check that this is a literal\r\n\t\t\t\t\t\tresult = new Date( item );\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t// It is an object literal\r\n\t\t\t\t\t\tresult = {};\r\n\t\t\t\t\t\tObject.keys( item ).forEach( function loop( key ) {\r\n\t\t\t\t\t\t\tresult[ key ] = instance.clone( item[ key ] );\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tresult = item;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn result;\r\n\t\t},\r\n\r\n\t\t// Function to help dispatch custom events\r\n\t\ttrigger : function( element, eventName ) {\r\n\t\t\tvar event = document.createEvent( 'Event' );\r\n\r\n\t\t\tevent.initEvent( eventName, true, true );\r\n\t\t\telement.dispatchEvent( event );\r\n\t\t},\r\n\r\n\t\t// Add specified class to an element (v4.13 - Sep 19)\r\n\t\taddClass : function( element, classNames ) {\r\n\t\t\tvar classes = classNames.split( ' ' );\r\n\r\n\t\t\tif ( element && element.classList ) {\r\n\t\t\t\tclasses.forEach( function loop( className ) {\r\n\t\t\t\t\tif ( className ) {\r\n\t\t\t\t\t\telement.classList.add( className );\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t// Get sum of measurements in an array (v4.13 - Sep 19)\r\n\t\taddMeasurements : function( measurementArray ) {\r\n\t\t\tvar instance = this,\r\n\t\t\t\tmeasurement = 0,\r\n\t\t\t\ti;\r\n\r\n\t\t\tfor ( i = 0; i < measurementArray.length; i++ ) {\r\n\t\t\t\tif ( typeof measurementArray[ i ] !== 'number' ) {\r\n\t\t\t\t\tmeasurementArray[ i ] = instance.removeMeasurementSuffix( measurementArray[ i ] ); // Value is NaN, so attempt to convert beore continuing\r\n\t\t\t\t}\r\n\t\t\t\tif ( typeof measurementArray[ i ] === 'number' ) {\r\n\t\t\t\t\tmeasurement += measurementArray[ i ]; // Value is a number, so add it on to current total\r\n\t\t\t\t} else {\r\n\t\t\t\t\tmeasurement = 'auto'; // Value is set to auto (so don't change it), or something else entirely (so set to auto rather than failing completely)...\r\n\t\t\t\t\ti = measurementArray.length; // ... then set count to be complete so no more additions are run\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn measurement;\r\n\t\t},\r\n\r\n\t\t// Add px suffix to a number (v4.13 - Sep 19)\r\n\t\tconvertToPx : function( number, noAuto ) {\r\n\t\t\tvar newNumber;\r\n\r\n\t\t\tif ( number === 0 || number === '0' || ( number === 'auto' && noAuto ) ) { // Starting value is 0, or number being forced instead of auto\r\n\t\t\t\tnewNumber = 0;\r\n\t\t\t} else if ( number === 'auto' || typeof number !== 'number' || Number.isNaN( number ) ) { // Starting value is auto or not a number\r\n\t\t\t\tnewNumber = 'auto';\r\n\t\t\t} else { // Standard functionality\r\n\t\t\t\tnewNumber = number + 'px';\r\n\t\t\t}\r\n\t\t\treturn newNumber;\r\n\t\t},\r\n\r\n\t\t// Help to prevent other functions from being called again too rapidly (eg on page resize) (v4.13 - Sep 19)\r\n\t\tdebounce : function( func, wait, immediate ) {\r\n\t\t\tvar timeout;\r\n\r\n\t\t\treturn function debounceFn() {\r\n\t\t\t\tvar context = this,\r\n\t\t\t\t\targs = arguments,\r\n\t\t\t\t\tlater = function() {\r\n\t\t\t\t\t\ttimeout = null;\r\n\t\t\t\t\t\tif ( !immediate ) {\r\n\t\t\t\t\t\t\tfunc.apply( context, args );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t},\r\n\t\t\t\t\tcallNow = immediate && !timeout;\r\n\r\n\t\t\t\tclearTimeout( timeout );\r\n\r\n\t\t\t\ttimeout = setTimeout( later, wait );\r\n\t\t\t\tif ( callNow ) {\r\n\t\t\t\t\tfunc.apply( context, args );\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t},\r\n\r\n\t\t// Safely escape any strings using built-in browser functionality (v4.13 - Sep 19)\r\n\t\tescapeHtml : function( str ) {\r\n\t\t\tvar div = document.createElement( 'div' );\r\n\r\n\t\t\tdiv.appendChild( document.createTextNode( str ) );\r\n\t\t\treturn div.innerHTML;\r\n\t\t},\r\n\r\n\t\t// Deep merge objects together (v5.0.0 - Jan 20)\r\n\t\textend : function() {\r\n\t\t\tvar instance = this,\r\n\t\t\t\tresult,\r\n\t\t\t\ti;\r\n\r\n\t\t\tif ( arguments.length > 0 ) {\r\n\t\t\t\tresult = {};\r\n\t\t\t\tfor ( i = 0; i < arguments.length; i++ ) {\r\n\t\t\t\t\tif ( arguments[ i ] ) {\r\n\t\t\t\t\t\tresult = instance.deepMerge( result, arguments[ i ] );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn result;\r\n\t\t},\r\n\r\n\t\t/*\r\n\t\t * Vanilla JS replacement for jQuery's fadeIn / fadeOut functions (v4.13 - Sep 19)\r\n\t\t * eg: element.fade( target element, animation duration (in ms), { options } );\r\n\t\t */\r\n\t\tfade : function( element, duration, options ) {\r\n\t\t\tvar instance = this,\r\n\t\t\t\tfadeOptions = {\r\n\t\t\t\t\tvariant : 'toggle', // ...in/out/toggle - default toggle\r\n\t\t\t\t\tdisplayNone : true, // ...boolean - default true\r\n\t\t\t\t\tminFade : 0, // ...number - default 0\r\n\t\t\t\t\tmaxFade : 1, // ...number - default 1\r\n\t\t\t\t\tcallback : function() {\r\n\t\t\t\t\t\t// Do nothing\r\n\t\t\t\t\t},\r\n\t\t\t\t};\r\n\r\n\t\t\t// Only run if not currently animating\r\n\t\t\tif ( instance.isNode( element ) && !element.classList.contains( 'is-animating' ) ) {\r\n\t\t\t\t// If options have been set update the default ones\r\n\t\t\t\tfadeOptions = instance.extend({}, fadeOptions, options );\r\n\r\n\t\t\t\tfadeOptions.transition = element.style.transition; // Save any curent inline styles\r\n\t\t\t\tfadeOptions.webkitTransition = element.style.webkitTransition; // Save any curent inline styles\r\n\r\n\t\t\t\telement.classList.add( 'is-animating' );\r\n\r\n\t\t\t\tif ( fadeOptions.variant === 'in' ) {\r\n\t\t\t\t\tinstance.fadeIn( element, duration, fadeOptions );\r\n\t\t\t\t} else if ( fadeOptions.variant === 'out' ) {\r\n\t\t\t\t\tinstance.fadeOut( element, duration, fadeOptions );\r\n\t\t\t\t} else if ( fadeOptions.variant === 'toggle' && ( element.style.opacity === 0 || element.style.display === 'none' ) ) {\r\n\t\t\t\t\tinstance.fadeIn( element, duration, fadeOptions );\r\n\t\t\t\t} else {\r\n\t\t\t\t\tinstance.fadeOut( element, duration, fadeOptions );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t// Fade in - fade variant only\r\n\t\tfadeIn : function( element, duration, fadeOptions ) {\r\n\t\t\tvar instance = this,\r\n\t\t\t\ttiming = ( duration / 1000 ) + 's';\r\n\r\n\t\t\tif ( instance.isNode( element ) ) {\r\n\t\t\t\telement.style.transition = 'opacity ' + timing;\r\n\t\t\t\telement.style.webkitTransition = 'opacity ' + timing;\r\n\t\t\t\telement.style.opacity = fadeOptions.minFade;\r\n\r\n\t\t\t\tif ( fadeOptions.displayNone ) {\r\n\t\t\t\t\telement.style.display = 'block';\r\n\t\t\t\t}\r\n\r\n\t\t\t\tsetTimeout( function timeoutFn() {\r\n\t\t\t\t\telement.style.opacity = fadeOptions.maxFade;\r\n\r\n\t\t\t\t\tsetTimeout( function innerTimeoutFn() {\r\n\t\t\t\t\t\telement.classList.remove( 'is-animating' );\r\n\t\t\t\t\t\tif ( element.style.transition === null ) {\r\n\t\t\t\t\t\t\telement.style.removeProperty( 'transition' );\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\telement.style.transition = fadeOptions.transition;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif ( element.style.webkitTransition === null ) {\r\n\t\t\t\t\t\t\telement.style.removeProperty( 'webkitTransition' );\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\telement.style.webkitTransition = fadeOptions.webkitTransition;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telement.style.webkitTransition = fadeOptions.webkitTransition;\r\n\t\t\t\t\t\tif ( fadeOptions.displayNone ) {\r\n\t\t\t\t\t\t\telement.style.display = 'block';\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telement.style.opacity = fadeOptions.maxFade;\r\n\t\t\t\t\t\telement.setAttribute( 'aria-hidden', 'false' );\r\n\t\t\t\t\t\tfadeOptions.callback();\r\n\t\t\t\t\t}, duration );\r\n\t\t\t\t}, 20 );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t// Fade out - fade variant only\r\n\t\tfadeOut : function( element, duration, fadeOptions ) {\r\n\t\t\tvar instance = this,\r\n\t\t\t\ttiming = ( duration / 1000 ) + 's';\r\n\r\n\t\t\tif ( instance.isNode( element ) ) {\r\n\t\t\t\telement.style.transition = 'opacity ' + timing;\r\n\t\t\t\telement.style.webkitTransition = 'opacity ' + timing;\r\n\t\t\t\telement.style.opacity = fadeOptions.maxFade;\r\n\r\n\t\t\t\tsetTimeout( function timeoutFn() {\r\n\t\t\t\t\telement.style.opacity = fadeOptions.minFade;\r\n\t\t\t\t\tsetTimeout( function innerTimeoutFn() {\r\n\t\t\t\t\t\telement.classList.remove( 'is-animating' );\r\n\t\t\t\t\t\tif ( element.style.transition === null ) {\r\n\t\t\t\t\t\t\telement.style.removeProperty( 'transition' );\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\telement.style.transition = fadeOptions.transition;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif ( element.style.webkitTransition === null ) {\r\n\t\t\t\t\t\t\telement.style.removeProperty( 'webkitTransition' );\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\telement.style.webkitTransition = fadeOptions.webkitTransition;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telement.style.display = 'block';\r\n\t\t\t\t\t\telement.style.opacity = fadeOptions.minFade;\r\n\r\n\t\t\t\t\t\tif ( fadeOptions.displayNone && fadeOptions.minFade === 0 ) {\r\n\t\t\t\t\t\t\t// MinFade = 0 required as otherwise minFade of greater than 0 will get blatted to hiddden anyway\r\n\t\t\t\t\t\t\telement.style.display = 'none';\r\n\t\t\t\t\t\t\telement.style.removeProperty( 'opacity' );\r\n\t\t\t\t\t\t\telement.setAttribute( 'aria-hidden', 'true' );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tfadeOptions.callback();\r\n\t\t\t\t\t}, duration );\r\n\t\t\t\t}, 20 );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t// Find elements with a particular selector from within a given set of elements (v4.13 - Sep 19)\r\n\t\tfind : function( elements, selector ) {\r\n\t\t\tvar results = [],\r\n\t\t\t\ti,\r\n\t\t\t\tsearch;\r\n\r\n\t\t\tfor ( i = 0; i < elements.length; i++ ) {\r\n\t\t\t\tsearch = elements[ i ].querySelectorAll( selector );\r\n\t\t\t\tif ( search !== null ) {\r\n\t\t\t\t\tresults = results.concat( Array.prototype.slice.call( search ) );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif ( results.length === 0 ) {\r\n\t\t\t\tresults = null;\r\n\t\t\t}\r\n\t\t\treturn results;\r\n\t\t},\r\n\r\n\t\t// Get anchor href (v4.13 - Sep 19)\r\n\t\tgetAnchor : function() {\r\n\t\t\tvar instance = this,\r\n\t\t\t\tcurrentUrl = window.location.href,\r\n\t\t\t\tfullHash = currentUrl.match( instance.urlRegExp ),\r\n\t\t\t\tpartHash = currentUrl.match( instance.urlAnchorRegExp ),\r\n\t\t\t\thref = '';\r\n\r\n\t\t\tif ( !fullHash ) {\r\n\t\t\t\t// Do nothing\r\n\t\t\t} else if ( partHash !== null && fullHash.toString().localeCompare( partHash.toString() ) === 0 ) {\r\n\t\t\t\thref = partHash;\r\n\t\t\t} else {\r\n\t\t\t\thref = null;\r\n\t\t\t}\r\n\r\n\t\t\treturn href;\r\n\t\t},\r\n\r\n\t\t// Get the current main breakpoint of the page so that we can adjust a component's behaviour (v4.13 - Sep 19)\r\n\t\tgetBreakpoint : function( element ) {\r\n\t\t\tvar instance = this,\r\n\t\t\t\tthisElement = window.document.body,\r\n\t\t\t\ttag = instance.smallTag,\r\n\t\t\t\tfontSize = instance.baseFont,\r\n\t\t\t\tlargeBreakpoint = instance.largeBP + 'em',\r\n\t\t\t\tmediumBreakpoint = instance.mediumBP + 'em';\r\n\r\n\t\t\tif ( FRAMEWORK.standalone && typeof element !== 'undefined' ) {\r\n\t\t\t\t// Get the font size for the element that was passed in. Used for Standalone global nav\r\n\t\t\t\tthisElement = element;\r\n\t\t\t\tfontSize = instance.removeMeasurementSuffix( window.getComputedStyle( thisElement ).fontSize );\r\n\t\t\t\tlargeBreakpoint = ( instance.largeBP * fontSize ) + 'px';\r\n\t\t\t\tmediumBreakpoint = ( instance.mediumBP * fontSize ) + 'px';\r\n\t\t\t}\r\n\r\n\t\t\tif ( window.matchMedia( '(min-width: ' + largeBreakpoint + ')' ).matches ) {\r\n\t\t\t\ttag = instance.largeTag;\r\n\t\t\t} else if ( window.matchMedia( '(min-width: ' + mediumBreakpoint + ')' ).matches ) {\r\n\t\t\t\ttag = instance.mediumTag;\r\n\t\t\t} else {\r\n\t\t\t\t// Do nothing\r\n\t\t\t}\r\n\r\n\t\t\treturn tag;\r\n\t\t},\r\n\r\n\t\t// Return an object containing a list of data attributes (v4.13 - Sep 19)\r\n\t\tgetData : function( element ) {\r\n\t\t\tvar data = {},\r\n\t\t\t\ti,\r\n\t\t\t\tattrib,\r\n\t\t\t\tattribName;\r\n\r\n\t\t\tfor ( i = 0; i < element.attributes.length; i++ ) {\r\n\t\t\t\tattrib = element.attributes[ i ];\r\n\t\t\t\tif ( attrib.specified && ( /^data-/ ).test( attrib.name ) ) {\r\n\t\t\t\t\tattribName = String( attrib.name );\r\n\t\t\t\t\tattribName = attribName.replace( /^data-/, '' );\r\n\t\t\t\t\tattribName = attribName.replace( /-\\b\\w/g, function fn( l ) {\r\n\t\t\t\t\t\treturn l.toUpperCase();\r\n\t\t\t\t\t});\r\n\t\t\t\t\tattribName = attribName.replace( /-/g, '' );\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tdata[ attribName ] = JSON.parse( attrib.value );\r\n\t\t\t\t\t} catch ( error ) {\r\n\t\t\t\t\t\tdata[ attribName ] = attrib.value;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn data;\r\n\t\t},\r\n\r\n\t\t// Convert hex value to rgba (v5.0 - May 20)\r\n\t\thexToRgba : function( hex ) {\r\n\t\t\tvar c;\r\n\t\t\tif ( ( /^#([A-Fa-f0-9]{3}){1,2}$/ ).test( hex ) ) {\r\n\t\t\t\tc = hex.substring( 1 ).split( '' );\r\n\t\t\t\tif ( c.length === 3 ) {\r\n\t\t\t\t\t// 6 digit shortcode\r\n\t\t\t\t\tc = [ c[ 0 ], c[ 0 ], c[ 1 ], c[ 1 ], c[ 2 ], c[ 2 ] ];\r\n\t\t\t\t}\r\n\t\t\t\tc = '0x' + c.join( '' );\r\n\t\t\t\t// eslint-disable-next-line no-bitwise\r\n\t\t\t\treturn 'rgba( ' + [ ( c >> 16 ) & 255, ( c >> 8 ) & 255, c & 255 ].join( ', ' ) + ', 1)';\r\n\t\t\t}\r\n\t\t\t// If process fails, return original value\r\n\t\t\treturn hex;\r\n\t\t},\r\n\r\n\t\t// Convert an HTML string to a proper DOM element (v4.13 - Sep 19)\r\n\t\thtmlStringToElement : function( str ) {\r\n\t\t\tvar template = document.createElement( 'div' ),\r\n\t\t\t\thtml = str.trim(); // Never return a text node of whitespace as the result\r\n\r\n\t\t\ttemplate.innerHTML = html;\r\n\t\t\treturn template.firstChild;\r\n\t\t},\r\n\r\n\t\t// Convert an HTML string to a node list of elements (v4.13 - Sep 19)\r\n\t\thtmlStringToElements : function( str ) {\r\n\t\t\t// Returns a node list rather than an array; may want to consider changing final line return to Array.from( template.childNodes );\r\n\t\t\tvar template = document.createElement( 'div' ),\r\n\t\t\t\thtml = str.trim(); // Never return a text node of whitespace as the result\r\n\r\n\t\t\ttemplate.innerHTML = html;\r\n\t\t\treturn template.childNodes; // Returns node list\r\n\t\t},\r\n\r\n\t\tinRange : function( originalNumber, comparitor, range, inclusive ) {\r\n\t\t\tvar min = comparitor - range,\r\n\t\t\t\tmax = comparitor + range;\r\n\r\n\t\t\treturn inclusive ? originalNumber >= min && originalNumber <= max : originalNumber > min && originalNumber < max;\r\n\t\t},\r\n\r\n\t\t// Check if the the element passed in is an Element Node (v4.15 - Nov 19)\r\n\t\tisNode : function( element ) {\r\n\t\t\tvar exists = false;\r\n\r\n\t\t\tif ( element && element !== null && element.nodeType === Node.ELEMENT_NODE ) {\r\n\t\t\t\texists = true;\r\n\t\t\t}\r\n\t\t\treturn exists;\r\n\t\t},\r\n\r\n\t\t// Check if the content of an element has overflown its bounding box (v4.13 - Sep 19)\r\n\t\tisOverflown : function( element, axis ) {\r\n\t\t\tvar hasOverflown = false;\r\n\r\n\t\t\tif ( axis === 'y' ) {\r\n\t\t\t\thasOverflown = element.scrollHeight > element.clientHeight + 1;\r\n\t\t\t} else if ( axis === 'x' ) {\r\n\t\t\t\thasOverflown = element.scrollWidth > element.clientWidth + 1;\r\n\t\t\t} else {\r\n\t\t\t\thasOverflown = element.scrollHeight > element.clientHeight + 1 || element.scrollWidth > element.clientWidth + 1;\r\n\t\t\t}\r\n\t\t\treturn hasOverflown;\r\n\t\t},\r\n\r\n\t\t// Check if an element is visible (v4.13 - Sep 19)\r\n\t\tisVisible : function( element ) {\r\n\t\t\tvar testHidden = ( element.offsetWidth === 0 && element.offsetHeight === 0 ) || window.getComputedStyle( element ).display === 'none';\r\n\t\t\treturn !testHidden;\r\n\t\t},\r\n\r\n\t\t// Create a random ID (copied from utility.js) (v4.13 - Sep 19)\r\n\t\tmakeId : function( prefix ) {\r\n\t\t\tvar newID = '',\r\n\t\t\t\tposs = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',\r\n\t\t\t\tpossLength = poss.length,\r\n\t\t\t\ti;\r\n\r\n\t\t\tfor ( i = 0; i < 5; i++ ) {\r\n\t\t\t\tnewID += poss.charAt( Math.floor( Math.random() * possLength ) );\r\n\t\t\t}\r\n\r\n\t\t\treturn ( prefix ? prefix : '' ) + newID;\r\n\t\t},\r\n\r\n\t\t// Find elements with a matching selector (v4.13 - Sep 19)\r\n\t\tmatches : function( element, selector ) {\r\n\t\t\tvar instance = this,\r\n\t\t\t\tresult = false;\r\n\r\n\t\t\tif ( instance.isNode( element ) ) {\r\n\t\t\t\t// eslint-disable-next-line max-len\r\n\t\t\t\tresult = ( element.matches || element.matchesSelector || element.msMatchesSelector || element.mozMatchesSelector || element.webkitMatchesSelector || element.oMatchesSelector ).call( element, selector );\r\n\t\t\t}\r\n\t\t\treturn result;\r\n\t\t},\r\n\r\n\t\t// Find an element's position (v4.13 - Sep 19)\r\n\t\toffset : function( element ) {\r\n\t\t\tvar rect = element.getBoundingClientRect();\r\n\r\n\t\t\treturn {\r\n\t\t\t\ttop : rect.top + window.pageYOffset,\r\n\t\t\t\tleft : rect.left + window.pageXOffset,\r\n\t\t\t};\r\n\t\t},\r\n\r\n\t\t// Get an element's total outer height (including margins etc) (v4.13 - Sep 19)\r\n\t\touterHeightTrue : function( element ) {\r\n\t\t\tvar height = element.offsetHeight,\r\n\t\t\t\tstyle = getComputedStyle( element );\r\n\r\n\t\t\theight += Number.parseInt( style.marginTop, 10 ) + Number.parseInt( style.marginBottom, 10 );\r\n\t\t\treturn height;\r\n\t\t},\r\n\r\n\t\t// Get an element's total outer width (including margins etc) (v4.13 - Sep 19)\r\n\t\touterWidthTrue : function( element ) {\r\n\t\t\tvar width = element.offsetWidth,\r\n\t\t\t\tstyle = getComputedStyle( element );\r\n\r\n\t\t\twidth += Number.parseInt( style.marginLeft, 10 ) + Number.parseInt( style.marginRight, 10 );\r\n\t\t\treturn width;\r\n\t\t},\r\n\r\n\t\t// Return an array of an element's parents (v4.13 - Sep 19)\r\n\t\tparents : function( element, customSelector ) {\r\n\t\t\tvar elements = [],\r\n\t\t\t\tselector = customSelector || '*',\r\n\t\t\t\tcurrentEl = element.parentNode;\r\n\r\n\t\t\twhile ( currentEl.parentNode ) {\r\n\t\t\t\tif ( currentEl.matches( selector ) ) {\r\n\t\t\t\t\telements.push( currentEl );\r\n\t\t\t\t}\r\n\t\t\t\tcurrentEl = currentEl.parentNode;\r\n\t\t\t}\r\n\t\t\treturn elements;\r\n\t\t},\r\n\r\n\t\t// Find all links with a specific selector and run specified function on them (v4.13 - Sep 19)\r\n\t\tprocessInPageLinks : function( selector, linkFunction ) {\r\n\t\t\tdocument.querySelectorAll( '[href*=\"#\"]' + selector ).forEach( function loop( element ) {\r\n\t\t\t\tif ( window.location.pathname === element.pathname && window.location.host === element.host ) {\r\n\t\t\t\t\tlinkFunction( element );\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\t// Remove specified class to an element (v4.13 - Sep 19)\r\n\t\tremoveClass : function( element, classNames ) {\r\n\t\t\tvar classes;\r\n\r\n\t\t\tif ( element && element.classList ) {\r\n\t\t\t\tclasses = classNames.split( ' ' );\r\n\t\t\t\tclasses.forEach( function loop( className ) {\r\n\t\t\t\t\tif ( className ) {\r\n\t\t\t\t\t\telement.classList.remove( className );\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t// Remove measurement suffixes (v4.13 - Sep 19)\r\n\t\tremoveMeasurementSuffix : function( value, noAuto ) {\r\n\t\t\tvar newValue = value;\r\n\r\n\t\t\tif ( typeof newValue === 'string' ) {\r\n\t\t\t\tif ( value === 'auto' && !noAuto ) {\r\n\t\t\t\t\tnewValue = 'auto'; // Starting value is auto, number not being forced\r\n\t\t\t\t} else {\r\n\t\t\t\t\tnewValue = newValue.replace( /q|mm|cm|in|pt|pc|px|em|ex|ch|rem|vw|vh|deg|%/g, '' ); // Remove valid css measurements such as px, em etc\r\n\t\t\t\t\tnewValue = Number.parseFloat( newValue, 10 );\r\n\t\t\t\t\tif ( Number.isNaN( newValue ) ) { // New value is NaN despite suffix removal\r\n\t\t\t\t\t\tnewValue = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else if ( typeof newValue === 'number' ) {\r\n\t\t\t\tnewValue = value; // Do nothing - starting value is already a number\r\n\t\t\t} else {\r\n\t\t\t\tnewValue = 0; // Any other random case\r\n\t\t\t}\r\n\t\t\treturn newValue;\r\n\t\t},\r\n\r\n\t\t// Reset styles on an element (v4.15 - Oct 19)\r\n\t\tresetStyles : function( element, styleList ) {\r\n\t\t\tvar convertedKey;\r\n\t\t\tObject.keys( styleList ).forEach( function loop( key ) {\r\n\t\t\t\tif ( styleList[ key ] === null || styleList[ key ] === '' ) {\r\n\t\t\t\t\tconvertedKey = key.replace( /[A-Z]/g, function regexFn( match ) {\r\n\t\t\t\t\t\treturn '-' + match.toLowerCase();\r\n\t\t\t\t\t});\r\n\t\t\t\t\telement.style.removeProperty( convertedKey );\r\n\t\t\t\t} else {\r\n\t\t\t\t\telement.style[ key ] = styleList[ key ];\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\t// Load content from specified url/anchor into an element (v4.13 - Sep 19)\r\n\t\trequestLoadInto : function( element, href, responseCallback ) {\r\n\t\t\tvar instance = this,\r\n\t\t\t\tbodyRegex = /([\\s\\S]*)<\\/body>/,\r\n\t\t\t\tid = href.match( instance.urlAnchorRegExp ),\r\n\t\t\t\trequestUrl = href,\r\n\t\t\t\trequest = new XMLHttpRequest(),\r\n\t\t\t\ttempUrl;\r\n\r\n\t\t\tif ( id && id[ 0 ] ) {\r\n\t\t\t\tid = id[ 0 ];\r\n\t\t\t\trequestUrl = href.replace( id, '' );\r\n\t\t\t\trequestUrl = href.replace( ' ', '' );\r\n\t\t\t}\r\n\t\t\t// If there is a space in the url then split and use the later part as the selector\r\n\t\t\tif ( requestUrl.indexOf( ' ' ) !== -1 ) {\r\n\t\t\t\ttempUrl = requestUrl.split( ' ' );\r\n\t\t\t\trequestUrl = tempUrl[ 0 ];\r\n\t\t\t\tid = tempUrl[ 1 ];\r\n\t\t\t}\r\n\r\n\t\t\t// If the url supplied does not start with // or the protocol then add the current path origin\r\n\t\t\tif ( !requestUrl.match( /^((\\/\\/)|(http))/ ) ) {\r\n\t\t\t\trequestUrl = window.location.origin + requestUrl;\r\n\t\t\t}\r\n\r\n\t\t\trequest.open( 'GET', requestUrl, true );\r\n\t\t\trequest.onload = function onload() {\r\n\t\t\t\tvar tempEl,\r\n\t\t\t\t\telContent;\r\n\r\n\t\t\t\tif ( request.status >= 200 && request.status < 400 ) {\r\n\t\t\t\t\ttempEl = document.createElement( 'div' );\r\n\t\t\t\t\ttempEl.innerHTML = request.responseText;\r\n\r\n\t\t\t\t\tif ( id ) {\r\n\t\t\t\t\t\telContent = tempEl.querySelector( id );\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( elContent ) {\r\n\t\t\t\t\t\telement.innerHTML = elContent.outerHTML;\r\n\t\t\t\t\t} else if ( request.responseText.indexOf( '' ) && request.responseText.indexOf( '' ) > 0 ) {\r\n\t\t\t\t\t\t// If there was not valid ID given then make sure only the body of any page passed in is injected into the page\r\n\t\t\t\t\t\telement.innerHTML = bodyRegex.exec( request.responseText )[ 1 ];\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\telement.innerHTML = request.responseText;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif ( responseCallback ) {\r\n\t\t\t\t\tresponseCallback( request.responseText, request.status );\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\trequest.send();\r\n\t\t},\r\n\r\n\t\t// Find an element's parent for scrolling purposes (v4.13 - Sep 19)\r\n\t\tscrollParent : function( element, includeHidden ) {\r\n\t\t\tvar style = getComputedStyle( element ),\r\n\t\t\t\texcludeStaticParent = style.position === 'absolute',\r\n\t\t\t\toverflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,\r\n\t\t\t\tparent;\r\n\r\n\t\t\tif ( style.position === 'fixed' ) {\r\n\t\t\t\treturn document.body;\r\n\t\t\t}\r\n\r\n\t\t\t// eslint-disable-next-line no-cond-assign\r\n\t\t\tfor ( parent = element; ( parent = parent.parentElement ); ) {\r\n\t\t\t\tstyle = getComputedStyle( parent );\r\n\t\t\t\tif ( excludeStaticParent && style.position === 'static' ) {\r\n\t\t\t\t\t// Do nothing\r\n\t\t\t\t} else if ( overflowRegex.test( style.overflow + style.overflowY + style.overflowX ) ) {\r\n\t\t\t\t\treturn parent;\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// Do nothing\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn document.body;\r\n\t\t},\r\n\r\n\t\t// Allow daisychaining to set multiple attributes in one go, eg setAtrributes( el, { href : '#', class : 'whatever' } ); (v4.13 - Sep 19)\r\n\t\tsetAttributes : function( element, attrs ) {\r\n\t\t\tObject.keys( attrs ).forEach( function loop( key ) {\r\n\t\t\t\telement.setAttribute( key, attrs[ key ] );\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\t// Find all sibling elements / sibling elements (with a particular selector if specified) (v4.13 - Sep 19)\r\n\t\tsiblings : function( element, selector ) {\r\n\t\t\tvar siblingsArr = [],\r\n\t\t\t\tinstance = this;\r\n\r\n\t\t\tsiblingsArr = Array.prototype.filter.call( element.parentNode.children, function loop( child ) {\r\n\t\t\t\tvar isSibling = false;\r\n\t\t\t\tif ( child === element ) {\r\n\t\t\t\t\t// Do nothing\r\n\t\t\t\t} else if ( typeof selector === 'undefined' || instance.matches( child, selector ) ) {\r\n\t\t\t\t\tisSibling = true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// Do nothing\r\n\t\t\t\t}\r\n\t\t\t\treturn isSibling;\r\n\t\t\t});\r\n\r\n\t\t\treturn siblingsArr;\r\n\t\t},\r\n\r\n\t\t/*\r\n\t\t * Vanilla JS replacement for jQuery's slideUp / slideDown / slideToggle functions (v4.13 - Sep 19)\r\n\t\t * eg: element.slideToggle( target element, animation duration (in ms), { options } );\r\n\t\t */\r\n\t\tslideToggle : function( element, duration, options ) { // eslint-disable-line complexity\r\n\t\t\tvar instance = this,\r\n\t\t\t\ttiming = ( duration / 1000 ) + 's',\r\n\t\t\t\ttoggleOptions = {\r\n\t\t\t\t\tvariant : 'toggle', // ...down/up/toggle - default toggle\r\n\t\t\t\t\toverlapMargin : false, // ...boolean - default false\r\n\t\t\t\t\tcustomStartHeight : null, // ...number - default null\r\n\t\t\t\t\tcustomEndHeight : null, // ...number - default null\r\n\t\t\t\t\tdisplay : 'block', // ...block/grid/flex - default block\r\n\t\t\t\t\tminFade : 0, // ...number - default 0\r\n\t\t\t\t\tmaxFade : 1, // ...number - default 1\r\n\t\t\t\t\tfade : false, // ...boolean - default false\r\n\t\t\t\t\tcallback : function() {\r\n\t\t\t\t\t\t// Do nothing\r\n\t\t\t\t\t},\r\n\t\t\t\t},\r\n\t\t\t\toverlap = 0, // Default if no overlap;\r\n\t\t\t\tnextStyles,\r\n\t\t\t\tstartHeight,\r\n\t\t\t\telStyles,\r\n\t\t\t\tstartPaddingBottom,\r\n\t\t\t\tstartPaddingTop,\r\n\t\t\t\tbaseHeight,\r\n\t\t\t\tinitialHeight;\r\n\r\n\t\t\t// Only run if animation is not progress\r\n\t\t\tif ( instance.isNode( element ) && !element.classList.contains( 'is-animating' ) ) {\r\n\t\t\t\telStyles = window.getComputedStyle( element );\r\n\t\t\t\tstartPaddingBottom = instance.removeMeasurementSuffix( elStyles.paddingBottom, true );\r\n\t\t\t\tstartPaddingTop = instance.removeMeasurementSuffix( elStyles.paddingTop, true );\r\n\r\n\t\t\t\t// If options have been set update the default ones\r\n\t\t\t\ttoggleOptions = instance.extend({}, toggleOptions, options );\r\n\r\n\t\t\t\ttoggleOptions.savedStyles = {\r\n\t\t\t\t\theight : element.style.height,\r\n\t\t\t\t\tmarginBottom : element.style.marginBottom,\r\n\t\t\t\t\tmarginTop : element.style.marginTop,\r\n\t\t\t\t\tmaxHeight : element.style.maxHeight,\r\n\t\t\t\t\topacity : element.style.opacity,\r\n\t\t\t\t\toverflow : element.style.overflow,\r\n\t\t\t\t\toverflowX : element.style.overflowX,\r\n\t\t\t\t\toverflowY : element.style.overflowY,\r\n\t\t\t\t\tpaddingBottom : element.style.paddingBottom,\r\n\t\t\t\t\tpaddingTop : element.style.paddingTop,\r\n\t\t\t\t\ttransition : element.style.transition,\r\n\t\t\t\t};\r\n\r\n\t\t\t\t/*\r\n\t\t\t\t * To avoid jumping at start/end of transitions caused by overflow-y: hidden, get next sibling's top\r\n\t\t\t\t * margin ready take that into consideration when calculating initial height\r\n\t\t\t\t * Set parameter to 'overlapMargin' to true to use (false with 'overlap = 0' by default)\r\n\t\t\t\t */\r\n\t\t\t\tif ( toggleOptions.overlapMargin && element.nextElementSibling ) {\r\n\t\t\t\t\tnextStyles = window.getComputedStyle( element.nextElementSibling );\r\n\t\t\t\t\toverlap = instance.removeMeasurementSuffix( nextStyles.marginTop, true );\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Get computed height of element plus any overlapping top margins from next sibling\r\n\t\t\t\tif ( toggleOptions.customStartHeight === null ) {\r\n\t\t\t\t\tstartHeight = instance.addMeasurements( [ instance.removeMeasurementSuffix( element.offsetHeight ), overlap ] );\r\n\t\t\t\t} else {\r\n\t\t\t\t\tstartHeight = toggleOptions.customStartHeight;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// If previously hidden, show element again before doing any animations\r\n\t\t\t\tif ( elStyles.display === 'none' ) {\r\n\t\t\t\t\telement.style.display = toggleOptions.display;\r\n\t\t\t\t\telement.style.paddingBottom = 0;\r\n\t\t\t\t\telement.style.paddingTop = 0;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t/*\r\n\t\t\t\t * Initial height without margins - needs setting specifically for setTimeout function as el.offsetHeight\r\n\t\t\t\t * is modified in the 10ms before it runs and can return value including overlapping margins\r\n\t\t\t\t * Set height to auto and get computed height of element less any overlapping top margins from next sibling\r\n\t\t\t\t */\r\n\t\t\t\telement.style.height = 'auto';\r\n\t\t\t\tbaseHeight = instance.removeMeasurementSuffix( elStyles.height );\r\n\t\t\t\tinitialHeight = instance.subtractMeasurements( [ baseHeight, overlap ] );\r\n\r\n\t\t\t\tif ( toggleOptions.fade && ( toggleOptions.variant === 'down' || ( toggleOptions.variant === 'toggle' && startHeight === 0 ) ) ) {\r\n\t\t\t\t\telement.style.opacity = toggleOptions.minFade;\r\n\t\t\t\t} else {\r\n\t\t\t\t\telement.style.opacity = toggleOptions.maxFade;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// After calculations, set element height to start height, hide overflow for duration of transition, and add transition css\r\n\t\t\t\telement.style.height = instance.convertToPx( startHeight );\r\n\t\t\t\telement.style.maxHeight = instance.convertToPx( startHeight );\r\n\t\t\t\telement.style.overflow = 'hidden';\r\n\t\t\t\telement.style.overflowX = 'hidden';\r\n\t\t\t\telement.style.overflowY = 'hidden';\r\n\t\t\t\telement.style.transition = 'all ' + timing + ' ease-in-out';\r\n\r\n\t\t\t\tsetTimeout( function timeoutFn() {\r\n\t\t\t\t\tif ( toggleOptions.variant === 'down' ) {\r\n\t\t\t\t\t\telement.classList.add( 'is-animating' );\r\n\t\t\t\t\t\tinstance.slideDown( element, duration, toggleOptions, {\r\n\t\t\t\t\t\t\tinitialHeight : initialHeight,\r\n\t\t\t\t\t\t\tstartPaddingBottom : startPaddingBottom,\r\n\t\t\t\t\t\t\tstartPaddingTop : startPaddingTop,\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} else if ( toggleOptions.variant === 'up' ) {\r\n\t\t\t\t\t\telement.classList.add( 'is-animating' );\r\n\t\t\t\t\t\tinstance.slideUp( element, duration, toggleOptions );\r\n\t\t\t\t\t} else if ( toggleOptions.variant === 'toggle' ) {\r\n\t\t\t\t\t\telement.classList.add( 'is-animating' );\r\n\t\t\t\t\t\tif ( startHeight === 0 ) {\r\n\t\t\t\t\t\t\tinstance.slideDown( element, duration, toggleOptions, {\r\n\t\t\t\t\t\t\t\tinitialHeight : initialHeight,\r\n\t\t\t\t\t\t\t\tstartPaddingBottom : startPaddingBottom,\r\n\t\t\t\t\t\t\t\tstartPaddingTop : startPaddingTop,\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tinstance.slideUp( element, duration, toggleOptions );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t// Error, as one of the above should apply, reset any styles\r\n\t\t\t\t\t\tinstance.resetStyles( element, toggleOptions.savedStyles );\r\n\t\t\t\t\t}\r\n\t\t\t\t}, 20 );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t// Slide up function - slideToggle variant only (v4.13 - Sep 19)\r\n\t\tslideUp : function( element, duration, toggleOptions ) {\r\n\t\t\tvar instance = this,\r\n\t\t\t\tendHeight = toggleOptions.customEndHeight || 0;\r\n\r\n\t\t\tif ( instance.isNode( element ) ) {\r\n\t\t\t\telement.style.maxHeight = instance.convertToPx( endHeight );\r\n\t\t\t\telement.style.height = instance.convertToPx( endHeight );\r\n\t\t\t\telement.style.marginBottom = 0;\r\n\t\t\t\telement.style.marginTop = 0;\r\n\t\t\t\telement.style.paddingBottom = 0;\r\n\t\t\t\telement.style.paddingTop = 0;\r\n\t\t\t\tif ( toggleOptions.fade ) {\r\n\t\t\t\t\telement.style.opacity = toggleOptions.minFade;\r\n\t\t\t\t\ttoggleOptions.savedStyles.opacity = toggleOptions.minFade;\r\n\t\t\t\t}\r\n\t\t\t\tsetTimeout( function timeoutFn() {\r\n\t\t\t\t\tvar hide = false;\r\n\t\t\t\t\tif ( element.style.height === '0px' || element.style.height === 0 ) {\r\n\t\t\t\t\t\thide = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telement.classList.remove( 'is-animating' );\r\n\t\t\t\t\tif ( toggleOptions.savedStyles ) {\r\n\t\t\t\t\t\tinstance.resetStyles( element, toggleOptions.savedStyles );\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( hide ) {\r\n\t\t\t\t\t\telement.style.display = 'none';\r\n\t\t\t\t\t\telement.setAttribute( 'aria-hidden', 'true' );\r\n\t\t\t\t\t}\r\n\t\t\t\t\ttoggleOptions.callback();\r\n\t\t\t\t}, duration );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t// Slide down function - slideToggle variant only (v4.13 - Sep 19)\r\n\t\tslideDown : function( element, duration, toggleOptions, options ) {\r\n\t\t\tvar instance = this,\r\n\t\t\t\tendHeight = instance.addMeasurements( [ options.initialHeight, options.startPaddingTop, options.startPaddingBottom ] );\r\n\r\n\t\t\tif ( instance.isNode( element ) ) {\r\n\t\t\t\tif ( toggleOptions.customEndHeight !== null ) {\r\n\t\t\t\t\tendHeight = toggleOptions.customEndHeight;\r\n\t\t\t\t}\r\n\t\t\t\tif ( endHeight === 'auto' ) {\r\n\t\t\t\t\telement.style.maxHeight = '4000px';\r\n\t\t\t\t} else {\r\n\t\t\t\t\telement.style.maxHeight = instance.convertToPx( endHeight );\r\n\t\t\t\t}\r\n\t\t\t\telement.style.height = instance.convertToPx( endHeight );\r\n\t\t\t\telement.style.paddingBottom = instance.convertToPx( options.startPaddingBottom );\r\n\t\t\t\telement.style.paddingTop = instance.convertToPx( options.startPaddingTop );\r\n\t\t\t\tif ( toggleOptions.fade ) {\r\n\t\t\t\t\telement.style.opacity = toggleOptions.maxFade;\r\n\t\t\t\t\ttoggleOptions.savedStyles.opacity = toggleOptions.maxFade;\r\n\t\t\t\t}\r\n\t\t\t\tsetTimeout( function timeoutFn() {\r\n\t\t\t\t\telement.classList.remove( 'is-animating' );\r\n\t\t\t\t\tif ( toggleOptions.savedStyles ) {\r\n\t\t\t\t\t\tinstance.resetStyles( element, toggleOptions.savedStyles );\r\n\t\t\t\t\t}\r\n\t\t\t\t\telement.style.display = toggleOptions.display;\r\n\t\t\t\t\telement.setAttribute( 'aria-hidden', 'false' );\r\n\t\t\t\t\ttoggleOptions.callback();\r\n\t\t\t\t}, duration );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t// Smooth scroll to position (v4.13 - Sep 19)\r\n\t\t// eslint-disable-next-line complexity\r\n\t\tsmoothScroll : function( xCoord, yCoord, animationTime, scrollArea, callback ) {\r\n\t\t\tvar smoothScrollSupported = 'scrollBehavior' in document.documentElement.style && document.documentElement.style.scrollBehavior !== 'auto',\r\n\t\t\t\tnewAnimationTime = animationTime,\r\n\t\t\t\tscrollTop,\r\n\t\t\t\tscrollLeft,\r\n\t\t\t\tdistanceTop,\r\n\t\t\t\tdistanceLeft,\r\n\t\t\t\tinstance = this,\r\n\t\t\t\tscrollableArea = scrollArea,\r\n\t\t\t\tscrollCompleteFunction,\r\n\t\t\t\tscrollTimeout;\r\n\r\n\t\t\t// If no scollable area is provide scroll the window\r\n\t\t\tif ( !scrollableArea || typeof scrollableArea === 'undefined' ) {\r\n\t\t\t\tscrollableArea = window;\r\n\t\t\t}\r\n\r\n\t\t\t// If not animation time was set, set to 350ms\r\n\t\t\tif ( typeof newAnimationTime !== 'number' ) {\r\n\t\t\t\tnewAnimationTime = FRAMEWORK.timings.current.t350ms;\r\n\t\t\t}\r\n\r\n\t\t\tif ( FRAMEWORK.animation && smoothScrollSupported && newAnimationTime > 0 ) {\r\n\t\t\t\t// Only setup the listener if there is a callback function\r\n\t\t\t\tif ( callback && typeof callback === 'function' ) {\r\n\t\t\t\t\tscrollCompleteFunction = function() {\r\n\t\t\t\t\t\tif ( scrollableArea === window ) {\r\n\t\t\t\t\t\t\t// If native smooth scrolling is not supported then implement a basic version\r\n\t\t\t\t\t\t\tscrollTop = Math.ceil( ( window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop ) / 10 ) * 10;\r\n\t\t\t\t\t\t\tscrollLeft = Math.ceil( ( window.pageXOffset || document.body.scrollLeft || document.documentElement.scrollLeft ) / 10 ) * 10;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tscrollTop = Math.ceil( scrollableArea.scrollTop / 10 ) * 10;\r\n\t\t\t\t\t\t\tscrollLeft = Math.ceil( scrollableArea.scrollLeft / 10 ) * 10;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif ( instance.inRange( scrollLeft, xCoord, 10, true ) && instance.inRange( scrollTop, yCoord, 10, true ) ) {\r\n\t\t\t\t\t\t\tscrollableArea.removeEventListener( 'scroll', scrollCompleteFunction );\r\n\t\t\t\t\t\t\tclearTimeout( scrollTimeout );\r\n\t\t\t\t\t\t\tcallback();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tscrollableArea.addEventListener( 'scroll', scrollCompleteFunction );\r\n\t\t\t\t\tscrollCompleteFunction();\r\n\r\n\t\t\t\t\t// Set a scroll timeout incase you can't scroll to the requested position so it never gets within range\r\n\t\t\t\t\tscrollTimeout = setTimeout( function timeoutFn() {\r\n\t\t\t\t\t\tscrollableArea.removeEventListener( 'scroll', scrollCompleteFunction );\r\n\t\t\t\t\t\tcallback();\r\n\t\t\t\t\t}, 1000 ); // Set to 1 second to allow for the browser native scroll speed\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// If native smooth scrolling is supported use that\r\n\t\t\t\tscrollableArea.scrollTo({\r\n\t\t\t\t\tbehavior : 'smooth',\r\n\t\t\t\t\tleft : xCoord,\r\n\t\t\t\t\ttop : yCoord,\r\n\t\t\t\t});\r\n\t\t\t} else if ( FRAMEWORK.animation && newAnimationTime > 0 ) {\r\n\t\t\t\tif ( scrollableArea === window ) {\r\n\t\t\t\t\t// If native smooth scrolling is not supported then implement a basic version\r\n\t\t\t\t\tscrollTop = window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop;\r\n\t\t\t\t\tscrollLeft = window.pageXOffset || document.body.scrollLeft || document.documentElement.scrollLeft;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tscrollTop = scrollableArea.scrollTop;\r\n\t\t\t\t\tscrollLeft = scrollableArea.scrollLeft;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tdistanceTop = ( yCoord - scrollTop ) / ( newAnimationTime / 10 );\r\n\t\t\t\tdistanceLeft = ( xCoord - scrollLeft ) / ( newAnimationTime / 10 );\r\n\r\n\t\t\t\tscrollTop += distanceTop;\r\n\t\t\t\tscrollLeft += distanceLeft;\r\n\t\t\t\tnewAnimationTime -= 10;\r\n\r\n\t\t\t\tscrollableArea.scrollTo( scrollLeft, scrollTop ); // Scrolling to 1/35 of desired left/top location; reruns until animation time hits 0.\r\n\t\t\t\tif ( newAnimationTime <= 0 || ( distanceTop === 0 && distanceLeft === 0 ) ) {\r\n\t\t\t\t\tif ( callback && typeof callback === 'function' ) {\r\n\t\t\t\t\t\tcallback();\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsetTimeout( function timeoutFn() {\r\n\t\t\t\t\t\tinstance.smoothScroll( xCoord, yCoord, newAnimationTime, scrollableArea, callback );\r\n\t\t\t\t\t}, 10 );\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\t// If no animation allowed just move to coords\r\n\t\t\t\tscrollableArea.scrollTo( xCoord, yCoord );\r\n\t\t\t\tif ( callback && typeof callback === 'function' ) {\r\n\t\t\t\t\tcallback();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t// Get remainder from subtracted measurements in an array (v4.13 - Sep 19)\r\n\t\tsubtractMeasurements : function( measurementArray ) {\r\n\t\t\tvar instance = this,\r\n\t\t\t\tmeasurement = 0,\r\n\t\t\t\ti;\r\n\r\n\t\t\tfor ( i = 0; i < measurementArray.length; i++ ) {\r\n\t\t\t\tif ( typeof measurementArray[ i ] !== 'number' ) {\r\n\t\t\t\t\tmeasurementArray[ i ] = instance.removeMeasurementSuffix( measurementArray[ i ] ); // Value is NaN, so attempt to convert beore continuing\r\n\t\t\t\t}\r\n\t\t\t\tif ( i === 0 && typeof measurementArray[ i ] === 'number' ) {\r\n\t\t\t\t\tmeasurement = measurementArray[ i ];\r\n\t\t\t\t} else if ( typeof measurementArray[ i ] === 'number' ) {\r\n\t\t\t\t\tmeasurement -= measurementArray[ i ]; // Value is a number, so subtract it from current total\r\n\t\t\t\t} else {\r\n\t\t\t\t\tmeasurement = 'auto'; // Value is set to auto (so don't change it), or something else entirely (so set to auto rather than failing completely)...\r\n\t\t\t\t\ti = measurementArray.length; // ... then set count to be complete so no more subtractions are run\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn measurement;\r\n\t\t},\r\n\r\n\t\t// Unwrap child nodes from element and remove original element (v5.7 - Apr 21 - updated to remove text nodes)\r\n\t\tunwrap : function( element ) {\r\n\t\t\tvar parent = element.parentNode;\r\n\r\n\t\t\twhile ( element.firstChild ) {\r\n\t\t\t\tif ( element.firstChild.nodeType === Node.TEXT_NODE ) {\r\n\t\t\t\t\telement.firstChild.remove();\r\n\t\t\t\t} else {\r\n\t\t\t\t\telement.insertAdjacentElement( 'beforebegin', element.firstChild );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tparent.removeChild( element );\r\n\t\t},\r\n\r\n\t\t// Update browser history (v4.13 - Sep 19)\r\n\t\tupdateHistory : function( anchor ) {\r\n\t\t\tvar instance = this,\r\n\t\t\t\tcurrentUrl;\r\n\r\n\t\t\tif ( window.history.replaceState ) {\r\n\t\t\t\t/*\r\n\t\t\t\t * Check that either there is no anchor on the url and that the anchor has no special characters before replacing\r\n\t\t\t\t * This stops issues between some systems which use these for state management\r\n\t\t\t\t */\r\n\t\t\t\tcurrentUrl = instance.getAnchor();\r\n\t\t\t\tif ( currentUrl !== null ) {\r\n\t\t\t\t\twindow.history.replaceState( null, null, anchor );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t// Wrap element with a new one (v4.13 - Sep 19)\r\n\t\twrap : function( element, wrappingElement ) {\r\n\t\t\tvar wrapper = wrappingElement || document.createElement( 'div' );\r\n\r\n\t\t\telement.parentNode.insertBefore( wrapper, element );\r\n\t\t\treturn wrapper.appendChild( element );\r\n\t\t},\r\n\r\n\t\t// Wrap the children of an element within a single new child element (v4.13 - Sep 19)\r\n\t\twrapInner : function( parent, wrapper, className ) {\r\n\t\t\tvar instance = this,\r\n\t\t\t\tcontentWrapper = wrapper;\r\n\r\n\t\t\tif ( typeof contentWrapper === 'string' ) {\r\n\t\t\t\tcontentWrapper = document.createElement( wrapper );\r\n\t\t\t}\r\n\r\n\t\t\tif ( className ) {\r\n\t\t\t\tinstance.addClass( contentWrapper, className );\r\n\t\t\t}\r\n\r\n\t\t\tparent.appendChild( contentWrapper );\r\n\t\t\twhile ( parent.firstChild !== contentWrapper ) {\r\n\t\t\t\tcontentWrapper.appendChild( parent.firstChild );\r\n\t\t\t}\r\n\t\t},\r\n\t};\r\n});\r\n"]}