{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./Typescript/Shared/Trbo/TrboRequestBuilder.js","webpack:///./Typescript/Shared/Trbo/TrboResponseMapper.ts","webpack:///./Typescript/Shared/ProductHelper.ts","webpack:///./Typescript/Shared/Slider.ts","webpack:///./Typescript/Produktdetails/productdetail.ts","webpack:///./Typescript/Produktdetails/productprice.ts","webpack:///./Typescript/Produktdetails/TabsRenderer.ts","webpack:///./Typescript/Produktdetails/ProductInfoRenderer.ts","webpack:///./Typescript/Produktdetails/SliderRenderer.ts","webpack:///./Typescript/Produktdetails/CombinationProductsRenderer.ts","webpack:///./Typescript/Produktdetails/Tracking/produktdetailtracking.ts","webpack:///./Typescript/swiper/swiperconfig.ts","webpack:///./Typescript/Shared/PriceHelper.ts","webpack:///./Typescript/Tracking/GoogleTracking.ts","webpack:///./Typescript/Produktdetails/ProductGoogleTracking.ts"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","14","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","buildTrboRequestUrl","slot","productId","requestUrl","JSON","stringify","parseGlobalData","parseSessionData","parseProductData","parseDataLayerData","parseSegments","Cookies","console","log","segments","_trbo","udp","segmentData","st","encodeURIComponent","location","href","pt","Math","floor","Date","getTime","sh","u","get_user_id","ts","get_sale_count","ust","get_user_start_time","sdt","get_session_duration_total","sc","get_session_count","sid","get_session_id","get_page_type_id","cb","get_current_basket","bw","bh","cic","cic2","get_cic2","ref","session_data","getSessions","localStorage","sst","parse","_trbo_ud","session","createTime","pvc","sessionSummary","pageViewCount","sd","sessionDuration","passt_sessions","sessions","keys","sessionkey","product_data","now","app","opts","requestDataTransformer","getProducts","data_layer","_local_storage_data_layer","getUserSummary","externalData","data_layer_key","toString","replace","user","userId","sessionId","num","voucher","userSummary","saleCount","userCreateTime","sessionDurationTotal","sessionCount","getChannelData","showBezugsartOverlay","trboProduct","custom15","parseFloat","price","custom7","custom11","mapTrboResponseToProduktkarussellModel","trboResponse","response","tracking","campaignId","campaign_id","campaignName","campaign_name","module_id","moduleName","module_name","userType","user_type","tr","karussellItems","authorstring","brand","imageUrl","image_url","isAnkuendigung","custom3","isEbook","isNew","custom2","isStandardwerk","isTopTitel","custom1","toLocaleString","style","currency","pricePrefix","custom6","productDetailUrl","deeplink_orig","parseInt","article","title","label","warenkorbAnzeigen","isBeckOnline","custom10","kupOrderNo","custom12","dateOfPublicationDescription","lieferstatus","custom14","lieferstatusId","auflage","custom4","releaseYear","custom5","medium","publisher","error","availabilityStatusId","Promise","resolve","reject","storedAvailabilityStatusList","sessionStorage","getItem","filter","x","id","text","$","ajax","method","dataType","url","success","availabilityStatusList","setItem","drmId","drmMapping","drmMappingItem","DRmid","AnzeigeText","systemanforderungenLink","storedOrderableAvailabilityStatusList","some","orderableAvailabilityStatusList","includes","deliverytypeId","priceinfo","tocId","breadcrumb","width","height","imageSize","product","DeliveryTypeID","Bruttopreis","PreisvariantenMerkmal","Urheberzeile","Verlag","boClickoutValues","nullOrEmpty","element","CreateSliderContent","products","container","sliderPrototype","sliderId","trbotracking","sliderPrototypes","clone","productItem","find","labelWrapper","newLabel","html","append","topLabel","standardwerkLabel","ankuendigungLabel","ebookLabel","addClass","attr","remove","addToCartButton","ProductHelper","getBoClickoutTrackingValues","clickoutTrackingValues","trackingValues","objectCode","removeClass","trim","holdingPeriod","conversionPeriod","loginPageUrl","getAvailabilityInfoText","getEditionText","addContainerViewTracking","produktPrice","ProduktPrice","tabsRenderer","TabsRenderer","productInfoRenderer","ProductInfoRenderer","slider","SliderRenderer","combinationProductsRenderer","CombinationProductsRenderer","RenderRelatedProducts","getGesamtwerkTab","getAutorenInfoTab","getRezensionenTab","getCombinationProducts","getProductFamily","getTrboProducts","getTrboLastSeenProducts","productGoogleTracking","hide","on","$this","this","$content","linkText","document","documentElement","body","animate","scrollTop","offset","top","click","e","ShowPriceDetailsMobileClicked","currentTarget","print","preventDefault","hasClass","stopPropagation","change","UpdateDisplayedPriceDetailsMobile","val","engagementId","specialConditions","at","pdfTracking","Number","testAboTracking","recommendationTracking","service","socialShareButtonTracking","recensionNavClick","showPricedetailsDiv","priceId","show","toggleClass","selectedValue","currentProductId","isPartOfSeries","isHeadOfSeries","seriesId","kopfproduktId","apiUrl","gesamtwerk","createGesamtwerkTabContent","autorenInfo","createAutorenInfoTabContent","rezensionen","createRezensionenTabContent","tab","kopfprodukt","protKopfprodukt","displayName","gesamtwerkTitel","titel","protTitel","showTabIfNotEmpty","model","heading","autorList","autorInfo","listElement","profileLink","preText","preTextTitle","next","firstname","firstName","prefix","birthname","birthName","postText","rezension","setFocusAndShowTabs","first","switcherClass","hasNoContent","predecessorIds","descandantId","relatedProucts","createRelatedProductsHtml","fillDescendantProductBox","descendantProduct","relatedProducts","descendantLink","BuildRelatedProductClone","predecessorLinks","forEach","link","index","relatedProduct","descendantPrototype","nachauflage_container","getImagePath","hasProduktabbildung","imagePath","split","authorList","titleMain","edition","publicationYear","seoOptimizedUrlPart","productFamilyIds","initSwiperLarge","getTopProducts","update","setTimeout","tracking_eecPromotionview","undefined","__ucCmp","isInitialized","getConsentDetails","details","trboAllowed","services","consent","given","gtmAllowed","encodeURI","trboProducts","trboslider","headIds","childIds","queryString","createCombinationProductsContent","combinationProducts","combinationProductsPrototypes","headProducts","headProductsContainer","head","childProducts","childProductsContainer","child","attachement_type","dataLayer","event","eventCategory","eventAction","eventLabel","eventValue","ecCustomProperties","Target","rqtype","fixedPriceValue","toFixed","setSlideGroupBig","setSlideGroupSmall","karussellElementsLarge","karussellElementsSmall","swiperElements","carouselbig","carouselsmall","lazyloadKarussell","karussellTop","karussell","getBoundingClientRect","innerHeight","pageYOffset","classList","add","initSwiperSmall","configureSwiperSlider","autoplay","effect","elements","Swiper","navigation","nextEl","prevEl","loop","delay","autoplayDisableOnInteraction","elem","swiper","slidesPerView","spaceBetween","slidesPerGroup","loopFillGroupWithBlank","pagination","el","clickable","observer","observeParents","breakpoints","1200","1024","768","640","320","resize","params","render","frequency","windowWidth","addEventListener","k","isCentPrice","windowHeight","trackGooglePromotionEvent_view","eventName","ecommerce","promoView","promotions","icampv","trackGooglePromotionEvent_click","promoClick","icampc","trboPromotionViewTracking","each","IsVisibleElement","usertype","_trboq","tracker","trackExternalView","top_of_element","bottom_of_element","outerHeight","top_of_screen","loginTracking","pageType","loggedInResult","pushTrboId","eId","external_user_id","trackIdLayerComplete","hId","hMail","hKid","externalIdHash","emailHash","kupCustomerNumberHash","trackIdLayerReduced","trackingParam","action","searchQuery","productsGoogleTrackingContainer","formatPrice2Digits","category","displayFormat","variant","detail","dimension8"],"mappings":"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","file":"produktdetail.d099b7153f232301def3.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t14: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([280,0]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","\r\n\r\nexport const buildTrboRequestUrl = (slot, productId) => {\r\n let requestUrl = 'https://api-v4.trbo.com/s2s.php';\r\n\r\n requestUrl +=\r\n '?g=' + JSON.stringify(parseGlobalData());\r\n requestUrl +=\r\n '&s=' + JSON.stringify(parseSessionData());\r\n requestUrl +=\r\n '&p=' + JSON.stringify(parseProductData(productId));\r\n requestUrl +=\r\n '&dl=' +\r\n JSON.stringify(parseDataLayerData(slot));\r\n requestUrl +=\r\n '&seg=' +\r\n JSON.stringify(parseSegments());\r\n\r\n if (Cookies.get(\"trbodebug\")) {\r\n console.log(requestUrl);\r\n }\r\n return requestUrl;\r\n}\r\n\r\nconst parseSegments = function() {\r\n var segments = {};\r\n if (typeof window !== 'undefined' && window && window._trbo) {\r\n segments = window._trbo.udp.data.segmentData;\r\n }\r\n\r\n return segments;\r\n}\r\n\r\nconst parseGlobalData = function() {\r\n var global_data = {\r\n st: 0,\r\n p: encodeURIComponent(window.location.href),\r\n pt: encodeURIComponent(window.location.href), // current URL with URL parameters\r\n t: Math.floor((new Date()).getTime() / 1000),\r\n sh: 13017, // shop_id from trbo interface : TODO \r\n u: get_user_id(), // trbo user_id\r\n ts: get_sale_count(), // sale count number of sales per User\r\n ust: get_user_start_time(), // user start time\r\n sdt: get_session_duration_total(), // session duration total of all sessions in seconds\r\n sc: get_session_count(), // session count, number of total sessions\r\n sid: get_session_id(),\r\n pt: get_page_type_id(),\r\n cb: get_current_basket(),\r\n bw: 1440, // browser / viewport with\r\n bh: 768, // browser / viewport height\r\n cic: [], // click in channel - legacy\r\n cic2: get_cic2(), // click in channel v2\r\n ref: \"\", // page referrer\r\n };\r\n\r\n return global_data;\r\n};\r\n\r\nconst parseSessionData = function() {\r\n var session_data = [];\r\n // if window._trbo is available :\r\n if (typeof window !== 'undefined' && window && window._trbo) {\r\n session_data = window._trbo.udp.getSessions().slice(0,5);\r\n } else if (typeof localStorage !== 'undefined') {\r\n // else use local storage\r\n session_data.push({\r\n sst: JSON.parse(localStorage._trbo_ud).session.createTime,\r\n pvc: JSON.parse(localStorage._trbo_ud).session.sessionSummary.pageViewCount,\r\n sd: JSON.parse(localStorage._trbo_ud).session.sessionSummary.sessionDuration\r\n });\r\n var passt_sessions = JSON.parse(localStorage._trbo_ud).sessions;\r\n if (Object.keys(passt_sessions).length > 0) {\r\n for (var sessionkey in passt_sessions) {\r\n if (session_data.length >= 5) continue;\r\n session_data.push({\r\n sst: passt_sessions[sessionkey].createTime,\r\n pvc: passt_sessions[sessionkey].sessionSummary.pageViewCount,\r\n sd: passt_sessions[sessionkey].sessionSummary.sessionDuration \r\n });\r\n }\r\n }\r\n }\r\n\r\n return session_data;\r\n};\r\n\r\nconst parseProductData = function(productId) {\r\n var product_data = {};\r\n\r\n if (productId) {\r\n product_data = {\r\n [productId]: Date.now()\r\n };\r\n\r\n return product_data;\r\n }\r\n\r\n \r\n // if window._trbo is available :\r\n if (typeof window !== 'undefined' && window && window._trbo) {\r\n product_data = window._trbo.app.opts.requestDataTransformer.getProducts()\r\n } else if (typeof localStorage !== 'undefined') {\r\n }\r\n\r\n return product_data;\r\n};\r\n\r\nconst parseDataLayerData = function(slot) {\r\n var data_layer = {};\r\n \r\n if (typeof window !== 'undefined' && window && window._trbo) {\r\n var _local_storage_data_layer = _trbo.udp.getUserSummary().externalData;\r\n if (_local_storage_data_layer && Object.keys(_local_storage_data_layer).length > 0) {\r\n for (var data_layer_key in _local_storage_data_layer) {\r\n if (_local_storage_data_layer[data_layer_key] !== 'n/a' && \r\n _local_storage_data_layer[data_layer_key] !== '' && \r\n data_layer_key !== 'external_user_id') {\r\n if (typeof _local_storage_data_layer[data_layer_key] === 'object' && \r\n _local_storage_data_layer[data_layer_key] !== null) {\r\n data_layer[data_layer_key] = _local_storage_data_layer[data_layer_key]\r\n }\r\n else {\r\n data_layer[data_layer_key] = _local_storage_data_layer[data_layer_key].toString().replace(\"&\", \"%26\");\r\n }\r\n \r\n }\r\n }\r\n }\r\n }\r\n \r\n if (slot) {\r\n data_layer[\"slot\"] = slot;\r\n }\r\n\r\n return data_layer;\r\n};\r\n\r\n/**\r\n * unique trbo user id\r\n */\r\nconst get_user_id = function() {\r\n return JSON.parse(localStorage._trbo_ud).user.userId;;\r\n};\r\n\r\n/**\r\n * current session id of user\r\n */\r\nconst get_session_id = function() {\r\n return JSON.parse(localStorage._trbo_ud).session.sessionId;\r\n};\r\n\r\n/**\r\n * id of current page type\r\n */\r\nconst get_page_type_id = function() {\r\n var page_type_mapping = {\r\n 'detail': 1,\r\n 'search': 2,\r\n 'basket': 3,\r\n 'home': 4,\r\n 'other': 5,\r\n 'checkout': 6,\r\n 'static': 7,\r\n 'category': 8,\r\n 'unknown': 9,\r\n 'confirmation': 10,\r\n 'account': 12\r\n };\r\n var page_type_id = page_type_mapping.detail;\r\n // TODO return correct page type\r\n\r\n return page_type_id;\r\n};\r\n\r\n/**\r\n * value, number and items of current basket\r\n */\r\nconst get_current_basket = function() {\r\n var current_basket_data = {\r\n value: 0, // absolut value of current basket\r\n num: 0, // number of products within current basket\r\n voucher: 0, // is voucher within basket : 0 = no : 1 = yes\r\n p: [] // array of product_ids within current basket \r\n };\r\n // TODO fill data\r\n return current_basket_data;\r\n};\r\n\r\n\r\n/**\r\n * total number of sale conversions\r\n */\r\nconst get_sale_count = function() {\r\n return JSON.parse(localStorage._trbo_ud).user.userSummary.saleCount;\r\n};\r\n\r\n/**\r\n * timestamp when user was created \r\n */ \r\nconst get_user_start_time = function() {\r\n return JSON.parse(localStorage._trbo_ud).user.userSummary.userCreateTime;\r\n};\r\n\r\n/**\r\n * total session duration from all sessions in seconds\r\n */\r\nconst get_session_duration_total = function() {\r\n return JSON.parse(localStorage._trbo_ud).user.userSummary.sessionDurationTotal;\r\n};\r\n\r\n/**\r\n * get number of sessions for this user\r\n */\r\nconst get_session_count = function() {\r\n return JSON.parse(localStorage._trbo_ud).user.userSummary.sessionCount;\r\n};\r\n\r\nconst get_cic2 = function() {\r\n let cic2 = [];\r\n\r\n if (typeof window !== 'undefined' && window && window._trbo) {\r\n cic2 = window._trbo.udp.getChannelData()\r\n } \r\n\r\n return cic2;\r\n}\r\n","import { Datum, ITrboResonse } from '../../Checkout/Models/Trbo/ITrboResonse';\r\nimport { ProduktkarussellItem, ProduktkarussellModel } from '../../Produktdetails/Models/Produktkarussell';\r\n\r\nexport const mapTrboResponseToProduktkarussellModel = (trboResponse: ITrboResonse): ProduktkarussellModel => {\r\n let response = {} as ProduktkarussellModel;\r\n response.karussellItems = [] as ProduktkarussellItem[];\r\n if (trboResponse.tracking.length > 0) {\r\n response.campaignId = trboResponse.tracking[0].campaign_id;\r\n response.campaignName = trboResponse.tracking[0].campaign_name;\r\n response.moduleId = trboResponse.tracking[0].module_id;\r\n response.moduleName = trboResponse.tracking[0].module_name;\r\n response.userType = trboResponse.tracking[0].user_type;\r\n }\r\n\r\n if (trboResponse.data) {\r\n for (let i = 0; i < trboResponse.data.length; i++) {\r\n for (let tr = 0; tr < trboResponse.data[i].length; tr++) {\r\n try {\r\n const trboProduct = trboResponse.data[i][tr];\r\n response.karussellItems.push({\r\n authorstring: trboProduct.brand,\r\n imageUrl: trboProduct.image_url,\r\n isAnkuendigung: trboProduct.custom3 === 'True',\r\n isEbook: false,\r\n isNew: trboProduct.custom2 === 'True',\r\n isStandardwerk: false,\r\n isTopTitel: trboProduct.custom1 === 'True',\r\n price: parseFloat(trboProduct.price).toLocaleString('de-De', {\r\n style: 'currency',\r\n currency: 'EUR',\r\n }),\r\n pricePrefix:\r\n trboProduct.custom6 === 'True' ? 'ca. ' : trboProduct.custom7 === 'True' ? 'ab ' : '',\r\n productDetailUrl: trboProduct.deeplink_orig,\r\n productId: parseInt(trboProduct.article),\r\n showBezugsartOverlay: showBezugsartOverlay(trboProduct),\r\n title: trboProduct.label,\r\n warenkorbAnzeigen: true,\r\n isBeckOnline: trboProduct.custom10 === 'beck-online-Modul',\r\n kupOrderNo: trboProduct.custom12,\r\n dateOfPublicationDescription: '',\r\n lieferstatus: trboProduct.custom14,\r\n lieferstatusId: 0,\r\n auflage: trboProduct.custom4,\r\n releaseYear: trboProduct.custom5,\r\n medium: trboProduct.custom10,\r\n publisher: trboProduct.custom11,\r\n });\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return response;\r\n};\r\nfunction showBezugsartOverlay(trboProduct: Datum): boolean {\r\n return (\r\n trboProduct.custom15 === '5' &&\r\n parseFloat(trboProduct.price) > 0 &&\r\n trboProduct.custom7 === 'False' &&\r\n (trboProduct.custom11 === 'C.H.BECK' || trboProduct.custom11 === 'Vahlen')\r\n );\r\n}\r\n","import request = require('request');\r\nimport { DummyImageSize } from '../Shared/Models/DummyImageSizeEnum';\r\nimport { IAvailabilityStatus } from './Models/AvailabilityStatus';\r\nimport { IDRMMapping } from './Models/DRMMapping';\r\nimport { StandardLink } from '../Produktdetails/Models/StandardLink';\r\nimport { BoClickoutTracking } from '../Produktdetails/Models/BoClickoutTracking';\r\n\r\n/**\r\n * Holt den availabilityStatus zur übergebenen Id\r\n * @param availabilityStatusId\r\n */\r\nexport function getAvailabilityStatus(availabilityStatusId: number): Promise {\r\n return new Promise((resolve, reject) => {\r\n var storedAvailabilityStatusList = JSON.parse(\r\n sessionStorage.getItem('availabilityStatusList')\r\n ) as IAvailabilityStatus[];\r\n if (storedAvailabilityStatusList) {\r\n resolve(storedAvailabilityStatusList.filter(x => x.id == availabilityStatusId)[0].text);\r\n } else {\r\n $.ajax({\r\n method: 'GET',\r\n dataType: 'JSON',\r\n url: '/Umbraco/api/Settings/GetAvailabilityStatusList',\r\n success: (availabilityStatusList: IAvailabilityStatus[]) => {\r\n sessionStorage.setItem('availabilityStatusList', JSON.stringify(availabilityStatusList));\r\n resolve(availabilityStatusList.filter(x => x.id == availabilityStatusId)[0].text);\r\n },\r\n error: () => {\r\n reject();\r\n },\r\n });\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Holt die DRM-Info zur übergebenen Id\r\n * @param availabilityStatusId\r\n */\r\nexport function getDRMInfo(drmId: number): Promise {\r\n return new Promise((resolve, reject) => {\r\n var drmMapping = JSON.parse(sessionStorage.getItem('drmMapping')) as IDRMMapping[];\r\n if (drmMapping) {\r\n let drmMappingItem = drmMapping.filter(x => x.DRmid == drmId)[0];\r\n if (drmMappingItem) {\r\n resolve(drmMappingItem.AnzeigeText);\r\n }\r\n resolve(null);\r\n } else {\r\n $.ajax({\r\n method: 'GET',\r\n dataType: 'JSON',\r\n url: '/Umbraco/api/Settings/GetDRMMapping',\r\n success: (drmMapping: IDRMMapping[]) => {\r\n sessionStorage.setItem('drmMapping', JSON.stringify(drmMapping));\r\n let drmMappingItem = drmMapping.filter(x => x.DRmid == drmId)[0];\r\n if (drmMappingItem) {\r\n resolve(drmMappingItem.AnzeigeText);\r\n }\r\n resolve(null);\r\n },\r\n error: () => {\r\n reject();\r\n },\r\n });\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Holt den Link zu den Systemanforderungen (In Umbraco hinterlegt)\r\n * @param availabilityStatusId\r\n */\r\nexport function getSystemanforderungenLink(): Promise {\r\n return new Promise((resolve, reject) => {\r\n var systemanforderungenLink = JSON.parse(sessionStorage.getItem('systemanforderungenLink')) as StandardLink;\r\n if (systemanforderungenLink) {\r\n resolve(systemanforderungenLink);\r\n } else {\r\n $.ajax({\r\n method: 'GET',\r\n dataType: 'JSON',\r\n url: '/Umbraco/api/Settings/GetSystemanforderungenLink',\r\n success: (systemanforderungenLink: StandardLink) => {\r\n sessionStorage.setItem('systemanforderungenLink', JSON.stringify(systemanforderungenLink));\r\n resolve(systemanforderungenLink);\r\n },\r\n error: () => {\r\n reject();\r\n },\r\n });\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Checkt, ob die übergene availabilityStatusId lieferbar ist oder nicht\r\n * @param availabilityStatusId\r\n */\r\nexport function checkAvailabilityStatus(availabilityStatusId: number): Promise {\r\n return new Promise((resolve, reject) => {\r\n var storedOrderableAvailabilityStatusList = JSON.parse(\r\n sessionStorage.getItem('orderableAvailabilityStatusList')\r\n ) as number[];\r\n if (storedOrderableAvailabilityStatusList) {\r\n resolve(storedOrderableAvailabilityStatusList.some(x => x == availabilityStatusId));\r\n } else {\r\n $.ajax({\r\n method: 'GET',\r\n dataType: 'JSON',\r\n url: '/Umbraco/api/Settings/GetOrderableAvailabilityStatusList',\r\n success: (orderableAvailabilityStatusList: number[]) => {\r\n sessionStorage.setItem(\r\n 'orderableAvailabilityStatusList',\r\n JSON.stringify(orderableAvailabilityStatusList)\r\n );\r\n resolve(orderableAvailabilityStatusList.includes(availabilityStatusId));\r\n },\r\n error: () => {\r\n reject();\r\n },\r\n });\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Holt die AdditionalPriceInfo zu dem Deliverytype. Daten sind in Backend Pflegbar\r\n * @param availabilityStatusId\r\n */\r\nexport function getAdditionalPriceInfoByDelivertypeId(deliverytypeId: number): Promise {\r\n return new Promise((resolve, reject) => {\r\n let priceinfo = sessionStorage.getItem('priceinfo_' + deliverytypeId) as string;\r\n if (priceinfo) {\r\n resolve(priceinfo);\r\n } else {\r\n $.ajax({\r\n method: 'GET',\r\n url: '/Umbraco/api/Settings/GetAdditionalPriceInfoByDelivertypeId?deliverytypeId=' + deliverytypeId,\r\n success: (priceinfo: any) => {\r\n sessionStorage.setItem('priceinfo_' + deliverytypeId, priceinfo);\r\n resolve(priceinfo);\r\n },\r\n error: () => {\r\n reject();\r\n },\r\n });\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Holt die AdditionalPriceInfo zu dem Deliverytype. Daten sind in Backend Pflegbar\r\n * @param availabilityStatusId\r\n */\r\nexport function getBreadcrumbByTocId(tocId: number): Promise {\r\n return new Promise((resolve, reject) => {\r\n if (!tocId) {\r\n resolve('Produkt ohne Kategorie');\r\n }\r\n let breadcrumb = sessionStorage.getItem('breadcrumb_' + tocId) as string;\r\n if (breadcrumb) {\r\n resolve(breadcrumb);\r\n } else {\r\n $.ajax({\r\n method: 'GET',\r\n url: '/Umbraco/api/Settings/GetBreadcrumbByTocId?tocId=' + tocId,\r\n success: (breadcrumb: string) => {\r\n sessionStorage.setItem('breadcrumb_' + tocId, breadcrumb);\r\n resolve(breadcrumb);\r\n },\r\n error: () => {\r\n reject();\r\n },\r\n });\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Baut den Link zu einem Produktbild zusammen.\r\n * @param productId\r\n * @param width\r\n * @param height\r\n */\r\nexport function getImagePath(productId: number, width: number = -1, height: number = -1): Promise {\r\n return new Promise((resolve, reject) => {\r\n $.ajax({\r\n method: 'GET',\r\n dataType: 'JSON',\r\n url:\r\n '/Umbraco/api/ImageServerApi/GetImageUrl?productId=' +\r\n productId +\r\n '&width=' +\r\n width +\r\n '&height=' +\r\n height,\r\n success: data => {\r\n resolve(data);\r\n },\r\n error: () => {\r\n reject();\r\n },\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * gibt den Pfad des Dummybildes passend zur übergebenen Größe zurück\r\n * @param imageSize\r\n */\r\nexport function getDummyImage(imageSize: DummyImageSize): Promise {\r\n return new Promise((resolve, reject) => {\r\n $.ajax({\r\n method: 'GET',\r\n dataType: 'JSON',\r\n url: '/Umbraco/api/ImageServerApi/GetDummyImage?imageSize=' + imageSize,\r\n success: data => {\r\n resolve(data);\r\n },\r\n error: () => {\r\n reject();\r\n },\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * gilt für Factfinder-Produkte\r\n * @param product\r\n */\r\nexport function showBezugsartOverlay(product): boolean {\r\n return (\r\n product.DeliveryTypeID == '5' &&\r\n product.Bruttopreis != null &&\r\n product.PreisvariantenMerkmal == 'false' &&\r\n product.Urheberzeile != null &&\r\n (product.Verlag == 'C.H.BECK' || product.Verlag == 'Vahlen')\r\n );\r\n}\r\n\r\n/**\r\n * Lädt die beck-online Clickout werte der einzelnen Module\r\n * Wird zur Berechnung der Conversion benötigt\r\n */\r\nexport function getBoClickoutTrackingValues(): Promise {\r\n return new Promise((resolve, reject) => {\r\n var boClickoutValues = JSON.parse(sessionStorage.getItem('boClickoutValues')) as BoClickoutTracking[];\r\n if (boClickoutValues) {\r\n resolve(boClickoutValues);\r\n } else {\r\n $.ajax({\r\n method: 'GET',\r\n dataType: 'JSON',\r\n url: '/Umbraco/api/Settings/GetBoClickoutTrackingValues',\r\n success: (boClickoutValues: BoClickoutTracking[]) => {\r\n sessionStorage.setItem('boClickoutValues', JSON.stringify(boClickoutValues));\r\n resolve(boClickoutValues);\r\n },\r\n error: () => {\r\n reject();\r\n },\r\n });\r\n }\r\n });\r\n}\r\n","import { ProduktkarussellItem, ProduktkarussellModel } from '../Produktdetails/Models/Produktkarussell';\r\nimport ProductHelper = require('../Shared/ProductHelper');\r\n\r\nexport const CreateSliderContent = async (\r\n products: ProduktkarussellModel,\r\n container,\r\n sliderPrototype,\r\n sliderId,\r\n trbotracking: boolean = false\r\n): Promise => {\r\n var container = container;\r\n if (!nullOrEmpty(products) && !nullOrEmpty(products.karussellItems) && products.karussellItems.length > 0) {\r\n var sliderPrototypes = sliderPrototype.clone();\r\n for (let product of products.karussellItems) {\r\n var productItem = sliderPrototypes.find('.productItem').clone();\r\n //Labels\r\n var labelWrapper = productItem.find('.labelWrapper');\r\n if (product.isNew) {\r\n var newLabel = sliderPrototypes.find('.statusLabel.red').clone();\r\n newLabel.find('.txt').html('Neu');\r\n labelWrapper.append(newLabel);\r\n }\r\n if (product.isTopTitel) {\r\n var topLabel = sliderPrototypes.find('.statusLabel.gold').clone();\r\n topLabel.find('.txt').html('Toptitel');\r\n labelWrapper.append(topLabel);\r\n }\r\n if (product.isStandardwerk) {\r\n var standardwerkLabel = sliderPrototypes.find('.statusLabel.gold').clone();\r\n standardwerkLabel.find('.txt').html('Standardwerk');\r\n labelWrapper.append(standardwerkLabel);\r\n }\r\n if (product.isAnkuendigung) {\r\n var ankuendigungLabel = sliderPrototypes.find('.statusLabel.red').clone();\r\n ankuendigungLabel.find('.txt').html('Ankündigung');\r\n labelWrapper.append(ankuendigungLabel);\r\n }\r\n if (product.isEbook) {\r\n var ebookLabel = sliderPrototypes.find('.mediaTypeLabel.gold').clone();\r\n ebookLabel.html('eBook');\r\n productItem.find('.imgWrapper').append(ebookLabel);\r\n }\r\n if (sliderId == 'merklisteSlider') {\r\n productItem.find('.title a').addClass('merklisteTracking');\r\n }\r\n if (container[0].id == 'productTopReihen') {\r\n productItem\r\n .find('.title a')\r\n .html(product.title)\r\n .attr('href', product.productDetailUrl)\r\n .addClass('topProductTracking')\r\n .attr('data-trackingevent', 'PDP_top-products_static-reco');\r\n } else if (container[0].id == 'productTrbo' || container[0].id == 'productTrboLastSeen' || trbotracking) {\r\n productItem\r\n .find('.title a')\r\n .html(product.title)\r\n .attr('href', product.productDetailUrl)\r\n .addClass('trboClickTracking')\r\n .attr('data-campaignid', products.campaignId)\r\n .attr('data-campaignname', products.campaignName)\r\n .attr('data-moduleid', products.moduleId)\r\n .attr('data-modulename', products.moduleName)\r\n .attr('data-productid', product.productId)\r\n .attr('data-usertype', products.userType);\r\n } else {\r\n productItem\r\n .find('.title a')\r\n .html(product.title)\r\n .attr('href', product.productDetailUrl);\r\n }\r\n\r\n productItem.find('.author').html(product.authorstring);\r\n if (product.pricePrefix === 'ca. ') {\r\n productItem.find('.price .ca').append(product.pricePrefix + product.price);\r\n } else {\r\n productItem.find('.price .ca').remove();\r\n productItem.find('.price').append(product.pricePrefix + product.price);\r\n }\r\n\r\n productItem.find('.imgWrapper img').attr('src', product.imageUrl);\r\n productItem.find('.imgWrapper img').attr('alt', `Cover ${product.title}`);\r\n productItem.find('.imgWrapper').attr('href', product.productDetailUrl);\r\n if (container[0].id == 'productTopReihen') {\r\n productItem\r\n .find('.imgWrapper')\r\n .addClass('topProductTracking')\r\n .attr('data-trackingevent', 'PDP_top-products_static-reco');\r\n productItem.find('.addToCard').addClass('promotionClick');\r\n } else if (container[0].id == 'productTrbo' || container[0].id == 'productTrboLastSeen' || trbotracking) {\r\n productItem\r\n .find('.imgWrapper')\r\n .addClass('trboClickTracking')\r\n .attr('data-campaignid', products.campaignId)\r\n .attr('data-campaignname', products.campaignName)\r\n .attr('data-moduleid', products.moduleId)\r\n .attr('data-modulename', products.moduleName)\r\n .attr('data-productid', product.productId)\r\n .attr('data-usertype', products.userType);\r\n } else if (container[0].id == 'productFamilyContainer') {\r\n productItem.find('.imgWrapper').addClass('promotionClick');\r\n productItem.find('.remember').addClass('promotionClick');\r\n productItem.find('.title').addClass('promotionClick');\r\n productItem.find('.addToCard').addClass('promotionClick');\r\n }\r\n\r\n if (sliderId == 'merklisteSlider') {\r\n productItem.find('.imgWrapper').addClass('merklisteTracking');\r\n }\r\n\r\n if (product.warenkorbAnzeigen && product.isBeckOnline !== true) {\r\n let addToCartButton = productItem.find('.addToCard.shop');\r\n if (sliderId == 'merklisteSlider') {\r\n addToCartButton.addClass('merklisteTracking');\r\n }\r\n addToCartButton.attr('data-productid', product.productId);\r\n if (product.showBezugsartOverlay) {\r\n addToCartButton.addClass('ajax_checkout_bezugsart');\r\n addToCartButton.attr('data-toggle', 'modal').attr('data-target', '#modalBezugsart-01');\r\n } else {\r\n addToCartButton.addClass('ajax_checkout_add');\r\n }\r\n if (container[0].id == 'productTrbo' || container[0].id == 'productTrboLastSeen' || trbotracking) {\r\n addToCartButton\r\n .addClass('trboClickTracking')\r\n .attr('data-campaignid', products.campaignId)\r\n .attr('data-campaignname', products.campaignName)\r\n .attr('data-moduleid', products.moduleId)\r\n .attr('data-modulename', products.moduleName)\r\n .attr('data-productid', product.productId)\r\n .attr('data-usertype', products.userType);\r\n\r\n productItem\r\n .find('.remember')\r\n .addClass('trboClickTracking')\r\n .attr('data-campaignid', products.campaignId)\r\n .attr('data-campaignname', products.campaignName)\r\n .attr('data-moduleid', products.moduleId)\r\n .attr('data-modulename', products.moduleName)\r\n .attr('data-productid', product.productId)\r\n .attr('data-usertype', products.userType);\r\n }\r\n productItem.find('.addToCard.screen').addClass('hide');\r\n } else {\r\n productItem.find('.addToCard').addClass('hide');\r\n }\r\n\r\n if (product.isBeckOnline) {\r\n const clickoutTrackingValues = await ProductHelper.getBoClickoutTrackingValues();\r\n const trackingValues = clickoutTrackingValues.find(x => x.objectCode === product.kupOrderNo);\r\n\r\n const defaultHoldPeriod = 74;\r\n const defaultConversionPeriod = 0.17;\r\n\r\n productItem.find('.addToCard.screen').removeClass('hide');\r\n productItem.find('.addToCard.screen').attr('data-productid', product.productId);\r\n productItem\r\n .find('.addToCard.screen')\r\n .attr(\r\n 'href',\r\n `https://shop.beck-online.de/?crop=${product.kupOrderNo}&chk=${\r\n product.kupOrderNo\r\n }&usr=1&cid=BS&uid=`\r\n )\r\n .attr(\r\n 'data-price',\r\n product.price\r\n .replace('€', '')\r\n .replace(',', '.')\r\n .trim()\r\n )\r\n .attr('data-holdingperiod', trackingValues?.holdingPeriod ?? defaultHoldPeriod)\r\n .attr('data-conversionperiod', trackingValues?.conversionPeriod ?? defaultConversionPeriod);\r\n }\r\n\r\n productItem.find('.remember').attr('data-id', product.productId);\r\n if ($('#loggedInFlag').length) {\r\n productItem.find('.remember').addClass('addToMerkliste');\r\n } else {\r\n productItem\r\n .find('.remember')\r\n .attr(\r\n 'href',\r\n products.loginPageUrl\r\n ? products.loginPageUrl + '?merklisteId=' + product.productId\r\n : '/meine-daten/meine-daten-login/' + '?merklisteId=' + product.productId\r\n );\r\n }\r\n\r\n if (\r\n product.lieferstatusId !== 3 &&\r\n product.lieferstatusId !== 5 &&\r\n !product.lieferstatus.includes('vorbestell')\r\n ) {\r\n productItem.find('.reminder').addClass('hide');\r\n } else {\r\n productItem.find('.reminder').attr('data-id', product.productId);\r\n }\r\n\r\n getAvailabilityInfoText(product, productItem);\r\n getEditionText(product, productItem);\r\n\r\n container.append(productItem);\r\n }\r\n\r\n addContainerViewTracking(container, trbotracking, products);\r\n $('.productFamily.ajaxSpinner_Loading').addClass('hide');\r\n } else {\r\n if (container[0].id == sliderId) {\r\n var topProductsKarussel = $('slider');\r\n topProductsKarussel.addClass('hide');\r\n }\r\n }\r\n};\r\n\r\nfunction addContainerViewTracking(container: any, trbotracking: boolean, products: ProduktkarussellModel) {\r\n if (container[0].id == 'productTrbo' || container[0].id == 'productTrboLastSeen' || trbotracking) {\r\n container\r\n .addClass('trboPromotionTracking')\r\n .attr('data-campaignid', products.campaignId)\r\n .attr('data-campaignname', products.campaignName)\r\n .attr('data-moduleid', products.moduleId)\r\n .attr('data-modulename', products.moduleName)\r\n .attr('data-usertype', products.userType);\r\n } else if (container[0].id == 'productTopReihen') {\r\n container\r\n .addClass('googleTracking')\r\n .addClass('promotionTracking')\r\n .attr('data-trackingevent', 'PDP_top-products_static-reco');\r\n } else if (container[0].id == 'productFamilyContainer') {\r\n container\r\n .addClass('googleTracking')\r\n .addClass('promotionTracking')\r\n .attr('data-trackingevent', 'PDP_product-family_static-reco');\r\n }\r\n}\r\n\r\nfunction getAvailabilityInfoText(product: ProduktkarussellItem, productItem: any) {\r\n if (product.lieferstatus && product.lieferstatus.length > 0) {\r\n if (\r\n product.lieferstatusId === 3 &&\r\n product.dateOfPublicationDescription &&\r\n product.dateOfPublicationDescription.length > 0\r\n ) {\r\n productItem\r\n .find('.lieferStatus span')\r\n .html(`${product.lieferstatus} (${product.dateOfPublicationDescription})`);\r\n } else {\r\n productItem.find('.lieferStatus span').html(product.lieferstatus);\r\n if (\r\n product.lieferstatusId === 1 ||\r\n product.lieferstatusId === 4 ||\r\n product.lieferstatus === 'sofort lieferbar!'\r\n ) {\r\n productItem.find('.lieferStatus span').addClass('availabilityStatusColorGreen');\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction nullOrEmpty(element) {\r\n return element === null || element === '' || typeof element === 'undefined';\r\n}\r\nfunction getEditionText(product: ProduktkarussellItem, productItem: any) {\r\n if (product.auflage) {\r\n productItem.find('.edition span').html(product.auflage);\r\n }\r\n}\r\n","import { ProduktPrice } from './productprice';\r\nimport { TabsRenderer } from './TabsRenderer';\r\nimport { ProductInfoRenderer } from './ProductInfoRenderer';\r\nimport { SliderRenderer } from './SliderRenderer';\r\nimport { CombinationProductsRenderer } from './CombinationProductsRenderer';\r\nimport { productGoogleTracking } from './ProductGoogleTracking';\r\nimport {\r\n pdfTracking,\r\n recommendationTracking,\r\n testAboTracking,\r\n recensionNavClick,\r\n socialShareButtonTracking,\r\n} from './Tracking/produktdetailtracking';\r\nimport { checkForRecaptcha, recaptchaId } from '../Shared/userCentrics';\r\n\r\nconst trboId = 'ryxCCtrEX';\r\n\r\nconst produktPrice = new ProduktPrice();\r\nconst tabsRenderer = new TabsRenderer();\r\nconst productInfoRenderer = new ProductInfoRenderer();\r\nconst slider = new SliderRenderer();\r\nconst combinationProductsRenderer = new CombinationProductsRenderer();\r\n\r\n$(async () => {\r\n productInfoRenderer.RenderRelatedProducts();\r\n tabsRenderer.getGesamtwerkTab();\r\n tabsRenderer.getAutorenInfoTab();\r\n tabsRenderer.getRezensionenTab();\r\n combinationProductsRenderer.getCombinationProducts();\r\n slider.getProductFamily();\r\n await slider.getTrboProducts();\r\n await slider.getTrboLastSeenProducts();\r\n await productGoogleTracking();\r\n\r\n /**\r\n * Event wenn Prduktdetailstext zu lang ist\r\n */\r\n if ($('.details.description').height() < 340) {\r\n $('.show-more1 a').hide();\r\n }\r\n /**\r\n * Event wenn auf \"mehr\" button gedrückt wird\r\n */\r\n $('.show-more1 a').on('click', function() {\r\n var $this = $(this);\r\n var $content = $('.produktbeschreibung');\r\n var linkText = $this.text();\r\n\r\n if (linkText === 'Mehr anzeigen') {\r\n linkText = 'Weniger anzeigen';\r\n $content.removeClass('hide-produktbeschreibung');\r\n $content.addClass('show-produktbeschreibung');\r\n } else {\r\n linkText = 'Mehr anzeigen';\r\n $content.removeClass('show-produktbeschreibung');\r\n $content.addClass('hide-produktbeschreibung');\r\n\r\n $([document.documentElement, document.body]).animate(\r\n {\r\n scrollTop: $('.description').offset().top,\r\n },\r\n 300\r\n );\r\n }\r\n\r\n $this.text(linkText);\r\n });\r\n\r\n /**\r\n * Event wenn \"Preisdetails anzeigen\" auf Mobile geklickt wird\r\n */\r\n $('.priceDetailsMobile').click(e => {\r\n produktPrice.ShowPriceDetailsMobileClicked(e.currentTarget);\r\n });\r\n\r\n $('#print_button').click(e => {\r\n window.print();\r\n });\r\n\r\n $('body').click(e => {\r\n $('.social-menu-bubble').addClass('hidden');\r\n $('.social-menu-bubble').removeClass('active');\r\n });\r\n\r\n $('.shareButton').click(e => {\r\n e.preventDefault();\r\n if ($('.social-menu-bubble').hasClass('active')) {\r\n $('.social-menu-bubble').addClass('hidden');\r\n $('.social-menu-bubble').removeClass('active');\r\n $('.social-menu-bubble').removeClass('active');\r\n } else {\r\n $('.social-menu-bubble').removeClass('hidden');\r\n $('.social-menu-bubble').addClass('active');\r\n $('.social-menu-bubble').addClass('active');\r\n }\r\n e.stopPropagation();\r\n });\r\n\r\n /**\r\n * Event wenn der Preis im Dropdown auf Mobile geändert wird\r\n */\r\n $('#mobilePriceSelect').change(e => {\r\n produktPrice.UpdateDisplayedPriceDetailsMobile($(e.currentTarget).val());\r\n });\r\n\r\n $('#seminar_terminwahl').on('change', function() {\r\n var engagementId = $(this).val();\r\n $('.ajax_checkout_add_seminar').attr(\r\n 'href',\r\n 'https://www.beck-seminare.de/warenkorb.aspx?action=add&id=' + engagementId\r\n );\r\n var specialConditions = $(this)\r\n .find(`option[value=${engagementId}]`)\r\n .data('special-conditions');\r\n $('.specialConditions').html(specialConditions);\r\n });\r\n\r\n $('.attachmenttracking').on('click', function() {\r\n let productId = +$(this).attr('data-productid');\r\n let at = $(this).attr('data-attachementtype');\r\n pdfTracking(productId, at);\r\n });\r\n\r\n $('.probeabotracking').on('click', function() {\r\n const price = Number.parseFloat($(this).attr('data-price'));\r\n const conversionPeriod = Number.parseFloat($(this).attr('data-conversionperiod'));\r\n const holdingPeriod = Number.parseInt($(this).attr('data-holdingperiod'));\r\n let productId = +$(this).attr('data-productid');\r\n\r\n testAboTracking(productId, price, conversionPeriod, holdingPeriod);\r\n });\r\n\r\n $('.empfehlungtracking').on('click', function() {\r\n let productId = +$(this).attr('data-productid');\r\n recommendationTracking(productId);\r\n });\r\n\r\n $('.socialShareTracking').on('click', function() {\r\n const service = $(this).attr('data-social');\r\n socialShareButtonTracking(service);\r\n });\r\n\r\n $('.rezensionen-nav').click(function() {\r\n $([document.documentElement, document.body]).animate(\r\n {\r\n scrollTop: $('#infoTabs').offset().top,\r\n },\r\n 200\r\n );\r\n let productId = +$(this).attr('data-productid');\r\n recensionNavClick(productId);\r\n $('#infoTabs .rezensionenSwitcher a').click();\r\n });\r\n});\r\n","/** \r\n * Die Klasse enthält Methoden die für die Preisdarstellung auf der Produktdetailseite verwendet werden.\r\n*/\r\nexport class ProduktPrice {\r\n\r\n /**\r\n * Zeigt den passenden Beschreibungstext zu den ausgewählten Preis in der Mobile ansicht an\r\n * @param showPricedetailsDiv Das Element welches angeklickt wurde. In diesen Fall der Container des Buttons\r\n */\r\n ShowPriceDetailsMobileClicked(showPricedetailsDiv: HTMLElement): void {\r\n var priceId = $(\"#mobilePriceSelect\").val();\r\n $(\".mobilePriceDescription\").hide();\r\n\r\n if ($(showPricedetailsDiv).hasClass(\"pricesHidden\")) {\r\n $(\"div.mobilePriceDescription[data-id='\" + priceId + \"']\").show();\r\n $(showPricedetailsDiv).removeClass(\"pricesHidden\");\r\n } else {\r\n $(showPricedetailsDiv).addClass(\"pricesHidden\");\r\n }\r\n\r\n $(showPricedetailsDiv).find(\"i\").toggleClass(\"fa-angle-down fa-angle-up\");\r\n }\r\n\r\n /**\r\n * Ist der Preisdetailtext ausgeklappt und der Preis wird geändert, wird der Text aktualisiert\r\n * @param selectedValue Die Id des neu ausgewählten Preises\r\n */\r\n UpdateDisplayedPriceDetailsMobile(selectedValue: string | number | string[]) {\r\n if (!$(\"div.priceDetailsMobile\").hasClass(\"pricesHidden\")) {\r\n $(\".mobilePriceDescription\").hide();\r\n $(\"div.mobilePriceDescription[data-id='\" + selectedValue + \"']\").show();\r\n }\r\n }\r\n}","import { Gesamtwerk } from './Models/Gesamtwerk';\r\nimport { AutorenInfo } from './Models/AutorenInfo';\r\nimport { RezensionenModel } from './Models/Rezensionen';\r\nimport 'bootstrap';\r\n\r\n/**\r\n * Enthält Logiken die für das Rendern der Tabs zuständig sind\r\n */\r\nexport class TabsRenderer {\r\n currentProductId: any;\r\n\r\n constructor() {\r\n this.currentProductId = $('#currentProductId').val();\r\n }\r\n\r\n /**\r\n * Holt die Daten für das Gesamtwerk von der Api. Unterscheidet dabei, ob es ein Kopfprodukt ist oder nicht\r\n * Baut bei Success das Gesamtwerk-Tab zusammen.\r\n */\r\n getGesamtwerkTab() {\r\n var isPartOfSeries = $('#partOfSeries').val();\r\n var isHeadOfSeries = $('#headOfSeries').val();\r\n var seriesId = $('#seriesId').val();\r\n var kopfproduktId = $('#kopfproduktId').val();\r\n\r\n var apiUrl = isPartOfSeries\r\n ? '/Umbraco/api/ProduktdetailApi/GetGesamtwerkByPartOfSeriesId?id=' + seriesId\r\n : isHeadOfSeries\r\n ? '/Umbraco/api/ProduktdetailApi/GetGesamtwerkByHeadOfSeriesId?id=' + kopfproduktId\r\n : '';\r\n\r\n if (apiUrl !== '') {\r\n //die CurrentProductId braucht man, weil das aktuelle Produkt selbst nicht in der Gesamtwerk-Auflistung vorkommen soll.\r\n apiUrl += '¤tProductId=' + this.currentProductId;\r\n $.ajax({\r\n method: 'GET',\r\n dataType: 'JSON',\r\n url: apiUrl,\r\n success: data => {\r\n var gesamtwerk = data as Gesamtwerk;\r\n this.createGesamtwerkTabContent(gesamtwerk);\r\n },\r\n });\r\n }\r\n }\r\n /**\r\n * Holt die Daten für die AutorenInfo von der Api\r\n * Baut bei Success das AutorenInfo-Tab zusammen.\r\n */\r\n getAutorenInfoTab() {\r\n var apiUrl = '/Umbraco/api/ProduktdetailApi/GetAutorenInfoByProductId?id=' + this.currentProductId;\r\n $.ajax({\r\n method: 'GET',\r\n dataType: 'JSON',\r\n url: apiUrl,\r\n success: data => {\r\n var autorenInfo = data as AutorenInfo;\r\n this.createAutorenInfoTabContent(autorenInfo);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Holt die Daten für die Rezensionen von der Api\r\n * Baut bei Success das Rezensionen-Tab zusammen.\r\n */\r\n getRezensionenTab() {\r\n var apiUrl = '/Umbraco/api/ProduktdetailApi/GetRezensionen?id=' + this.currentProductId;\r\n $.ajax({\r\n method: 'GET',\r\n dataType: 'JSON',\r\n url: apiUrl,\r\n success: data => {\r\n var rezensionen = data as RezensionenModel;\r\n this.createRezensionenTabContent(rezensionen);\r\n },\r\n error: () => {\r\n $('.accordion.ajaxSpinner_Loading').addClass('hide');\r\n },\r\n });\r\n }\r\n\r\n private createGesamtwerkTabContent(gesamtwerk: Gesamtwerk) {\r\n var tab = $('#tab-gesamtwerk');\r\n if (!this.nullOrEmpty(gesamtwerk)) {\r\n //Handelt es sich bei dem aktuellen Produkt nicht um das Gesamtwerk, muss es als erstes eine Verlinkung zum Gesamtwerk geben.\r\n if (!this.nullOrEmpty(gesamtwerk.kopfprodukt)) {\r\n var protKopfprodukt = $('#ProduktdetailPrototypes #GesamtwerkPrototypes p').clone();\r\n protKopfprodukt.find('a').attr('href', gesamtwerk.kopfprodukt.href);\r\n protKopfprodukt.find('.txt').html(gesamtwerk.kopfprodukt.displayName);\r\n tab.find('.heading').html('Weitere Titel im Gesamtwerk\\n');\r\n tab.append(protKopfprodukt);\r\n }\r\n if (!this.nullOrEmpty(gesamtwerk.gesamtwerkTitel) && gesamtwerk.gesamtwerkTitel.length > 0) {\r\n //Listet die einzelnen Produkte der Reihe auf\r\n tab.find('.heading').html('Weitere Titel im Gesamtwerk\\n');\r\n for (let titel of gesamtwerk.gesamtwerkTitel) {\r\n var protTitel = $('#ProduktdetailPrototypes #GesamtwerkPrototypes p').clone();\r\n protTitel.find('a').attr('href', titel.href);\r\n protTitel.find('.txt').html(titel.displayName);\r\n tab.append(protTitel);\r\n }\r\n }\r\n }\r\n this.showTabIfNotEmpty(tab, '.gesamtwerkSwitcher');\r\n }\r\n private createAutorenInfoTabContent(model: AutorenInfo) {\r\n var tab = $('#tab-autorenInfo');\r\n if (!this.nullOrEmpty(model) && !this.nullOrEmpty(model.autorenInfo) && model.autorenInfo.length > 0) {\r\n var heading = $('#ProduktdetailPrototypes #AutorenInfoPrototypes .heading').clone();\r\n if ($('#isELearning').val() == 'True') {\r\n heading.text('Referenten');\r\n }\r\n tab.append(heading);\r\n var autorList = $('#ProduktdetailPrototypes #AutorenInfoPrototypes ul').clone();\r\n for (let autorInfo of model.autorenInfo) {\r\n var listElement = $('#ProduktdetailPrototypes #AutorenInfoPrototypes li').clone();\r\n\r\n listElement.find('a').attr('href', autorInfo.profileLink);\r\n\r\n var preText = listElement.find('span');\r\n preText.html(autorInfo.preText);\r\n\r\n var preTextTitle = preText.next().find('span');\r\n preTextTitle.html(autorInfo.preTextTitle);\r\n\r\n var firstname = preTextTitle.next();\r\n firstname.html(autorInfo.firstName);\r\n\r\n var prefix = firstname.next();\r\n prefix.html(autorInfo.prefix);\r\n\r\n var name = prefix.next();\r\n\r\n name.html(autorInfo.name);\r\n\r\n const birthname = name.next();\r\n if (autorInfo.birthName) {\r\n birthname.html(` (geb. ${autorInfo.birthName}) `);\r\n } else {\r\n birthname.html(' ');\r\n }\r\n\r\n var postText = birthname.next();\r\n postText.html(autorInfo.postText);\r\n\r\n autorList.append(listElement);\r\n }\r\n tab.append(autorList);\r\n }\r\n this.showTabIfNotEmpty(tab, '.autorenInfoSwitcher');\r\n }\r\n\r\n private createRezensionenTabContent(model: RezensionenModel) {\r\n if (model.rezensionen.length > 0) {\r\n var tab = $('#tab-Rezesionen');\r\n var heading = $('#ProduktdetailPrototypes #RezensionenPrototypes .heading').clone();\r\n tab.append(heading);\r\n if (!this.nullOrEmpty(model) && !this.nullOrEmpty(model.rezensionen) && model.rezensionen.length > 0) {\r\n for (let rezension of model.rezensionen) {\r\n var prototype = $('#ProduktdetailPrototypes #RezensionenPrototypes .rezension').clone();\r\n prototype.find('.rezensionText').html(rezension.text);\r\n tab.append(prototype);\r\n }\r\n }\r\n $('.rezensionenSwitcher').removeClass('hide');\r\n } else {\r\n $('.rezensionen-nav').addClass('hide');\r\n }\r\n //Muss hier aufgerufen werden, da es sich um das letzte Tab handelt\r\n this.setFocusAndShowTabs();\r\n }\r\n\r\n //Die Tabs dürfen erst angezeigt werden, wenn alles fertig geladen hat, sonst tauchen Tabs auf und verschwinden direkt wieder.\r\n //Muss als allerletztes aufgerufen werden\r\n private setFocusAndShowTabs() {\r\n $('#infoTabs').show();\r\n $('#infoTabs .nav-tabs li:visible')\r\n .first()\r\n .find('a')\r\n .tab('show');\r\n $('#infoTabs .tab-switcher-mobile:visible')\r\n .first()\r\n .find('a')\r\n .tab('show');\r\n $('.accordion.ajaxSpinner_Loading').addClass('hide');\r\n }\r\n\r\n /**\r\n * Wenn ein Tab leer ist wird es zusammen mit seinem switcher ausgeblendet. Der Fokus wird dannach per click() auf das nächste sichtbare Tab gelegt.\r\n * @param switcher\r\n * @param tab\r\n */\r\n private showTabIfNotEmpty(tab, switcherClass) {\r\n if (!this.hasNoContent(tab)) {\r\n $(switcherClass).removeClass('hide');\r\n tab.removeClass('hide');\r\n }\r\n }\r\n\r\n private nullOrEmpty(element) {\r\n return element === null || element === '' || typeof element === 'undefined';\r\n }\r\n\r\n /**\r\n * Überprüft ob ein Element Inhalt hat. Leerzeichen und Zeilenumbrüche werden dabei ignoriert.\r\n * @param element\r\n */\r\n private hasNoContent(element) {\r\n return !$.trim(element.html());\r\n }\r\n}\r\n","import { RelatedProducts } from './Models/RelatedProducts';\r\nimport { StandardLink } from './Models/StandardLink';\r\nimport { ShortListProduct } from '../Shared/Models/ShortListProduct';\r\nimport { getImagePath } from '../Shared/ProductHelper';\r\n\r\n/**\r\n * Enthält Logiken die für das Rendern der einzelner Produktinfos\r\n */\r\nexport class ProductInfoRenderer {\r\n /**\r\n * Gibt es Vor- bzw. Nachfolger werden diese geladen und angezeigt\r\n */\r\n RenderRelatedProducts() {\r\n var predecessorIds = null;\r\n var descandantId: any = 0;\r\n var productId = $('#productGoogleTracking').data('id');\r\n if ($('#predecessorContainer').length) {\r\n predecessorIds = $('#predecessorContainer').data('id');\r\n }\r\n if ($('#descendantContainer').length) {\r\n descandantId = $('#descendantContainer').data('id');\r\n }\r\n if (descandantId > 0 || predecessorIds) {\r\n if (descandantId > 0) {\r\n $('.nachauflage_container').removeClass('hide'); //Spinner wird angezeigt\r\n }\r\n $.ajax({\r\n method: 'GET',\r\n dataType: 'JSON',\r\n url: `/Umbraco/api/ProduktdetailApi/GetRelatedProducts?productId=${productId}&predecessors=${\r\n predecessorIds ? predecessorIds : ''\r\n }&descendant=${descandantId}`,\r\n success: data => {\r\n var relatedProucts = data as RelatedProducts;\r\n this.createRelatedProductsHtml(relatedProucts);\r\n this.fillDescendantProductBox(relatedProucts.descendantProduct);\r\n },\r\n error: () => {\r\n $('.relatedproducts.ajaxSpinner_Loading').addClass('hide');\r\n $('.nachauflage_container').addClass('hide');\r\n },\r\n });\r\n }\r\n }\r\n\r\n private createRelatedProductsHtml(relatedProducts: RelatedProducts) {\r\n $('.relatedproducts.ajaxSpinner_Loading').addClass('hide');\r\n if (relatedProducts) {\r\n if (relatedProducts.descendantLink) {\r\n this.BuildRelatedProductClone(\r\n relatedProducts.descendantLink,\r\n 'Nachauflage:',\r\n $('#descendantContainer')\r\n );\r\n }\r\n if (relatedProducts.predecessorLinks && relatedProducts.predecessorLinks.length > 0) {\r\n var BuildRelatedProductClone = this.BuildRelatedProductClone;\r\n relatedProducts.predecessorLinks.forEach(function(link, index) {\r\n BuildRelatedProductClone(link, index == 0 ? 'Vorauflage:' : '', $('#predecessorContainer'));\r\n });\r\n }\r\n }\r\n }\r\n\r\n private BuildRelatedProductClone(relatedProduct: StandardLink, preText: string, container: JQuery) {\r\n var descendantPrototype = $('#ProduktdetailPrototypes #relatedProductPrototype p').clone();\r\n descendantPrototype.find('span.preTextRelatedProduct').html(preText);\r\n descendantPrototype.find('span.txt').html(relatedProduct.displayName);\r\n descendantPrototype.find('a').attr('href', relatedProduct.href);\r\n container.append(descendantPrototype);\r\n }\r\n\r\n private async fillDescendantProductBox(product: ShortListProduct) {\r\n let nachauflage_container = $('.nachauflage_container');\r\n\r\n if (!product) {\r\n nachauflage_container.addClass('hide');\r\n return;\r\n }\r\n\r\n var imagePath = await getImagePath(product.hasProduktabbildung ? product.productId : -1, 50);\r\n if (!product.hasProduktabbildung) {\r\n imagePath = `${imagePath.split('?')[0]}?width=60&height=50&quality=80`;\r\n }\r\n\r\n nachauflage_container.find('img').attr('src', imagePath);\r\n\r\n nachauflage_container.find('.authorlist').html(product.authorList);\r\n nachauflage_container.find('.haupttitel').html(product.titleMain);\r\n if (product.edition) {\r\n if (product.publicationYear) {\r\n nachauflage_container.find('.bibData').html(`${product.edition} ${product.publicationYear}`);\r\n } else {\r\n nachauflage_container.find('.bibData').html(`${product.edition}`);\r\n }\r\n } else {\r\n nachauflage_container.find('.bibData').html(`${product.publicationYear}`);\r\n }\r\n nachauflage_container\r\n .find('.nachauflage_link')\r\n .attr('href', `/${product.seoOptimizedUrlPart}/product/${product.productId}`);\r\n nachauflage_container.find('.ajaxSpinner_Loading').addClass('hide');\r\n nachauflage_container.find('.nachauflage_box').removeClass('hide');\r\n }\r\n}\r\n","import { ProduktkarussellModel } from './Models/Produktkarussell';\r\nimport { initSwiperLarge } from '../swiper/swiperconfig';\r\nimport { CreateSliderContent } from '../Shared/Slider';\r\nimport { tracking_eecPromotionview } from '../Tracking/GoogleTracking';\r\nimport { mapTrboResponseToProduktkarussellModel } from '../Shared/Trbo/TrboResponseMapper';\r\nimport { buildTrboRequestUrl } from '../Shared/Trbo/TrboRequestBuilder';\r\n\r\ndeclare var __ucCmp: any;\r\nconst trboId = 'ryxCCtrEX';\r\nconst gtmId = 'BJ59EidsWQ';\r\n\r\nexport class SliderRenderer {\r\n /**\r\n * Holt die Produkte der Produktfamilie zu einem Produkt von der Api anhand ihrer Ids.\r\n * Die Ids werden in einem Hidden-Input zwischengespeichert\r\n */\r\n getProductFamily() {\r\n var productFamilyIds = $('#productFamilyIds').val();\r\n if (!this.nullOrEmpty(productFamilyIds)) {\r\n var apiUrl = '/Umbraco/api/ProduktdetailApi/GetProductFamily?productids=' + productFamilyIds;\r\n $.ajax({\r\n method: 'GET',\r\n dataType: 'JSON',\r\n url: apiUrl,\r\n success: data => {\r\n var products = data as ProduktkarussellModel;\r\n \r\n if (products?.karussellItems.length === 0) {\r\n $('#productFamily_wrapper').addClass('hide');\r\n return;\r\n \r\n }\r\n\r\n CreateSliderContent(\r\n products,\r\n $('#productFamilyContainer'),\r\n $('#ProduktdetailPrototypes #SliderPrototypes'),\r\n 'productFamilyContainer',\r\n false\r\n );\r\n //Karussell muss neu initialisiert werden, da der Inhalt bei Document.ready noch nicht verfügbar ist.\r\n initSwiperLarge($('#produktkarussellLarge'));\r\n },\r\n error: () => {\r\n $('.slider-section').addClass('hide');\r\n },\r\n });\r\n }\r\n }\r\n\r\n getTopProducts() {\r\n var productFamilyIds = $('#productTopKategorieUmbracoNodeId').val();\r\n let productId = $('#productTopKategorieProductId').val();\r\n if (!productId || !productFamilyIds) {\r\n return;\r\n }\r\n if (!this.nullOrEmpty(productFamilyIds)) {\r\n var apiUrl =\r\n '/Umbraco/api/ProduktdetailApi/GetRelatedTopProducts?contentId=' +\r\n productFamilyIds +\r\n '&productId=' +\r\n productId;\r\n $.ajax({\r\n method: 'GET',\r\n dataType: 'JSON',\r\n url: apiUrl,\r\n success: async data => {\r\n var products = data as ProduktkarussellModel;\r\n $('.topReihenSlider').removeClass('hidden');\r\n CreateSliderContent(\r\n products,\r\n $('#productTopReihen'),\r\n $('#ProduktdetailPrototypes #SliderPrototypes'),\r\n 'productTopReihen',\r\n false\r\n );\r\n //Karussell muss neu initialisiert werden, da der Inhalt bei Document.ready noch nicht verfügbar ist.\r\n let topslider = initSwiperLarge($('#produktkarussellLarge'));\r\n\r\n topslider.update();\r\n setTimeout(function() {\r\n // nasty hack aber keinen weg gefunden das karussell auf seite 1 springt...\r\n $('.slider .swiper-pagination-bullet')\r\n .first()\r\n .click();\r\n }, 100);\r\n await tracking_eecPromotionview();\r\n },\r\n error: () => {\r\n $('.slider').addClass('hide');\r\n },\r\n });\r\n }\r\n }\r\n\r\n async getTrboProducts() {\r\n if (window['__ucCmp'] === undefined || (await __ucCmp.isInitialized() == false)) {\r\n setTimeout(this.getTrboProducts.bind(this), 200);\r\n return;\r\n }\r\n\r\n const details = await __ucCmp.getConsentDetails();\r\n const trboAllowed = details.services[trboId].consent.given;\r\n const gtmAllowed = details.services[gtmId].consent.given;\r\n const getTrboProducts = trboAllowed && gtmAllowed;\r\n\r\n if (\r\n getTrboProducts &&\r\n window['_trbo'] === undefined\r\n ) {\r\n setTimeout(this.getTrboProducts.bind(this), 100);\r\n return;\r\n } else {\r\n try {\r\n if (!getTrboProducts) {\r\n $('.trboProductsSlider').addClass('hide');\r\n this.getTopProducts();\r\n return;\r\n }\r\n $('.trboProductsSlider').removeClass('hide');\r\n const requestUrl = buildTrboRequestUrl('Product_Reco_PDP_s2s');\r\n $.ajax({\r\n method: 'GET',\r\n dataType: 'JSON',\r\n url: encodeURI(requestUrl),\r\n success: async data => {\r\n var trboProducts = mapTrboResponseToProduktkarussellModel(data) as ProduktkarussellModel;\r\n if (trboProducts.karussellItems.length === 0) {\r\n $('.trboProductsSlider').addClass('hide');\r\n this.getTopProducts();\r\n return;\r\n }\r\n $('.topReihenSlider').addClass('hidden');\r\n CreateSliderContent(\r\n trboProducts,\r\n $('#productTrbo'),\r\n $('#ProduktdetailPrototypes #SliderPrototypes'),\r\n 'productTrbo',\r\n false\r\n );\r\n //Karussell muss neu initialisiert werden, da der Inhalt bei Document.ready noch nicht verfügbar ist.\r\n let trboslider = initSwiperLarge($('#produktkarussellLargeTrbo'));\r\n\r\n await tracking_eecPromotionview();\r\n\r\n trboslider.update();\r\n setTimeout(function() {\r\n // nasty hack aber keinen weg gefunden das karussell auf seite 1 springt...\r\n $('.trboProductsSlider .swiper-pagination-bullet')\r\n .first()\r\n .click();\r\n }, 100);\r\n },\r\n error: () => {\r\n $('.trboProductsSlider').addClass('hide');\r\n this.getTopProducts();\r\n },\r\n });\r\n } catch {\r\n $('.trboProductsSlider').addClass('hide');\r\n }\r\n }\r\n }\r\n\r\n async getTrboLastSeenProducts() {\r\n if (window['__ucCmp'] === undefined || (await __ucCmp.isInitialized() == false)) {\r\n setTimeout(this.getTrboLastSeenProducts.bind(this), 200);\r\n return;\r\n }\r\n \r\n const details = await __ucCmp.getConsentDetails();\r\n const trboAllowed = details.services[trboId].consent.given;\r\n const gtmAllowed = details.services[gtmId].consent.given;\r\n const getTrboProducts = trboAllowed && gtmAllowed;\r\n \r\n\r\n if (\r\n getTrboProducts &&\r\n window['_trbo'] === undefined\r\n ) {\r\n setTimeout(this.getTrboLastSeenProducts.bind(this), 100);\r\n return;\r\n }\r\n\r\n try {\r\n if (!getTrboProducts) {\r\n $('.trboLastSeen').addClass('hide');\r\n return;\r\n }\r\n $('.trboLastSeen').removeClass('hide');\r\n const requestUrl = buildTrboRequestUrl('Product_Last-Seen_PDP_s2s');\r\n $.ajax({\r\n method: 'GET',\r\n dataType: 'JSON',\r\n url: encodeURI(requestUrl),\r\n success: async data => {\r\n var trboProducts = mapTrboResponseToProduktkarussellModel(data) as ProduktkarussellModel;\r\n if (trboProducts.karussellItems.length > 0) {\r\n CreateSliderContent(\r\n trboProducts,\r\n $('#productTrboLastSeen'),\r\n $('#ProduktdetailPrototypes #SliderPrototypes'),\r\n 'productTrboLastSeen',\r\n false\r\n );\r\n //Karussell muss neu initialisiert werden, da der Inhalt bei Document.ready noch nicht verfügbar ist.\r\n let trboslider = initSwiperLarge($('#produktkarussellLargeTrboLastSeen'));\r\n await tracking_eecPromotionview();\r\n\r\n trboslider.update();\r\n setTimeout(function() {\r\n // nasty hack aber keinen weg gefunden das karussell auf seite 1 springt...\r\n $('.trboLastSeen .swiper-pagination-bullet')\r\n .first()\r\n .click();\r\n }, 100);\r\n } else {\r\n $('.trboLastSeen').addClass('hide');\r\n }\r\n },\r\n error: () => {\r\n $('.trboLastSeen').addClass('hide');\r\n },\r\n });\r\n } catch {}\r\n }\r\n\r\n private nullOrEmpty(element) {\r\n return element === null || element === '' || typeof element === 'undefined';\r\n }\r\n}\r\n","import { CombinationProducts } from \"./Models/CombinationProducts\";\r\n\r\nexport class CombinationProductsRenderer {\r\n\r\n /**\r\n * Holt die Kombinationsprodukte zu einem Produkt von der Api anhand ihrer Ids.\r\n * Die Ids werden in Hidden-Inputs zwischengespeichert\r\n */\r\n getCombinationProducts() {\r\n var headIds = $(\"#headProductIdsInput\").val();\r\n var childIds = $(\"#childProductIdsInput\").val();\r\n \r\n var queryString = \"?\" + (!this.nullOrEmpty(headIds) ? \"&headProductIds=\" + headIds : \"\") + (!this.nullOrEmpty(childIds) ? \"&childProductIds=\" + childIds : \"\");\r\n if (queryString !== \"?\") {\r\n var apiUrl = \"/Umbraco/api/ProduktdetailApi/GetCombinationProducts\" + queryString.replace(\"?&\",\"?\");\r\n $.ajax({\r\n method: \"GET\",\r\n dataType: 'JSON',\r\n url: apiUrl,\r\n success: data => {\r\n var products = data as CombinationProducts;\r\n this.createCombinationProductsContent(products);\r\n }\r\n });\r\n }\r\n }\r\n\r\n private createCombinationProductsContent(combinationProducts: CombinationProducts) {\r\n var container = $(\"#combinationProductsContainer\");\r\n if (!this.nullOrEmpty(combinationProducts)) {\r\n var combinationProductsPrototypes = $('#ProduktdetailPrototypes #CombinationProductsPrototypes').clone();\r\n if (!this.nullOrEmpty(combinationProducts.headProducts)) {\r\n var headProductsContainer = combinationProductsPrototypes.find(\".combinationProductsHead\");\r\n for (let product of combinationProducts.headProducts) {\r\n var head = $('#ProduktdetailPrototypes #CombinationProductsPrototypes').find(\"li\").clone();\r\n head.find(\"a\").html(product.displayName).attr(\"href\", product.href);\r\n headProductsContainer.find(\"ul\").append(head);\r\n }\r\n container.append(headProductsContainer);\r\n }\r\n if (!this.nullOrEmpty(combinationProducts.childProducts)) {\r\n var childProductsContainer = combinationProductsPrototypes.find(\".combinationProductsChilds\").clone();\r\n for (let product of combinationProducts.childProducts) {\r\n var child = $('#ProduktdetailPrototypes #CombinationProductsPrototypes').find(\"li\").clone();\r\n child.find(\"a\").html(product.displayName).attr(\"href\", product.href);\r\n childProductsContainer.find(\"ul\").append(child);\r\n }\r\n container.append(childProductsContainer);\r\n }\r\n }\r\n $(\".combinationProducts.ajaxSpinner_Loading\").addClass(\"hide\");\r\n }\r\n\r\n private nullOrEmpty(element) {\r\n return element === null || element === \"\" || typeof (element) === 'undefined';\r\n }\r\n}","declare var dataLayer: any[];\r\n\r\n/**\r\n * Tracking für Leseproben auf Produktseite\r\n */\r\nexport function pdfTracking(productId: number, attachement_type: string) {\r\n dataLayer.push({\r\n event: 'event',\r\n eventCategory: 'product data',\r\n eventAction: 'pdf download',\r\n eventLabel: `pdf_${attachement_type}_${productId}`,\r\n eventValue: '14.0',\r\n });\r\n\r\n dataLayer.push({\r\n event: 'econdaEvent',\r\n ecCustomProperties: {\r\n Target: ['product data', 'pdf download' + '/' + `pdf_${attachement_type}_${productId}`, 14.0, 'd'],\r\n rqtype: 'hiddenpi',\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Tracking für \"beck-online 14-Tage-Test\"\r\n */\r\nexport function testAboTracking(productId: number, price: number, conversionPeriod: number, holdingPeriod: number) {\r\n const priceValue = price * holdingPeriod * conversionPeriod * 0.45;\r\n const fixedPriceValue = priceValue.toFixed(2);\r\n\r\n dataLayer.push({\r\n event: 'event',\r\n eventCategory: 'product data',\r\n eventAction: 'click on bo button',\r\n eventLabel: `click_bo_${productId}`,\r\n eventValue: fixedPriceValue,\r\n });\r\n\r\n dataLayer.push({\r\n event: 'econdaEvent',\r\n ecCustomProperties: {\r\n Target: [\r\n 'product data',\r\n 'click on bo button' + '/' + `click_bo_${productId}`,\r\n Number.parseFloat(fixedPriceValue),\r\n 'd',\r\n ],\r\n rqtype: 'hiddenpi',\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Tracking für Social Sharing auf Produktseite\r\n */\r\nexport function recommendationTracking(productId: number) {\r\n dataLayer.push({\r\n event: 'event',\r\n eventCategory: 'product data',\r\n eventAction: 'email_empfehlung',\r\n eventLabel: `email_empfehlung_${productId}`,\r\n eventValue: '14.0',\r\n });\r\n\r\n dataLayer.push({\r\n event: 'econdaEvent',\r\n ecCustomProperties: {\r\n Target: ['product data', 'email_empfehlung' + '/' + `email_empfehlung_${productId}`, 14.0, 'd'],\r\n rqtype: 'hiddenpi',\r\n },\r\n });\r\n}\r\n\r\nexport function recensionNavClick(productId: number) {\r\n dataLayer.push({\r\n event: 'event',\r\n eventCategory: 'product data',\r\n eventAction: 'test_review-hint',\r\n eventLabel: `test_review-hint_${productId}`,\r\n });\r\n\r\n dataLayer.push({\r\n event: 'econdaEvent',\r\n ecCustomProperties: {\r\n Target: ['product data', 'test_review-hint' + '/' + `test_review-hint_${productId}`, 0, 'd'],\r\n rqtype: 'hiddenpi',\r\n },\r\n });\r\n}\r\n\r\nexport function socialShareButtonTracking(service: string) {\r\n dataLayer.push({\r\n event: 'event',\r\n eventCategory: 'product data',\r\n eventAction: `share_${service}`,\r\n eventLabel: `share_${service}_pdp`,\r\n eventValue: '1.0',\r\n });\r\n\r\n dataLayer.push({\r\n event: 'econdaEvent',\r\n ecCustomProperties: {\r\n Target: ['product data', `share_${service}` + '/' + `share_${service}_pdp`, 1.0, 'd'],\r\n rqtype: 'hiddenpi',\r\n },\r\n });\r\n}\r\n","declare var Swiper: any;\r\nvar inAdvance = 700;\r\n\r\nvar setSlideGroupBig, setSlideGroupSmall;\r\nvar carouselbig = [];\r\nvar carouselsmall = [];\r\nvar karussellElementsLarge: JQuery;\r\nvar karussellElementsSmall: JQuery;\r\nvar swiperElements: JQuery;\r\n$(() => {\r\n checkForSwiperSlider();\r\n\r\n let windowWidth = $(window).width();\r\n if (windowWidth <= 768) {\r\n setSlideGroupBig = 1;\r\n setSlideGroupSmall = 1;\r\n } else if (windowWidth <= 1200) {\r\n setSlideGroupBig = 3;\r\n setSlideGroupSmall = 1;\r\n } else {\r\n setSlideGroupBig = 4;\r\n setSlideGroupSmall = 3;\r\n }\r\n\r\n //Produktkarussell\r\n karussellElementsLarge = $('[id^=produktkarussellLarge]:not(.initialized):not(.trboDynamicSlider)');\r\n karussellElementsSmall = $('[id^=produktkarussellSmall]:not(.initialized):not(.trboDynamicSlider)');\r\n lazyloadKarussell();\r\n\r\n window.addEventListener('scroll', function() {\r\n lazyloadKarussell();\r\n });\r\n\r\n /**\r\n * Beim window resize müssen die Produktkarussel aktualisiert werden,\r\n * ansonsten passt die Darstellung nicht mehr\r\n */\r\n $(window).resize(() => {\r\n for (var j = 0; j < carouselbig.length; j++) {\r\n carouselbig[j].pagination.render();\r\n carouselbig[j].pagination.update();\r\n carouselbig[j].update();\r\n }\r\n for (var k = 0; k < carouselsmall.length; k++) {\r\n carouselsmall[k].pagination.render();\r\n carouselsmall[k].pagination.update();\r\n carouselsmall[k].update();\r\n }\r\n });\r\n});\r\n\r\nfunction lazyloadKarussell() {\r\n for (let index = 0; index < karussellElementsLarge.length; index++) {\r\n try {\r\n const karussell = karussellElementsLarge[index];\r\n let karussellTop = karussell.getBoundingClientRect().top;\r\n if (karussellTop < window.innerHeight + window.pageYOffset + inAdvance && karussellTop > 0) {\r\n carouselbig.push(initSwiperLarge(karussell));\r\n karussell.classList.add('initialized');\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n for (let index = 0; index < karussellElementsSmall.length; index++) {\r\n try {\r\n const karussell = karussellElementsSmall[index];\r\n let karussellTop = karussell.getBoundingClientRect().top;\r\n if (karussellTop < window.innerHeight + window.pageYOffset + inAdvance && karussellTop > 0) {\r\n carouselsmall.push(initSwiperSmall(karussell));\r\n karussell.classList.add('initialized');\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n karussellElementsLarge = karussellElementsLarge.filter(':not(.initialized)');\r\n karussellElementsSmall = karussellElementsSmall.filter(':not(.initialized)');\r\n}\r\n\r\n/**\r\n * Überprüft ob es auf der Seite Slider gibt, falls ja, werden diese konfiguriert\r\n */\r\nfunction checkForSwiperSlider() {\r\n swiperElements = $('[id^=bannerSwiper]:not(.trboDynamicBuehne)');\r\n var frequency = swiperElements.first().data('frequency');\r\n if (swiperElements.length > 0) {\r\n configureSwiperSlider(frequency, 'fade', swiperElements);\r\n }\r\n}\r\n\r\n/**\r\n * Konfiguriert alle Swiper Slider auf der Seite\r\n * @param autoplay Die Anzeigedauer eines Bildes\r\n * @param effect Der Transition effekt\r\n * @param elements Die Swiper slider Elemente\r\n */\r\nexport function configureSwiperSlider(autoplay: number, effect: string, elements: any) {\r\n for (var i = 0; i < elements.length; i++) {\r\n var swiper = new Swiper(elements[i] as any, {\r\n navigation: {\r\n nextEl: '.swiper-button-next',\r\n prevEl: '.swiper-button-prev',\r\n },\r\n loop: true,\r\n autoplay: {\r\n delay: autoplay,\r\n },\r\n autoplayDisableOnInteraction: true,\r\n effect: effect,\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Initialisierungsfunktion für das kleine karussel\r\n * @param elem\r\n */\r\nexport function initSwiperSmall(elem: any) {\r\n let swiper = new Swiper(elem, {\r\n slidesPerView: setSlideGroupSmall,\r\n spaceBetween: 30,\r\n slidesPerGroup: setSlideGroupSmall,\r\n loop: true,\r\n loopFillGroupWithBlank: true,\r\n pagination: {\r\n el: '.swiper-pagination',\r\n clickable: true,\r\n },\r\n navigation: {\r\n nextEl: '.swiper-button-next',\r\n prevEl: '.swiper-button-prev',\r\n },\r\n observer: true,\r\n observeParents: true,\r\n breakpoints: {\r\n 1200: {\r\n slidesPerView: 2,\r\n spaceBetween: 40,\r\n },\r\n 1024: {\r\n slidesPerView: 2,\r\n spaceBetween: 40,\r\n },\r\n 768: {\r\n slidesPerView: 2,\r\n spaceBetween: 30,\r\n },\r\n 640: {\r\n slidesPerView: 1,\r\n spaceBetween: 20,\r\n },\r\n 320: {\r\n slidesPerView: 1,\r\n spaceBetween: 10,\r\n },\r\n },\r\n on: {\r\n resize: function() {\r\n if ($(window).width() > 1200) {\r\n setSlideGroupSmall = 3;\r\n this.params.slidesPerView = 3;\r\n } else if ($(window).width() < 1200 && $(window).width() > 1024) {\r\n setSlideGroupSmall = 2;\r\n this.params.slidesPerView = 2;\r\n } else if ($(window).width() < 1024) {\r\n this.params.slidesPerView = 1;\r\n setSlideGroupSmall = 1;\r\n }\r\n this.params.slidesPerGroup = setSlideGroupSmall;\r\n this.update();\r\n this.pagination.update();\r\n this.pagination.render();\r\n },\r\n },\r\n });\r\n $(elem)\r\n .find('.swiper-wrapper')\r\n .removeClass('hide');\r\n return swiper;\r\n}\r\n\r\n/**\r\n * Initialisierungsfunktion für das große karussel\r\n * @param elem\r\n */\r\nexport function initSwiperLarge(elem: any) {\r\n let swiper = new Swiper(elem, {\r\n slidesPerView: setSlideGroupBig,\r\n spaceBetween: 30,\r\n slidesPerGroup: setSlideGroupBig,\r\n loop: false,\r\n loopFillGroupWithBlank: false,\r\n pagination: {\r\n el: '.swiper-pagination',\r\n clickable: true,\r\n },\r\n navigation: {\r\n nextEl: '.swiper-button-next',\r\n prevEl: '.swiper-button-prev',\r\n },\r\n observer: true,\r\n observeParents: true,\r\n breakpoints: {\r\n //1400: {\r\n // slidesPerView: 4,\r\n // spaceBetween: 30\r\n //},\r\n 1200: {\r\n slidesPerView: 4,\r\n spaceBetween: 40,\r\n },\r\n 1024: {\r\n slidesPerView: 3,\r\n spaceBetween: 30,\r\n },\r\n 768: {\r\n slidesPerView: 2,\r\n spaceBetween: 30,\r\n },\r\n 640: {\r\n slidesPerView: 1,\r\n spaceBetween: 20,\r\n },\r\n 320: {\r\n slidesPerView: 1,\r\n spaceBetween: 10,\r\n },\r\n },\r\n on: {\r\n resize: function() {\r\n if ($(window).width() > 1200) {\r\n setSlideGroupBig = 4;\r\n this.params.slidesPerView = 4;\r\n } else if ($(window).width() < 1200 && $(window).width() > 1024) {\r\n setSlideGroupBig = 3;\r\n this.params.slidesPerView = 3;\r\n } else if ($(window).width() < 1024 && $(window).width() > 768) {\r\n this.params.slidesPerView = 2;\r\n setSlideGroupBig = 3;\r\n } else {\r\n this.params.slidesPerView = 1;\r\n setSlideGroupBig = 1;\r\n }\r\n this.params.slidesPerGroup = setSlideGroupBig;\r\n this.update();\r\n this.pagination.update();\r\n this.pagination.render();\r\n },\r\n },\r\n });\r\n $(elem)\r\n .find('.swiper-wrapper')\r\n .removeClass('hide');\r\n return swiper;\r\n}\r\n","/**\r\n * Formatiert den Übergebenen Betrag in das Format 0.00.\r\n * Wenn es sich um einen Cent-Betrag handelt wird vorher /100 geteilt\r\n * @param price\r\n * @param isCentPrice\r\n */\r\nexport function formatPrice2Digits(price: number, isCentPrice?: boolean) {\r\n try {\r\n if (!price && price != 0) {\r\n return null;\r\n }\r\n if (isCentPrice) {\r\n price = price / 100;\r\n }\r\n return price.toFixed(2);\r\n } catch (error) {\r\n return null;\r\n }\r\n}","import * as Cookies from 'js-cookie';\r\n\r\ndeclare var dataLayer: any[];\r\nvar windowHeight = $(window).innerHeight();\r\ndeclare var _trboq: any;\r\ndeclare var _trbo: any;\r\ndeclare var __ucCmp: any;\r\n\r\n/**\r\n * Googletracking für ein Promotionevent\r\n * @param eventName Der Name des Trackingevents\r\n */\r\nexport async function trackGooglePromotionEvent_view(eventName: string) {\r\n if (window['__ucCmp'] !== undefined && (await __ucCmp.isInitialized())) {\r\n dataLayer.push({\r\n event: 'eec.promotionView',\r\n ecommerce: {\r\n promoView: {\r\n promotions: [\r\n {\r\n name: eventName,\r\n },\r\n ],\r\n },\r\n },\r\n });\r\n\r\n dataLayer.push({\r\n event: 'econdaEvent',\r\n ecCustomProperties: {\r\n icampv: [[eventName]],\r\n rqtype: 'hiddenpi',\r\n },\r\n });\r\n } else {\r\n setTimeout(trackGooglePromotionEvent_view.bind(null, eventName), 100);\r\n }\r\n}\r\nexport function trackGooglePromotionEvent_click(eventName: string) {\r\n dataLayer.push({\r\n event: 'eec.promotionClick',\r\n ecommerce: {\r\n promoClick: {\r\n promotions: [\r\n {\r\n name: eventName,\r\n },\r\n ],\r\n },\r\n },\r\n });\r\n\r\n dataLayer.push({\r\n event: 'econdaEvent',\r\n ecCustomProperties: {\r\n icampc: [[eventName]],\r\n rqtype: 'hiddenpi',\r\n },\r\n });\r\n}\r\n\r\nexport function trackGoogleAddToMerkliste_click(productId: number) {\r\n dataLayer.push({\r\n event: 'event',\r\n eventCategory: 'product data',\r\n eventAction: 'add to wishlist',\r\n eventLabel: `add_${productId}`,\r\n });\r\n\r\n dataLayer.push({\r\n event: 'econdaEvent',\r\n ecCustomProperties: {\r\n Target: ['product data', 'add to wishlist' + '/' + `add_${productId}`, 0, 'd'],\r\n rqtype: 'hiddenpi',\r\n },\r\n });\r\n}\r\n\r\nexport function trackMerklisteInteraction_click(eventLabel: string) {\r\n dataLayer.push({\r\n event: 'event',\r\n eventCategory: 'user data',\r\n eventAction: 'interaction_wishlist',\r\n eventLabel: eventLabel,\r\n });\r\n\r\n dataLayer.push({\r\n event: 'econdaEvent',\r\n ecCustomProperties: {\r\n Target: ['user data', 'interaction_wishlist' + '/' + eventLabel, 0, 'd'],\r\n rqtype: 'hiddenpi',\r\n },\r\n });\r\n}\r\n\r\nexport async function MerklisteKarusellInViewTracking() {\r\n await trackGooglePromotionEvent_view('all_merklisten_static');\r\n}\r\n\r\nexport function MerklisteKarusellProductClickedTracking() {\r\n trackGooglePromotionEvent_click('all_merklisten_static');\r\n}\r\n\r\nexport function trackNaviEvent_click(eventName: string) {\r\n dataLayer.push({\r\n event: 'event',\r\n eventCategory: 'navigation data',\r\n eventAction: 'navigation_click',\r\n eventLabel: eventName,\r\n });\r\n\r\n dataLayer.push({\r\n event: 'econdaEvent',\r\n ecCustomProperties: {\r\n Target: ['navigation data', 'navigation_click' + '/' + eventName, 0, 'd'],\r\n rqtype: 'hiddenpi',\r\n },\r\n });\r\n}\r\n\r\nexport async function loginTracking(pageType: string, loggedInResult: string) {\r\n if (window['__ucCmp'] !== undefined && (await __ucCmp.isInitialized())) {\r\n if (pageType.includes('meine-daten')) {\r\n dataLayer.push({\r\n event: 'event',\r\n eventCategory: 'user data',\r\n eventAction: 'login_meine-daten',\r\n eventLabel: loggedInResult == 'failed' ? 'login_failed' : 'login_success',\r\n });\r\n\r\n dataLayer.push({\r\n event: 'econdaEvent',\r\n ecCustomProperties: {\r\n Target: [\r\n 'user data',\r\n 'login_meine-daten' + '/' + (loggedInResult == 'failed' ? 'login_failed' : 'login_success'),\r\n 0,\r\n 'd',\r\n ],\r\n rqtype: 'hiddenpi',\r\n },\r\n });\r\n } else {\r\n dataLayer.push({\r\n event: 'event',\r\n eventCategory: 'user data',\r\n eventAction: 'login_checkout',\r\n eventLabel: loggedInResult == 'failed' ? 'login_failed' : 'login_success',\r\n });\r\n\r\n dataLayer.push({\r\n event: 'econdaEvent',\r\n ecCustomProperties: {\r\n Target: [\r\n 'user data',\r\n 'login_checkout' + '/' + (loggedInResult == 'failed' ? 'login_failed' : 'login_success'),\r\n 0,\r\n 'd',\r\n ],\r\n rqtype: 'hiddenpi',\r\n },\r\n });\r\n }\r\n Cookies.remove('LoggedInPageType');\r\n Cookies.remove('LoggedInResult');\r\n } else {\r\n setTimeout(loginTracking.bind(null, pageType, loggedInResult), 100);\r\n }\r\n}\r\n\r\nexport async function pushTrboId(eId: string) {\r\n if (window['__ucCmp'] !== undefined && (await __ucCmp.isInitialized())) {\r\n if (typeof _trboq !== 'undefined') {\r\n _trboq = _trboq || [];\r\n _trboq.push([\r\n 'dataMatching',\r\n {\r\n external_user_id: eId,\r\n },\r\n ]);\r\n }\r\n } else {\r\n setTimeout(pushTrboId.bind(null, eId), 100);\r\n }\r\n}\r\n\r\nexport async function trackIdLayerComplete(hId: string, hMail: string, hKid: string) {\r\n if (window['__ucCmp'] !== undefined && (await __ucCmp.isInitialized())) {\r\n dataLayer.push({\r\n event: 'idLayer_complete_login',\r\n externalIdHash: hId,\r\n emailHash: hMail,\r\n kupCustomerNumberHash: hKid,\r\n });\r\n } else {\r\n setTimeout(trackIdLayerComplete.bind(null, hId, hMail, hKid), 100);\r\n }\r\n}\r\n\r\nexport async function trackIdLayerReduced(hMail: string, eventName: string) {\r\n if (window['__ucCmp'] !== undefined && (await __ucCmp.isInitialized())) {\r\n dataLayer.push({\r\n event: eventName,\r\n emailHash: hMail,\r\n });\r\n } else {\r\n setTimeout(trackIdLayerReduced.bind(null, hMail, eventName), 100);\r\n }\r\n}\r\n\r\nexport function trackNewsletterRegisterEvent(eventName: string) {\r\n if (eventName) {\r\n dataLayer.push({\r\n event: 'event',\r\n eventCategory: 'user data',\r\n eventAction: 'newsletter_registrierung',\r\n eventLabel: eventName,\r\n });\r\n\r\n dataLayer.push({\r\n event: 'econdaEvent',\r\n ecCustomProperties: {\r\n Target: ['user data', 'newsletter_registrierung' + '/' + eventName, 0, 'd'],\r\n rqtype: 'hiddenpi',\r\n },\r\n });\r\n }\r\n}\r\n\r\nexport async function tracking_eecPromotionview() {\r\n const promotionElements = $('.googleTracking.promotionTracking:not(.promoted)');\r\n promotionElements.each(function() {\r\n if (IsVisibleElement(this)) {\r\n const trackingParam = $(this).data('trackingevent');\r\n if (trackingParam) {\r\n trackGooglePromotionEvent_view(trackingParam);\r\n }\r\n $(this).addClass('promoted');\r\n }\r\n });\r\n\r\n await trboPromotionViewTracking();\r\n}\r\n\r\nasync function trboPromotionViewTracking() {\r\n if (window['__ucCmp'] !== undefined && (await __ucCmp.isInitialized())) {\r\n const promotionTrboElements = $('.trboPromotionTracking:not(.promoted)');\r\n promotionTrboElements.each(function() {\r\n if (IsVisibleElement(this)) {\r\n const moduleId = $(this).data('moduleid');\r\n const moduleName = $(this).data('modulename');\r\n const campaignId = $(this).data('campaignid');\r\n const campaignName = $(this).data('campaignname');\r\n const usertype = $(this).data('usertype');\r\n\r\n if (window['_trboq'] !== undefined && window['_trbo'] !== undefined && moduleId && campaignId) {\r\n _trboq.push(['layerView', { moduleId: moduleId, campaignId: campaignId }]);\r\n _trbo.app.tracker.trackExternalView(usertype, campaignId, campaignName, moduleId, moduleName);\r\n $(this).addClass('promoted');\r\n }\r\n }\r\n });\r\n } else {\r\n setTimeout(trboPromotionViewTracking, 100);\r\n }\r\n}\r\n\r\nexport function trackExternalBasketClick(productId: number, eventLabel: string, eventAction: string) {\r\n dataLayer.push({\r\n event: 'event',\r\n eventCategory: 'product data',\r\n eventAction: eventAction,\r\n eventLabel: `${eventLabel}_${productId}`,\r\n });\r\n\r\n dataLayer.push({\r\n event: 'econdaEvent',\r\n ecCustomProperties: {\r\n Target: ['product data', 'newsletter_registrierung' + '/' + `${eventLabel}_${productId}`, 0, 'd'],\r\n rqtype: 'hiddenpi',\r\n },\r\n });\r\n}\r\n\r\nexport function trackPrefixNameProblem() {\r\n dataLayer.push({\r\n event: 'event',\r\n eventCategory: 'user data',\r\n eventAction: 'interaction_forms',\r\n eventLabel: 'problem_name-prefix',\r\n });\r\n\r\n dataLayer.push({\r\n event: 'econdaEvent',\r\n ecCustomProperties: {\r\n Target: ['user data', 'interaction_forms' + '/' + 'problem_name-prefix', 0, 'd'],\r\n rqtype: 'hiddenpi',\r\n },\r\n });\r\n}\r\n\r\nexport function trackLageRegistrationAccount(action: string, label: string) {\r\n dataLayer.push({\r\n event: 'event',\r\n eventCategory: 'user data',\r\n eventAction: action,\r\n eventLabel: label,\r\n });\r\n\r\n dataLayer.push({\r\n event: 'econdaEvent',\r\n ecCustomProperties: {\r\n Target: ['user data', action + '/' + label, 0, 'd'],\r\n rqtype: 'hiddenpi',\r\n },\r\n });\r\n}\r\n\r\nexport function searchResultClickTracking(searchQuery: string) {\r\n dataLayer.push({\r\n event: 'econdaEvent',\r\n ecCustomProperties: {\r\n icampc: [[searchQuery ? `Suchergebnis/${searchQuery}` : 'Suchergebnis']],\r\n rqtype: 'hiddenpi',\r\n },\r\n });\r\n}\r\n\r\nfunction IsVisibleElement(element) {\r\n if ($(element).hasClass('hide')) {\r\n return false;\r\n }\r\n var top_of_element = $(element).offset().top;\r\n var bottom_of_element = $(element).offset().top + $(element).outerHeight();\r\n var top_of_screen = $(window).scrollTop();\r\n var bottom_of_screen = top_of_screen + windowHeight;\r\n\r\n if (bottom_of_screen > top_of_element && top_of_screen < bottom_of_element) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n}\r\n","import { formatPrice2Digits } from '../Shared/PriceHelper';\r\n\r\ndeclare var dataLayer: any[];\r\ndeclare var __ucCmp: any;\r\n\r\n/**\r\n * Googletracking für ein Promotionevent\r\n */\r\nexport async function productGoogleTracking() {\r\n if (window['__ucCmp'] !== undefined && (await __ucCmp.isInitialized())) {\r\n let productsGoogleTrackingContainer = $('#productGoogleTracking');\r\n let name =\r\n productsGoogleTrackingContainer.data('name') !== '' ? productsGoogleTrackingContainer.data('name') : null;\r\n let id = productsGoogleTrackingContainer.data('id') !== '' ? productsGoogleTrackingContainer.data('id') : null;\r\n let price =\r\n productsGoogleTrackingContainer.data('price') !== ''\r\n ? formatPrice2Digits(parseFloat(productsGoogleTrackingContainer.data('price')))\r\n : null;\r\n let brand =\r\n productsGoogleTrackingContainer.data('brand') !== '' ? productsGoogleTrackingContainer.data('brand') : null;\r\n let category =\r\n productsGoogleTrackingContainer.data('category') !== ''\r\n ? productsGoogleTrackingContainer.data('category')\r\n : 'Produkt ohne Kategorie';\r\n let displayFormat =\r\n productsGoogleTrackingContainer.data('displayformat') !== ''\r\n ? productsGoogleTrackingContainer.data('displayformat')\r\n : null;\r\n let variant = null;\r\n if (productsGoogleTrackingContainer.data('producttype') == 'SEMINAR') {\r\n variant = 'Seminar/Tagung';\r\n } else {\r\n if (productsGoogleTrackingContainer.data('variant') !== '') {\r\n variant = productsGoogleTrackingContainer.data('variant');\r\n }\r\n }\r\n\r\n dataLayer.push({\r\n event: 'eec.productDetailImpression',\r\n ecommerce: {\r\n detail: {\r\n products: [\r\n {\r\n name: name, // Name or ID is required.\r\n id: id,\r\n price: price,\r\n brand: brand,\r\n category: category,\r\n variant: variant,\r\n dimension8: displayFormat,\r\n },\r\n ],\r\n },\r\n },\r\n });\r\n } else {\r\n setTimeout(productGoogleTracking, 100);\r\n }\r\n}\r\n\r\nexport function availabilityReminderSubmitTracking(productId: string, eventAction: string) {\r\n dataLayer.push({\r\n event: 'event',\r\n eventCategory: 'product data',\r\n eventAction: eventAction,\r\n eventLabel: `reminder_${productId}`,\r\n });\r\n\r\n dataLayer.push({\r\n event: 'econdaEvent',\r\n ecCustomProperties: {\r\n Target: ['product data', eventAction + '/' + `reminder_${productId}`, 0, 'd'],\r\n rqtype: 'hiddenpi',\r\n },\r\n });\r\n}\r\n"],"sourceRoot":""}