PageSourceSearch

https://oberrotweiler.de/cdn/shop/t/6/assets/custom.js?v=18106233527478303871763660233

js oberrotweiler.de collected 2026-10-10 01:18:07 UTC 3,196 bytes, 2 lines download raw bytes

1class BBCountDown extends HTMLElement{static get observedAttributes(){return["data-expiration"]}constructor(){super(),this.intervalId=null,this.expirationDate=null,this.hasNotifiedExpiry=!1,this.unitElements=null}connectedCallback(){this.setAttribute("role",this.getAttribute("role")||"timer"),this.setAttribute("aria-live",this.getAttribute("aria-live")||"polite"),this.cacheUnitElements(),this.refreshExpiration(),this.startTicker()}disconnectedCallback(){this.stopTicker()}attributeChangedCallback(name,oldValue,newValue){name==="data-expiration"&&oldValue!==newValue&&this.refreshExpiration()}cacheUnitElements(){this.unitElements={days:this.querySelector('[data-unit="days"]'),hours:this.querySelector('[data-unit="hours"]'),minutes:this.querySelector('[data-unit="minutes"]'),seconds:this.querySelector('[data-unit="seconds"]')}}refreshExpiration(){this.stopTicker(),this.hasNotifiedExpiry=!1,this.classList.remove("is-expired"),this.expirationDate=this.parseExpiration(this.dataset.expiration),this.updateDisplay(),this.startTicker()}parseExpiration(rawValue){if(!rawValue||typeof rawValue!="string")return null;var trimmed=rawValue.trim();if(!trimmed)return null;var normalized=trimmed.replace(" ","T");/^\d{4}-\d{2}-\d{2}$/.test(trimmed)&&(normalized=trimmed+"T00:00"),/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$/.test(normalized)&&(normalized+=":00");var candidate=new Date(normalized);return isNaN(candidate.getTime())?null:candidate}startTicker(){this.expirationDate&&this.intervalId===null&&(this.intervalId=window.setInterval(function(){this.updateDisplay()}.bind(this),1e3))}stopTicker(){this.intervalId!==null&&(window.clearInterval(this.intervalId),this.intervalId=null)}updateDisplay(){var units=this.calculateRemaining();this.renderUnits(units),units.totalMilliseconds<=0&&!this.hasNotifiedExpiry?(this.hasNotifiedExpiry=!0,this.classList.add("is-expired"),this.stopTicker()):units.totalMilliseconds>0&&this.classList.remove("is-expired")}calculateRemaining(){if(!this.expirationDate)return{days:"--",hours:"--",minutes:"--",seconds:"--",totalMilliseconds:-1};var now=new Date,totalMilliseconds=this.expirationDate.getTime()-now.getTime(),remaining=Math.max(totalMilliseconds,0),totalSeconds=Math.floor(remaining/1e3),days=Math.floor(totalSeconds/86400),hours=Math.floor(totalSeconds%86400/3600),minutes=Math.floor(totalSeconds%3600/60),seconds=totalSeconds%60;return{days,hours,minutes,seconds,totalMilliseconds}}renderUnits(units){this.cacheUnitElements(),this.updateUnit(this.unitElements.days,units.days,!1),this.updateUnit(this.unitElements.hours,units.hours,!0),this.updateUnit(this.unitElements.minutes,units.minutes,!0),this.updateUnit(this.unitElements.seconds,units.seconds,!0)}updateUnit(target,value,pad){if(target){var output=value;typeof value=="number"&&pad&&(output=this.padNumber(value)),typeof value=="number"&&!pad&&(output=String(value)),typeof value=="string"&&(output=value),target.textContent!==output&&(target.textContent=output)}}padNumber(value){return value<10?"0"+value:String(value)}}customElements.get("bb-countdown")||customElements.define("bb-countdown",BBCountDown);
2//# sourceMappingURL=/cdn/shop/t/6/assets/custom.js.map?v=18106233527478303871763660233

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.