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