{"version":3,"sources":["blocks/m-showhide.js"],"names":["define","utility","mShowhideFn","defaults","expand","FRAMEWORK","locale","settings","mShowHide","contract","init","elm","classList","add","mShowhide","extend","getData","Array","allControls","controls","filter","controlEl","closest","forEach","controlLink","controlState","controlId","getAttribute","autoId","controlDesc","indexOf","document","querySelector","wrapInner","htmlStringToElement","contextHelpElm","wrap","contains","textContent","setAttributes","nextElementSibling","style","type","aria-controls","aria-expanded","id","aria-hidden","display","remove","Object","keys","dataset","key","keyString","tempArr","match","join","toLowerCase","showHideHeading","removeAttribute","toggleSelection","targetId","closeAll","controlBtn","children","moveTo","scrollTo","parentsList","parents","open","parentEl","scrollParent","openAll","offsetTop","newSettings","openSection","thisHref","targetElm","tempElm","controlsClick","sectionContentElm","href","openedSection","sectionHeadingElm","setAttribute","previousElementSibling","querySelectorAll","loop","otherControls","currentAnchor","parentId","updateHistory","anchor","stateSpan","toggleVariant","descState","parentNode","window","config","accordion","getBreakpoint","filterControlEl","innerLoop","otherControlEl","slideToggle","timings","current","t500ms","variant","callback","scrollToElm","thisOffset","trigger","smallTag","matches","getAnchor","t350ms","preventDefault","element","hasAttribute","isArray","thisControl","e","addEventListener","target","urlAnchorRegExp","length","initInstance"],"mappings":"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","file":"blocks/m-showhide.js","sourcesContent":["// eslint-disable-next-line max-lines-per-function\r\ndefine( [ 'utility' ], function run( utility ) {\r\n\t'use strict';\r\n\r\n\tvar mShowhideFn = {\r\n\r\n\t\t// Default settings\r\n\t\tdefaults : {\r\n\t\t\texpand : FRAMEWORK.locale.settings.mShowHide.expand,\r\n\t\t\tcontract : FRAMEWORK.locale.settings.mShowHide.contract,\r\n\t\t},\r\n\r\n\t\tinit : function( elm ) {\r\n\t\t\tif ( !elm.classList.contains( 'js-m-showhide' ) ) {\r\n\t\t\t\telm.classList.add( 'js-m-showhide' );\r\n\r\n\t\t\t\telm.mShowhide = {}; // Setup mShowhide object\r\n\r\n\t\t\t\t// Get config data\r\n\t\t\t\telm.mShowhide.config = utility.getData( elm );\r\n\r\n\t\t\t\telm.mShowhide.settings = utility.extend({}, mShowhideFn.defaults, utility.getData( elm ) );\r\n\r\n\t\t\t\t// Find all control element in the page\r\n\t\t\t\telm.mShowhide.allControls = Array.from( document.querySelectorAll( '.m-showhide__heading' ) );\r\n\t\t\t\t// Get control elements which are not in a child showhide\r\n\t\t\t\telm.mShowhide.controls = elm.mShowhide.allControls.filter( function filterFn( controlEl ) {\r\n\t\t\t\t\treturn controlEl.closest( '.m-showhide' ) === elm;\r\n\t\t\t\t});\r\n\r\n\t\t\t\t// Hide content elements\r\n\t\t\t\telm.mShowhide.controls.forEach( function loop( controlEl ) {\r\n\t\t\t\t\tvar controlId = controlEl.getAttribute( 'id' ),\r\n\t\t\t\t\t\tautoId = 'term' + elm.mShowhide.allControls.indexOf( controlEl ),\r\n\t\t\t\t\t\tcontrolLink,\r\n\t\t\t\t\t\tcontrolDesc,\r\n\t\t\t\t\t\tcontrolState,\r\n\t\t\t\t\t\tcontextHelpElm;\r\n\r\n\t\t\t\t\t// If the id already exists create a trully random one\r\n\t\t\t\t\tif ( document.querySelector( '#' + autoId ) ) {\r\n\t\t\t\t\t\tautoId = utility.makeId( 'term' );\r\n\t\t\t\t\t}\r\n\t\t\t\t\tutility.wrapInner( controlEl, 'span', 'm-showhide__control-heading' );\r\n\t\t\t\t\tutility.wrapInner( controlEl, 'button', 'm-showhide__control' );\r\n\t\t\t\t\tcontrolLink = controlEl.querySelector( '.m-showhide__control' );\r\n\t\t\t\t\t// eslint-disable-next-line max-len\r\n\t\t\t\t\tcontrolDesc = utility.htmlStringToElement( '' + elm.mShowhide.settings.expand + '' );\r\n\t\t\t\t\tcontrolLink.append( controlDesc );\r\n\t\t\t\t\tcontrolState = controlEl.querySelector( '.m-showhide__control-desc-state' );\r\n\r\n\t\t\t\t\tif ( controlId ) {\r\n\t\t\t\t\t\tautoId = controlId + '-term';\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tcontextHelpElm = controlLink.querySelector( '.a-context-help' );\r\n\t\t\t\t\tif ( contextHelpElm ) {\r\n\t\t\t\t\t\tcontrolEl.append( contextHelpElm );\r\n\t\t\t\t\t\tcontrolEl.classList.add( 'has-contextual-help' );\r\n\t\t\t\t\t\tutility.wrap( contextHelpElm, utility.htmlStringToElement( '
' ) );\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( controlEl.classList.contains( 'is-visible' ) ) {\r\n\t\t\t\t\t\tcontrolState.textContent = elm.mShowhide.settings.contract;\r\n\t\t\t\t\t\tutility.setAttributes( controlLink, {\r\n\t\t\t\t\t\t\ttype : 'button',\r\n\t\t\t\t\t\t\t'aria-controls' : autoId,\r\n\t\t\t\t\t\t\t'aria-expanded' : 'true',\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\tcontrolEl.nextElementSibling.style.display = 'block';\r\n\t\t\t\t\t\tutility.setAttributes( controlEl.nextElementSibling, {\r\n\t\t\t\t\t\t\tid : autoId,\r\n\t\t\t\t\t\t\t'aria-hidden' : 'false',\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tcontrolState.textContent = elm.mShowhide.settings.expand;\r\n\t\t\t\t\t\tutility.setAttributes( controlLink, {\r\n\t\t\t\t\t\t\ttype : 'button',\r\n\t\t\t\t\t\t\t'aria-controls' : autoId,\r\n\t\t\t\t\t\t\t'aria-expanded' : 'false',\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\tcontrolEl.nextElementSibling.style.display = 'none';\r\n\t\t\t\t\t\tutility.setAttributes( controlEl.nextElementSibling, {\r\n\t\t\t\t\t\t\tid : autoId,\r\n\t\t\t\t\t\t\t'aria-hidden' : 'true',\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Retain click tracking datasets\r\n\t\t\t\t\tif ( controlEl.classList.contains( 'dd-data-link' ) ) {\r\n\t\t\t\t\t\t// Add click tracking class to the button\r\n\t\t\t\t\t\tcontrolLink.classList.add( 'dd-data-link' );\r\n\t\t\t\t\t\t// Remove the class from the heading\r\n\t\t\t\t\t\tcontrolEl.classList.remove( 'dd-data-link' );\r\n\t\t\t\t\t\t// Get the dataset from the heading, convert back to kebab case, and add them to the button\r\n\t\t\t\t\t\tObject.keys( controlEl.dataset ).forEach( key => {\r\n\t\t\t\t\t\t\t// Fix hyphenated key names\r\n\t\t\t\t\t\t\tlet keyString = '';\r\n\t\t\t\t\t\t\t// Split data key into an array around uppercase with match if required\r\n\t\t\t\t\t\t\tlet tempArr = key.match( /[A-Za-z][a-z]+/g );\r\n\t\t\t\t\t\t\t// Concatenate and drop to lowercase - unless there is no split array in which case use key\r\n\t\t\t\t\t\t\tkeyString = tempArr === null ? keyString = key : keyString += 'data-' + tempArr.join( '-' ).toLowerCase();\r\n\t\t\t\t\t\t\t// Add the data attribute to the button\r\n\t\t\t\t\t\t\tcontrolLink.setAttribute( keyString, controlEl.dataset[ key ] );\r\n\t\t\t\t\t\t\t// Remove the data attribute from the heading\r\n\t\t\t\t\t\t\tcontrolEl.removeAttribute( keyString );\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t\telm.mShowhide.close = function close( targetId ) {\r\n\t\t\t\t\tvar showHideHeading = elm.mShowhide.controls.filter( function filterFn( controlEl ) {\r\n\t\t\t\t\t\treturn controlEl.closest( targetId ) !== null;\r\n\t\t\t\t\t});\r\n\t\t\t\t\tshowHideHeading.forEach( function loop( controlEl ) {\r\n\t\t\t\t\t\tvar controlBtn = controlEl.children[ 0 ];\r\n\t\t\t\t\t\t// If the section is open then close it\r\n\t\t\t\t\t\tif ( controlBtn.getAttribute( 'aria-expanded' ) === 'true' ) {\r\n\t\t\t\t\t\t\tmShowhideFn.toggleSelection( elm, controlBtn );\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\telm.mShowhide.closeAll = function closeAll() {\r\n\t\t\t\t\t// Loop though all the controls for the show/hide section\r\n\t\t\t\t\telm.mShowhide.controls.forEach( function loop( controlEl ) {\r\n\t\t\t\t\t\tlet controlBtn = controlEl.children[ 0 ];\r\n\t\t\t\t\t\t// If the section is open then close it\r\n\t\t\t\t\t\tif ( controlBtn.getAttribute( 'aria-expanded' ) === 'true' ) {\r\n\t\t\t\t\t\t\tmShowhideFn.toggleSelection( elm, controlBtn );\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\telm.mShowhide.open = function open( targetId, scrollTo ) {\r\n\t\t\t\t\tvar showHideHeading = elm.mShowhide.controls.filter( function filterFn( controlEl ) {\r\n\t\t\t\t\t\treturn controlEl.closest( targetId ) !== null;\r\n\t\t\t\t\t});\r\n\t\t\t\t\tshowHideHeading.forEach( function loop( controlEl ) {\r\n\t\t\t\t\t\tvar controlBtn = controlEl.children[ 0 ],\r\n\t\t\t\t\t\t\tparentsList,\r\n\t\t\t\t\t\t\tscrollParent,\r\n\t\t\t\t\t\t\tmoveTo;\r\n\r\n\t\t\t\t\t\tif ( scrollTo ) {\r\n\t\t\t\t\t\t\tparentsList = utility.parents( elm, '.m-showhide__content' );\r\n\t\t\t\t\t\t\tparentsList.forEach( function parentLoop( parentEl ) {\r\n\t\t\t\t\t\t\t\tmShowhideFn.open( elm, parentEl );\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\tmShowhideFn.openSection( elm, targetId );\r\n\r\n\t\t\t\t\t\t\tscrollParent = utility.scrollParent( controlEl );\r\n\t\t\t\t\t\t\tmoveTo = controlEl.offsetTop - scrollParent.offsetTop;\r\n\r\n\t\t\t\t\t\t\tscrollParent.scrollTo( 0, moveTo );\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tmShowhideFn.toggleSelection( elm, controlBtn, true );\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\telm.mShowhide.openAll = function openAll() {\r\n\t\t\t\t\tif ( elm.mShowhide.config.accordion ) {\r\n\t\t\t\t\t\t// Do nothing as this is an accordion show/hide so only one at a time may be opened\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\telm.mShowhide.controls.forEach( function loop( controlEl ) {\r\n\t\t\t\t\t\t\tvar controlBtn = controlEl.children[ 0 ];\r\n\r\n\t\t\t\t\t\t\tmShowhideFn.toggleSelection( elm, controlBtn, true );\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\telm.mShowhide.setSettings = function setSettings( newSettings ) {\r\n\t\t\t\t\tif ( newSettings.expand ) {\r\n\t\t\t\t\t\telm.mShowhide.settings.expand = newSettings.expand;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ( newSettings.contract ) {\r\n\t\t\t\t\t\telm.mShowhide.settings.contract = newSettings.contract;\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// Add a link to each control pointing to an id set on the following element\r\n\t\t\t\tmShowhideFn.controlsClick( elm );\r\n\t\t\t}\r\n\r\n\t\t\treturn elm.mShowhide;\r\n\t\t},\r\n\r\n\t\topenSection : function( elm, thisHref ) {\r\n\t\t\tvar href = thisHref,\r\n\t\t\t\ttargetElm,\r\n\t\t\t\ttempElm,\r\n\t\t\t\tsectionContentElm,\r\n\t\t\t\tsectionHeadingElm,\r\n\t\t\t\topenedSection = false;\r\n\r\n\t\t\tif ( thisHref.indexOf( '#' ) === 0 ) {\r\n\t\t\t\thref = '#' + CSS.escape( thisHref.substr( 1 ) );\r\n\t\t\t}\r\n\r\n\t\t\ttargetElm = elm.querySelector( href );\r\n\r\n\t\t\t// If target element exists within showhide component then carry on processing\r\n\t\t\tif ( targetElm && elm.contains( targetElm ) ) {\r\n\t\t\t\t// Loop through until you find the outer most showhide content area\r\n\t\t\t\ttempElm = targetElm.closest( '.m-showhide__content, .m-showhide__heading' );\r\n\t\t\t\twhile ( tempElm && elm.contains( tempElm ) ) {\r\n\t\t\t\t\tsectionContentElm = tempElm;\r\n\t\t\t\t\ttempElm = sectionContentElm.parentNode.closest( '.m-showhide__content, .m-showhide__heading' );\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( sectionContentElm.classList.contains( 'm-showhide__content' ) ) {\r\n\t\t\t\t\tsectionHeadingElm = sectionContentElm.previousElementSibling; // Get the showhide heading\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsectionHeadingElm = sectionContentElm; // It is the heading\r\n\t\t\t\t}\r\n\r\n\t\t\t\tmShowhideFn.toggleSelection( elm, sectionHeadingElm.querySelector( '.m-showhide__control' ), true, targetElm );\r\n\r\n\t\t\t\topenedSection = true;\r\n\t\t\t}\r\n\r\n\t\t\treturn openedSection;\r\n\t\t},\r\n\r\n\t\topen : function( elm, controlEl ) {\r\n\t\t\tcontrolEl.style.display = 'block';\r\n\t\t\tcontrolEl.setAttribute( 'aria-hidden', 'false' );\r\n\t\t\tcontrolEl.previousElementSibling.classList.add( 'is-visible' );\r\n\t\t\tcontrolEl.previousElementSibling.querySelectorAll( '.m-showhide__control' ).forEach( function loop( anchor ) {\r\n\t\t\t\tanchor.setAttribute( 'aria-expanded', 'true' );\r\n\t\t\t});\r\n\t\t\tcontrolEl.previousElementSibling.querySelectorAll( '.m-showhide__control-desc-state' ).forEach( function loop( stateSpan ) {\r\n\t\t\t\tstateSpan.textContent = elm.mShowhide.settings.contract;\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\ttoggleSelection : function( elm, currentAnchor, open, targetElm ) {\r\n\t\t\tvar parentId,\r\n\t\t\t\tparentEl,\r\n\t\t\t\tdescState,\r\n\t\t\t\totherControls,\r\n\t\t\t\ttoggleVariant = 'toggle';\r\n\r\n\t\t\tif ( !currentAnchor.classList.contains( 'is-animating' ) ) {\r\n\t\t\t\tcurrentAnchor.classList.add( 'is-animating' );\r\n\t\t\t\tparentEl = currentAnchor.parentNode;\r\n\t\t\t\tdescState = currentAnchor.querySelector( '.m-showhide__control-desc-state' );\r\n\r\n\t\t\t\tparentId = parentEl.getAttribute( 'id' );\r\n\r\n\t\t\t\tif ( parentId ) {\r\n\t\t\t\t\tutility.updateHistory( '#' + parentId );\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( parentEl.classList.contains( 'is-visible' ) && !open ) {\r\n\t\t\t\t\tparentEl.classList.remove( 'is-visible' );\r\n\t\t\t\t\tdescState.textContent = elm.mShowhide.settings.expand;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tparentEl.classList.add( 'is-visible' );\r\n\t\t\t\t\tdescState.textContent = elm.mShowhide.settings.contract;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( open ) {\r\n\t\t\t\t\ttoggleVariant = 'down';\r\n\t\t\t\t}\r\n\r\n\t\t\t\tutility.slideToggle( parentEl.nextElementSibling, FRAMEWORK.timings.current.t500ms, {\r\n\t\t\t\t\tvariant : toggleVariant,\r\n\t\t\t\t\tcallback : function() {\r\n\t\t\t\t\t\tif ( open ) {\r\n\t\t\t\t\t\t\tcurrentAnchor.setAttribute( 'aria-expanded', 'true' );\r\n\t\t\t\t\t\t\tdescState.textContent = elm.mShowhide.settings.contract;\r\n\t\t\t\t\t\t\tparentEl.nextElementSibling.setAttribute( 'aria-hidden', 'false' );\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tcurrentAnchor.setAttribute( 'aria-expanded', currentAnchor.getAttribute( 'aria-expanded' ) === 'true' ? 'false' : 'true' );\r\n\t\t\t\t\t\t\tdescState.textContent = currentAnchor.getAttribute( 'aria-expanded' ) === 'true' ? elm.mShowhide.settings.contract : elm.mShowhide.settings.expand;\r\n\t\t\t\t\t\t\tparentEl.nextElementSibling.setAttribute( 'aria-hidden', currentAnchor.getAttribute( 'aria-expanded' ) === 'true' ? 'false' : 'true' );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcurrentAnchor.classList.remove( 'is-animating' );\r\n\r\n\t\t\t\t\t\tutility.trigger( window, 'refresh' );\r\n\t\t\t\t\t},\r\n\t\t\t\t});\r\n\r\n\t\t\t\tif ( elm.mShowhide.config.accordion || utility.getBreakpoint() === utility.smallTag ) {\r\n\t\t\t\t\totherControls = elm.mShowhide.controls.filter( function filterFn( filterControlEl ) {\r\n\t\t\t\t\t\treturn filterControlEl !== parentEl && filterControlEl.matches( '.is-visible' );\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\totherControls.forEach( function innerLoop( otherControlEl ) {\r\n\t\t\t\t\t\totherControlEl.querySelector( '.m-showhide__control-desc-state' ).textContent = elm.mShowhide.settings.expand;\r\n\t\t\t\t\t\totherControlEl.classList.remove( 'is-visible' );\r\n\t\t\t\t\t\totherControlEl.children[ 0 ].classList.add( 'is-animating' );\r\n\r\n\t\t\t\t\t\tutility.slideToggle( otherControlEl.nextElementSibling, FRAMEWORK.timings.current.t350ms, {\r\n\t\t\t\t\t\t\tvariant : 'up',\r\n\t\t\t\t\t\t\tcallback : function() {\r\n\t\t\t\t\t\t\t\tvar scrollToElm = elm,\r\n\t\t\t\t\t\t\t\t\tscrollParent,\r\n\t\t\t\t\t\t\t\t\tmoveTo,\r\n\t\t\t\t\t\t\t\t\tthisOffset;\r\n\r\n\t\t\t\t\t\t\t\tif ( targetElm ) {\r\n\t\t\t\t\t\t\t\t\tscrollToElm = targetElm;\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\tscrollParent = utility.scrollParent( scrollToElm );\r\n\t\t\t\t\t\t\t\tmoveTo = scrollToElm.offsetTop - scrollParent.offsetTop;\r\n\t\t\t\t\t\t\t\tthisOffset = parentEl.offsetTop - scrollParent.offsetTop;\r\n\r\n\t\t\t\t\t\t\t\tif ( thisOffset < moveTo ) {\r\n\t\t\t\t\t\t\t\t\tscrollParent.scrollTo( 0, moveTo );\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\totherControlEl.children[ 0 ].classList.remove( 'is-animating' );\r\n\t\t\t\t\t\t\t\totherControlEl.children[ 0 ].setAttribute( 'aria-expanded', 'false' );\r\n\t\t\t\t\t\t\t\totherControlEl.setAttribute( 'aria-hidden', 'true' );\r\n\r\n\t\t\t\t\t\t\t\tutility.trigger( window, 'refresh' );\r\n\t\t\t\t\t\t\t},\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}\r\n\t\t},\r\n\r\n\t\tcontrolsClick : function( elm ) {\r\n\t\t\tvar href = utility.getAnchor(),\r\n\t\t\t\topenedSection = false,\r\n\t\t\t\tthisControl;\r\n\r\n\t\t\t// Add a click event to the control to open the associated element\r\n\t\t\telm.mShowhide.controls.forEach( function loop( controlEl ) {\r\n\t\t\t\tvar currentAnchor = controlEl.children[ 0 ];\r\n\r\n\t\t\t\tcurrentAnchor.addEventListener( 'click', function listener( e ) {\r\n\t\t\t\t\te.preventDefault();\r\n\r\n\t\t\t\t\tmShowhideFn.toggleSelection( elm, currentAnchor );\r\n\t\t\t\t});\r\n\t\t\t});\r\n\r\n\r\n\t\t\tdocument.addEventListener( 'click', function listener( e ) {\r\n\t\t\t\tvar element = e.target,\r\n\t\t\t\t\tthisHref;\r\n\r\n\t\t\t\t// Get the href of the clicked element if there is one\r\n\t\t\t\tif ( element.hasAttribute( 'href' ) ) {\r\n\t\t\t\t\tthisHref = element.getAttribute( 'href' ).match( utility.urlAnchorRegExp );\r\n\t\t\t\t} else {\r\n\t\t\t\t\telement = element.closest( 'a[href], button[href]' );\r\n\t\t\t\t\tif ( element ) {\r\n\t\t\t\t\t\tthisHref = element.getAttribute( 'href' ).match( utility.urlAnchorRegExp );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Only try and process if the link is not blank\r\n\t\t\t\tif ( Array.isArray( thisHref ) && thisHref[ 0 ] !== '' && !element.classList.contains( 'm-showhide__control' ) ) {\r\n\t\t\t\t\tmShowhideFn.openSection( elm, thisHref[ 0 ] );\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t// Open the associated element when the incoming link points to an id on a control\r\n\t\t\tif ( Array.isArray( href ) && href[ 0 ] !== '' ) {\r\n\t\t\t\topenedSection = mShowhideFn.openSection( elm, href[ 0 ] );\r\n\t\t\t}\r\n\r\n\t\t\t// No incoming link, so check for pre-opened flag instead\r\n\t\t\tif ( !openedSection ) {\r\n\t\t\t\t/* If a valid href is found check to see if it matches any of the showhide headings. */\r\n\t\t\t\t/* If no controls have been identified to open on load then check if there is one set to automatically open on load */\r\n\t\t\t\tthisControl = elm.mShowhide.controls.filter( function filterFn( controlEl ) {\r\n\t\t\t\t\treturn controlEl.classList.contains( 'js-m-showhide-open' );\r\n\t\t\t\t});\r\n\r\n\t\t\t\t// Open any controls identified by the above\r\n\t\t\t\tif ( thisControl.length > 0 ) {\r\n\t\t\t\t\tthisControl.forEach( function loop( controlEl ) {\r\n\t\t\t\t\t\tmShowhideFn.open( elm, controlEl.nextElementSibling );\r\n\r\n\t\t\t\t\t\tutility.parents( elm, '.m-showhide__content' ).forEach( function innerLoop( parentEl ) {\r\n\t\t\t\t\t\t\tmShowhideFn.open( elm, parentEl );\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}\r\n\t\t},\r\n\t};\r\n\r\n\treturn {\r\n\t\tinitInstance : function( elm ) {\r\n\t\t\treturn mShowhideFn.init( elm );\r\n\t\t},\r\n\t};\r\n});\r\n"]}