{"version":3,"sources":["eh.BundleView.ts","eh.CopyController.ts","eh.FlexGPSNavigator.ts","eh.NumericStepper.ts","eh.ProductBundleSpecifications.ts","eh.ProductCadLoader.ts","eh.ProductContainer.ts","eh.QuickSelectRvViewFactory.ts","product_detail.ts","eh.QuickSelectViewFactory.ts","eh.SchemaDataEnhancer.ts","eh.Successors.ts","eh.UpidGroup.ts","eh.VariantListController.ts"],"names":["eh","BundleView","init","$base","$","concat","clsBundleView","each","index","element","clsBundleDetailView","clsBundleTeaserView","clsButtonBack","clsButtonMore","clsSwitchTab","clsDisplayNone","$elem","_this","this","detailViews","_index","detail","DetailView","push","hide","tabber","$tab","on","$event","preventDefault","forEach","x","removeClass","addClass","target","data","v","id","show","ScrollPage","setScrollEnabled","click","prototype","visible","hasClass","teasers","teaser","TeaserView","bt","t","CopyController","TRIGGER_CLASSNAME","length","collectValue","base","separator","sources","querySelectorAll","SOURCE_CLASSNAME","Array","from","map","el","elementValue","join","override","getAttribute","HTMLInputElement","HTMLSelectElement","HTMLTextAreaElement","value","_b","_a","textContent","trim","registerControls","triggers","trigger","addEventListener","ev","onTriggerClick","ATTR_EXTERNAL_VALUE","vm","copy","CopyViewModel","tooltip","prevText","resolveValue","navigator","clipboard","writeText","nextElementSibling","querySelector","copiedText","dataset","classList","add","setTimeout","remove","external","EhFlexGPSNavigator","root","ajaxUrl","LoadingIndicator","showLoading","ajax","success","pre","content","find","addBack","parent","replaceWith","hideLoading","event_1","jQuery","Event","cs","Snippet","EventIdPostReplace","replacedTarget","removedTarget","error","console","warn","collapsePanel","collapsePanelInner","closeButton","event","transitionInProgress","css","outerHeight","slope","debounce","currentProgress","beginTimer","performance","now","lastScrollPos","getScrollPosition","lastHeight","tween","setInterval","to","slope_1","Math","ceil","scrollTo","maxHeight","STICKY_EVENTS","DOM_MUTATION","clearInterval","get","fn","ehNumericStepper","optionsOrCommand","config","min","max","step","decimals","onChange","_event","_value","$buttonDecrement","$buttonIncrement","isDisabled","prop","toggleClass","$input","parseFloat","attr","inputValue","val","extend","lastValue","$original","stepValue","multiplier","newValue","result","isNaN","toFixed","triggerHandler","isEnabled","registerControl","ctrl","cb","e","currentTarget","dispatchChange","stopImmediatePropagation","handleKeyDown","key","handleValueLength","digits","currentValue","type","document","select","off","disMin","disMax","removeAttr","ProductBundleSpecifications","isInSnippet","SELECTOR","$pbRoot","SELECTOR__TRIGGER__COMPONENT","$component","componentMaterialNumber","DATA__COMPONENT_MATERIAL_NUMBER","CLASS_ACTIVE","selfOrClosest","siblings","SELECTOR__MARKER__COMPONENT_GROUP","$content","active","CLASS_HIDDEN","SELECTOR__TRIGGER__SPECIFICATION_CATEGORY","category","DATA__SPECIFICATION_CATEGORY","selfOrFind","i","checked","$currentComponentGroup","filter","SELECTOR__MARKER__SPECIFICATION_CATEGORY","CLASSES_LINK_ACTIVE","CLASSES_LINK_INACTIVE","ProductCadLoader","isSnippetRequest","$productCadLoaderRoot","cadHandledByQS","SELECTOR__PRODUCT_CAD_LOADER","Object","keys","QuickSelect","syncCadWrapper","alternativeShown","$alternative","CLASS__HIDDEN","$orderCodeHandling","$cadWrapper","$quickSelectRoot","qs","DATA_KEY","SELECTOR__QS_ORDER_CODE_HANDLING","SELECTOR__QS_ALTERNATIVE","SELECTOR__CAD_DRAWER_WRAPPER","initFn","cadWrapperObserver","MutationObserver","observe","attributes","attributeFilter","productCadLoader","orderCode","showUrls","checkAvailability","productRoot","QS_EVENTS","ORDER_CODE_COMPLETE","_$event","getCurrentStep","pattern","orderCodeExternalized","prepareOrderCodeForExternals","logger","debug","ORDER_CODE_CHANGE","available","stateHidden","stateNotConfigured","isInitialized","one","INIT","syncCallout","dismissed","sync","$callout","SELECTOR__CAD_CALLOUT","SELECTOR__CAD_CALLOUT_DISMISS","stateLoading","service","getAvailability","then","response","isResponseAvailability","CADUrlsAvailable","catch","err","stateError","getUrls","$items_1","isResponseUrls","SELECTOR__CAD_ITEMS","children","sort","a","b","localizations","indexOf","url","idx","$newItem","$itemTemplate","clone","appendTo","label","text","$el","$dropdownValue","loadIframeUrl","stateUrls","first","stateEmpty","$display","$progressIndicator","$noDrawings","$configurationMessage","$errorMessage","$triggerDrawer","CLASS__INACTIVE","CLASS__IS_DISABLED","CLASS__DISABLED","CLASS__ACTIVE","CLASS__ERROR","$configuratorLink","$label","$smallInfo","CLASS__SHOW_SMALL","stateConfigurator","undefined","isResponseFailure","isArray","SELECTOR__CAD_CONFIGURATION_MESSAGE","SELECTOR__CAD_CONFIGURATOR_LINK","SELECTOR__CAD_DISPLAY","SELECTOR__CAD_ERROR_MESSAGE","SELECTOR__CAD_ITEM_TPL","SELECTOR__CAD_LABEL","SELECTOR__CAD_DROPDOWN_VALUE","SELECTOR__CAD_PROGRESS_INDICATOR","SELECTOR__CAD_NO_DRAWINGS","SELECTOR__TRIGGER_CAD_ACTIVE","SELECTOR__PRODUCT_CAD_LOADER_SMALL_INFO","SELECTOR__TRIGGER_CAD_DRAWER_OPEN","SELECTOR__CAD_DRAWER_ERROR_MESSAGE","SELECTOR__CAD_DRAWER_CONFIGURATION_MESSAGE","SELECTOR__CAD_DRAWER_PROGRESS_INDICATOR","log","getLogger","CadService","$triggerActive","CadServiceEndpoint","getConfig","buildRequest","endpoint","pathParam","requestHeaders","APIKey","apiKey","Urls","language","settings","dataType","timeout","headers","serviceUrl","endpointPath","encodeURIComponent","request","Availability","ProductContainer","SpareNavigationHandler","NavigationHandler","DocumentsNavigationHandler","filterDropDown","$dropDown","filterValue","optionsVisible","SELECT2_DEFAULT_VALUE","closest","filterContent","filter1Value","filter2Value","overflowing","maxVisible","showAll","numVisible","matchesFilterKey","showMoreBtn","search","split","$dropDown1","$dropDown2","showLessBtn","artificialEvent","is","trackingParams","k","Tracking","injectTrackingEvent","analyzeFilterParams","event_subtype","heightFull","height","currentPagePosition","heightShort","scrollToAnimated","getVal","dropDown","updateField","searchField","searchFieldClear","searchFieldMagnifier","reset","resetVal","beAgnostic","initSearch","updateList","event_linkname","initSelect","selectedValue","formParams","$select","term","toLowerCase","categories","bottomTab","catVisible","allVisible","allAvail","isTerm","terms","c","cat","match","prod","s","txt_1","last","co","det","details","showBt","hideBt","activate","tab","tabsContainer","setActive","container","setScrollPosition","scrollPosition","backBt","y","TabContainer","doShowLess","buttonShowLess","buttonShowMore","panel","slice","state","control","controller","tabSel","QS_RV_EVENTS","AUTO_COMPLETION_CHANGE","QSRvViewFactory","themeRow","tpl","values","create","$index","$inputid","idCounter","hasOwnProperty","needle","replace","createRow","createRows","valuesList","iterator","createTemplateString","elementString","createTemplateStringByEl","wrap","html","QSRvViewModel","defineProperty","_pendingLoader","loader","registerLoadingListener","onLoadingComplete","setLoading","isLoading","force","_isLoading","_isSimulating","updateLoadingFeedback","clearTimeout","_loadingFeedbackTimeout","updateSpinner","_$elCtaButton","_$elQuickselectFooter","_$elSpinnerHost","append","_spinner","detach","attachRow","component","sliceViewStack","_viewMap","_$elOptionsParent","elements","onCreate","dispatchDomUpdate","newCreatedElement","payload","_pendingSequencer","domUpdateTicking","requestAnimationFrame","_","setHasContent","_hasContent","_snippetsContentSection","onRemove","splice","hideAllOptions","showOptions","removeEmptyOptions","emptyIdx","NaN","hasSelection","stackPos","selectFamilyProduct","matnr","_$el","_c","cfg","application","childProducts","p","materialNumber","productMaterialNumber","setError","removeError","tplData","__assign","interface","callback","_errorIndicator","_snippetErrorRow","_$elFeedbackOptionsParent","setOrderCodeComplete","createTrackingInfo","currentIndex","currentSegmentIndex","triggerLegendUpdate","event_configuration_step","triggerEventType","legend","rEl","selection","d","getNextHighestDepth","cancelSequence","destroy","beginSequence","sq","run","setRecommendations","dataProvider","r","templateData","headerTpl","_snippetPreselectedRow","optionsTpl","_snippetPreselectableRowOption","ctrlClazz","QSProductPreselectionLayer","QSRecommendationQueue","item","setSelectionRow","setFocus","dispatchFocusChange","segments","selectedPattern","coding","ORDER_CODE_LEGEND_CHANGE","setSelection","layerIndex","templateDescriptor","_snippetSelectedRow","_snippetSelectableRowOption","QSProductSelectionLayer","setInitialized","setHighlight","ORDER_CODE_HIGHLIGHT","descriptor","options","o","exit","layerComponent","featureCoding","QuickSelectRv","FEATURE_CODING_CHILD_PRODUCT_SELECTION","stopPropagation","categoryOptions","layerData","manager","header","row","optionRows","selectionComponent","notifyReplaced","copyAttributes","$from","$to","exclude","attrs","name","EL_CONTENT_SECTION","EL_OPTIONS_PARENT_SELECTOR","EL_FEEDBACK_OPTIONS_PARENT_SELECTOR","EL_CTA_BUTTON","EL_QUICKSELECT_FOOTER","EL_SPINNER_HOST_SELECTOR","EL_TEMPLATE_STORE_SELECTOR","$templateStore","destroyed","_intervalId","window","next","delay","stack","onDestroy","NOOP","onComplete","isDone","shift","isExecutionKey","keyCode","onFocus","onHighlight","optionsContainer","optionsRows","_self","MARKER_OPTIONS_CONTAINER","isShowOptions","prepend","radio","exec","initFocus","_activeElement_1","browserDetect","mobile","_radio","focus","onSelect","option","rewindSteps","orderCodeString","trackingInfo","event_order_code","currentStepIndex","_d","finish","targetSelection","targetLabel","targetRoot","targetOption","feature","isLastLayer","observedSelect","app","currentFeature","currentStepFeature","QSRvOrderCodeLabel","decompose","LABEL_SEGMENT_SPLIT_SEPARATOR","segment","LABEL_SEGMENT_PLACEHOLDER","isFamilyProduct","productRootChildSuffix","prefix","toPlainValue","parts","placeholder","PLAIN_PLACEHOLDER_DEFAULT","rendered","unshift","separatorPos","setDisabled","disabled","_disabled","applyDisabledState","_labelSegments","DISABLED_CLASSNAMES","update","labelSegments","SNIPPET_PLACEHOLDER","SNIPPET_LABEL_SEGMENT","codeSegment","prependPrefix","_container","offset","animate","scrollTop","top","spinner","SPINNER_SELECTOR","output","LABEL_SEGMENT_SEPARATOR","highlightSegment","updateFromOrderCode","itemCodes","dashIdx","substring","rear","cursor","_i","itemCodes_1","code","startsWith","seg","l","SNIPPET_HIGHLIGHT_CLASSNAME","CONTAINER_CLASS_NAME","QSRvOrderCodeLegend","addRow","EL_DETAIL_ROW_SELECTOR","QSRvPriceScaleLegend","_list","slideUp","slideDown","SNIPPET_PRICE_SEGMENT","SNIPPET_PRICE_SEGMENT_SELECTOR","tplSnippet","QSViewFactory","QSViewModel","_focusedElement","singleRowView","isNavitaionKey","_naviKeyPressed","QSOrderCodeLabel","patternSegments","patternSegment","childProductCoding","QSOrderCodeLegend","QSPriceScaleLegend","SchemaDataEnhancer","isSnippet","vis","body","scpt","_idx","sc","mno","ProductPricing","fetchPriceFor","updateSchema","info","ldjson","materialNo","JSON","parse","offers","price","priceCurrency","currency","stringify","Successors","UPidGroup","prodConfigure","SELECTOR__TAB_CONTAINERS","reqTarget","targetId","TAB_EVENTS","TAB_ACTIVATE_REQUEST","targetIdentifier","pageOffsetTop","correction","initGroup","initFilter","$filterBase","$buttonShow","$buttonCancel","$buttonSubmit","toggleFilterDisplay","$button","SearchFilters","clippingManager","LocalGroupsFilter","$container","dummy","createElement","appendChild","setAttribute","execCommand","removeChild","location","href","activateTab","snippetEl","historyParamName","newHeading","siblingHeadings","$pane","navigations","tabCtrl","$tabCtrl","makeActive","panels","contains","emptyToOptional","doLoad","tabId","RegExp","qpm","URLHelper","buildQueryParamMap","history","replaceState","title","buildUrl","buildQueryString","handleOnsiteNavigation","$panel","load","$target","showLoadingIndicator","jqXHR","method","beforeSend","done","$data","newElementData","$newElement","resultData","fail","always","hideLoadingIndicator","tabberId","escapeSelector","TAB_CHANGE","Tabs","getTabContent","sub","typeVal","groupVal","group","updateResults","filterTerm","field","txt","allAct","typeAct","termAct","items","$e","updateCount","inputs","count","slider","updateButtons","submitButtonLabel","closeButtonLabel","others","LocalTypeFilterTrigger","LocalGroupFilterTrigger","LocalTextFilter","groups","types","id1","Constants","VISIBILITY_CHANGE","g","noResults","updateState","empty","clear","VariantListController","$sftRoot","$pls","VARIANT_LIST","fetchAndStart","eq","orderCodeInfo","pInfo","codes","orderCodeExt","lang","OrderCodeDetailService","withStaticHeader","fetchForCodes","dupls","variantInfo","sz","populate","ts","header2","ct","productInfos","parents","configuration","conf","entry","before","optsSel","vi","plh","j","del","firePostReplace","elem","compareCheckboxes","doChangeCheckbox","viewDetails","doViewDetailClick","columnsButtons","doColumnButtonClick","compareButton","doCompareBtClick","_e","moreBt","doMoreButtonClick","_f","resetButton","doResetButtonClick","VARIANT_LIST_VARIANTS","VARIANT_LIST_COMPARE_CHECKBOX","VARIANT_LIST_COMPARE_BANNER","VARIANT_LIST_DRAWER_COMPARE_BANNER","VARIANT_LIST_COMPARE_BUTTON_CLASSNAME","VARIANT_LIST_COMPARE_RESET_CLASSNAME","VARIANT_LIST_COMPARE_VIEW_DETAIL_CLASSNAME","VARIANT_LIST_DRAWER_DETAIL_BANNER_CLASSNAME","VARIANT_LIST_DATA_COLUMN_SELECTOR_CLASSNAME","VARIANT_LIST_DATA_COLUMN_BUTTON_CLASSNAME","TOOLTIP_TEXT_CLASSNAME","variants","toggleVariant","viewDetail","drawerDetail","drawerCompare","changeColumn","columnsSelector","_g","_h","compareBanner","_j","_k","_l","_m","_o","_p","VariantListViewModel","setCartIds","dataToCompare","dk","VARIANT_DATA_PREFIX","toUpperCase","template","DATA_TEMPLATE_CLASSNAME","dataDetail","compareBannerParent","VARIANT_LIST_BANNER_CONTENT_CLASSNAME","compareBanerData","templateEmpty","VARIANT_LIST_BANNER_TEMPLATE_EMPTY_CLASSNAME","VARIANT_LIST_COLUMN_TITLE_CLASSNAME","selected","SELECTED_CLASSNAME","tooltipText","checkCheckboxes","nbItemsChecked","checkboxesArray","reduce","acc","MAX_ITEMS_TO_COMPARE","HIDDEN_CLASSNAME","MIN_ITEMS_TO_COMPARE","DISABLED_CLASSNAME","input","compareReplacement","removeButton","newCompareEmptyElement","variant","VARIANT_CLASSNAME","variantId","newCompareElement","cloneNode","DATA_TEMPLATE_REPLACEMENT_CLASSNAME","VARIANT_LIST_BANNER_REMOVE_BUTTON_CLASSNAME","VARIANT_LIST_BANNER_EMPTY_CLASSNAME","dc","newElement","replacement","appendPriceAndCart","dd","button","activeElement","blur","ancest","pInfo_1","pph","$wrap","poc","scMaterialNumber","orderCodeIdent","pmn","staticHeaders","withStaticQueryParam","staticQueryParams","retVal","baseUrl","_response","$root","originalEvent","oEvent","Product","DrawerController","SegmentedButtonController"],"mappings":"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","file":"../bottom_product_detail.js","sourcesContent":["namespace eh {\n  \n  export class BundleView {\n    static readonly clsBundleView = 'eh-bundleview';\n    static readonly clsBundleDetailView = 'eh-bundleview--details';\n    static readonly clsBundleTeaserView = 'eh-bundleview--details-content';\n\n    static readonly clsButtonBack = 'js-back-bt-bundle-view';\n    static readonly clsButtonMore = 'eh-bundleview--show-more-button';\n    static readonly clsSwitchTab = 'eh-bundleview--tabbing';\n    static readonly clsDisplayNone = 'eh-display-none';\n\n\n    // the 'bundle' elems\n    private detailViews : DetailView[];\n    // the bundleDetail switcher\n    private tabber : JQuery<HTMLElement>[];\n\n    static init($base: JQuery<HTMLElement>): void {\n      $(`.${ BundleView.clsBundleView }`, $base).each((index, element) => {\n        new BundleView($(element));\n      });    \n    }\n\n    constructor(private $elem: JQuery<HTMLElement>) {\n      // view tabs\n      this.detailViews = [];\n      $(`.${ BundleView.clsBundleDetailView }`, $elem).each((_index, element) => {\n        const detail = new DetailView($(element));\n        this.detailViews.push(detail);\n        if(_index > 0) {\n          detail.hide();\n        }\n      });\n      // view controls\n      this.tabber = [];\n      $(`.${BundleView.clsSwitchTab}`, $elem).each((_index, element) => {\n        const $tab = $(element);\n        this.tabber.push($tab);\n        $tab.on('click', ($event) => {\n          $event.preventDefault();\n          this.tabber.forEach(x => {\n            x.removeClass('active');\n          });\n          $tab.addClass('active');\n          const target = $tab.data('target-tab');\n          this.detailViews.forEach(v => {\n            if(v.id == target) {\n              v.show();\n              this.$elem.addClass('has-selection');\n              eh.ScrollPage.setScrollEnabled(false, 'eh-no-scroll--x-small eh-full-height--x-small');\n            } else {\n              v.hide();\n            }\n          });\n        });\n      });\n      // back button (mobile)\n      $(`.${BundleView.clsButtonBack}`, $elem).click(($event) => {\n        $event.preventDefault();\n        this.$elem.removeClass('has-selection');\n        eh.ScrollPage.setScrollEnabled(true, 'eh-no-scroll--x-small eh-full-height--x-small');\n      });\n    }\n  }\n\n  class DetailView implements HasVisibility {\n    private teasers : TeaserView[];\n    visible: boolean;\n    id : string;\n\n    constructor(private $elem: JQuery<HTMLElement>) {\n      this.id = $elem.data('tab-target');\n      this.visible = !$elem.hasClass(BundleView.clsDisplayNone);\n      this.teasers = [];\n      $(`.${ BundleView.clsBundleTeaserView }`, $elem).each((_index, element) => {\n        const teaser = new TeaserView($(element));\n        this.teasers.push(teaser);\n        if(_index > 0) {\n          teaser.hide();\n        }\n      });\n      const bt = $(`.${BundleView.clsButtonMore}`, $elem);\n      bt.click(($event) => {\n        $event.preventDefault();\n        this.teasers.forEach( t => t.show());\n        bt.addClass(BundleView.clsDisplayNone);\n      });\n    }\n\n    show() {\n      if (this.visible) {\n        return;\n      }\n      this.visible = true;\n      this.$elem.removeClass(BundleView.clsDisplayNone);\n    }\n    \n    hide() {\n      if (!this.visible) {\n        return;\n      }\n      this.visible = false;\n      this.$elem.addClass(BundleView.clsDisplayNone);\n    }\n  }\n\n  class TeaserView implements HasVisibility {\n    visible: boolean;\n\n    constructor(private $elem: JQuery<HTMLElement>) {\n      this.visible = !$elem.hasClass(BundleView.clsDisplayNone);\n    }\n    show() {\n      if (this.visible) {\n        return;\n      }\n      this.visible = true;\n      this.$elem.removeClass(BundleView.clsDisplayNone);\n    }\n    \n    hide() {\n      if (!this.visible) {\n        return;\n      }\n      this.visible = false;\n      this.$elem.addClass(BundleView.clsDisplayNone);\n    }\n  }\n\n  \n  interface HasVisibility {\n    \n    visible: boolean;\n    \n    show(): void;\n    hide(): void;\n    \n  }\n\n}\n","namespace eh {\n    export class CopyController {\n        public static TRIGGER_CLASSNAME: string = 'ehel-copy--trigger';\n        public static SOURCE_CLASSNAME: string = 'ehel-copy--source';\n        /**\n         * The whole value, set from outside instead of collected from the DOM. Deliberately not\n         * named data-copy-value: that one sits on a single source and means \"my contribution\",\n         * this one means \"the complete string\". eh.QuickSelectRv pushes the current order code\n         * here, so the clipboard and the displays cannot drift apart.\n         */\n        public static ATTR_EXTERNAL_VALUE: string = 'data-copy-value-external';\n\n        public static init($base: JQuery<HTMLElement>): void {\n            if ($(`.${CopyController.TRIGGER_CLASSNAME}`, $base).length > 0) {\n                new CopyController($base[0]);\n            }\n        }\n\n        /**\n         * The string the copy action would put on the clipboard for the given container:\n         * every `.ehel-copy--source` inside it, joined in DOM order.\n         *\n         * Public so a second display can show exactly the copied value instead of\n         * assembling it a second way, which would drift apart (COM-4122: the order code\n         * in the configuration-details drawer).\n         */\n        public static collectValue(base: HTMLElement, separator: string = ''): string {\n            const sources = base.querySelectorAll(`.${CopyController.SOURCE_CLASSNAME}`);\n            if (!sources.length) {\n                return '';\n            }\n            return Array.from(sources)\n                .map(el => CopyController.elementValue(el as HTMLElement))\n                .join(separator);\n        }\n\n        private static elementValue(el: HTMLElement): string {\n            // Explicit copy override: lets a source contribute a value to the copied\n            // string that differs from (or is absent in) its visible text - e.g. an\n            // empty placeholder box copying \"_\", or a \" - \" separator copying \"-\".\n            const override = el.getAttribute('data-copy-value');\n            if (override !== null) {\n                return override;\n            }\n            if (el instanceof HTMLInputElement || el instanceof HTMLSelectElement || el instanceof HTMLTextAreaElement) {\n                return el.value;\n            }\n            return el.textContent?.trim() ?? '';\n        }\n\n        private triggers: NodeListOf<HTMLElement>;\n        private vm: CopyViewModel;\n\n        constructor(private readonly base: HTMLElement) {\n            this.triggers = this.base.querySelectorAll(`.${CopyController.TRIGGER_CLASSNAME}`);\n            if (!this.triggers.length) {\n                return;\n            }\n            this.vm = new CopyViewModel(this.base);\n            this.init();\n        }\n\n        private init(): void {\n            this.registerControls();\n        }\n\n        private registerControls(): void {\n            this.triggers?.forEach(trigger => {\n                trigger.addEventListener('click', (ev) => {\n                  this.onTriggerClick(trigger);\n                  ev.preventDefault();\n                });\n            });\n        }\n\n        private onTriggerClick = (trigger: HTMLElement): void => {\n            this.vm?.copy(trigger);\n        }\n    }\n\n    class CopyViewModel {\n        constructor(private readonly base: HTMLElement) {\n        }\n\n        public copy(trigger: HTMLElement): void {\n            const value = this.resolveValue(trigger);\n            if (!value) {\n                return;\n            }\n            navigator.clipboard.writeText(value);\n            const tooltip = trigger.nextElementSibling as HTMLElement | null;\n            if (!tooltip) {\n                return;\n            }\n\n            const prevText = tooltip.querySelector('.ehel-tooltip--text')?.textContent;\n            const copiedText = tooltip.dataset['copiedText'] ?? prevText;\n            tooltip.classList.add('!ehtw-flex');\n            tooltip.querySelector('.ehel-tooltip--text')!.textContent = copiedText ?? '';\n\n            setTimeout(() => {\n                tooltip.classList.remove('!ehtw-flex');\n                tooltip.querySelector('.ehel-tooltip--text')!.textContent = prevText ?? '';\n            }, 2000);\n        }\n\n        private resolveValue(trigger: HTMLElement): string {\n            // An external producer wins: it knows the value, while the collector below has to\n            // reassemble it from whatever sources happen to sit under this base. The collector\n            // stays as the fallback for copy widgets that have no producer.\n            const external = trigger.getAttribute(CopyController.ATTR_EXTERNAL_VALUE)\n                ?? this.base.getAttribute(CopyController.ATTR_EXTERNAL_VALUE);\n            if (external !== null) {\n                return external;\n            }\n            return CopyController.collectValue(this.base, trigger.dataset['copySeparator'] ?? '');\n        }\n    }\n}\n","namespace eh {\n  \n  export class EhFlexGPSNavigator {\n\n    static transitionInProgress: boolean = false;\n    \n    static init($base: JQuery<HTMLElement>): void {\n      $('.eh-product-specs-at-a-glance--gps-loader', $base).each(function (index, element) {\n        let root = $(element);\n        let ajaxUrl = root.data('ajaxUrl');\n        if (ajaxUrl) {\n          eh.LoadingIndicator.showLoading(root);\n          setTimeout( () => {\n            $.ajax(ajaxUrl, {\n              success:  (data: any) => {\n                let content = $(data).find('.eh-product-specs-at-a-glance').addBack('.eh-product-specs-at-a-glance').parent();\n                if (content.length > 0) {\n                   let pre = root.replaceWith(content);\n                   eh.LoadingIndicator.hideLoading();\n                   const event = jQuery.Event(cs.Snippet.EventIdPostReplace) as cs.SnippetEventPostReplace;\n                   event.replacedTarget = content;\n                   event.removedTarget = pre;\n                   $(':root').trigger(event);\n                }\n              },\n              error: (error: any) => {\n                console.warn('GPS loading error', error);\n              }\n            })\n          }, 50);\n        }\n      });\n\n      $('.eh-product-specs-at-a-glance:not(.eh-gps-loader)', $base).each(function (index, element) {\n        let root = $(element);\n        let collapsePanel = root.find('.eh-product-specs-at-a-glance--content-collapse-panel');\n        let collapsePanelInner = root.find('.eh-product-specs-at-a-glance--content-collapse-panel-inner')\n        let closeButton = root.find('.eh-product-specs-at-a-glance--close-button');\n        let openButton = root.find('.eh-product-specs-at-a-glance--open-button');\n\n        openButton.on('click', (event) => {\n          event.preventDefault();\n          if (EhFlexGPSNavigator.transitionInProgress) {\n            return;\n          }\n          root.addClass('is-open');\n          collapsePanel.css('height', collapsePanelInner.outerHeight() + 'px');\n        });\n\n        closeButton.on('click', (event) => {\n          event.preventDefault();\n          EhFlexGPSNavigator.transitionInProgress = true;\n          const slope: number = collapsePanelInner.outerHeight() as number;\n          collapsePanel.css('height', slope  + 'px');\n          root.removeClass('is-open');\n          eh.debounce(function () {\n            const beginTimer: number = performance.now();\n            const lastScrollPos: number = eh.ScrollPage.getScrollPosition();\n            const lastHeight: number = collapsePanelInner.outerHeight() as number;\n            const duration: number = 300;\n            const maxHeight: number = 0;\n            const lerp: (f: number, t: number, p: number) => number = (from: number, to: number, progress: number): number => {\n              return Math.ceil((to - from) * progress);\n            };\n\n            let currentProgress: number;\n            const tween = setInterval(() => {\n              currentProgress = (performance.now() - beginTimer) / duration;\n              if (currentProgress < 1) {\n                const slope = lerp(lastHeight, maxHeight, currentProgress);\n                collapsePanel.css('height', lastHeight + slope + 'px');\n                eh.ScrollPage.scrollTo(lastScrollPos + slope);\n              } else {\n                collapsePanel.css('height', maxHeight + 'px');\n                eh.ScrollPage.scrollTo(lastScrollPos - lastHeight);\n                $(':root').trigger(eh.STICKY_EVENTS.DOM_MUTATION);\n                clearInterval(tween);\n                EhFlexGPSNavigator.transitionInProgress = false;\n              }\n            }, 1);\n          })();\n        });\n\n        collapsePanel.on('transitionend', (event) => {\n          if (event.target === collapsePanel.get(0)) {\n            $(':root').trigger(eh.STICKY_EVENTS.DOM_MUTATION);\n          }\n          if (event.target === collapsePanel.get(0) && root.hasClass('is-open')) {\n            collapsePanel.css('height', 'auto');\n          }\n        });\n\n      });\n    }\n  }\n}\n","interface EhNumericStepperOptions {\n  min?: number,\n  max?: number,\n  step?: number,\n  decimals?: number,\n  onChange?: (event: JQuery.TriggeredEvent | null, value: string) => void\n}\n\ninterface JQuery {\n  ehNumericStepper(optionsOrKey?: Partial<EhNumericStepperOptions> | ehNumericStepperCommands,\n                   value?: string | number | boolean): JQuery;\n}\n\ntype ehNumericStepperCommands = 'toggleDisabled';\n\n$.fn.ehNumericStepper = function (optionsOrCommand?: Partial<EhNumericStepperOptions> | ehNumericStepperCommands,\n                                  value?: string | number | boolean): JQuery {\n\n  const config: EhNumericStepperOptions = {\n    min: 1,\n    max: 10,\n    step: 1,\n    decimals: 0,\n    onChange: (_event: JQuery.TriggeredEvent | null, _value: string) => {}\n  };\n  \n  if (typeof optionsOrCommand === 'string') {\n    if (optionsOrCommand === 'toggleDisabled') {\n      this.each((_index, el) => {\n        const $elem: JQuery<HTMLElement> = $(el);\n        const isDisabled: boolean = value === true;\n        $('.eh-numeric-stepper--input, .eh-numeric-stepper--decrease-button, .eh-numeric-stepper--increase-button', $elem)\n          .prop('disabled', isDisabled).add($elem).toggleClass('disabled', isDisabled);\n        if (!isDisabled) {\n          const $buttonDecrement = $('.eh-numeric-stepper--decrease-button', $elem);\n          const $buttonIncrement = $('.eh-numeric-stepper--increase-button', $elem);\n          const $input = $('.eh-numeric-stepper--input', $elem);\n          const min: number = parseFloat($input.attr('min') || '0');\n          const max: number = parseFloat($input.attr('max') || '0');\n          const inputValue: number = parseFloat($input.val() as string);\n          $buttonDecrement.toggleClass('disabled', min === inputValue);\n          $buttonIncrement.toggleClass('disabled', max === inputValue);\n        }\n      });\n    }\n  }\n  else {\n    $.extend(config, optionsOrCommand);\n  \n    this.each((_index, el) => {\n\n      const $original: JQuery<HTMLElement> = $(el);\n      let lastValue: string;\n\n      const $buttonDecrement = $('.eh-numeric-stepper--decrease-button', $original);\n      const $buttonIncrement = $('.eh-numeric-stepper--increase-button', $original);\n      const $input = $('.eh-numeric-stepper--input', $original)\n          .attr('min', config.min as number)\n          .attr('max', config.max as number)\n          .attr('step', config.step as number)\n      ;\n  \n      if ($original.hasClass('disabled')) {\n        $buttonDecrement.add($buttonIncrement)\n          .prop('disabled', true).toggleClass('disabled', true);\n      }\n\n      const stepValue = function(multiplier: number) {\n          let newValue = parseFloat($input.val() as string);\n          if (multiplier) {\n              newValue = newValue + (config.step as number) * multiplier;\n          }\n          newValue = isNaN(newValue) ? config.min as number : Math.min(Math.max(newValue, config.min as number), config.max as number);\n          const result = newValue.toFixed(config.decimals);\n          $input.val(result);\n          $original.triggerHandler('change');\n\n          return result;\n      };\n      \n      const isEnabled = function($elem: JQuery<HTMLElement>) {\n        return !$elem.hasClass('disabled');\n      };\n      \n      const registerControl = function (ctrl: JQuery<HTMLElement>, cb: (e: JQuery.TriggeredEvent, v: string) => void) {\n          ctrl.on('click touchStart', cb);\n      };\n\n      registerControl($buttonDecrement, (e: JQuery.TriggeredEvent) => {\n          e.preventDefault();\n          if (!isEnabled($(e.currentTarget))) {\n            e.stopImmediatePropagation();\n            return;\n          }\n          dispatchChange(e, stepValue(-1));\n      });\n      registerControl($buttonIncrement, (e: JQuery.TriggeredEvent) => {\n          e.preventDefault();\n        if (!isEnabled($(e.currentTarget))) {\n          e.stopImmediatePropagation();\n          return;\n        }\n          dispatchChange(e, stepValue(1));\n      });\n      \n      const handleKeyDown = (e: JQuery.TriggeredEvent) => {\n          switch (e.key) {\n              case 'ArrowUp':\n                  e.preventDefault();\n                if (!isEnabled($(e.currentTarget))) {\n                  e.stopImmediatePropagation();\n                  return;\n                }\n                  dispatchChange(e, stepValue(1));\n                  break;\n              case 'ArrowDown':\n                  e.preventDefault();\n                if (!isEnabled($(e.currentTarget))) {\n                  e.stopImmediatePropagation();\n                  return;\n                }\n                  dispatchChange(e, stepValue(-1));\n                  break;\n          }\n      };\n\n      const handleButtonState = (): void => {\n            var disMin = $original.hasClass('disabled') || (config.min === parseFloat(lastValue));\n            var disMax = $original.hasClass('disabled') || (config.max === parseFloat(lastValue))\n            $buttonDecrement.toggleClass('disabled', disMin);\n            $buttonIncrement.toggleClass('disabled', disMax);\n            if(disMin) {\n                $buttonDecrement.attr('disabled', 'true');\n            }else{\n                $buttonDecrement.removeAttr('disabled');\n            }\n          if(disMax) {\n              $buttonIncrement.attr('disabled', 'true');\n          }else{\n              $buttonIncrement.removeAttr('disabled');\n          }\n          handleValueLength();\n      };\n\n      // COM-3939: the number of digits drives the field width via CSS. Together with a\n      // qts-size-* class, qlen-1 renders the amount display square (48/40/32px); longer\n      // values widen it by character count. Mirrors EhQuantity.controller.ts of the design\n      // package, including its fallback to qlen-1 for an empty or overlong value.\n      const handleValueLength = (): void => {\n          const digits: number = (($input.val() as string) || '').length;\n          $input\n            .removeClass('qlen-1 qlen-2 qlen-3 qlen-4 qlen-5')\n            .addClass((digits >= 1 && digits <= 5) ? 'qlen-' + digits : 'qlen-1');\n      };\n\n      $input.on('paste change input', (e: JQuery.TriggeredEvent) => {\n          const currentValue = $input.val() as string;\n          if (e.type === 'input' && ((currentValue === '-' && (config.min as number) < 0) || currentValue === '')) { // entering number in progress\n              return;\n          }\n          if (!isEnabled($(e.currentTarget))) {\n            e.stopImmediatePropagation();\n            return;\n          }\n          dispatchChange(e, stepValue(0));\n      }).on('focus', () => {\n          $(document).on('keydown', handleKeyDown);\n          ($input.get(0) as HTMLInputElement)?.select();\n      }).on('blur', () => {\n          $(document).off('keydown', handleKeyDown);\n      });\n\n      const dispatchChange = function (event: JQuery.TriggeredEvent | null, value: string) {\n          if (lastValue !== value) {\n              if (config.onChange) {\n                  config.onChange(event, value);\n              }\n          }\n          lastValue = value;\n          setTimeout(() => handleButtonState(), 0); // change state after current event was handled\n      };\n\n      const init = () => dispatchChange(null, stepValue(0));\n      init();\n\n    });\n  }\n  \n  return this;\n};\n","namespace eh {\n  \n  export class ProductBundleSpecifications {\n  \n    public static readonly DATA__COMPONENT_MATERIAL_NUMBER = 'componentMaterialNumber';\n    public static readonly DATA__SPECIFICATION_CATEGORY = 'specificationCategory';\n    public static readonly SELECTOR = '.eh-product-bundle-specifications';\n    public static readonly SELECTOR__MARKER__COMPONENT_GROUP = '.marker-product-bundle-component-group';\n    public static readonly SELECTOR__MARKER__SPECIFICATION_CATEGORY = '.marker-product-bundle-specification-category';\n    public static readonly SELECTOR__TRIGGER__COMPONENT = '.trigger-product-bundle-component';\n    public static readonly SELECTOR__TRIGGER__SPECIFICATION_CATEGORY = '.trigger-product-bundle-specification-category';\n  \n    private static readonly CLASS_ACTIVE = 'active';\n    private static readonly CLASS_HIDDEN = 'eh--hide';\n    private static readonly CLASSES_LINK_ACTIVE = ['eh-link--09', ProductBundleSpecifications.CLASS_ACTIVE];\n    private static readonly CLASSES_LINK_INACTIVE = ['eh-link--02'];\n    \n    static init($base: JQuery<HTMLElement>, isInSnippet: boolean): void {\n      if (isInSnippet) {\n        return;\n      }\n  \n      $(ProductBundleSpecifications.SELECTOR, $base).each((_index, el) => {\n        const $pbRoot = $(el);\n  \n        $(ProductBundleSpecifications.SELECTOR__TRIGGER__COMPONENT, $pbRoot).on('click', $event => {\n          $event.preventDefault();\n          const $component = $($event.currentTarget);\n          const componentMaterialNumber = $component.data(ProductBundleSpecifications.DATA__COMPONENT_MATERIAL_NUMBER);\n          if (typeof componentMaterialNumber !== 'number') {\n            return;\n          }\n          $component\n              .toggleClass(ProductBundleSpecifications.CLASS_ACTIVE, true)\n              .selfOrClosest('.eh-slider--item')\n              .siblings()\n              .find(ProductBundleSpecifications.SELECTOR__TRIGGER__COMPONENT)\n              .toggleClass(ProductBundleSpecifications.CLASS_ACTIVE, false)\n          ;\n          $(ProductBundleSpecifications.SELECTOR__MARKER__COMPONENT_GROUP, $pbRoot).each((_index, el) => {\n            const $content = $(el);\n            const active = $content.data(ProductBundleSpecifications.DATA__COMPONENT_MATERIAL_NUMBER) === componentMaterialNumber;\n            $content\n                .toggleClass(ProductBundleSpecifications.CLASS_ACTIVE, active)\n                .toggleClass(ProductBundleSpecifications.CLASS_HIDDEN, !active);\n          });\n        });\n        \n        $(ProductBundleSpecifications.SELECTOR__TRIGGER__SPECIFICATION_CATEGORY, $pbRoot).on('click', $event => {\n          $event.preventDefault();\n          const $tab = $($event.currentTarget);\n          const category = $tab.data(ProductBundleSpecifications.DATA__SPECIFICATION_CATEGORY);\n          const componentMaterialNumber = $tab.selfOrClosest(ProductBundleSpecifications.SELECTOR__MARKER__COMPONENT_GROUP)\n            .data(ProductBundleSpecifications.DATA__COMPONENT_MATERIAL_NUMBER);\n          if (typeof category !== 'string' || typeof componentMaterialNumber !== 'number') {\n            return;\n          }\n          $tab\n            .selfOrFind('input[type=radio]').each(  (i: number, el:HTMLInputElement) => {\n              el.checked=true;\n            })\n            .selfOrClosest('li')\n            .siblings()\n            .find(ProductBundleSpecifications.SELECTOR__TRIGGER__SPECIFICATION_CATEGORY)\n            .selfOrFind('input[type=radio]:checked').each( (i:number, el: HTMLInputElement ) => {\n              el.checked = false;\n             });\n          ;\n          const $currentComponentGroup = $(ProductBundleSpecifications.SELECTOR__MARKER__COMPONENT_GROUP, $pbRoot).filter((_index, el) => {\n            return $(el).data(ProductBundleSpecifications.DATA__COMPONENT_MATERIAL_NUMBER) === componentMaterialNumber;\n          });\n          $(ProductBundleSpecifications.SELECTOR__MARKER__SPECIFICATION_CATEGORY, $currentComponentGroup).each((_index, el) => {\n            const $content = $(el);\n            $content.toggleClass(ProductBundleSpecifications.CLASS_HIDDEN, $content.data(ProductBundleSpecifications.DATA__SPECIFICATION_CATEGORY) !== category);\n          });\n        });\n      });\n      \n    }\n    \n  }\n  \n}\n","namespace eh {\n  \n  /**\n   * Fetches CAD drawings of products from webservice and displays them via iframe\n   *\n   */\n  export class ProductCadLoader {\n    public static readonly DATA_KEY = 'ehProductCadLoader';\n    public static readonly CLASS__ACTIVE = 'active';\n    public static readonly CLASS__INACTIVE = 'inactive';\n    public static readonly CLASS__DISABLED = 'disabled';\n    public static readonly CLASS__IS_DISABLED = 'is-disabled';\n    public static readonly CLASS__ERROR = 'error';\n    public static readonly CLASS__HIDDEN = 'eh--hide';\n    public static readonly CLASS__SHOW_SMALL = 'eh--show--lt-small';\n    \n    public static readonly SELECTOR__CAD_CONFIGURATION_MESSAGE = '.marker-cad-configuration-message';\n    public static readonly SELECTOR__CAD_CONFIGURATOR_LINK = '.marker-cad-configurator-link';\n    public static readonly SELECTOR__CAD_DISPLAY = '.marker-cad-display';\n    public static readonly SELECTOR__CAD_ERROR_MESSAGE = '.marker-cad-error-message';\n    public static readonly SELECTOR__CAD_ITEM_TPL = '.marker-cad-item-tpl';\n    public static readonly SELECTOR__CAD_ITEMS = '.marker-cad-items';\n    public static readonly SELECTOR__CAD_LABEL = '.marker-cad-label';\n    public static readonly SELECTOR__CAD_DROPDOWN_VALUE = '.marker-cad-dropdown-value';\n    public static readonly SELECTOR__CAD_PROGRESS_INDICATOR = '.marker-cad-progress-indicator';\n    public static readonly SELECTOR__PRODUCT_CAD_LOADER = '.marker-product-cad-loader';\n    public static readonly SELECTOR__CAD_CALLOUT = '.marker-cad-callout';\n    public static readonly SELECTOR__CAD_NO_DRAWINGS = '.marker-cad-no-drawings';\n    public static readonly SELECTOR__CAD_CALLOUT_DISMISS = '#privacyAdviceButton';\n    public static readonly SELECTOR__TRIGGER_CAD_ACTIVE = '.trigger-cad-active';\n    public static readonly SELECTOR__PRODUCT_CAD_LOADER_SMALL_INFO = '.marker-product-cad-loader-small-info';\n    // 5.15.3\n    public static readonly SELECTOR__TRIGGER_CAD_DRAWER_OPEN = '.trigger-cad-drawer-open';\n    public static readonly SELECTOR__CAD_DRAWER_WRAPPER = '.trigger-cad-drawer-active';\n    public static readonly SELECTOR__CAD_DRAWER_ERROR_MESSAGE = '.marker-cad-drawer-error-message';\n    public static readonly SELECTOR__CAD_DRAWER_CONFIGURATION_MESSAGE = '.marker-cad-drawer-configuration-message';\n    public static readonly SELECTOR__CAD_DRAWER_PROGRESS_INDICATOR = '.marker-cad-drawer-progress-indicator';\n    public static readonly SELECTOR__QS_ORDER_CODE_HANDLING = '.marker-qsrv-order-code-handling';\n    public static readonly SELECTOR__QS_ALTERNATIVE = '.marker-qsrv-alternative';\n\n    static readonly logger = log.getLogger('eh.ProductCadLoader');\n\n    static init($base: JQuery<HTMLElement>, isSnippetRequest = false): void {\n      if (isSnippetRequest) {\n        return;\n      }\n\n      const $productCadLoaderRoot = $(ProductCadLoader.SELECTOR__PRODUCT_CAD_LOADER, $base);\n      if ($productCadLoaderRoot.length === 0) {\n        return;\n      }\n  \n      const config: CadServiceConfiguration = $productCadLoaderRoot.data('cadServiceConfig');\n      if (!config || Object.keys(config).length === 0) {\n        return;\n      }\n\n      let cadHandledByQS = false;\n\n      $(eh.QuickSelect.SELECTOR, $base).each((_index, el) => {\n        const $quickSelectRoot = $(el);\n        const qs = $quickSelectRoot.data(eh.QuickSelect.DATA_KEY) as eh.QuickSelect;\n\n        const $orderCodeHandling = $(ProductCadLoader.SELECTOR__QS_ORDER_CODE_HANDLING, $quickSelectRoot);\n        const $alternative = $(ProductCadLoader.SELECTOR__QS_ALTERNATIVE, $quickSelectRoot);\n        const $cadWrapper = $(ProductCadLoader.SELECTOR__CAD_DRAWER_WRAPPER);\n        const syncCadWrapper = () => {\n          // Only treat the \"alternative\" panel as active when it actually EXISTS and is\n          // visible. An absent .marker-qsrv-alternative (e.g. when a predefined order code\n          // is passed) must NOT hide the CAD CTA — jQuery hasClass() returns false on an\n          // empty set, so the old `!$alternative.hasClass(...)` wrongly evaluated to true\n          // when the element was absent and hid the CTA.\n          const alternativeShown = $alternative.length > 0 && !$alternative.hasClass(ProductCadLoader.CLASS__HIDDEN);\n          const hide = $orderCodeHandling.hasClass(ProductCadLoader.CLASS__HIDDEN) || alternativeShown;\n          $cadWrapper.toggleClass(ProductCadLoader.CLASS__HIDDEN, hide);\n        };\n        syncCadWrapper();\n        const cadWrapperObserver = new MutationObserver(syncCadWrapper);\n        if ($orderCodeHandling[0]) {\n          cadWrapperObserver.observe($orderCodeHandling[0], { attributes: true, attributeFilter: ['class'] });\n        }\n        if ($alternative[0]) {\n          cadWrapperObserver.observe($alternative[0], { attributes: true, attributeFilter: ['class'] });\n        }\n\n        if (!qs || qs.isDisabled()) {\n          return;\n        }\n\n        cadHandledByQS = true;\n\n        const initFn = () => {\n          const productCadLoader = new ProductCadLoader(config, $productCadLoaderRoot);\n          $productCadLoaderRoot.data(ProductCadLoader.DATA_KEY, productCadLoader);\n          if (config.orderCode) {\n            productCadLoader.showUrls(config.orderCode);\n          } else {\n            productCadLoader.checkAvailability(config.productRoot);\n          }\n          $quickSelectRoot.on(eh.QS_EVENTS.ORDER_CODE_COMPLETE, (_$event: JQuery.TriggeredEvent) => {\n            const orderCode = qs.getCurrentStep()?.orderCode;\n            if (orderCode?.pattern) {\n              const orderCodeExternalized = QuickSelect.prepareOrderCodeForExternals(orderCode.pattern);\n              ProductCadLoader.logger.debug('QS_EVENTS.ORDER_CODE_COMPLETE', orderCodeExternalized, qs, _$event);\n              productCadLoader.showUrls(orderCodeExternalized);\n            }\n          }).on(eh.QS_EVENTS.ORDER_CODE_CHANGE, (_$event: JQuery.TriggeredEvent) => {\n            ProductCadLoader.logger.debug('QS_EVENTS.ORDER_CODE_CHANGE', qs, _$event);\n            if (productCadLoader.available === false) {\n              productCadLoader.stateHidden();\n            } else {\n              productCadLoader.stateNotConfigured();\n            }\n          });\n        };\n\n        if (qs.isInitialized()) {\n          initFn();\n        }\n        else {\n          $quickSelectRoot.one(eh.QS_EVENTS.INIT, (_$event: JQuery.TriggeredEvent) => {\n            initFn();\n          });\n        }\n      });\n\n      if (config.orderCode && !cadHandledByQS) {\n        const productCadLoader = new ProductCadLoader(config, $productCadLoaderRoot);\n        productCadLoader.showUrls(config.orderCode);\n      }\n    }\n\n    protected service: CadService;\n    private available: boolean | null = null;\n    private $configurationMessage: JQuery<HTMLElement>;\n    private $noDrawings: JQuery<HTMLElement>;\n    private $configuratorLink: JQuery<HTMLElement>;\n    private $display: JQuery<HTMLElement>;\n    private $smallInfo: JQuery<HTMLElement>;\n    private $errorMessage: JQuery<HTMLElement>;\n    private $itemTemplate: JQuery<HTMLElement>;\n    private $label: JQuery<HTMLElement>;\n    private $dropdownValue: JQuery<HTMLElement>;\n    private $progressIndicator: JQuery<HTMLElement>;\n    private $triggerActive: JQuery<HTMLElement>;\n    private $triggerDrawer: JQuery<HTMLElement>;\n\n    constructor(private config: CadServiceConfiguration, private $elem: JQuery<HTMLElement>) {\n      this.service = new CadService(config);\n      this.$configurationMessage = $(ProductCadLoader.SELECTOR__CAD_CONFIGURATION_MESSAGE, this.$elem).add(ProductCadLoader.SELECTOR__CAD_DRAWER_CONFIGURATION_MESSAGE);\n      // SPD (ps-cad-drawings.html): paragraph shown instead of the loader on a service error\n      this.$noDrawings = this.$elem.siblings(ProductCadLoader.SELECTOR__CAD_NO_DRAWINGS);\n      this.$configuratorLink = $(ProductCadLoader.SELECTOR__CAD_CONFIGURATOR_LINK, this.$elem);\n      this.$display = $(ProductCadLoader.SELECTOR__CAD_DISPLAY, this.$elem);\n\n      this.$smallInfo = $(ProductCadLoader.SELECTOR__PRODUCT_CAD_LOADER_SMALL_INFO);\n\n      this.$errorMessage = $(ProductCadLoader.SELECTOR__CAD_ERROR_MESSAGE, this.$elem).add(ProductCadLoader.SELECTOR__CAD_DRAWER_ERROR_MESSAGE);\n      this.$itemTemplate = this.$elem.find(ProductCadLoader.SELECTOR__CAD_ITEM_TPL).remove().removeClass('marker-cad-item-tpl');\n      this.$label = $(ProductCadLoader.SELECTOR__CAD_LABEL, this.$elem);\n      this.$dropdownValue = $(ProductCadLoader.SELECTOR__CAD_DROPDOWN_VALUE, this.$elem);\n      this.$progressIndicator = $(ProductCadLoader.SELECTOR__CAD_PROGRESS_INDICATOR, this.$elem).add(ProductCadLoader.SELECTOR__CAD_DRAWER_PROGRESS_INDICATOR);\n      this.$triggerActive = $(ProductCadLoader.SELECTOR__TRIGGER_CAD_ACTIVE, this.$elem)\n        .on('click', () => {\n          if (!this.$elem.hasClass(ProductCadLoader.CLASS__DISABLED) && this.$configuratorLink.hasClass(ProductCadLoader.CLASS__HIDDEN)) {\n            this.$elem.toggleClass(ProductCadLoader.CLASS__ACTIVE);\n          }\n        })\n      ;\n      this.$triggerDrawer = $(ProductCadLoader.SELECTOR__TRIGGER_CAD_DRAWER_OPEN).on('click', (ev) => {\n        if(this.$triggerDrawer.selfOrClosest(ProductCadLoader.CLASS__INACTIVE).length > 0) {\n          ev.preventDefault();\n          // qselect red\n          return false;\n        }\n      });\n      this.syncCallout();\n    }\n\n    private syncCallout(): void {\n      const $callout = this.$elem.siblings(ProductCadLoader.SELECTOR__CAD_CALLOUT);\n      if (!$callout.length) {\n        return;\n      }\n      let dismissed = false;\n      const sync = () => {\n        const visible = !dismissed && !this.$elem.hasClass(ProductCadLoader.CLASS__HIDDEN) && !this.$elem.hasClass('ehtw-hidden');\n        $callout.toggleClass('ehtw-hidden', !visible);\n      };\n      $callout.find(ProductCadLoader.SELECTOR__CAD_CALLOUT_DISMISS)\n        .off('click.cadCallout')\n        .on('click.cadCallout', (ev) => {\n          ev.preventDefault();\n          dismissed = true;\n          sync();\n        });\n      sync();\n      new MutationObserver(sync).observe(this.$elem[0], {attributes: true, attributeFilter: ['class']});\n    }\n  \n    private checkAvailability(root: string) {\n      this.stateLoading();\n      return this.service.getAvailability(root).then(response => {\n        if (ProductCadLoader.isResponseAvailability(response) && response.CADUrlsAvailable) {\n          ProductCadLoader.logger.debug('checkAvailability available', response);\n          this.available = true;\n          this.stateNotConfigured();\n        }\n        else {\n          ProductCadLoader.logger.debug('checkAvailability unavailable', response);\n          this.available = false;\n          this.stateHidden();\n        }\n      }).catch(err => {\n        ProductCadLoader.logger.warn('catch checkAvailability', err);\n        this.stateError();\n      });\n    }\n    \n    public showUrls(orderCode: string) {\n      this.stateLoading();\n      this.service.getUrls(orderCode).then(response => {\n        if (ProductCadLoader.isResponseUrls(response)) {\n          if (response.length > 0) {\n            ProductCadLoader.logger.debug('showUrls', response);\n            const $items = $(ProductCadLoader.SELECTOR__CAD_ITEMS, this.$elem);\n            $items.children().remove();\n            response\n              .sort((a,b) => {\n                const keys = Object.keys(this.config.localizations);\n                const posA = keys.indexOf(a.id);\n                const posB = keys.indexOf(b.id);\n                return posA - posB;\n              })\n              .forEach(((url, idx) => {\n              const $newItem = this.$itemTemplate.clone();\n              $newItem.attr('data-cs-tracking-title', url.id);\n              $newItem.appendTo($items);\n              const label = this.config.localizations[url.id];\n              $('.marker-cad-item-label', $newItem).text(label ?? url.id);\n              $('label.marker-cad-item-label', $newItem).attr('for', 'cadid'+idx)\n              $('.marker-cad-item-control', $newItem)\n                .attr('value', url.url).attr('id', 'cadid'+idx)\n                .on('change', $event => {\n                  const $el = $($event.target);\n                  if ($el.prop('checked')) {\n                    // Reflect the selected option in the dropdown's value label.\n                    // Done here (rather than delegated to DropdownController) so the\n                    // label updates reliably on both the initial trigger and user\n                    // selection, regardless of dynamic-item registration timing.\n                    this.$dropdownValue.text(label ?? url.id);\n                    this.loadIframeUrl('' + $el.val());\n                  }\n              });\n            }));\n            this.stateUrls();\n            $('.marker-cad-item-control', $items.children().first())\n              .prop('checked', true)\n              .trigger('change')\n            ;\n          }\n          else {\n            ProductCadLoader.logger.debug('showUrls', 'empty');\n            this.stateEmpty();\n          }\n        }\n        else {\n          ProductCadLoader.logger.warn('unexpected result showUrls', response);\n          this.stateError();\n        }\n      }).catch(err => {\n        ProductCadLoader.logger.warn('catch showUrls', err);\n        this.stateError();\n      });\n    }\n    \n    private loadIframeUrl(url: string) {\n      // The moment a new URL is requested, show the loading animation and keep the\n      // iframe hidden — reveal the iframe only once it has actually finished loading,\n      // so the blank/old iframe is never shown while loading.\n      // No `about:blank` reset: its (often synchronous) load event could fire the swap\n      // prematurely. `.off()` drops a stale handler from a rapid re-selection, so only\n      // the latest requested URL's load triggers the swap.\n      this.$display.toggleClass(ProductCadLoader.CLASS__HIDDEN, true);\n      this.$progressIndicator.toggleClass(ProductCadLoader.CLASS__HIDDEN, false);\n      this.$display\n        .off('load.cadLoad')\n        .one('load.cadLoad', () => {\n          this.$progressIndicator.toggleClass(ProductCadLoader.CLASS__HIDDEN, true);\n          this.$display.toggleClass(ProductCadLoader.CLASS__HIDDEN, false);\n        })\n        .prop('src', url)\n      ;\n    }\n    \n    private stateLoading() {\n      this.$noDrawings.toggleClass(ProductCadLoader.CLASS__HIDDEN, true);\n      this.$configurationMessage.toggleClass(ProductCadLoader.CLASS__HIDDEN, true);\n      this.$errorMessage.toggleClass(ProductCadLoader.CLASS__HIDDEN, true);\n      this.$progressIndicator.toggleClass(ProductCadLoader.CLASS__HIDDEN, false);\n      this.$triggerDrawer.toggleClass(ProductCadLoader.CLASS__HIDDEN, false)\n          .toggleClass(ProductCadLoader.CLASS__INACTIVE, true)\n          .toggleClass(ProductCadLoader.CLASS__IS_DISABLED, true)\n          .toggleClass(ProductCadLoader.CLASS__DISABLED, true);\n    }\n\n    private stateEmpty() {\n      this.$elem.toggleClass(ProductCadLoader.CLASS__ACTIVE, false);\n      this.$elem.toggleClass(ProductCadLoader.CLASS__DISABLED, true);\n      this.$elem.toggleClass(ProductCadLoader.CLASS__ERROR, false);\n      this.$elem.toggleClass(ProductCadLoader.CLASS__HIDDEN, true);\n\n      this.$configurationMessage.toggleClass(ProductCadLoader.CLASS__HIDDEN, true);\n      this.$configuratorLink.toggleClass(ProductCadLoader.CLASS__HIDDEN, true).toggleClass(ProductCadLoader.CLASS__DISABLED, true);\n      this.$display.toggleClass(ProductCadLoader.CLASS__HIDDEN, true).prop('src', 'about:blank');\n      this.$errorMessage.toggleClass(ProductCadLoader.CLASS__HIDDEN, true);\n      this.$label.toggleClass(ProductCadLoader.CLASS__HIDDEN, true);\n      this.$progressIndicator.toggleClass(ProductCadLoader.CLASS__HIDDEN, true);\n\n      this.$triggerDrawer.toggleClass(ProductCadLoader.CLASS__HIDDEN, false)\n          .toggleClass(ProductCadLoader.CLASS__INACTIVE, true)\n          .toggleClass(ProductCadLoader.CLASS__IS_DISABLED, true)\n          .toggleClass(ProductCadLoader.CLASS__DISABLED, true);\n    }\n\n    private stateHidden() {\n      this.$elem.toggleClass(ProductCadLoader.CLASS__ACTIVE, false);\n      this.$elem.toggleClass(ProductCadLoader.CLASS__DISABLED, false);\n      this.$elem.toggleClass(ProductCadLoader.CLASS__ERROR, false);\n      this.$elem.toggleClass(ProductCadLoader.CLASS__HIDDEN, true);\n      \n      this.$configurationMessage.toggleClass(ProductCadLoader.CLASS__HIDDEN, true);\n      this.$configuratorLink.toggleClass(ProductCadLoader.CLASS__HIDDEN, true).toggleClass(ProductCadLoader.CLASS__DISABLED, true);\n      this.$display.toggleClass(ProductCadLoader.CLASS__HIDDEN, true).prop('src', 'about:blank');\n      this.$errorMessage.toggleClass(ProductCadLoader.CLASS__HIDDEN, false);\n      this.$label.toggleClass(ProductCadLoader.CLASS__HIDDEN, true);\n      this.$progressIndicator.toggleClass(ProductCadLoader.CLASS__HIDDEN, true);\n\n      this.$triggerDrawer.toggleClass(ProductCadLoader.CLASS__HIDDEN, false)\n          .toggleClass(ProductCadLoader.CLASS__INACTIVE, true)\n          .toggleClass(ProductCadLoader.CLASS__IS_DISABLED, true)\n          .toggleClass(ProductCadLoader.CLASS__DISABLED, true)\n      ;\n    }\n\n    private stateNotConfigured() {\n      this.$elem.toggleClass(ProductCadLoader.CLASS__ACTIVE, false);\n      this.$elem.toggleClass(ProductCadLoader.CLASS__DISABLED, true);\n      this.$elem.toggleClass(ProductCadLoader.CLASS__ERROR, false);\n      this.$elem.toggleClass(ProductCadLoader.CLASS__HIDDEN, false);\n  \n      this.$configurationMessage.toggleClass(ProductCadLoader.CLASS__HIDDEN, false);\n      this.$configuratorLink.toggleClass(ProductCadLoader.CLASS__HIDDEN, true).toggleClass(ProductCadLoader.CLASS__DISABLED, true);\n      this.$display.toggleClass(ProductCadLoader.CLASS__HIDDEN, true).prop('src', 'about:blank');\n      this.$errorMessage.toggleClass(ProductCadLoader.CLASS__HIDDEN, true);\n      this.$label.toggleClass(ProductCadLoader.CLASS__HIDDEN, false);\n      this.$progressIndicator.toggleClass(ProductCadLoader.CLASS__HIDDEN, true);\n\n      this.$smallInfo.toggleClass(ProductCadLoader.CLASS__HIDDEN, false);\n      this.$smallInfo.toggleClass(ProductCadLoader.CLASS__SHOW_SMALL, true);\n\n      this.$triggerDrawer.toggleClass(ProductCadLoader.CLASS__HIDDEN, false)\n          .toggleClass(ProductCadLoader.CLASS__INACTIVE, true)\n          .toggleClass(ProductCadLoader.CLASS__IS_DISABLED, true)\n          .toggleClass(ProductCadLoader.CLASS__DISABLED, true)\n      ;\n    }\n  \n    private stateUrls() {\n      this.$elem.toggleClass(ProductCadLoader.CLASS__ACTIVE, false); // only opened by click on $triggerActive\n      this.$elem.toggleClass(ProductCadLoader.CLASS__DISABLED, false);\n      this.$elem.toggleClass(ProductCadLoader.CLASS__ERROR, false);\n      this.$elem.toggleClass(ProductCadLoader.CLASS__HIDDEN, false);\n      \n      this.$configurationMessage.toggleClass(ProductCadLoader.CLASS__HIDDEN, true);\n      this.$configuratorLink.toggleClass(ProductCadLoader.CLASS__HIDDEN, true).toggleClass(ProductCadLoader.CLASS__DISABLED, true);\n      this.$display.toggleClass(ProductCadLoader.CLASS__HIDDEN, true);\n      this.$errorMessage.toggleClass(ProductCadLoader.CLASS__HIDDEN, true);\n      this.$label.toggleClass(ProductCadLoader.CLASS__HIDDEN, false);\n      this.$progressIndicator.toggleClass(ProductCadLoader.CLASS__HIDDEN, true);\n\n      this.$triggerDrawer.toggleClass(ProductCadLoader.CLASS__HIDDEN, false)\n          .toggleClass(ProductCadLoader.CLASS__INACTIVE, false)\n          .toggleClass(ProductCadLoader.CLASS__IS_DISABLED, false)\n          .toggleClass(ProductCadLoader.CLASS__DISABLED, false)\n      ;\n    }\n    \n    private stateConfigurator() {\n      this.$elem.toggleClass(ProductCadLoader.CLASS__ACTIVE, false);\n      this.$elem.toggleClass(ProductCadLoader.CLASS__DISABLED, false);\n      this.$elem.toggleClass(ProductCadLoader.CLASS__ERROR, false);\n      this.$elem.toggleClass(ProductCadLoader.CLASS__HIDDEN, false);\n      \n      this.$configurationMessage.toggleClass(ProductCadLoader.CLASS__HIDDEN, true);\n      this.$configuratorLink.toggleClass(ProductCadLoader.CLASS__HIDDEN, false).toggleClass(ProductCadLoader.CLASS__DISABLED, false);\n      this.$display.toggleClass(ProductCadLoader.CLASS__HIDDEN, true).prop('src', 'about:blank');\n      this.$errorMessage.toggleClass(ProductCadLoader.CLASS__HIDDEN, true);\n      this.$label.toggleClass(ProductCadLoader.CLASS__HIDDEN, true);\n      this.$progressIndicator.toggleClass(ProductCadLoader.CLASS__HIDDEN, true);\n\n      this.$triggerDrawer.toggleClass(ProductCadLoader.CLASS__HIDDEN, false)\n          .toggleClass(ProductCadLoader.CLASS__INACTIVE, false)\n          .toggleClass(ProductCadLoader.CLASS__IS_DISABLED, false)\n          .toggleClass(ProductCadLoader.CLASS__DISABLED, false)\n      ;\n    }\n    \n    private stateError() {\n      this.$elem.toggleClass(ProductCadLoader.CLASS__ACTIVE, false);\n      this.$elem.toggleClass(ProductCadLoader.CLASS__DISABLED, true);\n      this.$elem.toggleClass(ProductCadLoader.CLASS__ERROR, true);\n      this.$elem.toggleClass(ProductCadLoader.CLASS__HIDDEN, false);\n      \n      this.$configurationMessage.toggleClass(ProductCadLoader.CLASS__HIDDEN, true);\n      this.$configuratorLink.toggleClass(ProductCadLoader.CLASS__HIDDEN, true).toggleClass(ProductCadLoader.CLASS__DISABLED, true);\n      this.$display.toggleClass(ProductCadLoader.CLASS__HIDDEN, true).prop('src', 'about:blank');\n      this.$errorMessage.toggleClass(ProductCadLoader.CLASS__HIDDEN, false);\n      this.$label.toggleClass(ProductCadLoader.CLASS__HIDDEN, false);\n      this.$progressIndicator.toggleClass(ProductCadLoader.CLASS__HIDDEN, true);\n\n      this.$triggerDrawer.toggleClass(ProductCadLoader.CLASS__HIDDEN, false)\n          .toggleClass(ProductCadLoader.CLASS__INACTIVE, true)\n          .toggleClass(ProductCadLoader.CLASS__IS_DISABLED, true)\n          .toggleClass(ProductCadLoader.CLASS__DISABLED, true)\n      ;\n\n      if (this.$noDrawings.length) {\n        this.$elem.toggleClass(ProductCadLoader.CLASS__HIDDEN, true);\n        this.$noDrawings.toggleClass(ProductCadLoader.CLASS__HIDDEN, false);\n      }\n    }\n    \n    public static isResponseAvailability(response: CadServiceResponse | undefined): response is CadServiceResponse_Availability {\n      return response !== undefined\n          && (response as CadServiceResponse_Availability).CADUrlsAvailable !== undefined;\n    }\n    \n    public static isResponseFailure(response: CadServiceResponse | undefined): response is CadServiceResponse_Failure {\n      return response !== undefined\n          && (response as CadServiceResponse_Failure).error !== undefined;\n    }\n  \n    public static isResponseUrls(response: CadServiceResponse | undefined): response is CadServiceResponse_Urls {\n      return response !== undefined\n          && Array.isArray(response);\n    }\n    \n  }\n  \n  \n  class CadService {\n\n    constructor(private readonly config: CadServiceConfiguration) {\n    }\n\n    public getConfig(): CadServiceConfiguration {\n      return this.config;\n    }\n\n    protected buildRequest(endpoint: CadServiceEndpoint, pathParam: string): JQuery.AjaxSettings<CadServiceResponse> {\n      const requestHeaders : { [key: string]: string } = {\n        'APIKey': this.config.apiKey\n      };\n      if (endpoint === CadServiceEndpoint.Urls) {\n        requestHeaders['Accept-Language'] = this.config.language;\n      }\n      const settings: JQuery.AjaxSettings<CadServiceResponse> = {\n        'dataType': 'json',\n        'timeout': 30_000,\n        'headers': requestHeaders\n      };\n      const url = this.config.serviceUrl;\n      settings.url = url + [this.config.endpointPath[endpoint], encodeURIComponent(pathParam)].join('/');\n      return settings;\n    }\n\n    public getAvailability(productRoot: string): JQuery.jqXHR<CadServiceResponse_Availability | CadServiceResponse_Failure> {\n      const request = this.buildRequest(CadServiceEndpoint.Availability, productRoot);\n      return $.ajax(request);\n    }\n\n    public getUrls(orderCode: string): JQuery.jqXHR<CadServiceResponse_Urls | CadServiceResponse_Failure> {\n      const request = this.buildRequest(CadServiceEndpoint.Urls, orderCode);\n      return $.ajax(request);\n    }\n\n  }\n  \n  enum CadServiceEndpoint {\n    Availability = 'getAvailability',\n    Urls = 'getUrls'\n  }\n  \n  type CadServiceConfiguration = {\n    'apiKey': string,\n    'endpointPath': {\n      [Property in CadServiceEndpoint]: string\n    },\n    'language': string,\n    'localizations': {\n      [key: string]: string\n    },\n    'productRoot': string,\n    'orderCode'?: string,\n    'serviceUrl': string\n  };\n  \n  type CadServiceResponse = CadServiceResponse_Availability | CadServiceResponse_Urls | CadServiceResponse_Failure;\n  \n  type CadServiceResponse_Availability = {\n    'CADUrlsAvailable': boolean\n  };\n  \n  type CadServiceResponse_Failure = {\n    'error': {\n      'status': number,\n      'errorType': string,\n      'message': string\n    }\n  };\n  \n  type CadServiceResponse_Url = {\n    'id': string,\n    'url': string\n  };\n  \n  type CadServiceResponse_Urls = CadServiceResponse_Url[];\n  \n}\n","namespace eh {\n\n  export class ProductContainer {\n  \n    public static readonly CLASS_HIDDEN = 'eh--hide';\n    \n    static init($base: JQuery<HTMLElement>): void {\n      if ($base.find('.ps-product-container-accessoire-start').length) {\n        new SpareNavigationHandler($base.find('.ps-product-container-accessoire-start'));\n      }\n      if ($base.find('.ps-product-container-tech-info-start').length) {\n        new NavigationHandler($base.find('.ps-product-container-tech-info-start'));\n      }\n      if ($base.find('.ps-product-container-documents-start').length) {\n        new DocumentsNavigationHandler($base.find('.ps-product-container-documents-start'));\n      }\n    }\n  }\n\n  function getSelectedLabel($select: JQuery<HTMLElement>, selectedValue = $select.val()):string {\n    return $('option[value=\"' + selectedValue + '\"]', $select).text();\n  }\n\n  class DocumentsNavigationHandler {\n\n    private readonly $dropDown1: JQuery<HTMLElement>;\n    private readonly $dropDown2: JQuery<HTMLElement>;\n    private showMoreBtn: JQuery<HTMLElement>;\n    private showLessBtn: JQuery<HTMLElement>;\n    private showAll = false;\n    \n    private static readonly SELECT2_DEFAULT_VALUE = '-1';\n\n    constructor(private readonly $base: JQuery<HTMLElement>) {\n      this.$dropDown1 = $('.product-container-select[name=\"category1\"]', this.$base);\n      this.$dropDown2 = $('.product-container-select[name=\"category2\"]', this.$base);\n      this.showMoreBtn = this.$base.find('.marker-show-more');\n      this.showLessBtn = this.$base.find('.marker-show-less');\n  \n      this.$dropDown1.add(this.$dropDown2)\n        .on('change', ($event: JQuery.TriggeredEvent, artificialEvent?: boolean) => {\n        if (artificialEvent) {\n          return;\n        }\n        const $el = $($event.currentTarget);\n        \n        if ($el.is(this.$dropDown1)) {\n          this.filterDropDown(this.$dropDown2, this.$dropDown1.val() as string);\n        }\n        \n        this.filterContent(this.$dropDown1.val() as string, this.$dropDown2.val() as string);\n  \n        const trackingParams: { 'k': string; 'v': string; }[] = [{k:this.$dropDown1.data('csTrackingTitle'), v: this.$dropDown1.val() as string}];\n        if (this.$dropDown2.val() && this.$dropDown2.val() !== DocumentsNavigationHandler.SELECT2_DEFAULT_VALUE) {\n          trackingParams.push({k:this.$dropDown2.data('csTrackingTitle'), v: this.$dropDown2.val() as string});\n        }\n        eh.Tracking.injectTrackingEvent($.extend({}, eh.Tracking.analyzeFilterParams(trackingParams),\n            {'event_subtype': 'filter_click'}), this.$dropDown1, 'filter');\n      });\n      \n      this.filterDropDown(this.$dropDown2, this.$dropDown1.val() as string);\n      this.filterContent(this.$dropDown1.val() as string, this.$dropDown2.val() as string);\n      \n      this.showMoreBtn.on('click', ($event: JQuery.TriggeredEvent) => {\n        $event.preventDefault();\n        this.showAll = true;\n        this.showMoreBtn.addClass(ProductContainer.CLASS_HIDDEN);\n        this.showLessBtn.removeClass(ProductContainer.CLASS_HIDDEN);\n  \n        this.filterContent(this.$dropDown1.val() as string, this.$dropDown2.val() as string);\n      });\n      this.showLessBtn.on('click', ($event: JQuery.TriggeredEvent) => {\n        $event.preventDefault();\n        this.showAll = false;\n        this.showLessBtn.addClass(ProductContainer.CLASS_HIDDEN);\n        this.showMoreBtn.removeClass(ProductContainer.CLASS_HIDDEN);\n        \n        const heightFull = this.$base.height() || 0;\n        const currentPagePosition = eh.ScrollPage.getScrollPosition();\n        this.filterContent(this.$dropDown1.val() as string, this.$dropDown2.val() as string);\n        const heightShort = this.$base.height() || 0;\n        eh.ScrollPage.scrollToAnimated(currentPagePosition + (heightShort - heightFull));\n      });\n    }\n    \n    private filterDropDown($dropDown: JQuery<HTMLElement>, filterValue: string | undefined) {\n      let optionsVisible = false;\n      $dropDown.find('option').each((_index, el) => {\n        const $el = $(el);\n        if ($el.attr('value') === DocumentsNavigationHandler.SELECT2_DEFAULT_VALUE) {\n          // skip default option\n          return;\n        }\n        if (!filterValue || $el.data('parent') === filterValue) {\n          $el.prop('disabled', false).prop('hidden', false);\n          optionsVisible = true;\n        }\n        else {\n          $el.prop('disabled', true).prop('hidden', true);\n        }\n      });\n      // reset selection\n      $dropDown.val(DocumentsNavigationHandler.SELECT2_DEFAULT_VALUE).trigger('change', true);\n      $dropDown.closest('.product-container-select-wrapper')\n        .toggleClass(ProductContainer.CLASS_HIDDEN, !optionsVisible);\n    }\n    \n    private filterContent(filter1Value: string | undefined, filter2Value: string | undefined) {\n      let overflowing = false;\n      const maxVisible = this.showAll ? 9007199254740991 : 5; // Number.MAX_SAFE_INTEGER === 9007199254740991\n      let numVisible = 0;\n      $('.marker-product-container-tab', this.$base).each((_index, el) => {\n        const $el = $(el);\n        if (DocumentsNavigationHandler.matchesFilterKey(filter1Value, $el.data('filterKey1'))\n          && DocumentsNavigationHandler.matchesFilterKey(filter2Value, $el.data('filterKey2'))) {\n          if (numVisible < maxVisible) {\n            $el.toggleClass(ProductContainer.CLASS_HIDDEN, false);\n            numVisible++;\n          }\n          else {\n            overflowing = true;\n            $el.toggleClass(ProductContainer.CLASS_HIDDEN, true);\n          }\n        }\n        else {\n          $el.toggleClass(ProductContainer.CLASS_HIDDEN, true);\n        }\n      });\n      this.showMoreBtn.toggleClass(ProductContainer.CLASS_HIDDEN, !overflowing);\n    }\n    \n    private static matchesFilterKey(search: string | undefined, data: string | undefined) {\n      if (!search || search === DocumentsNavigationHandler.SELECT2_DEFAULT_VALUE) {\n        return true;\n      }\n      return data?.split(',').indexOf(search) !== -1 ?? false;\n    }\n\n  }\n\n  class SpareNavigationHandler {\n    private readonly searchField: JQuery<HTMLElement>;\n    private searchFieldMagnifier: JQuery<HTMLElement>;\n    private searchFieldClear: JQuery<HTMLElement>;\n    private readonly dropDown: JQuery<HTMLElement>;\n    private bottomTab: JQuery<HTMLElement>;\n    private showMoreBtn: JQuery<HTMLElement>;\n    private showLessBtn: JQuery<HTMLElement>;\n    private showAll: boolean = false;\n    private beAgnostic: boolean = false;\n\n    constructor(public readonly co: JQuery<HTMLElement>) {\n      this.searchField = $('.ps-product-container-search', this.co);\n      this.searchFieldMagnifier = $('.ps-product-container-magnifier', this.co);\n      this.searchFieldClear = $('.ps-product-container-clear-search', this.co);\n      this.dropDown = $('.product-container-select', this.co);\n      this.bottomTab = $('.product-container-list-part', this.co);\n      this.showMoreBtn = this.bottomTab.find('.ps-product-container-show-more');\n      this.showLessBtn = this.bottomTab.find('.ps-product-container-show-less');\n\n      this.showMoreBtn.on('click', (event: JQuery.Event) => {\n        event.preventDefault();\n        this.showAll = true;\n        this.showMoreBtn.addClass(ProductContainer.CLASS_HIDDEN);\n        this.showLessBtn.removeClass(ProductContainer.CLASS_HIDDEN);\n        this.updateList();\n      });\n\n      this.showLessBtn.on('click', (event: JQuery.Event) => {\n        event.preventDefault();\n        this.showAll = false;\n        const heightFull = this.bottomTab.height() || 0;\n        const currentPagePosition = eh.ScrollPage.getScrollPosition();\n        this.showMoreBtn.removeClass(ProductContainer.CLASS_HIDDEN);\n        this.showLessBtn.addClass(ProductContainer.CLASS_HIDDEN);\n        this.updateList();\n        const heightShort = this.bottomTab.height() || 0;\n        eh.ScrollPage.scrollToAnimated(currentPagePosition + (heightShort - heightFull));\n      });\n\n      this.bottomTab.find('.eh-external-accessoire--item-details').each((idx, det) => {\n        let details = $(det);\n        let detail = details.find('.ps-product-container-detail');\n        let showBt = details.find('.ps-product-container-show-detail-btn');\n        let hideBt = details.find('.ps-product-container-show-less-detail-btn');\n        showBt.on('click', (event: JQuery.Event) => {\n          event.preventDefault();\n          detail.removeClass(ProductContainer.CLASS_HIDDEN);\n          showBt.addClass(ProductContainer.CLASS_HIDDEN);\n          hideBt.removeClass(ProductContainer.CLASS_HIDDEN);\n        });\n        hideBt.on('click', (event: JQuery.Event) => {\n          event.preventDefault();\n          detail.addClass(ProductContainer.CLASS_HIDDEN);\n          showBt.removeClass(ProductContainer.CLASS_HIDDEN);\n          hideBt.addClass(ProductContainer.CLASS_HIDDEN);\n        });\n      });\n\n      this.initSearch();\n      this.initSelect();\n      this.dropDown.trigger('change', true);\n    }\n\n    private getVal(el:JQuery<HTMLElement>):string {\n      if(el && el.val()) {\n        if(el === this.dropDown && (''+el.val() === '0')) {\n          return '';\n        }\n        return ''+el.val();\n      }\n      return '';\n    }\n\n    private updateField() {\n      let term = this.getVal(this.searchField);\n      if(term) {\n        this.searchFieldClear.removeClass(ProductContainer.CLASS_HIDDEN);\n        this.searchFieldMagnifier.removeClass('disabled');\n      } else {\n        this.searchFieldClear.addClass(ProductContainer.CLASS_HIDDEN);\n        this.searchFieldMagnifier.addClass('disabled');\n      }\n    }\n\n    private reset(el:JQuery<HTMLElement>, resetVal:string) {\n      if(this.beAgnostic) {\n        return;\n      }\n      let v = this.getVal(el);\n      if(v && v !== resetVal) {\n        el.val(resetVal);\n        if(el.hasClass('select2-hidden-accessible')) {\n          this.beAgnostic = true;\n          el.trigger('change.select2');\n          this.beAgnostic = false;\n        }\n      }\n      this.showAll = false;\n      this.showMoreBtn.removeClass(ProductContainer.CLASS_HIDDEN);\n    }\n\n    private initSearch() {\n      this.searchFieldClear.on('click', (event: JQuery.Event) => {\n        event.preventDefault();\n        this.reset(this.searchField, '');\n        this.updateField();\n        this.updateList();\n      });\n      this.searchField.on('keydown', (event: JQuery.Event) => {\n        if (event.key === 'Enter') {\n          event.stopImmediatePropagation();\n          event.preventDefault();\n        }\n      }).on('input', () => {\n        this.reset(this.dropDown, '0');\n        this.updateField();\n        this.updateList();\n      }).on('focus', () => {\n        eh.Tracking.injectTrackingEvent({'event_linkname': 'search'}, this.searchField, 'click_in');\n      });\n      this.updateField();\n    }\n\n    private initSelect() {\n      this.dropDown.on('change', (_$event, artificialEvent?: boolean) => {\n        this.reset(this.searchField, '');\n        if(!this.getVal(this.dropDown)) {\n          this.reset(this.dropDown, '0'); // update 'more'\n        } else {\n          this.showAll = false;\n        }\n        \n        this.updateList();\n        if (!artificialEvent) {\n          const formParams: { 'k': string; 'v': string; }[] = [{k: this.dropDown.data('csTrackingTitle'), v: getSelectedLabel(this.dropDown)}];\n          eh.Tracking.injectTrackingEvent($.extend({}, eh.Tracking.analyzeFilterParams(formParams),\n            {'event_subtype': 'filter_click'}), this.dropDown, 'filter');\n        }\n      });\n    }\n\n\n    private updateList():void {\n      let term = this.getVal(this.searchField).toLowerCase();\n      let filter = this.getVal(this.dropDown);\n      let categories = this.bottomTab.find('.top-marker-product-container');\n      let catVisible = 0;\n      let allVisible = 0;\n      let allAvail = 0;\n      if(term) {\n        this.showAll = true;\n      }\n      this.showMoreBtn.addClass(ProductContainer.CLASS_HIDDEN);\n      this.showLessBtn.addClass(ProductContainer.CLASS_HIDDEN);\n      let isTerm = term.trim().length > 0;\n      let terms = term.split(' ');\n      categories.each((idx, c) => {\n        let cat = $(c);\n        catVisible = 0;\n        cat.find('.marker-product-container').each((i, x) => {\n          let match = false;\n          let prod = $(x);\n          if(allVisible < 5 || this.showAll || allAvail === 0) {\n            match = !isTerm;\n            if(isTerm) {\n              prod.find('.ps-product-container-searchable').each((i, s) => {\n                if(!match) {\n                  let txt = $(s).text().toLowerCase();\n                  terms.forEach((t) => {\n                    if(!match && txt.indexOf(t) > -1) {\n                      match = true;\n                    }\n                  });\n                }\n              });\n            }\n            if(match && filter) {\n              match = prod.data('category') === filter;\n            }\n          }\n          if(match) {\n            if(this.showAll || allVisible < 5) {\n              catVisible++;\n              allVisible++;\n              prod.removeClass(ProductContainer.CLASS_HIDDEN);\n              prod.removeClass('eh-no-b');\n            } else {\n              prod.addClass(ProductContainer.CLASS_HIDDEN);\n              allAvail ++;\n            }\n          } else {\n            prod.addClass(ProductContainer.CLASS_HIDDEN);\n          }\n        });\n        cat.find('.marker-product-container:not(.eh--hide)').last().addClass('eh-no-b');\n        if(catVisible > 0) {\n          cat.removeClass(ProductContainer.CLASS_HIDDEN);\n          cat.removeClass('eh-no-b');\n        } else {\n          cat.addClass(ProductContainer.CLASS_HIDDEN);\n        }\n      });\n      if(!this.showAll) {\n        if(allAvail > 0) {\n          this.showMoreBtn.removeClass(ProductContainer.CLASS_HIDDEN);\n        }\n      } else {\n        if(allVisible > 5 && !isTerm) {\n          this.showLessBtn.removeClass(ProductContainer.CLASS_HIDDEN);\n        }\n      }\n      this.bottomTab.find('.top-marker-product-container:not(.eh--hide)').last().addClass('eh-no-b');\n    }\n  }\n\n  class NavigationHandler {\n    private tabsContainer: TabContainer[] = [];\n    private backBt: JQuery<HTMLElement>;\n    private scrollPosition: number;\n\n    constructor(public readonly container: JQuery<HTMLElement>) {\n      this.backBt = container.find('.js-back-bt-prod-container');\n      $('.trigger-product-container-tab', container).each((i, x) => {\n        let y = new TabContainer(this, $(x));\n        this.tabsContainer.push(y);\n      });\n\n      this.backBt.on('click', (event: JQuery.Event) => {\n        event.preventDefault();\n        container.removeClass('has-selection');\n        eh.ScrollPage.setScrollEnabled(true, 'eh-no-scroll--x-small eh-full-height--x-small');\n      });\n    }\n\n    activate(tab: TabContainer) {\n      this.tabsContainer.forEach(x => {\n        x.setActive(x === tab, this.container);\n      });\n    }\n\n    setScrollPosition(scrollPosition: number) {\n      this.scrollPosition = scrollPosition;\n    }\n  }\n\n  class TabContainer {\n    private control: JQuery<HTMLElement>;\n    private panel: JQuery<HTMLElement>;\n    private buttonShowMore: JQuery<HTMLElement>;\n    private buttonShowLess: JQuery<HTMLElement>;\n\n    constructor(private controller: NavigationHandler, ctrl: JQuery<HTMLElement>) {\n      this.control = ctrl;\n      let tabSel = ctrl.data('tabmarker');\n      this.panel = $(controller.container.find('.' + tabSel));\n      this.control.on('click', (e) => {\n        e.preventDefault();\n        controller.setScrollPosition(eh.ScrollPage.getScrollPosition());\n        this.controller.activate(this);\n      });\n\n      this.buttonShowMore = this.panel.find('.marker-show-more');\n      this.buttonShowLess = this.panel.find('.marker-show-less');\n\n      this.buttonShowMore.on('click', (event: JQuery.Event) => {\n        event.preventDefault();\n        this.buttonShowMore.addClass(ProductContainer.CLASS_HIDDEN);\n        this.buttonShowLess.removeClass(ProductContainer.CLASS_HIDDEN);\n\n        this.panel.find('.eh-external-tech-info-result--items li').removeClass(ProductContainer.CLASS_HIDDEN);\n      });\n      this.buttonShowLess.on('click', (event: JQuery.Event) => {\n        event.preventDefault();\n        const currentPagePosition = eh.ScrollPage.getScrollPosition();\n        const heightFull = this.panel.height() || 0;\n        this.doShowLess();\n        const heightShort = this.panel.height() || 0;\n        eh.ScrollPage.scrollToAnimated(currentPagePosition + (heightShort - heightFull));\n      });\n\n    }\n\n    private doShowLess() {\n      this.buttonShowLess.addClass(ProductContainer.CLASS_HIDDEN);\n      this.buttonShowMore.removeClass(ProductContainer.CLASS_HIDDEN);\n      this.panel.find('.eh-external-tech-info-result--items li').addClass(ProductContainer.CLASS_HIDDEN);\n      this.panel.find('.eh-external-tech-info-result--items li').slice(0, 5).removeClass(ProductContainer.CLASS_HIDDEN);\n    }\n\n    setActive(state: boolean, container: JQuery<HTMLElement>) {\n      if (state) {\n        container.addClass('has-selection');\n        eh.ScrollPage.setScrollEnabled(false, 'eh-no-scroll--x-small eh-full-height--x-small');\n        this.control.addClass('active');\n        this.panel.removeClass(ProductContainer.CLASS_HIDDEN);\n      } else {\n        this.doShowLess();\n        this.control.removeClass('active');\n        this.panel.addClass(ProductContainer.CLASS_HIDDEN);\n      }\n    }\n  }\n\n}\n","namespace eh {\n    /*\n     * Uses custom events triggered by the QuickSelectRv component.\n     * uses eh.QuickSelect.QS_EVENTS\n     */\n\n\n    /**\n     * Custom events of the RV implementation only — the shared eh.QS_EVENTS belong to\n     * the old QuickSelect workflow and must not be extended.\n     */\n    export class QS_RV_EVENTS {\n        /**\n         * Triggered with a boolean payload when the service starts / finishes\n         * auto-completing the remaining features (recommendation sequence). While it\n         * runs, the configuration is in flux, so the order-box actions and the\n         * order-code segments must not be operable.\n         */\n        static AUTO_COMPLETION_CHANGE: string = 'eh-quickselect-rv-on-autocompletion-change';\n    }\n\n    export interface IRvRowValue {\n        [s: string]: any\n    }\n\n    /**\n     * Utility factory for creating and templating QuickSelect view elements.\n     */\n    export class QSRvViewFactory {\n        private static idCounter = 1;\n        /**\n         * Replaces placeholders in a template string with provided values.\n         * Escapes HTML characters.\n         *\n         * @param tpl The template string containing <%prop%> placeholders.\n         * @param values Object containing key-value pairs for replacement.\n         * @param index Optional index value to replace <%$index%>.\n         * @returns The processed template string.\n         */\n        static themeRow(tpl: string, values: IRvRowValue = Object.create(null), index: number = 0): string {\n            values.$index = index;\n            values.$inputid = 'input_tpl_'+QSRvViewFactory.idCounter++;\n            for (let prop in values) {\n                if (!values.hasOwnProperty(prop)) {\n                    continue;\n                }\n                const needle: string = `<%${prop}%>`;\n                while (tpl.indexOf(needle) !== -1) {\n                    tpl = tpl.replace(needle, (values[prop] + '')\n                        .replace(/&/g, \"&amp;\")\n                        .replace(/</g, \"&lt;\")\n                        .replace(/>/g, \"&gt;\")\n                        .replace(/\"/g, \"&quot;\")\n                    );\n                }\n            }\n            tpl = tpl.replace(/(<%)+\\w+(%>)/gim, '');\n            return tpl;\n        }\n\n        /**\n         * Creates a jQuery element from a template and values.\n         */\n        static createRow(tpl: string, values: IRvRowValue, index: number = 0): JQuery<HTMLElement> {\n            return $(QSRvViewFactory.themeRow(tpl, values, index));\n        }\n\n        /**\n         * Creates an array of jQuery elements from a template and a list of values.\n         */\n        static createRows(tpl: string, valuesList: IRvRowValue[]): JQuery<HTMLElement>[] {\n            const iterator: () => number = (() => {\n                let i = 0;\n                return (): number => ++i;\n            })();\n            return valuesList.map(v => QSRvViewFactory.createRow(tpl, v, iterator()));\n        }\n\n        /**\n         * Cleans up a template string by replacing escaped placeholder delimiters.\n         */\n        static createTemplateString(elementString?: string): string {\n            return elementString\n                ?.replace(/&lt;%/g, '<%')\n                ?.replace(/%&gt;/g, '%>') ?? '';\n        }\n\n        /**\n         * Extracts the HTML of an element and converts it into a template string.\n         */\n        static createTemplateStringByEl(el: JQuery<HTMLElement>): string {\n            return QSRvViewFactory.createTemplateString(el.wrap('<p/>').parent().html() ?? '');\n        }\n    }\n\n    interface ITemplateDescriptor {\n        templateData: any;\n        headerTpl: string;\n        optionsTpl: string;\n        ctrlClazz: any;\n    }\n\n    /**\n     * Interface for elements that can be rendered as a configuration layer.\n     */\n    interface IRenderElement {\n        state: LoaderStateRv;\n        data: RenderElementData;\n        idx: number;\n        selection: eh.IProductSegmentRv | null;\n\n        /** Returns true if an option has been selected in this layer. */\n        hasSelection(): boolean;\n\n        /** Called when the element is created and added to the DOM. */\n        onCreate(): void;\n\n        /** Called when the element is removed from the DOM. */\n        onRemove(): void;\n\n        /** Toggles the visibility of options in this layer. */\n        showOptions(v: boolean): void;\n\n        /** Handles the selection of an option. */\n        onSelect(option: any): void;\n\n        /** Called when the layer receives focus. */\n        onFocus(): void;\n\n        /** The root jQuery element(s) of the layer. */\n        elements: JQuery<HTMLElement>;\n    }\n\n    type RenderElementData = {\n        manager: QSRvViewModel,\n        header: any,\n        options: any,\n        templateData: any\n    };\n\n    export interface OrderCodeRvVO {\n        pattern: string;\n        currentIndex: number;\n        orderCode: OrderCodeRv;\n    }\n\n    /**\n     * View Model for the QuickSelect component.\n     * Manages the UI state, rendering of configuration layers, and user interactions.\n     */\n    export class QSRvViewModel {\n        static EL_CONTENT_SECTION: string = '.eh-qsrv-section';\n        static EL_OPTIONS_PARENT_SELECTOR: string = '.eh-qsrv--options';\n        static EL_FEEDBACK_OPTIONS_PARENT_SELECTOR: string = '.eh-qsrv--selection-options-feedback';\n        static EL_CTA_BUTTON: string = '.eh-qsrv--product-cta .eh-link';\n        static EL_QUICKSELECT_FOOTER: string = '.eh-qsrv--footer';\n        // Structured order-code label; the spinner trails its segments inline\n        // (the label row is flex-wrap, unlike the flex-col legend around it) while\n        // loading/simulating. QSRvOrderCodeLabel preserves the spinner across its\n        // re-renders (see update/updateFromOrderCode).\n        static EL_SPINNER_HOST_SELECTOR: string = '.eh-qsrv--product-label';\n        // Hidden store holding the (uncloned) snippet templates; read from here so the\n        // raw <%...%> markup never renders even if the controller bails out early.\n        static EL_TEMPLATE_STORE_SELECTOR: string = '.eh-qsrv--templates';\n\n        private _isLoading: boolean;\n        private _isSimulating: boolean;\n        private _pendingLoader: LoaderStateRv | null = null;\n        private _viewMap: IRenderElement[] = [];\n        private _$elOptionsParent: JQuery<HTMLElement>;\n        private _$elFeedbackOptionsParent: JQuery<HTMLElement>;\n        private _$elCtaButton: JQuery<HTMLElement>;\n        private _$elQuickselectFooter: JQuery<HTMLElement>;\n        private _$elSpinnerHost: JQuery<HTMLElement>;\n        private _errorIndicator: JQuery<HTMLElement>;\n        private _pendingSequencer: QSRecommendationQueue | null;\n\n        // snippets\n        private readonly _snippetErrorRow: string;\n        private readonly _snippetSelectedRow: string;\n        private readonly _snippetPreselectedRow: string;\n        private readonly _snippetSelectableRowOption: string;\n        private readonly _snippetPreselectableRowOption: string;\n        // Single reusable spinner node, shown as the last child of the order-code\n        // legend while the service is queried and throughout the auto-config steps.\n        private readonly _spinner: JQuery<HTMLElement>;\n\n        private _snippetsContentSection: JQuery<HTMLElement>;\n        private _hasContent: boolean = false;\n\n        /**\n         * @param application Reference to the main QuickSelect controller.\n         * @param _$el The root jQuery element of the QuickSelect component.\n         */\n        constructor(\n            public readonly application: QuickSelectRv,\n            private _$el: JQuery<HTMLElement>\n        ) {\n            this._$elOptionsParent = $(QSRvViewModel.EL_OPTIONS_PARENT_SELECTOR, this._$el);\n            this._$elFeedbackOptionsParent = $(QSRvViewModel.EL_FEEDBACK_OPTIONS_PARENT_SELECTOR, this._$el);\n            this._$elCtaButton = $(QSRvViewModel.EL_CTA_BUTTON, this._$el);\n            this._$elQuickselectFooter = $(QSRvViewModel.EL_QUICKSELECT_FOOTER, this._$el);\n            this._$elSpinnerHost = $(QSRvViewModel.EL_SPINNER_HOST_SELECTOR, this._$el);\n            this._snippetsContentSection = $(QSRvViewModel.EL_CONTENT_SECTION);\n\n            // Templates live in a hidden store (.eh-qsrv--templates) so their raw <%...%>\n            // markup never leaks into the visible layout. Read/remove them from there.\n            const $templateStore = $(QSRvViewModel.EL_TEMPLATE_STORE_SELECTOR, this._$el);\n\n            this._snippetErrorRow = QSRvViewFactory\n                .createTemplateString($('.eh-qsrv--selection-options-feedback-error', $templateStore).html());\n            // template for quickselect position in state editable (eg multiple options available), mutates into row with one active option selected\n            this._snippetSelectedRow = QSRvViewFactory\n                .createTemplateStringByEl($('.eh-qsrv--option-selected-row-snippet', $templateStore).remove());\n            this._snippetPreselectedRow = QSRvViewFactory\n                .createTemplateStringByEl($('.eh-qsrv--option-preselected-row-snippet', $templateStore).remove());\n            // template for quickselect position -> option\n            this._snippetSelectableRowOption = QSRvViewFactory\n                .createTemplateStringByEl($('.eh-qsrv--selectable-row-option-snippet', $templateStore).remove());\n            this._snippetPreselectableRowOption = QSRvViewFactory\n                .createTemplateStringByEl($('.eh-qsrv--preselectable-row-option-snippet', $templateStore).remove());\n            // Detached from the store and kept as one reusable node (see updateSpinner).\n            this._spinner = $('.eh-qsrv--spinner-snippet', $templateStore).remove();\n\n            this._$elOptionsParent.children().remove();\n            this._$elFeedbackOptionsParent.children().remove();\n        }\n\n        /**\n         * Gets or sets the current loader state, updating the UI loading feedback.\n         */\n        public get currentLoader(): LoaderStateRv | null {\n            return this._pendingLoader;\n        }\n\n        public set currentLoader(loader: LoaderStateRv | null) {\n            this._pendingLoader = loader;\n            if (!!loader) {\n                loader.registerLoadingListener(this.onLoadingComplete);\n                this.setLoading(loader.isLoading);\n            } else {\n                this.setLoading(false);\n            }\n        }\n\n        public onLoadingComplete: () => void = (): void => {\n            this.setLoading(false);\n        };\n\n        private setLoading(v: boolean, force: boolean = false) {\n            if (!force && this._isLoading === v) {\n                return;\n            }\n            this._isLoading = v;\n            if (this._isLoading || this._isSimulating) {\n                this.updateLoadingFeedback(true);\n            } else {\n                this.updateLoadingFeedback(false);\n            }\n        }\n\n        private _loadingFeedbackTimeout: any;\n\n        private updateLoadingFeedback(v: boolean): void {\n            clearTimeout(this._loadingFeedbackTimeout);\n            this.updateSpinner(v);\n            if (!v) {\n                this._loadingFeedbackTimeout = setTimeout((): void => {\n                    this._$elCtaButton.toggleClass('disabled', this._$elCtaButton.data('disabledByDefault'));\n                    this._$elQuickselectFooter.toggleClass('is-loading', false);\n                }, 150);\n            } else {\n                if (this._$elCtaButton.data('disabledByDefault') === undefined) {\n                    this._$elCtaButton.data('disabledByDefault', this._$elCtaButton.hasClass('disabled'));\n                }\n                this._$elCtaButton.toggleClass('disabled', true);\n                this._$elQuickselectFooter.toggleClass('is-loading', true);\n            }\n        }\n\n        // Attach the spinner as the last (inline) child of the order-code label\n        // while loading (service query) or simulating (auto-configuration), detach\n        // it otherwise. append() relocates the single reusable node, so re-calls\n        // never duplicate it.\n        private updateSpinner(show: boolean): void {\n            if (show) {\n                this._$elSpinnerHost.append(this._spinner);\n            } else {\n                this._spinner.detach();\n            }\n        }\n\n        private attachRow(component: IRenderElement): void {\n            this.sliceViewStack(component.idx);\n            this._viewMap.push(component);\n            this._$elOptionsParent.append(component.elements);\n            component.onCreate();\n            this.dispatchDomUpdate(component.elements);\n        }\n\n        private domUpdateTicking: boolean = false;\n\n        /**\n         * Notifies the system that the DOM has been updated, triggering layout recalculations (e.g. for sticky elements).\n         * @param newCreatedElement The element that was recently added or updated.\n         */\n        public dispatchDomUpdate(newCreatedElement: JQuery<HTMLElement> | null = null): void {\n            const payload: { element: JQuery<HTMLElement> | null } = {element: null};\n            // restrict animations to sequences only\n            if (this._pendingSequencer) {\n                payload.element = newCreatedElement;\n            }\n            if (!this.domUpdateTicking) {\n                requestAnimationFrame(_ => {\n                        $(':root').trigger(STICKY_EVENTS.DOM_MUTATION, payload);\n                        this.domUpdateTicking = false;\n                    }\n                );\n                this.domUpdateTicking = true;\n            }\n        }\n\n        private setHasContent(v: boolean): void {\n            if (v !== this._hasContent) {\n                this._hasContent = v;\n                this._snippetsContentSection.toggleClass('has-content', v);\n            }\n        }\n\n        /**\n         * Removes all configuration layers from the view stack starting from a specific index.\n         * @param idx The index from which to slice the stack.\n         */\n        public sliceViewStack(idx: number): void {\n            const bailOut: IRenderElement[] = this._viewMap.filter(e => e.idx >= idx);\n            bailOut.forEach(e => {\n                e.onRemove();\n                this._viewMap.splice(this._viewMap.indexOf(e), 1);\n            });\n        }\n\n        public hideAllOptions(): void {\n            this._viewMap.forEach(v => v.showOptions(false));\n        }\n\n        public removeEmptyOptions(): void {\n            let emptyIdx: number = NaN;\n            this._viewMap.forEach(v => {\n                if (!v.hasSelection()) {\n                    const stackPos = v.idx;\n                    emptyIdx = !(stackPos > emptyIdx) ? stackPos : emptyIdx;\n                }\n            });\n            if (!isNaN(emptyIdx)) {\n                this.sliceViewStack(emptyIdx);\n            }\n        }\n\n        // A family/child product was selected: swap the disabled family-step placeholder\n        // for the real nebp add-to-cart button and stamp the chosen child product root\n        // onto it. Covers the case where the family selection is the last step (no further\n        // setSelectionRow render re-runs the swap). data-nebp-product-root is handled\n        // separately by the ORDER_CODE_CHANGE handler; here we fix data-cs-product-root.\n        public selectFamilyProduct(root: string | undefined): void {\n            $('.marker-add2cart-family-step', this._$el).addClass('eh--hide');\n            $('.marker-add2cart-default', this._$el).removeClass('eh--hide');\n            $('.eh-quickselector--selection-options', this._$el).removeClass('ehel-quick-selection--error');\n            if (root) {\n                // Also stamp the selected child's material number (mirrors the legacy impl's\n                // getSelectedChildProduct()?.materialNumber ?? config.productMaterialNumber). Done\n                // here because when the family step is the last layer, exec() skips observedSelect()\n                // → selectChildProduct() never runs → the ORDER_CODE_COMPLETE handler's\n                // getSelectedChildProduct() is undefined and would fall back to the family matnr.\n                // getSelectedChildProduct() isn't populated yet at this point, so resolve by root.\n                const cfg = this.application.config;\n                const matnr = cfg.childProducts?.find(p => p.root === root)?.materialNumber\n                    ?? cfg.productMaterialNumber;\n                $('.hook-nebp-add-to-cart', this._$el)\n                    .attr('data-cs-product-root', root)\n                    .attr('data-nebp-product-matnr', matnr);\n            }\n        }\n\n        public removeError = (): void => {\n            if (this._errorIndicator) {\n                // closing initial error response without content\n                // leads to has-no-content state\n                this.setHasContent(!!this._viewMap.length);\n                this._errorIndicator.off();\n                this._errorIndicator.remove();\n                this.dispatchDomUpdate();\n            }\n        };\n\n\n        public setError(state: eh.StateRv, data: { message: string }): void {\n            this.removeError();\n            const tplData: { message: string, interface: any } = {interface: {callback: this.removeError}, ...data};\n            this._errorIndicator = eh.QSRvViewFactory.createRow(this._snippetErrorRow, tplData);\n            this.setHasContent(true);\n            $('a', this._errorIndicator).on('click touchstart', tplData.interface.callback);\n            this._$elFeedbackOptionsParent.append(this._errorIndicator);\n            this.dispatchDomUpdate();\n        }\n\n        public setOrderCodeComplete(): void {\n            this._$el.selfOrClosest('.marker-cs-tracking-info')\n                .data('quickSelectTrackingInfo', this.application.createTrackingInfo());\n\n            const orderCode = this.application.getCurrentStep()?.orderCode;\n            if (orderCode) {\n                const payload: OrderCodeRvVO = {\n                    pattern: orderCode.pattern,\n                    currentIndex: orderCode.currentSegmentIndex ?? 0,\n                    orderCode: orderCode\n                };\n                this._$el.trigger(QS_EVENTS.ORDER_CODE_CHANGE, payload);\n            }\n\n            this.triggerLegendUpdate(QS_EVENTS.ORDER_CODE_COMPLETE);\n\n            eh.Tracking.injectTrackingEvent({\n                'event_linkname': 'product is fully configured',\n                'event_subtype': 'quick_select_fully_configured',\n                'event_configuration_step': 'fully configured'\n            }, this._$el, 'content_link');\n        }\n\n        private triggerLegendUpdate(triggerEventType: string): void {\n            const legend: (eh.IProductSegmentRv | null)[] = this._viewMap\n                .map((rEl: IRenderElement) => rEl.selection)\n                .filter((d: eh.IProductSegmentRv) => !!d)\n                .sort((a: eh.IProductSegmentRv, b: eh.IProductSegmentRv) => {\n                    if (a.index < b.index) {\n                        return -1;\n                    }\n                    if (b.index < a.index) {\n                        return 1;\n                    }\n                    return 0;\n                });\n            this._$el.trigger(triggerEventType, {legend: legend});\n        }\n\n        /**\n         * build next available index of the viewStack.\n         *\n         * @returns {number}\n         */\n        private getNextHighestDepth(): number {\n            return this._viewMap.length;\n        }\n\n        public cancelSequence(): void {\n            if (this._pendingSequencer) {\n                this._pendingSequencer.destroy();\n                this._pendingSequencer = null;\n            }\n        }\n\n        private beginSequence(sq: QSRecommendationQueue): void {\n            this.cancelSequence();\n            this.setLoading(true);\n            this._pendingSequencer = sq;\n            // Announce AFTER cancelSequence(): cancelling a previous sequence emits the\n            // matching \"finished\" event, which would otherwise unlock again right away.\n            this._$el.trigger(QS_RV_EVENTS.AUTO_COMPLETION_CHANGE, true);\n            sq.run();\n        }\n\n        public setRecommendations(state: StateRv, data: eh.IProductSegmentRv[]): void {\n            const dataProvider: ITemplateDescriptor[] = data.map(r => {\n                const templateDescriptor: any = {\n                    templateData: {...r},\n                    index: r.index,\n                    orderCode: r.orderCode,\n                    headerTpl: this._snippetPreselectedRow,\n                    optionsTpl: this._snippetPreselectableRowOption,\n                    ctrlClazz: QSProductPreselectionLayer\n                };\n                return templateDescriptor;\n            });\n            this.beginSequence(new QSRecommendationQueue(\n                800,\n                dataProvider,\n                (item: any) => {\n                    this.setSelectionRow({...state, ...item}, item.index, item);\n                },\n                () => {\n                    this._isSimulating = true;\n                },\n                () => {\n                    this._isSimulating = false;\n                    this.setLoading(false, true);\n                    this._$el.trigger(QS_RV_EVENTS.AUTO_COMPLETION_CHANGE, false);\n                },\n                () => {\n                    this.setOrderCodeComplete();\n                }\n            ));\n\n        }\n\n        public setFocus(component: IRenderElement): void {\n            this.dispatchFocusChange(component);\n        }\n\n        private dispatchFocusChange(c: IRenderElement): void {\n            let orderCode: OrderCodeRv = c.state.orderCode;\n            let selectedPattern: string | null = null;\n\n            if (orderCode.currentSegmentIndex === undefined) {\n                return;\n            }\n\n            if (c.hasSelection()) {\n                const segments: string[] = orderCode.pattern.split('-');\n                segments[orderCode.currentSegmentIndex] = c.selection?.coding || '';\n                selectedPattern = segments.join('-');\n            }\n\n            const payload: OrderCodeRvVO = {\n                pattern: selectedPattern || orderCode.pattern,\n                currentIndex: orderCode.currentSegmentIndex,\n                orderCode: orderCode\n            };\n            this._$el.trigger(QS_EVENTS.ORDER_CODE_CHANGE, payload);\n            this.triggerLegendUpdate(QS_EVENTS.ORDER_CODE_LEGEND_CHANGE);\n        }\n\n        public setSelection(state: eh.LoaderStateRv, layerIndex: number): void {\n            const templateDescriptor: any = {\n                templateData: {...state.templateData},\n                headerTpl: this._snippetSelectedRow,\n                optionsTpl: this._snippetSelectableRowOption,\n                ctrlClazz: QSProductSelectionLayer\n            };\n            this.setSelectionRow(state, layerIndex, templateDescriptor);\n\n            const payload: OrderCodeRvVO = {\n                pattern: templateDescriptor.templateData.orderCode.pattern,\n                currentIndex: templateDescriptor.templateData.orderCode.currentSegmentIndex,\n                orderCode: templateDescriptor.templateData.orderCode\n            };\n            this.application.setInitialized();\n            this._$el.trigger(QS_EVENTS.INIT, payload);\n        }\n\n        public setHighlight(component: IRenderElement): void {\n            this._$el.trigger(QS_EVENTS.ORDER_CODE_HIGHLIGHT, component.state.orderCode.currentSegmentIndex);\n        }\n\n        public setSelectionRow(state: eh.StateRv, layerIndex: number,\n                               descriptor: ITemplateDescriptor): void {\n            const templateData: any = descriptor.templateData;\n            templateData.index = layerIndex;\n            templateData.options = templateData.options\n                // apply layer index to entity\n                .map((o: any) => {\n                    o.index = layerIndex;\n                    return o;\n                })\n                // exclude falsy results\n                .filter((o: any) => !o.exit);\n\n            const layerComponent: JQuery<HTMLElement> = eh.QSRvViewFactory\n                .createRow(descriptor.headerTpl, templateData);\n            if (templateData.featureCoding === QuickSelectRv.FEATURE_CODING_CHILD_PRODUCT_SELECTION) {\n                $('.marker-family-preselect', layerComponent).removeClass('eh--hide');\n                $('.marker-add2cart-default', this._$el).addClass('eh--hide');\n                const $familyBtn = $('.marker-add2cart-family-step', this._$el).removeClass('eh--hide');\n                $familyBtn.off('click.familyValidate').on('click.familyValidate', (ev) => {\n                    ev.preventDefault();\n                    ev.stopPropagation();\n                    $('.eh-quickselector--selection-options', this._$el).addClass('ehel-quick-selection--error');\n                });\n            } else {\n                $('.marker-add2cart-default', this._$el).removeClass('eh--hide');\n                $('.marker-add2cart-family-step', this._$el).addClass('eh--hide');\n                $('.eh-quickselector--selection-options', this._$el).removeClass('ehel-quick-selection--error');\n            }\n            const categoryOptions: JQuery<HTMLElement>[] = eh.QSRvViewFactory\n                .createRows(descriptor.optionsTpl, templateData.options);\n            this.setHasContent(true);\n\n            const layerData: any = {\n                manager: this,\n                templateData: templateData,\n                header: {\n                    row: layerComponent,\n                },\n                options: {\n                    container: $('.eh-quickselector--selection-options', layerComponent),\n                    optionRows: categoryOptions\n                }\n            };\n            const selectionComponent: IRenderElement = new descriptor.ctrlClazz(\n                state,\n                layerData,\n                layerComponent,\n                this.getNextHighestDepth(),\n                null\n            );\n\n            this.attachRow(selectionComponent);\n\n        }\n\n        public static notifyReplaced($el: JQuery<HTMLElement>) {\n            const $event = jQuery.Event(cs.Snippet.EventIdPostReplace) as cs.SnippetEventPostReplace;\n            $event.replacedTarget = $el;\n            $(':root').trigger($event);\n        }\n\n        public static copyAttributes($from: JQuery<HTMLElement>, $to: JQuery<HTMLElement>, exclude: string[] = []) {\n            const attrs = $from.get(0)?.attributes ?? [];\n            for (let i = 0; i < attrs.length; i++) {\n                const attr = attrs[i];\n                if (exclude.indexOf(attr.name) > -1) {\n                    continue;\n                }\n                $to.attr(attr.name, attr.value);\n            }\n        }\n\n    }\n\n    class QSRecommendationQueue {\n\n        private _intervalId: number;\n        private destroyed: boolean;\n        static NOOP: () => void = () => {\n        };\n\n        constructor(\n            public delay: number,\n            private stack: any[] | null,\n            private callback: (item: any) => any | null,\n            private onCreate: () => void = QSRecommendationQueue.NOOP,\n            private onDestroy: () => void = QSRecommendationQueue.NOOP,\n            private onComplete: () => void = QSRecommendationQueue.NOOP\n        ) {\n            this.onCreate();\n        }\n\n        public run(): void {\n            if (!this.destroyed) {\n                this._intervalId = window.setInterval(this.next, this.delay);\n            }\n        }\n\n        isDone = (): boolean => {\n            return !!(this.stack && this.stack.length === 0);\n        };\n\n        next = (): void => {\n            if (!this.stack) {\n                this.destroy();\n                return;\n            }\n            if (this.stack.length) {\n                this.callback(this.stack.shift());\n                if (this.isDone()) {\n                    this.onComplete();\n                    this.destroy();\n                }\n            }\n        };\n\n        destroy(): void {\n            this.destroyed = true;\n            clearInterval(this._intervalId);\n            this.stack = null;\n            this.onDestroy();\n        }\n\n    }\n\n    /**\n     * Represents a layer in the configuration process where a user can select an option for a feature.\n     */\n    class QSProductSelectionLayer implements IRenderElement {\n        private static readonly  MARKER_OPTIONS_CONTAINER = 'marker-opts-container';\n\n        constructor(\n            // model ref\n            public state: LoaderStateRv,\n            // aggregated generic data\n            public data: RenderElementData,\n            // root element of the view\n            public elements: JQuery<HTMLElement>,\n            // layer index\n            public idx: number,\n            // selected data\n            public selection: eh.IProductSegmentRv | null\n        ) {\n        }\n\n        isExecutionKey(keyCode: number): boolean {\n            const execKeys: number[] = [\n                32, // space\n                13 // enter\n            ];\n            return execKeys.indexOf(keyCode) !== -1;\n        }\n\n        onFocus(): void {\n            const manager: QSRvViewModel = this.data.manager;\n            manager.setFocus(this);\n        }\n\n        onHighlight(): void {\n            const manager: QSRvViewModel = this.data.manager;\n            manager.setHighlight(this);\n        }\n\n        onCreate(): void {\n            const manager: QSRvViewModel = this.data.manager;\n            const header: any = this.data.header;\n            const optionsContainer: JQuery<HTMLElement> = this.data.options.container;\n            const optionsRows: JQuery<HTMLElement>[] = this.data.options.optionRows;\n            const _self: QSProductSelectionLayer = this;\n\n            // register row\n            optionsContainer.addClass(QSProductSelectionLayer.MARKER_OPTIONS_CONTAINER);\n            // expose the segment index so a click on the structured order-code segment can activate this item\n            header.row.attr('data-qsrv-segment-index', '' + this.data.templateData.orderCode.currentSegmentIndex);\n            header.row.on('click', () => {\n                if(!this.isShowOptions() ) {\n                    // Jumping back to an earlier step must only DEACTIVATE the currently\n                    // open (still unselected) trailing step, not destroy it — so it stays\n                    // visible as an inactive card and can be reopened. hideAllOptions()\n                    // already collapses it; removeEmptyOptions() would remove it, so it is\n                    // intentionally not called here. A real upstream re-selection still\n                    // rebuilds later layers via exec()'s sliceViewStack(this.idx + 1).\n                    manager.hideAllOptions();\n                    this.showOptions(true);\n                    this.onHighlight();\n                }\n            });\n\n            this.onFocus();\n\n            optionsContainer.prepend(optionsRows);\n\n            // register options\n            optionsRows.forEach(el => {\n                const row: JQuery<HTMLElement> = el;\n                const radio: JQuery<HTMLElement> = $('input', row);\n                radio.on('change', () => {\n                    this.exec(row);\n                });\n                row.on('click', (e) => {\n                    if(!this.isShowOptions()) {\n                        // area collapsed, trigger open\n                        e.stopPropagation();\n                        e.preventDefault();\n                        header.row.trigger('click');\n                    }\n                });\n                radio.on('keydown', (e) => {\n                    // trigger execution when using space | enter\n                    if (_self.isExecutionKey(e.keyCode)) {\n                        row.trigger('click');\n                    }\n                });\n            });\n\n            this.elements.selfOrClosest('.marker-cs-tracking-info').data('quickSelectTrackingInfo', this.data.manager.application.createTrackingInfo());\n            QSRvViewModel.notifyReplaced(this.elements);\n        }\n\n        exec: (row: JQuery) => void = (row: JQuery): void => {\n            const targetSelection: string | undefined = row.attr('data-coding');\n            const targetLabel: string | undefined = row.attr('data-label');\n            const targetRoot: string | undefined = row.attr('data-root');\n            const targetOption: string | undefined = row.attr('data-option');\n            const option: eh.IProductSegmentRv = {\n                feature: this.data.templateData.label,\n                featureCoding: this.data.templateData.featureCoding,\n                index: this.data.templateData.orderCode.currentSegmentIndex,\n                root: targetRoot,\n                coding: targetSelection,\n                isLastLayer: this.data.templateData.isLastLayer,\n                label: targetLabel || '!label=undefined!',\n                option: targetOption\n            };\n            this.onSelect(option);\n            this.data.manager.sliceViewStack(this.idx + 1);\n\n            if (option.isLastLayer) {\n                this.data.manager.setFocus(this);\n                this.data.manager.setOrderCodeComplete();\n            } else {\n                this.state.observedSelect(option);\n            }\n\n        };\n\n        onRemove(): void {\n            this.elements.remove();\n        }\n\n        showOptions(v: boolean): void {\n            this.elements.toggleClass('is-active', v);\n            // Left border must follow the active state. The JS only toggles\n            // 'is-active', and there is no Tailwind JIT in Responsive (only pre-built\n            // utility classes exist), so swap the existing border utilities here:\n            // black/strong while active, no border by default, gray on hover only\n            // while inactive.\n            this.elements\n                .toggleClass('ehtw-border-l-stroke-strong', v)\n                .toggleClass('ehtw-border-l-transparent', !v)\n                .toggleClass('hover:ehtw-border-stroke-medium', !v);\n            // The 'completed' checkmark is CSS-hidden only while '.is-active'. An open\n            // step that is deactivated (user jumped back to an earlier step) without a\n            // selection must NOT look done, so force the checkmark hidden while inactive\n            // and unselected; clear it again once active or actually selected so a\n            // genuinely completed inactive step keeps its checkmark.\n            this.elements.find('.marker-qsrv-step-check')\n                .toggleClass('ehtw-opacity-0', !v && !this.hasSelection());\n            this.initFocus(v);\n            this.data.manager.dispatchDomUpdate();\n        }\n\n        private isShowOptions(): boolean {\n            return this.elements.hasClass('is-active');\n        }\n\n        initFocus(showOptions: boolean): void {\n            // no focus on mobile views to prevent glitches\n            if (!(window as any).browserDetect.mobile) {\n                return;\n            }\n            if (showOptions) {\n                let _activeElement: HTMLInputElement;\n                $('input[type=radio]', this.data.options.container).each((idx, el) => {\n                    const _radio: HTMLInputElement = el as HTMLInputElement;\n                    if (_activeElement) {\n                        return;\n                    }\n                    if (_radio.checked) {\n                        _activeElement = _radio;\n                        _activeElement.focus();\n                        return;\n                    }\n                    if (idx === 0 && this.idx > 0) {\n                        // set focus on first option\n                        _radio.focus();\n                    }\n                });\n            }\n        }\n\n        hasSelection(): boolean {\n            return !!this.selection;\n        }\n\n        onSelect(option: eh.IProductSegmentRv): void {\n            const manager: QSRvViewModel = this.data.manager;\n            manager.removeError();\n            manager.cancelSequence();\n            // Record the selection BEFORE collapsing so showOptions() sees hasSelection()\n            // === true and keeps this completed step's checkmark (only unselected steps\n            // are shown without one).\n            this.selection = option;\n            this.showOptions(false);\n            $(this.data.header.row).data('option', option.option ?? null);\n\n            if (option.featureCoding === QuickSelectRv.FEATURE_CODING_CHILD_PRODUCT_SELECTION) {\n                // A concrete family/child product was picked: reveal the real nebp\n                // add-to-cart button and stamp the selected child root onto it.\n                manager.selectFamilyProduct(option.root);\n            }\n\n            if (option.featureCoding !== manager.application.getCurrentStep()?.featureCoding) {\n                // featureCoding of given option does not match current selection step => must be a change of a former step\n                if (option.coding) {\n                    manager.application.rewindSteps(option.featureCoding, option.coding);\n                }\n            }\n\n            const orderCodeString = manager.application.getCurrentStep()?.orderCodeString;\n            const $el = $('input', this.data.header.row);\n            const trackingInfo = $el.selfOrClosest('.marker-cs-tracking-info').data('quickSelectTrackingInfo');\n            eh.Tracking.injectTrackingEvent({\n                'event_linkname': option.coding,\n                'event_subtype': 'quick_select_radio_button',\n                'event_order_code': orderCodeString ? QuickSelect.prepareOrderCodeForExternals(orderCodeString) : undefined,\n                'event_configuration_step': `step ${trackingInfo.currentStepIndex}: ${option.featureCoding}`\n            }, $el, 'radio_button');\n\n            if (option.coding) {\n                // finish current step after tracking of current selection activity\n                manager.application.getCurrentStep()?.finish(option.coding);\n            }\n        }\n    }\n\n    /**\n     * Represents a layer for selecting a child product from a family product.\n     */\n    class QSProductPreselectionLayer implements IRenderElement {\n        constructor(\n            // model ref\n            public state: LoaderStateRv,\n            // aggregated generic data\n            public data: RenderElementData,\n            // root element of the view\n            public elements: JQuery<HTMLElement>,\n            // layer index\n            public idx: number,\n            // selected data\n            public selection: eh.IProductSegmentRv | null\n        ) {\n        }\n\n        onFocus(): void {\n            this.data.manager.setFocus(this);\n        }\n\n        onHighlight(): void {\n            this.data.manager.setHighlight(this);\n        }\n\n        onCreate(): void {\n            const app = this.data.manager.application;\n            const $configuratorLink = $('.eh-qsrv--selection-option-description-details a', this.elements);\n            QSRvViewModel.copyAttributes($('.marker-configure-action', this.data.manager.application.$elem), $configuratorLink,\n                ['class', 'href', 'data-cs-tracking-goals', 'data-cs-tracking-ps-name', 'data-cs-tracking-subtype', 'data-cs-tracking-title']);\n\n            const currentFeature = this.data.templateData.featureCoding;\n            if (currentFeature && currentFeature !== QuickSelect.FEATURE_CODING_CHILD_PRODUCT_SELECTION) {\n                $configuratorLink.attr('data-nebp-product-feature', currentFeature);\n            } else {\n                $configuratorLink.removeAttr('data-nebp-product-feature');\n            }\n\n            this.selection = {\n                index: this.data.templateData.orderCode.currentSegmentIndex,\n                feature: this.data.templateData.feature,\n                featureCoding: this.data.templateData.featureCoding,\n                coding: this.data.templateData.coding,\n                label: this.data.templateData.label,\n                isLastLayer: this.data.templateData.isLastLayer\n            };\n\n            const header: any = this.data.header;\n            const optionsContainer: JQuery<HTMLElement> = this.data.options.container;\n            const optionsRows: JQuery<HTMLElement>[] = this.data.options.optionRows;\n\n            // register row\n            // expose the segment index so a click on the structured order-code segment can activate this item\n            header.row.attr('data-qsrv-segment-index', '' + this.data.templateData.orderCode.currentSegmentIndex);\n            header.row.on('click', () => {\n                // See QSProductSelectionLayer header handler: only deactivate the open\n                // trailing step on back-navigation, don't destroy it (no removeEmptyOptions).\n                this.data.manager.hideAllOptions();\n                this.showOptions(true);\n                this.onHighlight();\n            });\n\n            this.onFocus();\n\n            const i = app.createTrackingInfo();\n            i.currentStepFeature = this.data.templateData.featureCoding;\n            i.orderCode = this.data.templateData.orderCode.pattern;\n            this.elements.selfOrClosest('.marker-cs-tracking-info').data('quickSelectTrackingInfo', i);\n            optionsContainer.prepend(optionsRows);\n            QSRvViewModel.notifyReplaced(this.elements);\n\n            const payload: OrderCodeRvVO = {\n                pattern: this.data.templateData.orderCode.pattern,\n                currentIndex: this.data.templateData.orderCode.currentSegmentIndex,\n                orderCode: this.data.templateData.orderCode\n            };\n            app.$elem.trigger(QS_EVENTS.INIT, payload);\n        }\n\n        onRemove(): void {\n            this.elements.remove();\n        }\n\n        showOptions(v: boolean): void {\n            // Mirror QSProductSelectionLayer: the active layer gets the black left\n            // border and, via the '.is-active'-scoped opacity utilities, reveals its\n            // (checked) radio input. 'is-show-options' has no CSS hook in the revamp\n            // component, so it never showed a border nor the input. There is no\n            // Tailwind JIT in Responsive, so swap the pre-built border utilities here.\n            this.elements.toggleClass('is-active', v);\n            this.elements\n                .toggleClass('ehtw-border-l-stroke-strong', v)\n                .toggleClass('ehtw-border-l-transparent', !v)\n                .toggleClass('hover:ehtw-border-stroke-medium', !v);\n            this.data.manager.dispatchDomUpdate();\n        }\n\n        // persistent type\n        hasSelection(): boolean {\n            return true;\n        }\n\n        onSelect(option: { coding: string, label: string } | null): void {\n            this.data.manager.hideAllOptions();\n            this.data.manager.removeEmptyOptions();\n            this.showOptions(false);\n        }\n    }\n\n    /**\n     * The current order code taken apart: the family-product prefix (null for a normal product)\n     * and one entry per pattern segment, `null` where the position is not configured yet.\n     * Rendering the segmented display and building the plain string both start from this, so the\n     * two cannot drift apart (COM-4122 required them to be identical).\n     */\n    export interface OrderCodePlainParts {\n        prefix: string | null;\n        segments: (string | null)[];\n    }\n\n    export class QSRvOrderCodeLabel {\n        static CONTAINER_CLASS_NAME: string = '.eh-qsrv--product-label';\n        static SNIPPET_LABEL_SEGMENT: string = `<span class=\"eh-qsrv--code-highlight ehel-copy--source\"><%codeSegment%></span>`;\n        static SNIPPET_PLACEHOLDER: string = `<span class=\"ehel-parameter ehtw-h-pigeon ehtw-min-w-spider ehtw-flex ehtw-justify-center ehtw-border-b ehtw-border-stroke-strong ehel-copy--source eh-qsrv--code-placeholder\" data-copy-value=\"_\"></span>`;\n        static SNIPPET_HIGHLIGHT_CLASSNAME: string = 'ehtw-bg-surface-info';\n        static LABEL_SEGMENT_SEPARATOR: string = `<span class=\"ehtw-typo-body-regular-large eh-qsrv--code-separator ehel-copy--source\" data-copy-value=\"-\"> - </span>`;\n        static LABEL_SEGMENT_SPLIT_SEPARATOR: string = `-`;\n        static LABEL_SEGMENT_PLACEHOLDER: string = '*';\n\n        // classes applied to every segment while the display is locked (auto-completion)\n        static DISABLED_CLASSNAMES: string = 'ehtw-pointer-events-none ehtw-text-on-surface-disabled ehtw-opacity-70';\n        // the loading spinner (owned by QSRvViewModel) may live inside this container;\n        // preserve it across re-renders instead of wiping it with the segments\n        static SPINNER_SELECTOR: string = '.eh-qsrv--spinner-snippet';\n\n        // the character a not-yet-configured position contributes to the plain value; the\n        // segmented display shows LABEL_SEGMENT_PLACEHOLDER instead, which is why this is separate\n        static PLAIN_PLACEHOLDER_DEFAULT: string = '_';\n\n        private _labelSegments: JQuery<HTMLElement>[] = [];\n        private _disabled: boolean = false;\n\n        constructor(private _container: JQuery<HTMLElement>) {\n        }\n\n        /** Takes the order code apart; see OrderCodePlainParts. */\n        public static decompose(orderCode: OrderCodeRvVO): OrderCodePlainParts {\n            const segments: (string | null)[] = orderCode.pattern\n                .split(QSRvOrderCodeLabel.LABEL_SEGMENT_SPLIT_SEPARATOR)\n                .map(segment => segment === QSRvOrderCodeLabel.LABEL_SEGMENT_PLACEHOLDER ? null : segment);\n            if (!orderCode.orderCode.isFamilyProduct()) {\n                return { prefix: null, segments: segments };\n            }\n            // A family product carries its root as a prefix of its own and the child coding takes\n            // the first segment - which stays unset until a child was picked.\n            segments[0] = orderCode.orderCode.productRootChildSuffix ?? null;\n            return { prefix: orderCode.orderCode.productRoot, segments: segments };\n        }\n\n        /**\n         * The order code as a plain string - the value the Copy action puts on the clipboard.\n         * Mirrors the rendering in update(): the single separator sits after the first segment\n         * (after prefix plus first segment for a family product), everything else is concatenated.\n         */\n        public static toPlainValue(parts: OrderCodePlainParts,\n                                   placeholder: string = QSRvOrderCodeLabel.PLAIN_PLACEHOLDER_DEFAULT): string {\n            const rendered: string[] = parts.segments.map(segment => segment ?? placeholder);\n            if (parts.prefix !== null) {\n                rendered.unshift(parts.prefix);\n            }\n            // Mirrors update() down to the edge case: splice at an index equal to the length\n            // APPENDS, so a family product whose child is not picked yet ends on the separator\n            // (\"8F3B_-\"). That trailing separator looks unintended, but display and clipboard have\n            // to agree - suppressing it here would only move the drift instead of removing it.\n            const separatorPos = parts.prefix !== null ? 2 : 1;\n            rendered.splice(separatorPos, 0, QSRvOrderCodeLabel.LABEL_SEGMENT_SPLIT_SEPARATOR);\n            return rendered.join('');\n        }\n\n        /**\n         * Locks / unlocks the segmented display: while locked the segments are dimmed\n         * and their click (jump to the corresponding feature group) is suppressed.\n         * The flag is kept because every order-code change re-renders the segments.\n         */\n        public setDisabled(disabled: boolean): void {\n            this._disabled = disabled;\n            this.applyDisabledState();\n        }\n\n        private applyDisabledState(): void {\n            this._labelSegments.forEach(segment => {\n                segment.toggleClass(QSRvOrderCodeLabel.DISABLED_CLASSNAMES, this._disabled);\n                segment.toggleClass('ehtw-cursor-pointer', !this._disabled && !!segment.data('qsrvSegmentClickable'));\n            });\n        }\n\n        public update(orderCode: OrderCodeRvVO): void {\n            // Both the spans below and the plain string in toPlainValue start from this one\n            // decomposition - a second traversal of the pattern would be a second algorithm to\n            // keep in step, and the drawer text has to read exactly what Copy copies.\n            const parts: OrderCodePlainParts = QSRvOrderCodeLabel.decompose(orderCode);\n            const labelSegments: JQuery<HTMLElement>[] = parts.segments.map(segment => segment === null\n                ? QSRvViewFactory.createRow(QSRvOrderCodeLabel.SNIPPET_PLACEHOLDER, {})\n                : QSRvViewFactory.createRow(QSRvOrderCodeLabel.SNIPPET_LABEL_SEGMENT, {codeSegment: segment}));\n            const prependPrefix: JQuery<HTMLElement> | null = parts.prefix === null\n                ? null\n                : QSRvViewFactory.createRow(QSRvOrderCodeLabel.SNIPPET_LABEL_SEGMENT, {codeSegment: parts.prefix});\n            this._labelSegments = labelSegments;\n            // A click on a segment activates its corresponding configuration item (feature group),\n            // i.e. behaves as if that item's header row was clicked. The segment's index equals the\n            // item's currentSegmentIndex (the same index highlightSegment uses); segments without a\n            // matching item (e.g. not-yet-reachable positions) simply no-op.\n            labelSegments.forEach((segment, idx) => {\n                segment.addClass('ehtw-cursor-pointer')\n                    .data('qsrvSegmentClickable', true)\n                    .on('click.qsrvSegment', () => {\n\n                        const el = this._container.closest('.eh-qsrv')\n                            .find('[data-qsrv-segment-index=\"' + idx + '\"]').first();\n\n                        el.trigger('click');\n                        //if (eh.Breakpoints.getInstance().isMobile) {\n                        const offset = el.offset();\n                        if (offset) {\n                            $('html, body').animate({\n                                scrollTop: offset.top - 120\n                            }, 300);\n                        }\n                        //}\n                    });\n            });\n            // keep the spinner (if currently shown) out of the wipe, re-append it last\n            const spinner = this._container.children(QSRvOrderCodeLabel.SPINNER_SELECTOR).detach();\n            this._container.children().remove();\n            this._container.text('');\n\n            const output: JQuery<HTMLElement>[] = this._labelSegments.slice();\n            let separatorPos = 1;\n            if (prependPrefix) {\n                output.unshift(prependPrefix);\n                separatorPos = 2;\n            }\n            output.splice(separatorPos, 0, QSRvViewFactory.createRow(QSRvOrderCodeLabel.LABEL_SEGMENT_SEPARATOR, {}));\n\n            this.highlightSegment(orderCode.currentIndex);\n            // re-rendered segments must keep the lock state (auto-completion re-renders\n            // the display on every order-code change)\n            this.applyDisabledState();\n            this._container.append(output);\n            this._container.append(spinner);\n        }\n\n        /**\n         * Builds the structured order-code display for the predefined case from a plain\n         * order-code string plus the configuration items' option codes. The rear part\n         * (after the first '-') is segmented by matching the item codes against the actual\n         * order code IN ORDER — item codes are never trusted blindly. The first item code\n         * that does not match at the current cursor stops the matching, and the remaining\n         * (unmatched) tail is rendered as a single segment.\n         */\n        public updateFromOrderCode(orderCode: string, itemCodes: string[]): void {\n            const dashIdx = orderCode.indexOf(QSRvOrderCodeLabel.LABEL_SEGMENT_SPLIT_SEPARATOR);\n            const root = dashIdx === -1 ? orderCode : orderCode.substring(0, dashIdx);\n            const rear = dashIdx === -1 ? '' : orderCode.substring(dashIdx + 1);\n\n            const segments: string[] = [];\n            let cursor = 0;\n            for (const code of itemCodes) {\n                if (code && rear.startsWith(code, cursor)) {\n                    segments.push(code);\n                    cursor += code.length;\n                } else {\n                    break; // item code does not match the order code at this position\n                }\n            }\n            if (cursor < rear.length) {\n                segments.push(rear.substring(cursor)); // remaining, unmatched tail as one segment\n            }\n\n            const output: JQuery<HTMLElement>[] = [];\n            output.push(QSRvViewFactory.createRow(QSRvOrderCodeLabel.SNIPPET_LABEL_SEGMENT, {codeSegment: root}));\n            if (dashIdx !== -1) {\n                output.push(QSRvViewFactory.createRow(QSRvOrderCodeLabel.LABEL_SEGMENT_SEPARATOR, {}));\n            }\n            segments.forEach(seg => output.push(\n                QSRvViewFactory.createRow(QSRvOrderCodeLabel.SNIPPET_LABEL_SEGMENT, {codeSegment: seg})\n            ));\n\n            this._labelSegments = output;\n            // keep the spinner (if currently shown) out of the wipe, re-append it last\n            const spinner = this._container.children(QSRvOrderCodeLabel.SPINNER_SELECTOR).detach();\n            this._container.children().remove();\n            this._container.text('');\n            this.applyDisabledState();\n            this._container.append(output);\n            this._container.append(spinner);\n        }\n\n        public highlightSegment(idx: number): void {\n            this._labelSegments.forEach((l, i) =>\n                l.toggleClass(QSRvOrderCodeLabel.SNIPPET_HIGHLIGHT_CLASSNAME, i === idx)\n            );\n        }\n    }\n\n    /**\n     * Manages the detailed legend of configuration steps.\n     */\n    export class QSRvOrderCodeLegend {\n        static EL_DETAIL_ROW_SELECTOR: string = '.eh-qsrv--product-result-details-data-items';\n        private readonly SNIPPET_LABEL_SEGMENT: string;\n\n        constructor(private _container: JQuery<HTMLElement>) {\n            this.SNIPPET_LABEL_SEGMENT = QSRvViewFactory.createTemplateString(this._container.html());\n            this._container.children().remove();\n            this._container.text('');\n        }\n\n        public update(dataProvider: eh.IProductSegmentRv[]) {\n            this._container.children().remove();\n            dataProvider.forEach(item => this.addRow(item));\n        }\n\n        private addRow(data: eh.IProductSegmentRv): void {\n            const tplData: { coding: string | undefined, label: string, feature: string } = {\n                coding: data.coding,\n                label: data.label,\n                feature: data.feature\n            };\n            this._container.append(QSRvViewFactory.createRow(this.SNIPPET_LABEL_SEGMENT, tplData));\n        }\n    }\n\n    /**\n     * Manages the price scale legend display.\n     */\n    export class QSRvPriceScaleLegend {\n        static CONTAINER_CLASS_NAME: string = '.eh-qsrv--product-price-scale';\n        static SNIPPET_PRICE_SEGMENT_SELECTOR: string = '.eh-qsrv--product-price-scale-prices';\n        private readonly SNIPPET_PRICE_SEGMENT: string;\n        private _list: JQuery<HTMLElement>;\n\n        constructor(private _container: JQuery<HTMLElement>) {\n            this._list = $(QSRvPriceScaleLegend.SNIPPET_PRICE_SEGMENT_SELECTOR, this._container);\n            const tplSnippet: string = $('<div></div>').append(this._list.children().first()).html();\n            this.SNIPPET_PRICE_SEGMENT = QSRvViewFactory.createTemplateString(tplSnippet);\n            this._list.children().remove();\n            this._list.text('');\n        }\n\n        public reset(): void {\n            this._list.children().remove();\n            this.hide();\n        }\n\n        private hide(): void {\n            this._container.slideUp();\n        }\n\n        private show(): void {\n            this._container.slideDown();\n        }\n\n\n        public update(dataProvider: PriceScaleInfo[]) {\n            this.reset();\n            if (dataProvider.length) {\n                dataProvider.forEach((data) => this.addRow(data));\n                this.show();\n            }\n        }\n\n        private addRow(data: PriceScaleInfo): void {\n            this._list.append(QSRvViewFactory.createRow(this.SNIPPET_PRICE_SEGMENT, data));\n        }\n    }\n}\n","$(() => {\n  \n  const $root = $(':root');\n  $root.on(cs.Snippet.EventIdPostReplace, ($event: cs.SnippetEventPostReplace) => {\n    let target = $event.replacedTarget\n    if (!target && $event.originalEvent) {\n      const oEvent = ($event.originalEvent as any as cs.SnippetEventPostReplace | null)\n      if (oEvent?.replacedTarget) {\n        target = oEvent.replacedTarget;\n      }\n    }\n    if (target){\n      eh.Product.init($(target), true);\n    }\n  });\n  eh.Product.init($root);\n  \n});\n\nnamespace eh {\n  \n  export class Product {\n    \n    static init($base: JQuery<HTMLElement>, isSnippetRequest = false): void {\n      \n      eh.UPidGroup.init($base);\n      eh.BundleView.init($base);\n      eh.EhFlexGPSNavigator.init($base);\n      eh.ProductBundleSpecifications.init($base, isSnippetRequest);\n      eh.ProductCadLoader.init($base, isSnippetRequest);\n      eh.ProductContainer.init($base);\n      eh.Successors.init($base);\n      eh.SchemaDataEnhancer.init($base, isSnippetRequest);\n      eh.DrawerController.init($base, isSnippetRequest);\n      eh.SegmentedButtonController.init($base, isSnippetRequest);\n      eh.VariantListController.init($base, isSnippetRequest);\n      eh.CopyController.init($base);\n    }\n  }\n}\n","namespace eh {\n\n  /**\n   * Custom events triggered by the QuickSelect component.\n   */\n  export class QS_EVENTS {\n    /** Triggered when QuickSelect is fully initialized. */\n    static INIT: string = 'eh-quickselect-on-init';\n    /** Triggered when the order code changes. */\n    static ORDER_CODE_CHANGE: string = 'eh-quickselect-on-ordercode-change';\n    /** Triggered when the order code legend needs an update. */\n    static ORDER_CODE_LEGEND_CHANGE: string = 'eh-quickselect-on-ordercode-legend-change';\n    /** Triggered when a segment of the order code should be highlighted. */\n    static ORDER_CODE_HIGHLIGHT: string = 'eh-quickselect-on-ordercode-highlight';\n    /** Triggered when the configuration is complete. */\n    static ORDER_CODE_COMPLETE: string = 'eh-quickselect-on-ordercode-complete';\n  }\n\n  export interface IRowValue {\n    [s: string]: any\n  }\n\n  /**\n   * Utility factory for creating and templating QuickSelect view elements.\n   */\n  export class QSViewFactory {\n\n      /**\n       * Replaces placeholders in a template string with provided values.\n       * Escapes HTML characters.\n       * \n       * @param tpl The template string containing <%prop%> placeholders.\n       * @param values Object containing key-value pairs for replacement.\n       * @param index Optional index value to replace <%$index%>.\n       * @returns The processed template string.\n       */\n      static themeRow(tpl: string, values: IRowValue = Object.create(null), index: number = 0): string {\n        values.$index = index;\n        for (let prop in values) {\n          if (!values.hasOwnProperty(prop)) {\n            continue;\n          }\n          const needle: string = `<%${prop}%>`;\n          while (tpl.indexOf(needle) !== -1) {\n            tpl = tpl.replace(needle, (values[prop] + '')\n              .replace(/&/g, \"&amp;\")\n              .replace(/</g, \"&lt;\")\n              .replace(/>/g, \"&gt;\")\n              .replace(/\"/g, \"&quot;\")\n            );\n          }\n        }\n        tpl = tpl.replace(/(<%)+\\w+(%>)/gim, '');\n        return tpl;\n      }\n\n      /**\n       * Creates a jQuery element from a template and values.\n       */\n      static createRow(tpl: string, values: IRowValue, index: number = 0): JQuery<HTMLElement> {\n        return $(QSViewFactory.themeRow(tpl, values, index));\n      }\n\n      /**\n       * Creates an array of jQuery elements from a template and a list of values.\n       */\n      static createRows(tpl: string, valuesList: IRowValue[]): JQuery<HTMLElement>[] {\n        const iterator: () => number = (() => {\n          let i = 0;\n          return (): number => ++i;\n        })();\n        return valuesList.map(v => QSViewFactory.createRow(tpl, v, iterator()));\n      }\n\n      /**\n       * Cleans up a template string by replacing escaped placeholder delimiters.\n       */\n      static createTemplateString(elementString?: string): string {\n        return elementString\n          ?.replace(/&lt;%/g, '<%')\n          ?.replace(/%&gt;/g, '%>') ?? '';\n      }\n\n      /**\n       * Extracts the HTML of an element and converts it into a template string.\n       */\n      static createTemplateStringByEl(el: JQuery<HTMLElement>): string {\n        return QSViewFactory.createTemplateString(el.wrap('<p/>').parent().html() ?? '');\n      }\n\n  }\n\n  interface ITemplateDescriptor {\n    templateData: any;\n    headerTpl: string;\n    optionsTpl: string;\n    ctrlClazz: any;\n  }\n\n  /**\n   * Interface for elements that can be rendered as a configuration layer.\n   */\n  interface IRenderElement {\n    state: LoaderState;\n    data: RenderElementData;\n    idx: number;\n    selection: eh.IProductSegment | null;\n    /** Returns true if an option has been selected in this layer. */\n    hasSelection(): boolean;\n    /** Called when the element is created and added to the DOM. */\n    onCreate(): void;\n    /** Called when the element is removed from the DOM. */\n    onRemove(): void;\n    /** Toggles the visibility of options in this layer. */\n    showOptions(v: boolean): void;\n    /** Handles the selection of an option. */\n    onSelect(option: any): void;\n    /** Called when the layer receives focus. */\n    onFocus(): void;\n    /** The root jQuery element(s) of the layer. */\n    elements: JQuery<HTMLElement>;\n  }\n\n  type RenderElementData = {\n    manager:QSViewModel,\n    header:any,\n    options:any,\n    templateData:any\n  };\n\n  export interface OrderCodeVO {\n    pattern: string;\n    currentIndex: number;\n    orderCode: OrderCode;\n  }\n\n  /**\n   * View Model for the QuickSelect component.\n   * Manages the UI state, rendering of configuration layers, and user interactions.\n   */\n  export class QSViewModel {\n    static EL_CONTENT_SECTION: string = '.eh-quickselector';\n    static EL_OPTIONS_PARENT_SELECTOR: string = '.eh-quickselector--options';\n    static EL_FEEDBACK_OPTIONS_PARENT_SELECTOR: string = '.eh-quickselector--selection-options-feedback';\n    static EL_CTA_BUTTON: string = '.eh-quickselector--product-cta .eh-link';\n    static EL_QUICKSELECT_FOOTER: string = '.eh-quickselector--footer';\n\n    private _isLoading: boolean;\n    private _isSimulating: boolean;\n    private _pendingLoader: LoaderState | null = null;\n    private _viewMap: IRenderElement[] = [];\n    private _$elOptionsParent: JQuery<HTMLElement>;\n    private _$elFeedbackOptionsParent: JQuery<HTMLElement>;\n    private _$elCtaButton: JQuery<HTMLElement>;\n    private _$elQuickselectFooter: JQuery<HTMLElement>;\n    private _errorIndicator: JQuery<HTMLElement>;\n    private _pendingSequencer: QSRecommendationQueue | null;\n    private _focusedElement: any;\n\n    // snippets\n    private readonly _snippetErrorRow: string;\n    private readonly _snippetSelectedRow: string;\n    private readonly _snippetPreselectedRow: string;\n    private readonly _snippetSelectableRowOption: string;\n    private readonly _snippetPreselectableRowOption: string;\n\n    private _snippetsContentSection: JQuery<HTMLElement>;\n    private _hasContent: boolean = false;\n\n    /**\n     * @param application Reference to the main QuickSelect controller.\n     * @param _$el The root jQuery element of the QuickSelect component.\n     */\n    constructor(\n      public readonly application: QuickSelect,\n      private _$el: JQuery<HTMLElement>\n    ) {\n      this._$elOptionsParent = $(QSViewModel.EL_OPTIONS_PARENT_SELECTOR, this._$el);\n      this._$elFeedbackOptionsParent = $(QSViewModel.EL_FEEDBACK_OPTIONS_PARENT_SELECTOR, this._$el);\n      this._$elCtaButton = $(QSViewModel.EL_CTA_BUTTON, this._$el);\n      this._$elQuickselectFooter = $(QSViewModel.EL_QUICKSELECT_FOOTER, this._$el);\n      this._snippetsContentSection = $(QSViewModel.EL_CONTENT_SECTION);\n\n      this._snippetErrorRow = QSViewFactory\n        .createTemplateString($('.eh-quickselector--selection-options-feedback-error').html());\n      // template for quickselect position in state editable (eg multiple options available), mutates into row with one active option selected\n      this._snippetSelectedRow = QSViewFactory\n        .createTemplateStringByEl($('.eh-quickselector--option-selected-row-snippet').remove());\n      this._snippetPreselectedRow = QSViewFactory\n        .createTemplateStringByEl($('.eh-quickselector--option-preselected-row-snippet').remove());\n      // template for quickselect position -> option\n      this._snippetSelectableRowOption = QSViewFactory\n        .createTemplateStringByEl($('.eh-quickselector--selectable-row-option-snippet').remove());\n      this._snippetPreselectableRowOption = QSViewFactory\n        .createTemplateStringByEl($('.eh-quickselector--preselectable-row-option-snippet').remove());\n\n      this._$elOptionsParent.children().remove();\n      this._$elFeedbackOptionsParent.children().remove();\n    }\n\n    /**\n     * Gets or sets the current loader state, updating the UI loading feedback.\n     */\n    public get currentLoader (): LoaderState | null {\n      return this._pendingLoader;\n    }\n\n    public set currentLoader(loader: LoaderState | null) {\n      this._pendingLoader = loader;\n      if (!!loader) {\n        loader.registerLoadingListener(this.onLoadingComplete);\n        this.setLoading(loader.isLoading);\n      } else {\n        this.setLoading(false);\n      }\n    }\n\n    public onLoadingComplete: () => void = (): void => {\n      this.setLoading(false);\n    };\n\n    private setLoading(v: boolean, force: boolean = false) {\n      if (!force && this._isLoading === v) {\n        return;\n      }\n      this._isLoading = v;\n      if (this._isLoading || this._isSimulating) {\n        this.updateLoadingFeedback(true);\n      } else {\n        this.updateLoadingFeedback(false);\n      }\n    }\n\n    private _loadingFeedbackTimeout: any;\n    private updateLoadingFeedback(v: boolean): void {\n      clearTimeout(this._loadingFeedbackTimeout);\n      if (!v) {\n        this._loadingFeedbackTimeout = setTimeout((): void => {\n          this._$elCtaButton.toggleClass('disabled', this._$elCtaButton.data('disabledByDefault'));\n          this._$elQuickselectFooter.toggleClass('is-loading', false);\n        }, 150);\n      } else {\n          if (this._$elCtaButton.data('disabledByDefault') === undefined) {\n            this._$elCtaButton.data('disabledByDefault', this._$elCtaButton.hasClass('disabled'));\n          }\n          this._$elCtaButton.toggleClass('disabled', true);\n          this._$elQuickselectFooter.toggleClass('is-loading', true);\n      }\n    }\n\n    private attachRow(component: IRenderElement): void {\n      this.sliceViewStack(component.idx);\n      this._viewMap.push(component);\n      this._$elOptionsParent.append(component.elements);\n      component.onCreate();\n      this.dispatchDomUpdate(component.elements);\n    }\n\n    private domUpdateTicking: boolean = false;\n    /**\n     * Notifies the system that the DOM has been updated, triggering layout recalculations (e.g. for sticky elements).\n     * @param newCreatedElement The element that was recently added or updated.\n     */\n    public dispatchDomUpdate(newCreatedElement: JQuery<HTMLElement> | null = null): void {\n      const payload: { element: JQuery<HTMLElement> | null } = {element: null};\n      // restrict animations to sequences only\n      if (this._pendingSequencer) {\n        payload.element = newCreatedElement;\n      }\n      if (!this.domUpdateTicking) {\n        requestAnimationFrame(_ => {\n            $(':root').trigger(STICKY_EVENTS.DOM_MUTATION, payload);\n            this.domUpdateTicking = false;\n          }\n        );\n        this.domUpdateTicking = true;\n      }\n    }\n\n    private setHasContent(v: boolean): void {\n      if (v !== this._hasContent) {\n        this._hasContent = v;\n        this._snippetsContentSection.toggleClass('has-content', v);\n      }\n    }\n\n    /**\n     * Removes all configuration layers from the view stack starting from a specific index.\n     * @param idx The index from which to slice the stack.\n     */\n    public sliceViewStack(idx: number): void {\n      const bailOut: IRenderElement[] = this._viewMap.filter(e => e.idx >= idx);\n      bailOut.forEach(e => {\n        e.onRemove();\n        this._viewMap.splice(this._viewMap.indexOf(e), 1);\n      });\n    }\n\n    public hideAllOptions(): void {\n      this._viewMap.forEach(v => v.showOptions(false));\n    }\n\n    public removeEmptyOptions(): void {\n      let emptyIdx: number = NaN;\n      this._viewMap.forEach(v => {\n        if (!v.hasSelection()) {\n          const stackPos = v.idx;\n          emptyIdx = !(stackPos > emptyIdx) ? stackPos : emptyIdx;\n        }\n      });\n      if (!isNaN(emptyIdx)) {\n        this.sliceViewStack(emptyIdx);\n      }\n    }\n\n    public removeError = (): void => {\n      if (this._errorIndicator) {\n        // closing initial error response without content\n        // leads to has-no-content state\n        this.setHasContent(!!this._viewMap.length);\n        this._errorIndicator.off();\n        this._errorIndicator.remove();\n        this.dispatchDomUpdate();\n      }\n    };\n\n\n    public setError(state: eh.State, data: {message: string}): void {\n      this.removeError();\n      const tplData: {message: string, interface: any} = {interface: {callback: this.removeError}, ...data};\n      this._errorIndicator = eh.QSViewFactory.createRow(this._snippetErrorRow, tplData);\n      this.setHasContent(true);\n      $('a', this._errorIndicator).on('click touchstart', tplData.interface.callback);\n      this._$elFeedbackOptionsParent.append(this._errorIndicator);\n      this.dispatchDomUpdate();\n    }\n\n    public setOrderCodeComplete(): void {\n      this._$el.selfOrClosest( '.marker-cs-tracking-info')\n        .data('quickSelectTrackingInfo', this.application.createTrackingInfo());\n      \n      const orderCode = this.application.getCurrentStep()?.orderCode;\n      if (orderCode) {\n        const payload: OrderCodeVO = {\n          pattern: orderCode.pattern,\n          currentIndex: orderCode.currentSegmentIndex ?? 0,\n          orderCode: orderCode\n        };\n        this._$el.trigger(QS_EVENTS.ORDER_CODE_CHANGE, payload);\n      }\n      \n      this.triggerLegendUpdate(QS_EVENTS.ORDER_CODE_COMPLETE);\n\n      eh.Tracking.injectTrackingEvent({\n        'event_linkname': 'product is fully configured',\n        'event_subtype': 'quick_select_fully_configured',\n        'event_configuration_step': 'fully configured'\n      }, this._$el, 'content_link');\n    }\n\n    private triggerLegendUpdate(triggerEventType: string): void {\n      const legend: (eh.IProductSegment | null)[] = this._viewMap\n        .map((rEl: IRenderElement) => rEl.selection)\n        .filter((d: eh.IProductSegment) => !!d)\n        .sort((a: eh.IProductSegment, b: eh.IProductSegment) => {\n          if (a.index < b.index) { return -1; }\n          if (b.index < a.index) { return 1; }\n          return 0;\n        });\n      this._$el.trigger(triggerEventType, {legend: legend});\n    }\n\n    /**\n     * build next available index of the viewStack.\n     *\n     * @returns {number}\n     */\n    private getNextHighestDepth(): number {\n      return this._viewMap.length;\n    }\n\n    public cancelSequence(): void {\n      if (this._pendingSequencer) {\n        this._pendingSequencer.destroy();\n        this._pendingSequencer = null;\n      }\n    }\n\n    private beginSequence(sq: QSRecommendationQueue): void {\n      this.cancelSequence();\n      this.setLoading(true);\n      this._pendingSequencer = sq;\n      sq.run();\n    }\n\n    public setRecommendations(state: State, data: eh.IProductSegment[]): void {\n      const dataProvider: ITemplateDescriptor[] = data.map(r => {\n        const templateDescriptor: any = {\n          templateData: {...r},\n          index: r.index,\n          orderCode: r.orderCode,\n          headerTpl: this._snippetPreselectedRow,\n          optionsTpl: this._snippetPreselectableRowOption,\n          ctrlClazz: QSProductPreselectionLayer\n        };\n        return templateDescriptor;\n      });\n      this.beginSequence(new QSRecommendationQueue(\n        800,\n        dataProvider,\n        (item: any) => {\n          this.setSelectionRow({...state, ...item}, item.index, item);\n        },\n        () => {\n          this._isSimulating = true;\n        },\n        () => {\n          this._isSimulating = false;\n          this.setLoading(false, true);\n        },\n        () => {\n          this.setOrderCodeComplete();\n        }\n      ));\n\n    }\n\n    public setFocus(component: IRenderElement): void {\n      this._focusedElement = component;\n      this.dispatchFocusChange(component);\n    }\n\n    private dispatchFocusChange(c: IRenderElement): void {\n      let orderCode: OrderCode = c.state.orderCode;\n      let selectedPattern: string | null = null;\n\n      if (orderCode.currentSegmentIndex === undefined) {\n        return;\n      }\n\n      if (c.hasSelection()) {\n        const segments: string[] = orderCode.pattern.split('-');\n        segments[orderCode.currentSegmentIndex] = c.selection?.coding || '';\n        selectedPattern = segments.join('-');\n      }\n\n      const payload: OrderCodeVO = {\n        pattern: selectedPattern || orderCode.pattern,\n        currentIndex: orderCode.currentSegmentIndex,\n        orderCode: orderCode\n      };\n      this._$el.trigger(QS_EVENTS.ORDER_CODE_CHANGE, payload);\n      this.triggerLegendUpdate(QS_EVENTS.ORDER_CODE_LEGEND_CHANGE);\n    }\n\n    public setSelection(state: eh.LoaderState, layerIndex: number): void {\n      const templateDescriptor: any = {\n        templateData: {...state.templateData},\n        headerTpl: this._snippetSelectedRow,\n        optionsTpl: this._snippetSelectableRowOption,\n        ctrlClazz: QSProductSelectionLayer\n      };\n      this.setSelectionRow(state, layerIndex, templateDescriptor);\n\n      const payload: OrderCodeVO = {\n        pattern: templateDescriptor.templateData.orderCode.pattern,\n        currentIndex: templateDescriptor.templateData.orderCode.currentSegmentIndex,\n        orderCode: templateDescriptor.templateData.orderCode\n      };\n      this.application.setInitialized();\n      this._$el.trigger(QS_EVENTS.INIT, payload);\n    }\n\n    public setHighlight(component: IRenderElement): void {\n      this._$el.trigger(QS_EVENTS.ORDER_CODE_HIGHLIGHT, component.state.orderCode.currentSegmentIndex);\n    }\n\n    public setSelectionRow(state: eh.State, layerIndex: number,\n                           descriptor: ITemplateDescriptor): void {\n      const headerCodeSelector: string = '.eh-quickselector--option-specs-description-code .eh-font-bold';\n      const headerLabelSelector: string = '.eh-quickselector--option-specs-description-details .marker-label';\n\n      const templateData: any = descriptor.templateData;\n      templateData.index = layerIndex;\n      templateData.options = templateData.options\n        // apply layer index to entity\n        .map((o: any) => {o.index = layerIndex; return o;})\n        // exclude falsy results\n        .filter((o: any) => !o.exit);\n\n      const layerComponent: JQuery<HTMLElement> = eh.QSViewFactory\n        .createRow(descriptor.headerTpl, templateData);\n      const categoryOptions: JQuery<HTMLElement>[] = eh.QSViewFactory\n        .createRows(descriptor.optionsTpl, templateData.options);\n      this.setHasContent(true);\n      const singleRowView: JQuery<HTMLElement> = $('.eh-quickselector--selection-overview', layerComponent);\n\n      const layerData: any = {\n        manager: this,\n        templateData: templateData,\n        header: {\n          row: singleRowView,\n          code: $(headerCodeSelector, singleRowView),\n          label: $(headerLabelSelector, singleRowView)\n        },\n        options: {\n          container: $('.eh-quickselector--selection-options', layerComponent),\n          optionRows: categoryOptions\n        }\n      };\n      const selectionComponent: IRenderElement = new descriptor.ctrlClazz(\n        state,\n        layerData,\n        layerComponent,\n        this.getNextHighestDepth(),\n        null\n      );\n\n      this.attachRow(selectionComponent);\n\n    }\n\n    public static notifyReplaced($el: JQuery<HTMLElement>) {\n      const $event = jQuery.Event(cs.Snippet.EventIdPostReplace) as cs.SnippetEventPostReplace;\n      $event.replacedTarget = $el;\n      $(':root').trigger($event);\n    }\n\n    public static copyAttributes($from: JQuery<HTMLElement>, $to: JQuery<HTMLElement>, exclude: string[] = []) {\n      const attrs = $from.get(0)?.attributes ?? [];\n      for (let i = 0; i < attrs.length; i++) {\n        const attr = attrs[i];\n        if (exclude.indexOf(attr.name) > -1) {\n          continue;\n        }\n        $to.attr(attr.name, attr.value);\n      }\n    }\n\n  }\n\n  class QSRecommendationQueue {\n\n    private _intervalId: number;\n    private destroyed: boolean;\n    static NOOP: () => void = () => {};\n\n    constructor(\n      public delay: number,\n      private stack: any[] | null,\n      private callback: (item: any) => any | null,\n      private onCreate: () => void = QSRecommendationQueue.NOOP,\n      private onDestroy: () => void = QSRecommendationQueue.NOOP,\n      private onComplete: () => void = QSRecommendationQueue.NOOP\n    ) {\n      this.onCreate();\n    }\n\n    public run(): void {\n      if (!this.destroyed) {\n        this._intervalId = window.setInterval(this.next, this.delay);\n      }\n    }\n\n    isDone = (): boolean => {\n      return !!(this.stack && this.stack.length === 0);\n    };\n\n    next = (): void => {\n      if (!this.stack) {\n        this.destroy();\n        return;\n      }\n      if (this.stack.length) {\n        this.callback(this.stack.shift());\n        if (this.isDone()) {\n          this.onComplete();\n          this.destroy();\n        }\n      }\n    };\n\n    destroy(): void {\n      this.destroyed = true;\n      clearInterval(this._intervalId);\n      this.stack = null;\n      this.onDestroy();\n    }\n\n  }\n\n  /**\n   * Represents a layer in the configuration process where a user can select an option for a feature.\n   */\n  class QSProductSelectionLayer implements IRenderElement {\n\n    private _naviKeyPressed: boolean;\n\n    constructor(\n      // model ref\n      public state: LoaderState,\n      // aggregated generic data\n      public data: RenderElementData,\n      // root element of the view\n      public elements: JQuery<HTMLElement>,\n      // layer index\n      public idx: number,\n      // selected data\n      public selection: eh.IProductSegment | null\n    ) {}\n\n    isNavitaionKey(keyCode: number): boolean {\n      const navKeys: number[] = [\n        39, // arrow right\n        37, // arrow left\n        40, // arrow down\n        38 // arrow up\n      ];\n      return navKeys.indexOf(keyCode) !== -1;\n    }\n\n    isExecutionKey(keyCode: number): boolean {\n      const execKeys: number[] = [\n        32, // space\n        13 // enter\n      ];\n      return execKeys.indexOf(keyCode) !== -1;\n    }\n\n    onFocus(): void {\n      const manager: QSViewModel = this.data.manager;\n      manager.setFocus(this);\n    }\n\n    onHighlight(): void {\n      const manager: QSViewModel = this.data.manager;\n      manager.setHighlight(this);\n    }\n\n    onCreate(): void {\n      const manager: QSViewModel = this.data.manager;\n      const header: any = this.data.header;\n      const optionsContainer: JQuery<HTMLElement> = this.data.options.container;\n      const optionsRows: JQuery<HTMLElement>[] = this.data.options.optionRows;\n      const _self: QSProductSelectionLayer = this;\n      \n      const $configuratorLink = $('.eh-quickselector--selection-option-description-details a', this.elements);\n      QSViewModel.copyAttributes($('.marker-configure-action', this.data.manager.application.$elem), $configuratorLink,\n        ['class', 'href', 'data-cs-tracking-goals', 'data-cs-tracking-ps-name', 'data-cs-tracking-subtype', 'data-cs-tracking-title']);\n  \n      const currentFeature = this.data.templateData.featureCoding;\n      if (currentFeature && currentFeature !== QuickSelect.FEATURE_CODING_CHILD_PRODUCT_SELECTION) {\n        $configuratorLink.attr('data-nebp-product-feature', currentFeature);\n      }\n      else {\n        $configuratorLink.removeAttr('data-nebp-product-feature');\n      }\n      \n      // register row\n      header.row.on('click', () => {\n        manager.hideAllOptions();\n        manager.removeEmptyOptions();\n        this.showOptions(true);\n        this.onHighlight();\n      });\n\n      this.onFocus();\n\n      optionsContainer.prepend(optionsRows);\n\n      // register options\n      optionsRows.forEach(el => {\n        const row: JQuery<HTMLElement> = el;\n        const radio: JQuery<HTMLElement> = $('input', row);\n        row.on('click', (e) => {\n          e.stopImmediatePropagation();\n          e.preventDefault();\n          if (this._naviKeyPressed) {\n            _self._naviKeyPressed = false;\n            return;\n          }\n          const radioInput: HTMLInputElement = radio.get(0) as HTMLInputElement;\n          radioInput.checked = true;\n          this.exec(row);\n        });\n        radio.on('keydown', (e) => {\n          // prevent execution when using the arrow keys\n          _self._naviKeyPressed = _self.isNavitaionKey(e.keyCode);\n          // trigger execution when using space | enter\n          if (_self.isExecutionKey(e.keyCode)) {\n            row.trigger('click');\n          }\n        });\n      });\n\n      this.elements.selfOrClosest( '.marker-cs-tracking-info').data('quickSelectTrackingInfo', this.data.manager.application.createTrackingInfo());\n      QSViewModel.notifyReplaced(this.elements);\n    }\n\n    exec: (row: JQuery) => void = (row: JQuery): void => {\n      const targetSelection: string | undefined = row.attr('data-coding');\n      const targetLabel: string | undefined = row.attr('data-label');\n      const targetRoot: string | undefined = row.attr('data-root');\n      const targetOption: string | undefined = row.attr('data-option');\n      const option: eh.IProductSegment = {\n        feature: this.data.templateData.label,\n        featureCoding: this.data.templateData.featureCoding,\n        index: this.data.templateData.orderCode.currentSegmentIndex,\n        root: targetRoot,\n        coding: targetSelection,\n        isLastLayer: this.data.templateData.isLastLayer,\n        label: targetLabel || '!label=undefined!',\n        option: targetOption\n      };\n      this.onSelect(option);\n      this.data.manager.sliceViewStack(this.idx + 1);\n\n      if (option.isLastLayer) {\n        this.data.manager.setFocus(this);\n        this.data.manager.setOrderCodeComplete();\n      } else {\n        this.state.observedSelect(option);\n      }\n\n    };\n\n    onRemove(): void {\n      this.elements.remove();\n    }\n\n    showOptions(v: boolean): void {\n      this.elements.toggleClass('is-show-options', v);\n      this.initFocus(v);\n      this.data.manager.dispatchDomUpdate();\n    }\n\n    initFocus(showOptions: boolean): void {\n      // no focus on mobile views to prevent glitches\n      if (!(window as any).browserDetect.mobile) {\n        return;\n      }\n      if (showOptions) {\n        let _activeElement: HTMLInputElement;\n        $('input[type=radio]', this.data.options.container).each((idx, el) => {\n          const _radio: HTMLInputElement = el as HTMLInputElement;\n          if (_activeElement) {\n            return;\n          }\n          if (_radio.checked) {\n            _activeElement = _radio;\n            _activeElement.focus();\n            return;\n          }\n          if (idx === 0 && this.idx > 0) {\n            // set focus on first option\n            _radio.focus();\n          }\n        });\n      }\n    }\n\n    hasSelection(): boolean {\n      return !!this.selection;\n    }\n\n    onSelect(option: eh.IProductSegment): void {\n      const manager: QSViewModel = this.data.manager;\n      manager.removeError();\n      manager.cancelSequence();\n      this.showOptions(false);\n      this.selection = option;\n      this.data.header.code.text(option.coding);\n      this.data.header.label.text(option.label);\n      $(this.data.header.row).data('option', option.option ?? null);\n      \n      if (option.featureCoding !== manager.application.getCurrentStep()?.featureCoding) {\n        // featureCoding of given option does not match current selection step => must be a change of a former step\n        if (option.coding) {\n          manager.application.rewindSteps(option.featureCoding, option.coding);\n        }\n      }\n      \n      const orderCodeString = manager.application.getCurrentStep()?.orderCodeString;\n      const $el = $('input', this.data.header.row);\n      const trackingInfo = $el.selfOrClosest('.marker-cs-tracking-info').data('quickSelectTrackingInfo');\n        eh.Tracking.injectTrackingEvent({\n          'event_linkname': option.coding,\n          'event_subtype': 'quick_select_radio_button',\n          'event_order_code': orderCodeString ? QuickSelect.prepareOrderCodeForExternals(orderCodeString) : undefined,\n          'event_configuration_step': `step ${trackingInfo.currentStepIndex}: ${option.featureCoding}`\n        }, $el, 'radio_button');\n\n      if (option.coding) {\n        // finish current step after tracking of current selection activity\n        manager.application.getCurrentStep()?.finish(option.coding);\n      }\n    }\n\n  }\n\n  /**\n   * Represents a layer for selecting a child product from a family product.\n   */\n  class QSProductPreselectionLayer implements IRenderElement {\n\n    constructor(\n      // model ref\n      public state: LoaderState,\n      // aggregated generic data\n      public data: RenderElementData,\n      // root element of the view\n      public elements: JQuery<HTMLElement>,\n      // layer index\n      public idx: number,\n      // selected data\n      public selection: eh.IProductSegment | null\n    ) {\n    }\n\n    onFocus(): void {\n      this.data.manager.setFocus(this);\n    }\n\n    onHighlight(): void {\n      this.data.manager.setHighlight(this);\n    }\n\n    onCreate(): void {\n      const app = this.data.manager.application;\n      const $configuratorLink = $('.eh-quickselector--selection-option-description-details a', this.elements);\n      QSViewModel.copyAttributes($('.marker-configure-action', this.data.manager.application.$elem), $configuratorLink,\n        ['class', 'href', 'data-cs-tracking-goals', 'data-cs-tracking-ps-name', 'data-cs-tracking-subtype', 'data-cs-tracking-title']);\n  \n      const currentFeature = this.data.templateData.featureCoding;\n      if (currentFeature && currentFeature !== QuickSelect.FEATURE_CODING_CHILD_PRODUCT_SELECTION) {\n        $configuratorLink.attr('data-nebp-product-feature', currentFeature);\n      }\n      else {\n        $configuratorLink.removeAttr('data-nebp-product-feature');\n      }\n      \n      this.data.header.code.text(this.data.templateData.coding);\n      this.data.header.label.text(this.data.templateData.label);\n\n      this.selection = {\n        index: this.data.templateData.orderCode.currentSegmentIndex,\n        feature: this.data.templateData.feature,\n        featureCoding: this.data.templateData.featureCoding,\n        coding: this.data.templateData.coding,\n        label: this.data.templateData.label,\n        isLastLayer: this.data.templateData.isLastLayer\n      };\n\n      const header: any = this.data.header;\n      const optionsContainer: JQuery<HTMLElement> = this.data.options.container;\n      const optionsRows: JQuery<HTMLElement>[] = this.data.options.optionRows;\n\n      // register row\n      header.row.on('click', () => {\n        this.data.manager.hideAllOptions();\n        this.data.manager.removeEmptyOptions();\n        this.showOptions(true);\n        this.onHighlight();\n      });\n\n      this.onFocus();\n\n      const i = app.createTrackingInfo();\n      i.currentStepFeature = this.data.templateData.featureCoding;\n      i.orderCode = this.data.templateData.orderCode.pattern;\n      this.elements.selfOrClosest( '.marker-cs-tracking-info').data('quickSelectTrackingInfo', i);\n      optionsContainer.prepend(optionsRows);\n      QSViewModel.notifyReplaced(this.elements);\n\n      const payload: OrderCodeVO = {\n        pattern: this.data.templateData.orderCode.pattern,\n        currentIndex: this.data.templateData.orderCode.currentSegmentIndex,\n        orderCode: this.data.templateData.orderCode\n      };\n      app.$elem.trigger(QS_EVENTS.INIT, payload);\n    }\n\n    onRemove(): void {\n      this.elements.remove();\n    }\n\n    showOptions(v: boolean): void {\n      this.elements.toggleClass('is-show-options', v);\n      this.data.manager.dispatchDomUpdate();\n    }\n\n    // persistent type\n    hasSelection(): boolean {\n      return true;\n    }\n\n    onSelect(option: {coding: string, label: string} | null): void {\n      this.data.manager.hideAllOptions();\n      this.data.manager.removeEmptyOptions();\n      this.showOptions(false);\n    }\n\n  }\n\n  export class QSOrderCodeLabel {\n\n    static CONTAINER_CLASS_NAME: string = '.eh-quickselector--product-label';\n\n    static SNIPPET_HIGHLIGHT_CLASSNAME: string = 'is-active';\n\n    static SNIPPET_LABEL_SEGMENT: string = `<span class=\"eh-quickselect--code-highlight\"><%codeSegment%></span>`;\n\n    static SNIPPET_PLACEHOLDER: string = `<span class=\"eh-quickselect--code-placeholder\"></span>`;\n\n    static LABEL_SEGMENT_SEPARATOR: string = `<span class=\"eh-quickselect--code-separator\"> - </span>`;\n\n    static LABEL_SEGMENT_SPLIT_SEPARATOR: string = `-`;\n\n    static LABEL_SEGMENT_PLACEHOLDER: string = '*';\n\n    private _labelSegments: JQuery<HTMLElement>[] = [];\n\n    constructor(private _container: JQuery<HTMLElement>) {\n    }\n\n    public update(orderCode: OrderCodeVO): void {\n\n      const patternSegments: string[] = orderCode.pattern.split(QSOrderCodeLabel.LABEL_SEGMENT_SPLIT_SEPARATOR);\n      const labelSegments: JQuery<HTMLElement>[] = [];\n\n      patternSegments.forEach(patternSegment => {\n        if (patternSegment === QSOrderCodeLabel.LABEL_SEGMENT_PLACEHOLDER) {\n          labelSegments.push(QSViewFactory.createRow(QSOrderCodeLabel.SNIPPET_PLACEHOLDER, {}));\n        } else {\n          const replacements = {codeSegment: patternSegment};\n          labelSegments.push(QSViewFactory.createRow(QSOrderCodeLabel.SNIPPET_LABEL_SEGMENT, replacements));\n        }\n      });\n\n      let prependPrefix: JQuery<HTMLElement> | null = null;\n      if (orderCode.orderCode.isFamilyProduct()) {\n        prependPrefix = QSViewFactory.createRow(QSOrderCodeLabel.SNIPPET_LABEL_SEGMENT, {codeSegment: orderCode.orderCode.productRoot});\n        const childProductCoding = orderCode.orderCode.productRootChildSuffix;\n        labelSegments[0] =\n          childProductCoding ?\n            QSViewFactory.createRow(QSOrderCodeLabel.SNIPPET_LABEL_SEGMENT, {codeSegment: childProductCoding})\n            :\n            QSViewFactory.createRow(QSOrderCodeLabel.SNIPPET_PLACEHOLDER, {})\n        ;\n      }\n      this._labelSegments = labelSegments;\n      this._container.children().remove();\n      this._container.text('');\n\n      const output: JQuery<HTMLElement>[] = this._labelSegments.slice();\n      let separatorPos = 1;\n      if (prependPrefix) {\n        output.unshift(prependPrefix);\n        separatorPos = 2;\n      }\n      output.splice(separatorPos, 0, QSViewFactory.createRow(QSOrderCodeLabel.LABEL_SEGMENT_SEPARATOR, {}));\n\n      this.highlightSegment(orderCode.currentIndex);\n      this._container.append(output);\n\n    }\n\n    public highlightSegment(idx: number): void {\n      this._labelSegments.forEach((l, i) =>\n        l.toggleClass(QSOrderCodeLabel.SNIPPET_HIGHLIGHT_CLASSNAME, i === idx)\n      );\n    }\n\n  }\n\n  /**\n   * Manages the detailed legend of configuration steps.\n   */\n  export class QSOrderCodeLegend {\n\n    static CONTAINER_CLASS_NAME: string = '.eh-quickselector--product-result-details-data-items';\n\n    private readonly SNIPPET_LABEL_SEGMENT: string;\n\n    constructor(private _container: JQuery<HTMLElement>) {\n      this.SNIPPET_LABEL_SEGMENT = QSViewFactory.createTemplateString(this._container.html());\n      this._container.children().remove();\n      this._container.text('');\n    }\n\n    public update(dataProvider: eh.IProductSegment[]) {\n      this._container.children().remove();\n      dataProvider.forEach(item => this.addRow(item));\n    }\n\n    private addRow(data: eh.IProductSegment): void {\n      const tplData: {coding: string | undefined, label: string, feature: string} = {\n        coding: data.coding,\n        label: data.label,\n        feature: data.feature\n      };\n      this._container.append(QSViewFactory.createRow(this.SNIPPET_LABEL_SEGMENT, tplData));\n    }\n\n  }\n\n  /**\n   * Manages the price scale legend display.\n   */\n  export class QSPriceScaleLegend {\n\n    static CONTAINER_CLASS_NAME: string = '.eh-quickselector--product-price-scale';\n    static SNIPPET_PRICE_SEGMENT_SELECTOR: string = '.eh-quickselector--product-price-scale-prices';\n    private readonly SNIPPET_PRICE_SEGMENT: string;\n\n    private _list: JQuery<HTMLElement>;\n\n    constructor(private _container: JQuery<HTMLElement>) {\n      this._list = $(QSPriceScaleLegend.SNIPPET_PRICE_SEGMENT_SELECTOR, this._container);\n      const tplSnippet: string = $('<div></div>').append(this._list.children().first()).html();\n      this.SNIPPET_PRICE_SEGMENT = QSViewFactory.createTemplateString(tplSnippet);\n      this._list.children().remove();\n      this._list.text('');\n    }\n\n    public reset(): void {\n      this._list.children().remove();\n      this.hide();\n    }\n\n    private hide(): void {\n      this._container.slideUp();\n    }\n\n    private show(): void {\n      this._container.slideDown();\n    }\n\n\n    public update(dataProvider: PriceScaleInfo[]) {\n      this.reset();\n      if (dataProvider.length) {\n        dataProvider.forEach((data) => this.addRow(data));\n        this.show();\n      }\n    }\n\n    private addRow(data: PriceScaleInfo): void {\n      this._list.append(QSViewFactory.createRow(this.SNIPPET_PRICE_SEGMENT, data));\n    }\n\n  }\n\n}\n","namespace eh {\n  \n    export class SchemaDataEnhancer {\n\n        /* if page is product detail try to add price and currency to schema.org data */\n        static init(base:JQuery<HTMLElement>, isSnippet: boolean):void {\n          if(!isSnippet && !!$(document.body).data('csProductRoot')) {\n            let scpt = $(document).find('script').filter( (_idx, sc) =>  !!$(sc).attr('data-matnr'))[0];\n            let mno =  $(scpt).data('matnr');\n            let vis = $(scpt).data('priceVis');\n            if(!!mno && !!vis) {\n              ProductPricing.fetchPriceFor(mno, vis, this.updateSchema);\n            }\n          }\n        }\n        static updateSchema(info: SimplePriceInfo):void  {\n          let scpt = $(document).find('script').filter( (_idx, sc) =>  $(sc).attr('data-matnr') == info.materialNo)[0];\n          if(scpt) {\n            let ldjson = JSON.parse($(scpt).text());\n            if(ldjson.offers) {\n              ldjson.offers.price = ''+info.price;\n              ldjson.offers.priceCurrency = info.currency;\n              $(scpt).text(JSON.stringify(ldjson));\n            }\n          }\n        }\n    }\n\n}","namespace eh {\n  \n  export class Successors {\n    \n    static init($base: JQuery<HTMLElement>): void {\n      $('.eh-predessor-successor--more-btn .eh-button', $base).each(function (_index, element) {\n        $(element).on('click', (event: JQuery.TriggeredEvent) => {\n          event.preventDefault();\n          $(event.currentTarget).hide().closest('.eh-predessor-successor').find('.eh-predessor-successor--item').removeClass('eh-display-none');\n        });\n      });\n    }\n  }\n  \n}\n","namespace eh {\n\n    export class UPidGroup {\n        \n        public static readonly SELECTOR__TAB_CONTAINERS = \".marker-product-specifications, .marker-product-downloads, .marker-product-overview, .marker-product-spare-parts, .marker-product-related-products, .marker-product-configure\";\n\n        static init($base: JQuery<HTMLElement>): void {\n            let prodConfigure = $base.selfOrFind(this.SELECTOR__TAB_CONTAINERS);\n            $base.find('.marker-open-tab').on('click', ($event) => {\n                $event.preventDefault();\n                const reqTarget = $($event.currentTarget).data('tabRequestTarget');\n                if(reqTarget) {\n                    $(reqTarget).each(function() {\n                            const targetId = $(this).attr('id');\n                            if (targetId) {\n                              $(':root').trigger(TAB_EVENTS.TAB_ACTIVATE_REQUEST, targetId);\n                            } else {\n                              $(this).trigger('click');\n                            }\n                        }\n                    )\n                }\n            });\n            $base.find('.cs-trigger-anchor').on('click', ($event) => {\n                $event.preventDefault();\n                const targetIdentifier = $($event.currentTarget).data('teeId');\n                const $target = $(`.marker-focus-target[data-focus-target~=\"${targetIdentifier}\"]`);\n                const pageOffsetTop = $target.offset()?.top;\n                if (pageOffsetTop !== undefined) {\n                    const correction = ($('.eh-upid-header--container').outerHeight(true) ?? 0) * -1;\n                    ScrollPage.scrollToAnimated(pageOffsetTop + correction);\n                }\n            });\n            if(prodConfigure.length > 0) {\n                UPidGroup.initGroup(prodConfigure);\n            }\n\n            $base.selfOrFind('.eh-sg-accordion-filter').each((idx, el) => {\n                UPidGroup.initFilter($(el));\n            });\n\n            $base.selfOrFind('.marker-product-related-products .eh-related-products-reset').on('click',($event) => {\n                $event.preventDefault();\n                $base.selfOrFind('input[type=radio]:checked').prop('checked', false);\n                $base.selfOrFind('.marker-tabs-relateds.marker-tabs-relateds-specific ').addClass('eh--hide');\n                $base.selfOrFind('.marker-tabs-relateds.marker-tabid-all').removeClass('eh--hide');\n\n            });\n\n\n        }\n\n        private static notifyReplaced($el: JQuery<HTMLElement>): void {\n            const event = jQuery.Event(cs.Snippet.EventIdPostReplace) as cs.SnippetEventPostReplace;\n            event.replacedTarget = $el;\n            $(':root').trigger(event);\n        }\n\n        private static initFilter($el: JQuery<HTMLElement>):void {\n            const $filterBase = $el;\n            const $buttonShow = $('.trigger-filter-show', $filterBase);\n            const $buttonCancel = $('.trigger-filter-cancel', $filterBase);\n            const $buttonSubmit = $('.trigger-filter-submit', $filterBase);\n\n            $buttonShow.on('click', ($event) => {\n                $event.preventDefault();\n                toggleFilterDisplay($($event.currentTarget), true);\n            });\n            $buttonCancel.on('click', ($event) => {\n                $event.preventDefault();\n                toggleFilterDisplay($($event.currentTarget), false);\n            });\n            $buttonSubmit.on('click', ($event) => {\n                $event.preventDefault();\n                toggleFilterDisplay($($event.currentTarget), false);\n            });\n\n            const toggleFilterDisplay = ($button: JQuery<HTMLElement>, show: boolean) => {\n                $filterBase.find('.eh-product-filter').toggleClass('eh-filter-active', show);\n                ScrollPage.setScrollEnabled(!show, 'eh-no-scroll--lt-medium eh-layout--pos-fixed--lt-medium eh-full-height--lt-medium');\n                $buttonSubmit.toggleClass('eh-cta-button--01', true).toggleClass('eh-cta-button--02', false);\n                $buttonSubmit.selfOrFind('[data-label-part-id=\"result\"]').toggleClass('eh--hide', true);\n                $buttonSubmit.selfOrFind('[data-label-part-id=\"close\"]').toggleClass('eh--hide', false);\n                requestAnimationFrame(SearchFilters.clippingManager.init);\n            };\n\n            $el.selfOrFind('.eh-sg-js-filter').each((idx, el) => {\n                new LocalGroupsFilter($(el));\n            });\n        }\n        private static initGroup($container: JQuery<HTMLElement>):void {\n            $container.find('.marker-copy-clipboard').on('click', ($event) => {\n                $event.preventDefault();\n                const dummy = document.createElement(\"input\");\n                dummy.value = '' + ($($event.currentTarget).attr('href') || '');\n                document.body.appendChild(dummy);\n                dummy.setAttribute(\"id\", \"dummy_id\");\n                dummy.select();\n                document.execCommand(\"copy\");\n                document.body.removeChild(dummy);\n            });\n            $container.find('.marker-send-mail').on('click', ($event) => {\n                $event.preventDefault();\n                const bt = $($event.currentTarget);\n                let text = (bt.data('body') || '').replace('{{url}}', ($($event.currentTarget).attr('href')?.replace(/ /g, '%20') || ''));\n                text = \"mailto:?subject=\"+encodeURIComponent(bt.data('subject') || '')+'&body='+encodeURIComponent(text);\n                window.location.href = text;\n            });\n           \n            $container.selfOrFind('.marker-tabbing').each((idx, el) => {\n                new UPidGroup($(el));\n            });\n        }\n    \n        private static readonly logger = log.getLogger('eh.UPidGroup');\n        \n        private readonly navigations: JQuery<HTMLElement>;\n        private readonly panels: JQuery<HTMLElement>;\n        private jqXHR: JQuery.jqXHR | null;\n  \n        public constructor(private readonly $pane: JQuery<HTMLElement>) {\n            UPidGroup.logger.info('constructor', $pane);\n            \n            const tabberId = $pane.data('csTabbingId');\n            this.navigations = this.$pane.find('.trigger-' + $.escapeSelector(tabberId));\n            this.panels = this.$pane.find('.marker-' + $.escapeSelector(tabberId));\n\n            this.navigations.each((idx, tabCtrl) => {\n                $(tabCtrl).on('click', (event: JQuery.Event) => {\n                    //UPidGroup.logger.info('onClick', tabCtrl, event);\n                    event.preventDefault();\n                    const $tabCtrl = $(tabCtrl);\n                    const tabSel = $tabCtrl.data('tabmarker');\n                    if(tabSel) {\n                        const tabNx = this.panels.selfOrFind('.'+tabSel.replace('.','\\\\.')).emptyToOptional();\n                        if(tabNx) {\n                            this.navigations.selfOrFind('input[type=radio]:checked').each( (i:number, el: HTMLInputElement ) => {\n                                el.checked = false;\n                            });\n                            $tabCtrl.selfOrFind('input[type=radio]').each(  (i: number, el:HTMLInputElement) => {\n                                el.checked=true;\n                                $(el).trigger('change');\n                            });\n                            this.activateTab(tabSel);\n                        }\n                    }\n                    this.activateTab($(tabCtrl).data('tabmarker'));\n                });\n            }).filter('.active').first().each((_i, el) => {\n                this.activateTab($(el).data('tabmarker'));\n            });\n    \n            this.panels.selfOrFind('.trigger-snippet-auto').each((idx, el) => {\n                const $el = $(el);\n                const url = $el.data('snippetUrl');\n                if (url) {\n                    this.load(url, $el, null);\n                }\n            });\n    \n            $(':root').on(eh.TAB_EVENTS.TAB_CHANGE, ($event: JQuery.TriggeredEvent, tab: ITab): void => {\n                if (Tabs.getTabContent(tab).selfOrFind(this.navigations).length > 0) { // subtabs are inside displayed tab content\n                    this.navigations.filter('.active').first().each((_i, el) => {\n                        this.activateTab($(el).data('tabmarker'));\n                    });\n                }\n            });\n        }\n\n        private activateTab(tabSel: string) {\n            UPidGroup.logger.info('activateTab', tabSel, this.$pane);\n            if(!tabSel) {// cs7062288 202511\n              UPidGroup.logger.warn('activateTab - no data-tabmarker', tabSel, this.$pane);\n              return;\n            }\n   \n            this.navigations.each((idx, tabCtrl) => {\n                const $tabCtrl = $(tabCtrl);\n                const makeActive = $tabCtrl.data('tabmarker') === tabSel;\n                $tabCtrl.toggleClass('active', makeActive);\n                $tabCtrl.selfOrFind('input[type=radio]').each((_i, el) => {\n                    const $el = $(el);\n                    $el.prop('checked', makeActive);\n                });\n            });\n            \n            let snippetEl = null;\n            this.panels.each((i, el) => {\n                if (el.classList.contains(tabSel)) {\n                    snippetEl = $(el).selfOrFind('.trigger-snippet').emptyToOptional();\n                    if (snippetEl) {\n                        this.doLoad(snippetEl, tabSel);\n                    }\n                }\n            });\n            if (!snippetEl) {\n                this.panels.each((i, el) => {\n                    if(el.classList.contains(tabSel)) {\n                        el.classList.remove('eh--hide');\n                    } else {\n                        el.classList.add('eh--hide');\n                    }\n                });\n                \n                if (!this.$pane.is(':visible')) {\n                    UPidGroup.logger.debug('invisible => skipping handleOnsiteNavigation', tabSel, this.$pane);\n                    return;\n                }\n                \n                const tabId = tabSel.replace(new RegExp('^marker-tabid-'), '');\n                UPidGroup.logger.info('activateTab', tabSel, tabId);\n                const historyParamName = this.$pane.data('csTabParam');\n                if (historyParamName) {\n                    const url = window.location.href;\n                    const qpm = URLHelper.buildQueryParamMap(URLHelper.parse(url).search);\n                    qpm[historyParamName] = tabId;\n                    window.history.replaceState(null, document.title, URLHelper.buildUrl(window.location.href, URLHelper.buildQueryString(qpm)));\n                }\n                \n                if  (this.$pane.hasClass('marker-cs-tracking-onsite-navigation')) {\n                    const newHeading: string|undefined = this.navigations.filter(`*[data-tabmarker=\"${tabSel}\"]`).data('csTrackingTitle');\n                    if (newHeading) {\n                        const siblingHeadings = $.map(this.navigations, el => $(el).data('csTrackingTitle')).filter(v => v);\n                        eh.Tracking.handleOnsiteNavigation(newHeading, siblingHeadings);\n                    }\n                    \n                }\n            }\n        }\n        \n        private doLoad($panel:JQuery<HTMLElement>, tabSel:string|null):void {\n            const url = $panel.data('snippetUrl');\n            if(url) {\n                this.load(url, $panel, tabSel);\n            }\n        }\n\n        private load(url:string, $target:JQuery<HTMLElement>, tabSel:string|null): void {\n            //console.log('doSearch', this.getTerm(), '$searchResultContainer', this.$searchResultContainer);\n            this.showLoadingIndicator();\n            this.jqXHR = $.ajax({\n              'url': url,\n              'method': 'get',\n              'beforeSend': ()  => {\n              }\n            }).done((data) => {\n                //console.log('search result');\n                const $data = $(data);\n                const newElementData = $data.find('data').text();\n                const $newElement = newElementData.length > 0 ? $(newElementData) : $data;\n                const resultData = $($newElement).find('.snippet-result');\n                $target.replaceWith(resultData);\n                if(tabSel) {\n                    this.activateTab(tabSel);\n                }\n                UPidGroup.notifyReplaced(resultData);\n            })\n            .fail(function(/*jqXHR, textStatus, errorThrown*/) {\n              //console.log('search failure');\n            })\n            .always(() => {\n              this.hideLoadingIndicator();\n            });\n            //console.log('started jqXHR search');\n        }\n        private showLoadingIndicator() {\n            this.$pane.toggleClass('is-loading', true);\n        // @TODO: NYI\n        // eh.LoadingIndicator.showLoading(this.$searchButton);\n        //this.$progressIndicator.toggleClass(SiteSearch.CLASS__HIDDEN, false);\n        }\n        \n        private hideLoadingIndicator() {\n            this.$pane.toggleClass('is-loading', false);\n        // @TODO: NYI\n        // eh.LoadingIndicator.hideLoading();\n        //this.$progressIndicator.toggleClass(SiteSearch.CLASS__HIDDEN, true);\n        }\n\n    }\n    \n    \n    class LocalGroupsFilter {\n        triggers: LocalTrigger[] = [];\n        others: LocalTextFilter[] = [];\n        items: JQuery<HTMLElement>; \n        count: JQuery<HTMLElement>;\n        slider: JQuery<HTMLElement>;\n        closeButtonLabel: JQuery<HTMLElement>;\n        submitButtonLabel: JQuery<HTMLElement>;\n        inputs: JQuery<HTMLElement>;\n        groupVal: string = '';\n        typeVal: string = '';\n        term: string ='';\n        updateButtons: boolean = false;\n\n        constructor(private readonly base: JQuery<HTMLElement>) {\n            this.items = $('.marker-item-all');\n            this.count = $('.marker-counter-text')\n            this.slider = $('.marker-sparepart-slider')\n            this.inputs = $('.trigger-filter-group input')\n            this.closeButtonLabel = $('.marker-close-button-label')\n            this.submitButtonLabel = $('.marker-submit-button-label')\n            base.find('.trigger-filter-type').each((idx, el)=> {\n                this.triggers.push(new LocalTypeFilterTrigger($(el), this));\n            });\n            base.find('.trigger-filter-group').each((idx, el)=>{\n                this.triggers.push(new LocalGroupFilterTrigger($(el), this));\n            });\n            base.find('.marker-filter-input').each((idx, el) => {\n                this.others.push(new LocalTextFilter($(el), this));\n            });\n            this.updateResults();\n            this.updateButtons=true;\n        }\n\n        contains(val:any, sub:string):boolean {\n            return (val != null) && ((''+val).toLowerCase().indexOf(sub.toLowerCase()) > -1);\n        }\n\n        activate(trigger:LocalTrigger) {\n            this.typeVal = trigger.type; // level 1\n            this.groupVal = trigger.group; // level 2\n            this.updateResults();\n    \n            const trackingParams: { 'k': string; 'v': string; }[] = [];\n            if (this.typeVal) {\n                trackingParams.push({\n                    k: 'type',\n                    v: this.typeVal\n                });\n            }\n            if (this.groupVal) {\n                trackingParams.push({\n                    k: 'group',\n                    v: this.groupVal\n                });\n            }\n            eh.Tracking.injectTrackingEvent($.extend({}, eh.Tracking.analyzeFilterParams(trackingParams),\n                {'event_subtype': 'filter_click'}), trigger.trigger, 'filter');\n        }\n\n        filterTerm(trigger:LocalTextFilter) {\n            this.term = trigger.value;\n            this.updateResults();\n            \n            const formParams: { 'k': string; 'v': string; }[] = [\n                {\n                    k: trigger.field.data('csTrackingTitle'),\n                    v: trigger.value\n                }\n            ];\n            eh.Tracking.injectTrackingEvent($.extend({}, eh.Tracking.analyzeFilterParams(formParams),\n                {'event_subtype': 'filter_click'}), trigger.field, 'filter');\n        }\n\n        updateResults() {// refresh on init, by term? term = '' \n            const allAct:string[] = [];\n            const typeAct:string[] = [];\n            const termAct:string[] = [];\n\n            this.items\n                .toggleClass('eh--hide', true)\n                .filter((i, e) => {\n                    const $e = $(e);\n                    if (this.term === '' || this.contains($e.data('filterPos'), this.term) || this.contains($e.data('filterCode'), this.term)) {\n                        termAct.push($e.data('filterGroup'));\n                        typeAct.push($e.data('filterType'));\n                        if (this.typeVal === '' || !$e.data('filterType') || $e.data('filterType') === this.typeVal) {\n                            if (this.groupVal === '' || !$e.data('filterGroup') || $e.data('filterGroup') === this.groupVal) {\n                                allAct.push($e.data('filterGroup'));\n                                return true;\n                            }\n                        }\n                        return false;\n                    }\n                    return false;\n                })\n                .toggleClass('eh--hide', false)\n            ;\n            this.triggers.forEach(t=>{\n                t.updateCount(termAct,typeAct);\n            });\n            if(!this.groupVal || this.groupVal === ''){\n                this.inputs.each((idx, el: HTMLInputElement)=> {\n                    el.checked = false;\n                });\n            }\n            this.count.each((idx, el)=> {\n                let e = $(el);\n                let txt = e.data('resultCountTemplate') || '';\n                txt = txt.replace('$c', allAct.length);\n                e.text(txt);\n                if(((this.typeVal === '' ||!this.typeVal) && !e.data('filterType')) || this.typeVal === e.data('filterType')){\n                    e.toggleClass('eh--hide',false);\n                } else {\n                    e.toggleClass('eh--hide',true);\n                }\n            });\n            this.slider.toggleClass('eh--hide', this.typeVal !== 'spareparts');\n            if(this.updateButtons){\n                let txt = this.submitButtonLabel.data('resultCountTemplate') || '';\n                txt = txt.replace('$c', allAct.length);\n                this.submitButtonLabel.text(txt);\n                this.closeButtonLabel.toggleClass('eh--hide', true);\n                this.submitButtonLabel.toggleClass('eh--hide', false);\n                this.submitButtonLabel.closest('a').toggleClass('eh-cta-button--01',false).toggleClass('eh-cta-button--02',true)\n            }\n\n        }\n    }\n    interface LocalTrigger {\n        readonly trigger: JQuery<HTMLElement>;\n        readonly group: string;\n        readonly type: string;\n        updateCount(groups: string[], types: string[]): void;\n    }\n    class LocalTypeFilterTrigger  implements LocalTrigger{\n        trigger: JQuery<HTMLElement>;\n        label: JQuery<HTMLElement>;\n        group: string;\n        type: string;\n\n        constructor(base: JQuery<HTMLElement>, group:LocalGroupsFilter) {\n            //console.log(\"LocalTypeFilterTrigger\")\n            this.trigger = base;\n            this.label =this.trigger.find('span.eh-accordion-ctrl--category-heading-label, span.eh-accordion-ctrl--selection-indicator');\n            this.group = base.data('filterGroup') || '';\n            this.type = base.data('filterType') || '';\n\n            this.trigger.on('click', ($event) => {\n                group.activate(this);\n                $(':root').trigger(eh.Constants.VISIBILITY_CHANGE);\n            });\n        }\n\n        updateCount(groups:string[], types: string[]) {\n            this.label.each((id,el) => {\n                $(el).text((id1, txt) => {\n                    txt = txt.replace(/\\d+/, types.filter(t => {\n                        return t === this.type;\n                    }).length + '');\n                    return txt;\n                });\n            });\n        }\n    }\n    class LocalGroupFilterTrigger   implements LocalTrigger{\n        trigger: JQuery<HTMLElement>;\n        label: JQuery<HTMLElement>;\n        group: string;\n        type: string;\n\n        constructor(base: JQuery<HTMLElement>, group:LocalGroupsFilter) {\n            this.trigger = base.find('.trigger-click');\n            this.label = base.find('.marker-filter-group-count');\n            this.group = base.data('filterGroup') || '';\n            this.type = base.data('filterType') || '';\n            this.trigger.on('click', ($event) => {\n                const t = $($event.currentTarget);\n                $event.preventDefault();\n                t.find('input:radio').prop(\"checked\", true);\n                group.activate(this);\n            });\n        }\n\n        updateCount(groups:string[], types: string[]) {\n            let count=groups.filter(g=>{\n                return g === this.group;\n            }).length;\n            this.label.text(''+count);\n            let noResults = count === 0;\n            this.label.closest(\"li\").toggleClass('disabled', noResults).find(\"input\").prop('disabled',noResults);\n        }\n    }\n\n    class LocalTextFilter {\n        trigger: JQuery<HTMLElement>;\n        clear: JQuery<HTMLElement>;\n        field: JQuery<HTMLElement>;\n        value: string;\n\n        constructor(private readonly base: JQuery<HTMLElement>, group:LocalGroupsFilter) {\n            this.trigger = base.find('.trigger-input-filter');\n            this.clear = base.find('.trigger-input-clear');\n            this.field = base.find('input[type=search]');\n            this.value = '';\n\n            this.trigger.on('click', ($event) => {\n                $event.preventDefault();\n                this.value= ''+ (this.field.val() || '');\n                group.filterTerm(this);\n            });\n            this.clear.on('click', ($event)=> {\n                $event.preventDefault();\n                this.field.val('');\n                this.value= '';\n                this.updateState();\n                group.filterTerm(this);\n            });\n\n            this.field.on('keydown', ($event) => {\n                switch ($event.key) {\n                    case 'Enter':// 13 enter\n                        $event.preventDefault();\n                        this.value= ''+ (this.field.val() || '');\n                        group.filterTerm(this);\n                }\n            }).on('keyup', () => {\n                this.updateState();\n            }).on('focus', () => {\n                eh.Tracking.injectTrackingEvent({'event_linkname': 'search'}, this.field, 'click_in');\n            });\n        }\n        updateState():void {\n            const empty = (this.field.val() || '') === '';\n            this.trigger.toggleClass('disabled', empty);\n            this.clear.toggleClass('eh--hide', empty);\n        }\n    }\n}\n\n","namespace eh {\n  interface dataCompareViewModel {\n    key: string;\n    parent: HTMLElement;\n    template: HTMLElement;\n  }\n\n  interface compareBanerModel {\n    parent: HTMLElement;\n    templateData: HTMLElement;\n    templateEmpty: HTMLElement;\n  }\n\n  // module: inStock table\n  export class VariantListController {    \n    static readonly EventIdPostReplace = 'csSnippet:postReplace';\n    public static VARIANT_LIST: string = 'ehel-variant-list';\n    public static VARIANT_LIST_VARIANTS: string = 'ehel-variant-list--variant'; \n    public static VARIANT_LIST_COMPARE_CHECKBOX: string = 'ehel-variant-list--compare-checkbox';\n    public static VARIANT_LIST_COMPARE_BANNER: string = 'ehel-variant-list--compare-banner';\n    public static VARIANT_LIST_DRAWER_COMPARE_BANNER: string = 'ehel-variant-list--drawer-compare';\n    public static VARIANT_LIST_COMPARE_BUTTON_CLASSNAME: string = 'ehel-variant-list--compare-banner-button';\n    public static VARIANT_LIST_COMPARE_RESET_CLASSNAME: string = 'ehel-variant-list--compare-banner-reset';\n    public static VARIANT_LIST_COMPARE_VIEW_DETAIL_CLASSNAME: string = 'ehel-variant-list--view-detail';\n    public static VARIANT_LIST_DRAWER_DETAIL_BANNER_CLASSNAME: string = 'ehel-variant-list--drawer-detail';\n\n    public static VARIANT_LIST_DATA_COLUMN_SELECTOR_CLASSNAME: string = 'ehel-variant-list--data-column-selector';\n    public static VARIANT_LIST_DATA_COLUMN_BUTTON_CLASSNAME: string = 'ehel-variant-list--data-column-button';\n    public static TOOLTIP_TEXT_CLASSNAME: string = 'ehel-tooltip--text';\n\n    static init($base: JQuery<HTMLElement>, isSnippetRequest: boolean): void {\n      if (isSnippetRequest) {\n        return;\n      }\n      const $sftRoot = $('body', $base);\n      if ($sftRoot.length === 0) {\n        return;\n      }\n\n      const config: SftConfiguration = $sftRoot.data('sftConfig');\n      if (!config || Object.keys(config).length === 0) {\n        return;\n      }\n      \n      const $pls = $base.selfOrFind(`.${VariantListController.VARIANT_LIST}`);\n      if ($pls.length === 0) {\n        return;\n      }\n      \n      VariantListController.fetchAndStart($pls.eq(0) , config);\n    }\n\n    private static fetchAndStart($base: JQuery<HTMLElement>, config: SftConfiguration): void {\n      const url  = `${config.serviceUrl}${config.endpointPath.orderCodeInfo}/`;\n      let pInfo: ProductInStockInfo[] = $base.data('instock');\n      const codes: string[] = pInfo?.map(s => s.orderCodeExt);\n      if(codes) {\n        const lang = $base.data('locale') || 'en';\n        const serv = new OrderCodeDetailService(url).withStaticHeader('Accept-Language', lang);\n        serv.fetchForCodes(codes, (details: VariantDetailInfo[]) => {\n          details.map(d => {\n            let dupls = 0;\n            pInfo.forEach(p => {\n              if(p.orderCodeExt === d.orderCode) {\n                p.variantInfo = d;\n                dupls++;\n              }\n            });\n            if(dupls) {\n              console.log(\"INFO: Duplicate extended order-code infos found (may have unique order-code-ident).\");\n            }\n          });\n          let sz = pInfo.length;\n          pInfo = pInfo.filter(p => {\n            return !!p.variantInfo;\n          });\n          if(sz != pInfo.length) {\n            console.log(\"INFO: Filtered \"+(sz-pInfo.length)+\" entries without variant configuration info.\");\n          }\n          new VariantListController($base, pInfo);\n        });\n      }\n    }\n \n    private el: HTMLElement | null | undefined;\n    private compareCheckboxes: HTMLInputElement[] = [];\n    private viewDetails: HTMLInputElement[] = [];//NodeListOf<HTMLElement> | null | undefined;\n    private variants: HTMLInputElement[] = [];   //NodeListOf<HTMLElement> | null | undefined;\n    private compareBanner: HTMLElement | null | undefined;\n    private drawerCompare: HTMLElement | null | undefined;\n    private drawerDetail: HTMLElement | null | undefined;\n    private compareButton: HTMLElement | null | undefined;\n    private resetButton: HTMLElement | null | undefined;\n    private moreBt: HTMLElement | null | undefined;\n\n    private columnsSelector: NodeListOf<HTMLElement> | null | undefined;\n    private columnsButtons: NodeListOf<HTMLElement> | null | undefined;\n\n    private vm: VariantListViewModel | null | undefined = null;\n\n    constructor(private readonly $base: JQuery<HTMLElement>, private readonly productInfos: ProductInStockInfo[]) {\n      //console.log(detailInfos);\n      this.populate();\n      \n      // this.$base.find('.ehel-variant-list--data-column-button').each((id, e) => {\n      //   console.log(\"R\"+id, $(e).data());\n      // });\n      // this.$base.find('.ehel-variant-list--variant').each((id, e) => {\n      //   console.log(\"R\"+id, $(e).data());\n      // });\n      this.el = this.$base.get(0);\n      this.compareCheckboxes = Array.from(this.el?.querySelectorAll(`.${VariantListController.VARIANT_LIST_COMPARE_CHECKBOX}`) ?? []);\n      this.variants = Array.from(this.el?.querySelectorAll(`.${VariantListController.VARIANT_LIST_VARIANTS}`)?? []);\n      this.viewDetails = Array.from(this.el?.querySelectorAll(`.${VariantListController.VARIANT_LIST_COMPARE_VIEW_DETAIL_CLASSNAME}`)?? []);\n      this.columnsSelector = this.el?.querySelectorAll(`.${VariantListController.VARIANT_LIST_DATA_COLUMN_SELECTOR_CLASSNAME}`);\n      this.columnsButtons = this.el?.querySelectorAll(`.${VariantListController.VARIANT_LIST_DATA_COLUMN_BUTTON_CLASSNAME}`);\n      this.compareBanner = this.el?.querySelector(`.${VariantListController.VARIANT_LIST_COMPARE_BANNER}`);\n      this.drawerCompare = this.el?.querySelector(`.${VariantListController.VARIANT_LIST_DRAWER_COMPARE_BANNER}`);\n      this.compareButton = this.el?.querySelector(`.${VariantListController.VARIANT_LIST_COMPARE_BUTTON_CLASSNAME}`);\n      this.resetButton = this.el?.querySelector(`.${VariantListController.VARIANT_LIST_COMPARE_RESET_CLASSNAME}`);\n      this.drawerDetail = this.el?.querySelector(`.${VariantListController.VARIANT_LIST_DRAWER_DETAIL_BANNER_CLASSNAME}`);\n      this.moreBt = this.el?.querySelector('.marker-show-more');\n\n\n      if (!this.el  || !this.compareBanner || !this.drawerCompare || !this.compareButton || !this.resetButton || !this.drawerDetail || !this.columnsSelector || !this.columnsButtons) {\n        console.log(\"missing element(s)\");\n        return;\n      }\n      this.vm = new VariantListViewModel(\n        this.compareCheckboxes,\n        this.compareBanner,\n        this.drawerCompare,\n        this.compareButton,\n        this.drawerDetail,\n        this.columnsSelector,\n        this.variants\n      );\n      this.init();\n    }\n\n    private populate(): void {\n      if(this.productInfos.length < 1) {\n        return;\n      }\n      // header selector\n      let ts = this.$base.find('.marker-t--select-entry').removeClass('marker-t--select-entry');\n      let header2 = ts.parents('.marker-t-header2').removeClass('marker-t-header2');\n\n      ts.each((e, el) => {\n        let t = $(el);\n        let parent = t.parent();\n        this.productInfos[0].variantInfo?.configuration.forEach((conf, i) => {\n          let entry = t.clone().removeClass('ehtw-hidden');\n          entry.attr('data-variant-data-key', ('conf'+i));\n          entry.find('.marker-t--label').text(conf.label).removeClass('marker-t--label');\n          entry.removeClass('selected');\n          if(e === i) {\n            entry.addClass('selected');\n            //console.log(\"H2\", header2.length), header2.find('.ehel-variant-list--data-column-title, .ehel-tooltip--text ').length;\n            header2.find('.ehel-variant-list--data-column-title, .ehel-tooltip--text ').text(conf.label);\n          }\n          //parent.append(entry);\n          t.before(entry);\n        });\n      });\n      $(ts[0]).addClass('selected');\n      \n      // rows\n      let t = this.$base.find('.ehel-variant-list--variant--template');\n      let lang = this.$base.data('locale') || 'en';\n\n      this.productInfos.forEach((pInfo, i)=> {\n        const vi = pInfo.variantInfo; \n        if (!vi) {\n          return;\n        }\n        let entry = t.clone();\n        entry.addClass('ehel-variant-list--variant');\n        entry.removeClass('ehel-variant-list--variant--template');\n        if(i < 10) {\n          entry.removeClass('ehtw-hidden');\n        }\n        entry.attr('data-variant-data-id', i);\n        entry.attr('data-variant-data-name', vi.orderCode);\n        entry.attr('data-info', JSON.stringify(pInfo));\n        \n        entry.selfOrFind('*[data-cs-product-material-number]').each((index, el) => {\n          $(el).attr('data-cs-product-material-number', vi.materialNumber);\n        });\n        entry.selfOrFind('*[data-cs-product-root]').each((index, el) => {\n          $(el).attr('data-cs-product-root', vi.productRoot);\n        });\n        \n        entry.find(':checkbox').attr('id', 'cbId'+i);\n        entry.find(':checkbox').attr('data-cs-tracking-title', vi.orderCode);\n        entry.find('.marker-t-variant-label').removeClass('marker-t-variant-label').text(vi.orderCode);\n        entry.find('.marker-t-tooltip-target').attr('id', 'ttTargetId'+vi.orderCode).removeClass('marker-t-tooltip-target');\n        entry.find('.marker-t-tooltip-trigger').attr('data-tooltip-target', 'ttTargetId'+vi.orderCode).removeClass('marker-t-tooltip-trigger');\n        \n        let plh = entry.find('.marker-price-placeholder');\n        let val = entry.find('.marker-t-column-value').removeClass('marker-t-column-value');\n        let optsSel:string[] = [];\n        vi.configuration.forEach((conf, j) => {\n          let txt = $.map(conf.options, x => {\n            optsSel.push(vi.productRoot+'_'+conf.feature+'_'+x.value);\n            return x.label;\n          }).join(' ');\n          entry.attr('data-variant-data-conf'+j, txt);\n          if(j === 0) {\n            val.text(txt);\n          }\n        });\n        let del = $('<div class=\"ehtw-hidden marker-product-pricing-options\"></div>');\n        del.attr('data-product-pricing-options', JSON.stringify(optsSel));\n        plh.append(del);\n        plh.removeClass('eh-t-price-widget').addClass('eh-price-widget');\n        t.before(entry);\n      });\n\n      // details\n      let cs = this.$base.find('.marker-t--detail').removeClass('marker-t--detail');\n      this.productInfos[0].variantInfo?.configuration.forEach((conf, i) => {\n        let entry = cs.clone();\n        entry.attr('data-variant-data-key', ('conf'+i)).removeClass('ehtw-hidden');\n        entry.children().text(conf.label);\n        cs.before(entry);\n      });\n      this.$base.find('.marker-t--price-wrapper').find('.marker-price-placeholder').removeClass('marker-price-placeholder').addClass('marker-t--price-placeholder');\n\n      // compare\n      let ct = this.$base.find('.marker-t--compare').removeClass('marker-t--compare');\n      this.productInfos[0].variantInfo?.configuration.forEach((conf, i) => {\n        let entry = ct.clone();\n        entry.attr('data-variant-data-key', ('conf'+i)).removeClass('ehtw-hidden');\n        entry.children().text(conf.label);\n        ct.before(entry);\n      });\n      this.firePostReplace(this.$base);\n    }\n\n    private firePostReplace(elem:JQuery<HTMLElement>) {// no Snippet but replace\n      const event = jQuery.Event(cs.Snippet.EventIdPostReplace) as cs.SnippetEventPostReplace;\n      event.replacedTarget = elem;\n      // event.removedTarget = undefined;\n      $(':root').trigger(event);\n    }\n\n    private init(): void {\n      this.registerControls();\n    }\n\n    private registerControls(): void {\n      this.compareCheckboxes?.forEach(cb => {\n        cb.addEventListener('change', this.doChangeCheckbox);\n      });\n\n      this.viewDetails?.forEach(cb => {\n        cb.addEventListener('click', this.doViewDetailClick);\n      });\n\n      this.columnsButtons?.forEach(cb => {\n        cb.addEventListener('click', this.doColumnButtonClick);\n      });\n\n      this.compareButton?.addEventListener('click', this.doCompareBtClick);\n      this.moreBt?.addEventListener('click', this.doMoreButtonClick);\n      this.resetButton?.addEventListener('click', this.doResetButtonClick)\n    }\n\n    private doChangeCheckbox = (e: Event): void => {\n      this.vm?.toggleVariant(e.currentTarget as HTMLInputElement);\n    }\n\n    private doResetButtonClick = (e: UIEvent): void => {\n      this.vm?.reset();\n    }\n\n    private doMoreButtonClick = (e: UIEvent): void => {\n      this.vm?.showAll(e.currentTarget as HTMLElement);\n    }\n\n    private doViewDetailClick = (e: UIEvent): void => {\n      this.vm?.viewDetail(e.currentTarget as HTMLElement);\n      (this.drawerDetail?.querySelectorAll('.marker-price-wrapper') as NodeListOf<HTMLElement>|null)?.forEach(x => this.firePostReplace($(x)));\n    }\n\n    private doCompareBtClick = (e: UIEvent): void => {// DrawerCtrler\n      (this.drawerCompare?.querySelectorAll('.marker-price-wrapper') as NodeListOf<HTMLElement>|null)?.forEach(x => this.firePostReplace($(x)));\n    }\n\n    private doColumnButtonClick = (e: UIEvent): void => {\n      this.vm?.changeColumn(e.currentTarget as HTMLElement);\n    }\n  }\n\n  class VariantListViewModel {\n    private static HIDDEN_CLASSNAME: string = 'lg:!ehtw-hidden';\n    private static DISABLED_CLASSNAME: string = 'is-disabled';\n    private static SELECTED_CLASSNAME: string = 'selected';\n\n    private static VARIANT_CLASSNAME: string = 'ehel-variant-list--variant';\n    private static DATA_TEMPLATE_CLASSNAME: string = 'ehtw-variant-list--template';\n    private static DATA_TEMPLATE_REPLACEMENT_CLASSNAME: string = 'ehtw-variant-list--template-replacement';\n    private static VARIANT_LIST_BANNER_EMPTY_CLASSNAME: string = 'ehtw-variant-list--empty';\n    private static VARIANT_LIST_BANNER_TEMPLATE_EMPTY_CLASSNAME: string = 'ehtw-variant-list--template-empty';\n    private static VARIANT_LIST_BANNER_CONTENT_CLASSNAME: string = 'ehel-variant-list--compare-banner-content';\n    private static VARIANT_LIST_BANNER_REMOVE_BUTTON_CLASSNAME: string = 'ehel-variant-list--compare-banner-remove';\n\n    private static VARIANT_LIST_COLUMN_TITLE_CLASSNAME: string = 'ehel-variant-list--data-column-title';\n    private static TOOLTIP_TEXT_CLASSNAME: string = 'ehel-tooltip--text';\n\n    private static VARIANT_DATA_PREFIX: string = 'variantData';\n\n    private static MIN_ITEMS_TO_COMPARE: number = 2;\n    private static MAX_ITEMS_TO_COMPARE: number = 3;\n    private dataToCompare!: dataCompareViewModel[];\n    private dataDetail!: dataCompareViewModel[];\n    private compareBanerData!: compareBanerModel;\n\n    constructor(\n      private checkboxesArray: HTMLInputElement[],\n      private compareBanner: HTMLElement,\n      private drawerCompare: HTMLElement,\n      private compareButton: HTMLElement,\n      private drawerDetail: HTMLElement,\n      private columnsSelector: NodeListOf<HTMLElement>,\n      private variants:HTMLElement[]\n    ) { \n      this.init();\n    }\n\n    private init() {\n      this.variants.forEach((row) => {\n        var val = row.dataset.info;\n        if(val) {\n          var pInfo = JSON.parse(val) as ProductInStockInfo;\n          this.setCartIds($(row).find('.marker-t-cart-matr-nr'), pInfo).removeClass('marker-t-cart-matr-nr');\n        }\n      });\n\n      this.dataToCompare = Array.from(this.drawerCompare.querySelectorAll('div[data-variant-data-key]') as NodeListOf<HTMLElement>)\n                .map((dk: HTMLElement) => {\n                  return {\n                    key: (dk.dataset[VariantListViewModel.VARIANT_DATA_PREFIX + 'Key']??'')[0].toUpperCase() + (dk.dataset[VariantListViewModel.VARIANT_DATA_PREFIX + 'Key']??'').substring(1),\n                    parent: dk,\n                    template: dk.querySelector(`.${VariantListViewModel.DATA_TEMPLATE_CLASSNAME}`) as HTMLElement\n                  }\n                });\n\n      this.dataDetail = Array.from(this.drawerDetail.querySelectorAll('div[data-variant-data-key]') as NodeListOf<HTMLElement>)\n                .map((dk: HTMLElement) => {\n                  return {\n                    key: (dk.dataset[VariantListViewModel.VARIANT_DATA_PREFIX + 'Key']??'')[0].toUpperCase() + (dk.dataset[VariantListViewModel.VARIANT_DATA_PREFIX + 'Key']??'').substring(1),\n                    parent: dk,\n                    template: dk.querySelector(`.${VariantListViewModel.DATA_TEMPLATE_CLASSNAME}`) as HTMLElement\n                  }\n                });\n\n      const compareBannerParent = this.compareBanner.querySelector(`.${VariantListViewModel.VARIANT_LIST_BANNER_CONTENT_CLASSNAME}`) as HTMLElement;\n\n      this.compareBanerData = {\n        parent: compareBannerParent,\n        templateData: compareBannerParent?.querySelector(`.${VariantListViewModel.DATA_TEMPLATE_CLASSNAME}`) as HTMLElement,\n        templateEmpty: compareBannerParent?.querySelector(`.${VariantListViewModel.VARIANT_LIST_BANNER_TEMPLATE_EMPTY_CLASSNAME}`) as HTMLElement\n      };\n\n      this.columnsSelector.forEach(cs => {\n        const title = cs.querySelector(`.${VariantListViewModel.VARIANT_LIST_COLUMN_TITLE_CLASSNAME}`) as HTMLElement;\n        const selected = cs.querySelector(`.${VariantListViewModel.SELECTED_CLASSNAME}`) as HTMLElement;\n        const tooltipText = cs.querySelector(`.${VariantListViewModel.TOOLTIP_TEXT_CLASSNAME}`) as HTMLElement;\n        const target = cs.dataset['columnDataTarget']??'';\n        const key = (selected.dataset[VariantListViewModel.VARIANT_DATA_PREFIX + 'Key']??'')[0].toUpperCase() + (selected.dataset[VariantListViewModel.VARIANT_DATA_PREFIX + 'Key']??'').substring(1);\n\n        title.textContent = tooltipText.textContent = selected.textContent;\n\n        this.variants.forEach((v: HTMLElement) => {\n          const t = v.querySelector(`.${target}`) as HTMLElement;\n          t.textContent = v.dataset[VariantListViewModel.VARIANT_DATA_PREFIX + key]??'';\n        });\n      });\n\n    }\n\n    private checkCheckboxes () {\n      const nbItemsChecked = this.checkboxesArray.reduce((acc, cb) => acc += (cb.checked ? 1 : 0), 0);\n      if (nbItemsChecked >= VariantListViewModel.MAX_ITEMS_TO_COMPARE) {\n        this.checkboxesArray.filter(cb => !cb.checked).forEach(cb => cb.disabled = true);\n      } else {\n        this.checkboxesArray.filter(cb => !cb.checked).forEach(cb => cb.disabled = false);  \n      }\n      if (nbItemsChecked  > 0) {\n        this.compareBanner.classList.remove(VariantListViewModel.HIDDEN_CLASSNAME);\n      } else {\n        this.compareBanner.classList.add(VariantListViewModel.HIDDEN_CLASSNAME);\n      }\n      if (nbItemsChecked >= VariantListViewModel.MIN_ITEMS_TO_COMPARE) {\n        this.compareButton.classList.remove(VariantListViewModel.DISABLED_CLASSNAME);\n      } else {\n        this.compareButton.classList.add(VariantListViewModel.DISABLED_CLASSNAME);\n      }\n    }\n\n    public toggleVariant(input: HTMLInputElement | null): void {\n      const variant = input?.closest(`.${VariantListViewModel.VARIANT_CLASSNAME}`) as HTMLElement;\n      const variantId = variant.dataset[VariantListViewModel.VARIANT_DATA_PREFIX + 'Id'];\n      if (input?.checked) {\n        /* Compare banner */\n        const newCompareElement = this.compareBanerData.templateData.cloneNode(true) as HTMLElement;\n        newCompareElement.classList.remove(VariantListViewModel.DATA_TEMPLATE_CLASSNAME,'ehtw-hidden');\n        newCompareElement.dataset[VariantListViewModel.VARIANT_DATA_PREFIX + 'Id'] = variantId;\n        newCompareElement.dataset['csTrackingOrderCode'] = variant.dataset[VariantListViewModel.VARIANT_DATA_PREFIX + 'Name'];\n\n        const compareReplacement = newCompareElement.querySelector(`.${VariantListViewModel.DATA_TEMPLATE_REPLACEMENT_CLASSNAME}`);\n        if (compareReplacement) {\n          compareReplacement.classList.remove(VariantListViewModel.DATA_TEMPLATE_REPLACEMENT_CLASSNAME);\n          compareReplacement.textContent = variant.dataset[VariantListViewModel.VARIANT_DATA_PREFIX + 'Name']??null;\n        } \n        const removeButton = newCompareElement.querySelector(`.${VariantListViewModel.VARIANT_LIST_BANNER_REMOVE_BUTTON_CLASSNAME}`);\n        removeButton?.addEventListener('click', () => {\n          /* Compare banner */\n          const newCompareEmptyElement = this.compareBanerData.templateEmpty.cloneNode(true) as HTMLElement;\n          newCompareEmptyElement.classList.remove(VariantListViewModel.VARIANT_LIST_BANNER_TEMPLATE_EMPTY_CLASSNAME,'ehtw-hidden');\n          this.compareBanerData.parent.appendChild(newCompareEmptyElement);\n          this.compareBanner.querySelector('div[data-variant-data-id=\"' + variantId + '\"]')?.remove();\n\n          /* Compare drawer */\n          this.drawerCompare.querySelectorAll('*[data-variant-data-id=\"' + variantId + '\"]').forEach(el => el.remove());\n          input.checked = false;\n          this.checkCheckboxes();\n        });\n        this.compareBanner.querySelector(`.${VariantListViewModel.VARIANT_LIST_BANNER_EMPTY_CLASSNAME}:not(.${VariantListViewModel.VARIANT_LIST_BANNER_TEMPLATE_EMPTY_CLASSNAME})`)?.replaceWith(newCompareElement);\n          /* Compare drawer */\n          this.dataToCompare.forEach(dc => {\n            const newElement = dc.template.cloneNode(true) as HTMLElement;\n            newElement.classList.remove(VariantListViewModel.DATA_TEMPLATE_CLASSNAME,'ehtw-hidden');\n            newElement.dataset[VariantListViewModel.VARIANT_DATA_PREFIX + 'Id'] = variantId;\n            const replacement = newElement.querySelector(`.${VariantListViewModel.DATA_TEMPLATE_REPLACEMENT_CLASSNAME}`);\n            if (replacement) {\n              replacement.classList.remove(VariantListViewModel.DATA_TEMPLATE_REPLACEMENT_CLASSNAME);\n              replacement.textContent = variant.dataset[VariantListViewModel.VARIANT_DATA_PREFIX + dc.key]??null;\n            } else if (dc.key !== 'Price')  {\n              newElement.textContent = variant.dataset[VariantListViewModel.VARIANT_DATA_PREFIX + dc.key]??null;\n            }\n            dc.parent.appendChild(newElement);\n          });\n          this.appendPriceAndCart(variant, this.drawerCompare, false);\n      } else {\n        /* Compare banner */\n        const newCompareEmptyElement = this.compareBanerData.templateEmpty.cloneNode(true) as HTMLElement;\n        newCompareEmptyElement.classList.remove(VariantListViewModel.VARIANT_LIST_BANNER_TEMPLATE_EMPTY_CLASSNAME,'ehtw-hidden');\n        this.compareBanerData.parent.appendChild(newCompareEmptyElement);\n        this.compareBanner.querySelector('div[data-variant-data-id=\"' + variantId + '\"]')?.remove();\n        /* Compare drawer */\n        this.drawerCompare.querySelectorAll('*[data-variant-data-id=\"' + variantId + '\"]').forEach(el => el.remove());\n      }\n      this.checkCheckboxes();\n    }\n\n    public reset() {\n      this.checkboxesArray.forEach(cb => { cb.checked = false; cb.disabled = false} );\n      this.compareBanner.classList.add(VariantListViewModel.HIDDEN_CLASSNAME);\n      this.compareButton.classList.add(VariantListViewModel.DISABLED_CLASSNAME);\n      /* Compare banner */\n      this.compareBanner.querySelectorAll(`.${VariantListViewModel.VARIANT_LIST_BANNER_EMPTY_CLASSNAME}`).forEach(el => el.remove());\n      this.compareBanner.querySelectorAll('div[data-variant-data-id]').forEach(el => el.remove());\n      for (let i=0; i<VariantListViewModel.MAX_ITEMS_TO_COMPARE; i++) {\n        const newCompareEmptyElement = this.compareBanerData.templateEmpty.cloneNode(true) as HTMLElement;\n        newCompareEmptyElement.classList.remove(VariantListViewModel.VARIANT_LIST_BANNER_TEMPLATE_EMPTY_CLASSNAME,'ehtw-hidden');\n        this.compareBanerData.parent.appendChild(newCompareEmptyElement);\n      }\n      /* Compare drawer */\n      this.drawerCompare.querySelectorAll('*[data-variant-data-id]').forEach(el => el.remove());\n    }\n\n    public viewDetail(input: HTMLElement | null): void {\n      const variant = input?.closest(`.${VariantListViewModel.VARIANT_CLASSNAME}`) as HTMLElement;\n      const variantId = $(variant).data('variantDataId');\n      this.drawerDetail.querySelectorAll('*[data-variant-data-id]').forEach(el => el.remove());\n      this.dataDetail.forEach(dd => {\n        const newElement = dd.template.cloneNode(true) as HTMLElement;\n        newElement.classList.remove(VariantListViewModel.DATA_TEMPLATE_CLASSNAME,'ehtw-hidden');\n        newElement.dataset[VariantListViewModel.VARIANT_DATA_PREFIX + 'Id'] = variantId;\n        const replacement = newElement.querySelector(`.${VariantListViewModel.DATA_TEMPLATE_REPLACEMENT_CLASSNAME}`);\n        if (replacement) {\n          replacement.classList.remove(VariantListViewModel.DATA_TEMPLATE_REPLACEMENT_CLASSNAME);\n          replacement.textContent = variant.dataset[VariantListViewModel.VARIANT_DATA_PREFIX + dd.key]??null;\n        }  else if (dd.key !== 'Price')  {\n          newElement.textContent = variant.dataset[VariantListViewModel.VARIANT_DATA_PREFIX + dd.key]??null;\n        }\n        dd.parent.appendChild(newElement);\n      });\n      this.appendPriceAndCart(variant, this.drawerDetail, true);\n    }\n\n    public changeColumn(button: HTMLElement | null) {\n      //console.log(\"COL\", button?.textContent, button?.closest(`.${VariantListController.VARIANT_LIST_DATA_COLUMN_SELECTOR_CLASSNAME}`));\n      const parent = button?.closest(`.${VariantListController.VARIANT_LIST_DATA_COLUMN_SELECTOR_CLASSNAME}`) as HTMLElement;\n      const title = parent.querySelector(`.${VariantListViewModel.VARIANT_LIST_COLUMN_TITLE_CLASSNAME}`) as HTMLElement;\n      const selected = parent.querySelector(`.${VariantListViewModel.SELECTED_CLASSNAME}`) as HTMLElement;\n      const tooltipText = parent.querySelector(`.${VariantListViewModel.TOOLTIP_TEXT_CLASSNAME}`) as HTMLElement;\n      const target = parent.dataset['columnDataTarget']??'';\n      const key = (button?.dataset[VariantListViewModel.VARIANT_DATA_PREFIX + 'Key']??'')[0].toUpperCase() + (button?.dataset[VariantListViewModel.VARIANT_DATA_PREFIX + 'Key']??'').substring(1);\n      //console.log(\"K\", key, ((button?.dataset[VariantListViewModel.VARIANT_DATA_PREFIX + 'Key']??'')[0].toUpperCase()), (button?.dataset[VariantListViewModel.VARIANT_DATA_PREFIX + 'Key']??'') );\n      selected.classList.remove(VariantListViewModel.SELECTED_CLASSNAME);\n      button?.classList.add(VariantListViewModel.SELECTED_CLASSNAME);\n      title.textContent = tooltipText.textContent = button?.textContent??'';\n      this.variants.forEach((v: HTMLElement) => {\n        const t = v.querySelector(`.${target}`) as HTMLElement;\n        t.textContent = v.dataset[VariantListViewModel.VARIANT_DATA_PREFIX + key]??'';\n      });\n      (document?.activeElement as HTMLElement).blur();\n    }\n\n    public showAll(bt: HTMLElement):void {\n      this.variants.forEach((el, i) => {\n        el.classList.remove('ehtw-hidden');\n      });\n      bt.classList.add('ehtw-hidden');\n    }\n\n    private appendPriceAndCart(variant: HTMLElement, ancest: HTMLElement, clear: boolean): void {\n      if(clear) {\n        ancest.querySelectorAll('.marker-price-wrapper').forEach(x => x.remove() );\n      }\n      const wrap = ancest.querySelector(`.marker-t--price-wrapper:not(.${VariantListViewModel.DATA_TEMPLATE_CLASSNAME})`) as HTMLElement;\n      const variantId = $(variant).data('variantDataName');\n      const del = variant.querySelector('.marker-product-pricing-options')?.cloneNode(true) as HTMLElement;\n     //console.log(wrap, variantId, del);\n      if(wrap && variantId && del) {\n        // cart\n        const val = variant.dataset.info;\n        if(val) {\n          const pInfo = JSON.parse(val) as ProductInStockInfo;\n          const $wrap = $(wrap);\n          this.setCartIds($wrap.find('.marker-t-cart-matr-nr'), pInfo);\n          $wrap.find('.marker-t-cart-matr-nr').removeClass('marker-t-cart-matr-nr');\n          $wrap.selfOrFind('*[data-cs-product-material-number]').each((_index, el) => {\n            $(el).attr('data-cs-product-material-number', pInfo.variantInfo?.materialNumber ?? pInfo.materialNumber);\n          });\n          $wrap.selfOrFind('*[data-cs-product-root]').each((_index, el) => {\n            $(el).attr('data-cs-product-root', pInfo.variantInfo?.productRoot ?? pInfo.productRoot);\n          });\n        }\n        // price\n        let pph = wrap.querySelector('.marker-t--price-placeholder');\n        pph?.append(del);\n        pph?.classList.add('marker-price-placeholder');\n        pph?.classList.remove('marker-t--price-placeholder');\n        wrap.classList.remove('marker-t--price-wrapper');\n        pph?.classList.add('marker-price-wrapper', 'eh-price-widget');\n        this.firePostReplace($(wrap));\n      } \n    }\n\n    public setCartIds(el: JQuery<HTMLElement>, pInfo: ProductInStockInfo): JQuery<HTMLElement> {\n      let poc = (pInfo.scMaterialNumber || pInfo.orderCodeIdent || pInfo.orderCodeExt);\n      poc && el.attr('data-nebp-product-ordercode', poc);\n      pInfo.orderCodeExt && el.attr('data-cs-tracking-order-code', pInfo.orderCodeExt);\n      let pmn = pInfo.materialNumber;\n      pmn && el.attr('data-nebp-product-matnr', pmn);\n      return el;\n    }\n\n    private firePostReplace(elem:JQuery<HTMLElement>) {// no Snippet but replace\n      const event = jQuery.Event(cs.Snippet.EventIdPostReplace) as cs.SnippetEventPostReplace;\n      event.replacedTarget = elem;\n      // event.removedTarget = undefined;\n      $(':root').trigger(event);\n    }\n\n  }\n  \n  class OrderCodeDetailService {\n    \n    private staticHeaders: {[headerName: string]: string} = {};\n    private staticQueryParams: eh.QueryParams = {};\n    \n    constructor(private baseUrl: string) {\n    }\n    \n    public withStaticHeader(name: string, value: string): OrderCodeDetailService {\n      this.staticHeaders[name] = value;\n      return this;\n    }\n    \n    public withStaticQueryParam(name: string, value: string): OrderCodeDetailService {\n      this.staticQueryParams[name] = value;\n      return this;\n    }\n    \n    public fetchForCodes(codes: string[], cb: (items: VariantDetailInfo[]) => any): boolean {\n      let retVal = false;\n      const successHandler = (result: VariantDetailInfo[]) => {\n        if (result && result.length > 0) {\n          result.forEach(r => {\n            r.configuration.forEach(c => {\n              if(c.label && c.label.length > 1 && c.label[c.label.length-1] === ':') {\n                c.label = c.label.slice(0, -1);\n              }\n            } );\n          });\n          cb(result);\n          retVal = true;\n        } else {\n          // let mock = '[{\"metadata\":{\"systemName\":\"Output: SFT Mapping - FTL31 Rev: 6\",\"updateDate\":\"2025-03-01T04:58:26Z\",\"changeDate\":\"2025-03-01T04:58:26Z\",\"id\":10232114,\"latestRevision\":true,\"revision\":6},\"label\":\"Liquiphant FTL31\",\"orderCode\":\"FTL31-CA4M2AAVAJ\",\"rows\":[{\"id\":\"df00b8c4-4989-48ee-a89d-ffdc7782c48e\",\"sorting\":5,\"infotextId\":\"UNI_01001\",\"index\":5,\"label\":\"Gerät ist nicht reparierbar.\",\"drawingGroup\":{\"key\":\"info\",\"label\":\"Info\"},\"configuration\":[],\"internal\":false,\"installationManuals\":[],\"compatibilityInformation\":[],\"infotexts\":[],\"serviceSegmentation\":1,\"recommendation\":false,\"salesTexts\":[],\"quoteTexts\":[],\"tags\":[],\"orderable\":false},{\"id\":\"b3809e2c-bd64-44d1-aeaf-6c0142b6485c\",\"sorting\":20,\"orderCode\":\"52006263\",\"index\":0,\"label\":\"M12-Buchse, Kabelseite\",\"drawingGroup\":{\"key\":\"nogroup\",\"label\":\"Weitere Teile\"},\"configuration\":[],\"internal\":false,\"installationManuals\":[],\"compatibilityInformation\":[{\"key\":\"SD02586F\",\"url\":\"https://portal.endress.com/sap/bc/bsp/euh/dla/extern/detail.do?docu_set=SD02586F&language=de&xObject=X\"}],\"infotexts\":[],\"category\":{\"code\":\"A\",\"name\":\"Zubehör\"},\"serviceSegmentation\":1,\"recommendation\":false,\"salesTexts\":[],\"quoteTexts\":[\"M12-Steckerbuchse, Kabelseite.Selbstkonfektionierbarer Anschluss. Verwendung: FMB50/FMB51/FMB52/FMB53, FMB70, FTL31/FTL33, FTW23, FTW33,PMP11, PMP21, PMP51, PTC31B, PTP31B, QMW43.\"],\"tags\":[],\"materialNumber\":\"52006263\",\"orderable\":true},{\"id\":\"1b7c8b9a-4833-43d0-b213-1fb4a21cf6ff\",\"sorting\":30,\"orderCode\":\"52010285\",\"index\":1,\"label\":\"M12-Buchse, 100deg,5m Kabel\",\"drawingGroup\":{\"key\":\"nogroup\",\"label\":\"Weitere Teile\"},\"configuration\":[],\"internal\":false,\"installationManuals\":[],\"compatibilityInformation\":[{\"key\":\"SD02586F\",\"url\":\"https://portal.endress.com/sap/bc/bsp/euh/dla/extern/detail.do?docu_set=SD02586F&language=de&xObject=X\"}],\"infotexts\":[],\"category\":{\"code\":\"A\",\"name\":\"Zubehör\"},\"serviceSegmentation\":1,\"recommendation\":false,\"salesTexts\":[],\"quoteTexts\":[\"M12-Steckerbuchse, Kabelseite. 5m Kabel PVC,Cu Sn/Ni Schraubverschluss. Verwendung: FMB50, FMB51, FMB52, FMB53, FMR43, FTL31, FTL33, FTL41, FTL43, FTL51B, FTL62, FTL63, FTL64, FTW23, FTW33, PMC11, PMC21, PMC51, PMP11, PMP21, PMP23, PMP43, PMP51, PMP55, PTC31B, PTP31B, PTP33B, QMW43, QWX43.\"],\"tags\":[],\"materialNumber\":\"52010285\",\"orderable\":true},{\"id\":\"40a8b684-539f-463d-a80f-4dd43f636ce9\",\"sorting\":31,\"orderCode\":\"52018763\",\"index\":2,\"label\":\"Kabel M12-Steck. auf 90o M12-Buchse,LED\",\"drawingGroup\":{\"key\":\"nogroup\",\"label\":\"Weitere Teile\"},\"configuration\":[],\"internal\":false,\"installationManuals\":[],\"compatibilityInformation\":[],\"infotexts\":[],\"category\":{\"code\":\"A\",\"name\":\"Zubehör\"},\"serviceSegmentation\":1,\"recommendation\":false,\"salesTexts\":[],\"quoteTexts\":[\"M12x1 Steckerbuchse 90o, 4-pin, integrierte LED. 5m Kabel, PVC, 316L Schraubverschluss. Hygieneapplikationen, IP69. Verwendung: FTL31/OFTL31, FTL33/OFTL33, FTW23/OFTW23, FTW33/OFTW33, FTI26/OFTI26, QMW43.\"],\"tags\":[],\"materialNumber\":\"52018763\",\"orderable\":true},{\"id\":\"e0b1352e-a91e-4b3f-b268-73aae8115ee3\",\"sorting\":40,\"orderCode\":\"52010156\",\"index\":3,\"label\":\"Schlüssel, 6kt Rohrsteck SW32\",\"drawingGroup\":{\"key\":\"nogroup\",\"label\":\"Weitere Teile\"},\"configuration\":[],\"internal\":false,\"installationManuals\":[],\"compatibilityInformation\":[],\"infotexts\":[],\"category\":{\"code\":\"A\",\"name\":\"Zubehör\"},\"serviceSegmentation\":1,\"recommendation\":false,\"salesTexts\":[],\"quoteTexts\":[\"Verwendung: FTL20/FTL20H, FTL31/FTL33, FTW23/FTW33, QMW43.\"],\"tags\":[],\"materialNumber\":\"52010156\",\"orderable\":true},{\"id\":\"c0e8ed3f-51c6-440e-b752-c38e38112ce3\",\"sorting\":45,\"orderCode\":\"71267011\",\"index\":4,\"label\":\"Testmagnet\",\"drawingGroup\":{\"key\":\"nogroup\",\"label\":\"Weitere Teile\"},\"configuration\":[],\"internal\":false,\"installationManuals\":[],\"compatibilityInformation\":[],\"infotexts\":[],\"category\":{\"code\":\"A\",\"name\":\"Zubehör\"},\"serviceSegmentation\":1,\"recommendation\":false,\"salesTexts\":[],\"quoteTexts\":[\"Verwendung: FTL20/FTL20H, FTL31/FTL33, FTL50/FTL50H/FTL51/FTL51H, FTW23, FTW33.\"],\"tags\":[],\"materialNumber\":\"71267011\",\"orderable\":true,\"productStatus\":{\"materialNumber\":\"71267011\",\"salesReleasePlannedDate\":\"2014-10-01\",\"status\":\"AVAILABLE\"}},{\"id\":\"0dc166b2-bd1a-448e-8222-263ade349bf9\",\"sorting\":499,\"infotextId\":\"UNI_01077\",\"index\":6,\"label\":\"Einschweißadapter und zugehörige Dichtungen\",\"drawingGroup\":{\"key\":\"info\",\"label\":\"Info\"},\"configuration\":[],\"internal\":false,\"installationManuals\":[],\"compatibilityInformation\":[],\"infotexts\":[],\"serviceSegmentation\":1,\"recommendation\":false,\"salesTexts\":[],\"quoteTexts\":[],\"tags\":[],\"orderable\":false}],\"documents\":[],\"productRoot\":\"FTL31\",\"materialNumber\":\"71235779\",\"status\":{\"materialNumber\":\"71235779\",\"repairCode\":\"A\",\"maintenanceAdvices\":[],\"status\":\"AVAILABLE\"},\"configuration\":[{\"label\":\"Zulassung:\",\"options\":[{\"value\":\"CA\",\"label\":\"CSA C/US General Purpose\"}],\"feature\":\"010\"},{\"label\":\"Energieversorgung; Ausgang:\",\"options\":[{\"value\":\"4\",\"label\":\"10-30VDC; 3-Leiter PNP\"}],\"feature\":\"020\"},{\"label\":\"Elektrischer Anschluss:\",\"options\":[{\"value\":\"M\",\"label\":\"Stecker M12, IP65/67 NEMA Type 4X Encl.\"}],\"feature\":\"040\"},{\"label\":\"Sensordesign:\",\"options\":[{\"value\":\"2\",\"label\":\"Max. Prozesstemperatur 100oC/212oF\"}],\"feature\":\"050\"},{\"label\":\"Sensortyp:\",\"options\":[{\"value\":\"AA\",\"label\":\"Kompaktversion 316L Ra<3,2um/126uin\"}],\"feature\":\"060\"},{\"label\":\"Prozessanschluss:\",\"options\":[{\"value\":\"VAJ\",\"label\":\"Gewinde ASME MNPT1/2, 316L\"}],\"feature\":\"110\"}]}]';\n          // result = JSON.parse(mock);\n          // window.setTimeout(cb(result));\n        }\n      };\n      const failHandler: (response: JQuery.jqXHR) => void = (_response: JQuery.jqXHR) => {\n        // console.log(\"GET FAIL\");\n        // let mock = '[{\"metadata\":{\"systemName\":\"Output: SFT Mapping - FTL31 Rev: 6\",\"updateDate\":\"2025-03-01T04:58:26Z\",\"changeDate\":\"2025-03-01T04:58:26Z\",\"id\":10232114,\"latestRevision\":true,\"revision\":6},\"label\":\"Liquiphant FTL31\",\"orderCode\":\"FTL31-CA4M2AAVAJ\",\"rows\":[{\"id\":\"df00b8c4-4989-48ee-a89d-ffdc7782c48e\",\"sorting\":5,\"infotextId\":\"UNI_01001\",\"index\":5,\"label\":\"Gerät ist nicht reparierbar.\",\"drawingGroup\":{\"key\":\"info\",\"label\":\"Info\"},\"configuration\":[],\"internal\":false,\"installationManuals\":[],\"compatibilityInformation\":[],\"infotexts\":[],\"serviceSegmentation\":1,\"recommendation\":false,\"salesTexts\":[],\"quoteTexts\":[],\"tags\":[],\"orderable\":false},{\"id\":\"b3809e2c-bd64-44d1-aeaf-6c0142b6485c\",\"sorting\":20,\"orderCode\":\"52006263\",\"index\":0,\"label\":\"M12-Buchse, Kabelseite\",\"drawingGroup\":{\"key\":\"nogroup\",\"label\":\"Weitere Teile\"},\"configuration\":[],\"internal\":false,\"installationManuals\":[],\"compatibilityInformation\":[{\"key\":\"SD02586F\",\"url\":\"https://portal.endress.com/sap/bc/bsp/euh/dla/extern/detail.do?docu_set=SD02586F&language=de&xObject=X\"}],\"infotexts\":[],\"category\":{\"code\":\"A\",\"name\":\"Zubehör\"},\"serviceSegmentation\":1,\"recommendation\":false,\"salesTexts\":[],\"quoteTexts\":[\"M12-Steckerbuchse, Kabelseite.Selbstkonfektionierbarer Anschluss. Verwendung: FMB50/FMB51/FMB52/FMB53, FMB70, FTL31/FTL33, FTW23, FTW33,PMP11, PMP21, PMP51, PTC31B, PTP31B, QMW43.\"],\"tags\":[],\"materialNumber\":\"52006263\",\"orderable\":true},{\"id\":\"1b7c8b9a-4833-43d0-b213-1fb4a21cf6ff\",\"sorting\":30,\"orderCode\":\"52010285\",\"index\":1,\"label\":\"M12-Buchse, 100deg,5m Kabel\",\"drawingGroup\":{\"key\":\"nogroup\",\"label\":\"Weitere Teile\"},\"configuration\":[],\"internal\":false,\"installationManuals\":[],\"compatibilityInformation\":[{\"key\":\"SD02586F\",\"url\":\"https://portal.endress.com/sap/bc/bsp/euh/dla/extern/detail.do?docu_set=SD02586F&language=de&xObject=X\"}],\"infotexts\":[],\"category\":{\"code\":\"A\",\"name\":\"Zubehör\"},\"serviceSegmentation\":1,\"recommendation\":false,\"salesTexts\":[],\"quoteTexts\":[\"M12-Steckerbuchse, Kabelseite. 5m Kabel PVC,Cu Sn/Ni Schraubverschluss. Verwendung: FMB50, FMB51, FMB52, FMB53, FMR43, FTL31, FTL33, FTL41, FTL43, FTL51B, FTL62, FTL63, FTL64, FTW23, FTW33, PMC11, PMC21, PMC51, PMP11, PMP21, PMP23, PMP43, PMP51, PMP55, PTC31B, PTP31B, PTP33B, QMW43, QWX43.\"],\"tags\":[],\"materialNumber\":\"52010285\",\"orderable\":true},{\"id\":\"40a8b684-539f-463d-a80f-4dd43f636ce9\",\"sorting\":31,\"orderCode\":\"52018763\",\"index\":2,\"label\":\"Kabel M12-Steck. auf 90o M12-Buchse,LED\",\"drawingGroup\":{\"key\":\"nogroup\",\"label\":\"Weitere Teile\"},\"configuration\":[],\"internal\":false,\"installationManuals\":[],\"compatibilityInformation\":[],\"infotexts\":[],\"category\":{\"code\":\"A\",\"name\":\"Zubehör\"},\"serviceSegmentation\":1,\"recommendation\":false,\"salesTexts\":[],\"quoteTexts\":[\"M12x1 Steckerbuchse 90o, 4-pin, integrierte LED. 5m Kabel, PVC, 316L Schraubverschluss. Hygieneapplikationen, IP69. Verwendung: FTL31/OFTL31, FTL33/OFTL33, FTW23/OFTW23, FTW33/OFTW33, FTI26/OFTI26, QMW43.\"],\"tags\":[],\"materialNumber\":\"52018763\",\"orderable\":true},{\"id\":\"e0b1352e-a91e-4b3f-b268-73aae8115ee3\",\"sorting\":40,\"orderCode\":\"52010156\",\"index\":3,\"label\":\"Schlüssel, 6kt Rohrsteck SW32\",\"drawingGroup\":{\"key\":\"nogroup\",\"label\":\"Weitere Teile\"},\"configuration\":[],\"internal\":false,\"installationManuals\":[],\"compatibilityInformation\":[],\"infotexts\":[],\"category\":{\"code\":\"A\",\"name\":\"Zubehör\"},\"serviceSegmentation\":1,\"recommendation\":false,\"salesTexts\":[],\"quoteTexts\":[\"Verwendung: FTL20/FTL20H, FTL31/FTL33, FTW23/FTW33, QMW43.\"],\"tags\":[],\"materialNumber\":\"52010156\",\"orderable\":true},{\"id\":\"c0e8ed3f-51c6-440e-b752-c38e38112ce3\",\"sorting\":45,\"orderCode\":\"71267011\",\"index\":4,\"label\":\"Testmagnet\",\"drawingGroup\":{\"key\":\"nogroup\",\"label\":\"Weitere Teile\"},\"configuration\":[],\"internal\":false,\"installationManuals\":[],\"compatibilityInformation\":[],\"infotexts\":[],\"category\":{\"code\":\"A\",\"name\":\"Zubehör\"},\"serviceSegmentation\":1,\"recommendation\":false,\"salesTexts\":[],\"quoteTexts\":[\"Verwendung: FTL20/FTL20H, FTL31/FTL33, FTL50/FTL50H/FTL51/FTL51H, FTW23, FTW33.\"],\"tags\":[],\"materialNumber\":\"71267011\",\"orderable\":true,\"productStatus\":{\"materialNumber\":\"71267011\",\"salesReleasePlannedDate\":\"2014-10-01\",\"status\":\"AVAILABLE\"}},{\"id\":\"0dc166b2-bd1a-448e-8222-263ade349bf9\",\"sorting\":499,\"infotextId\":\"UNI_01077\",\"index\":6,\"label\":\"Einschweißadapter und zugehörige Dichtungen\",\"drawingGroup\":{\"key\":\"info\",\"label\":\"Info\"},\"configuration\":[],\"internal\":false,\"installationManuals\":[],\"compatibilityInformation\":[],\"infotexts\":[],\"serviceSegmentation\":1,\"recommendation\":false,\"salesTexts\":[],\"quoteTexts\":[],\"tags\":[],\"orderable\":false}],\"documents\":[],\"productRoot\":\"FTL31\",\"materialNumber\":\"71235779\",\"status\":{\"materialNumber\":\"71235779\",\"repairCode\":\"A\",\"maintenanceAdvices\":[],\"status\":\"AVAILABLE\"},\"configuration\":[{\"label\":\"Zulassung:\",\"options\":[{\"value\":\"CA\",\"label\":\"CSA C/US General Purpose\"}],\"feature\":\"010\"},{\"label\":\"Energieversorgung; Ausgang:\",\"options\":[{\"value\":\"4\",\"label\":\"10-30VDC; 3-Leiter PNP\"}],\"feature\":\"020\"},{\"label\":\"Elektrischer Anschluss:\",\"options\":[{\"value\":\"M\",\"label\":\"Stecker M12, IP65/67 NEMA Type 4X Encl.\"}],\"feature\":\"040\"},{\"label\":\"Sensordesign:\",\"options\":[{\"value\":\"2\",\"label\":\"Max. Prozesstemperatur 100oC/212oF\"}],\"feature\":\"050\"},{\"label\":\"Sensortyp:\",\"options\":[{\"value\":\"AA\",\"label\":\"Kompaktversion 316L Ra<3,2um/126uin\"}],\"feature\":\"060\"},{\"label\":\"Prozessanschluss:\",\"options\":[{\"value\":\"VAJ\",\"label\":\"Gewinde ASME MNPT1/2, 316L\"}],\"feature\":\"110\"}]}]';\n        // let result = JSON.parse(mock);\n        // window.setTimeout(cb(result));\n        console.log('webservice failed', _response);\n      };\n      let url = eh.URLHelper.buildUrl(this.baseUrl+codes.join('/'), eh.URLHelper.buildQueryString(this.staticQueryParams));\n      const settings: JQuery.AjaxSettings = {\n        'url': url,\n        'dataType': 'json',\n        'data': {}\n      };\n      if (this.staticHeaders) {\n        settings.headers = this.staticHeaders;\n      }\n      $.ajax(settings).done(successHandler).fail(failHandler);\n      return retVal;\n    }\n  }\n\n  type ProductInStockInfo = {\n    quantity: Number;\n    orderCodeIdent: string;\n    orderCodeExt: string;\n    materialNumber: string;\n    productRoot: string;\n    scMaterialNumber: string;\n    variantInfo?: VariantDetailInfo\n  }\n\n  type VariantDetailInfo = {\n    orderCode: string;\n    materialNumber: string;\n    productRoot: string;\n    configuration: [\n      {\n        label: string,\n        feature: string,\n        options: [\n          {\n            value: string,\n            label: string\n          }\n        ]\n      }\n    ];\n  }\n\n  type SftConfiguration = {\n    'endpointPath': {\n      'orderCodeInfo': string,\n    },\n    'serviceUrl': string\n  };\n\n}"]}