window.ADDREVENUE=window.ADDREVENUE||{};Object.assign(window.ADDREVENUE,{params:['advertiserId','channelId','market','clickId','clickRef','affiliateGclid','wctid','deleteCookiesAfterPurchase','expires'],baseUrl:'https://addrevenue.io',baseCookieName:'addrevenue',cookieName(name){if(!name||typeof name!=='string')return'';try{return this.baseCookieName+name[0].toUpperCase()+name.substring(1);}catch(e){this.errorHandler(e);}},getCookie(name){try{const cookie={};document.cookie.split(';').forEach(function(el){const[key,...valParts]=el.split('=');const value=valParts.join('=');cookie[key.trim()]=value;});return cookie[name]!==undefined?cookie[name]:null;}catch(e){this.errorHandler(e);}},setCookie(name,value){try{let expires;if(value===null||value===undefined||value===''){expires='; expires=Thu, 01 Jan 1970 00:00:00 GMT';value='';}else{const date=new Date(this.expires?parseInt(this.expires):Date.now()+(this.cookiePeriod*86400000));expires='; expires='+date.toUTCString();}const domain='; domain=.'+this.getDomainFromUrl(window.location.href);const path='; path=/';const SameSite='; SameSite=Lax; Secure';document.cookie=`${name}=${value}${expires}${domain}${path}${SameSite}`;}catch(e){this.errorHandler(e);}},deleteCookie(name){this.setCookie(name,null);},getLocalStorage(name){try{return localStorage.getItem(name);}catch(e){this.errorHandler(e);}},setLocalStorage(name,value){try{if(typeof value!=='string'){console.warn('Value is not a string. Applying JSON.stringify:',value);value=JSON.stringify(value);}localStorage.setItem(name,value);}catch(e){console.error('Error in setLocalStorage:',e);}},deleteLocalStorage(name){localStorage.removeItem(name);},setCookieAndLocalStorage(name,value){try{if(!this.noCookies)this.setCookie(name,value);this.setLocalStorage(name,value);}catch(e){this.errorHandler(e);}},deleteCookieAndLocalStorage(name){try{const cookieName=this.cookieName(name);this.deleteLocalStorage(cookieName);this.deleteCookie(cookieName);this[name]=undefined;}catch(e){this.errorHandler(e);}},isBot(){const KNOWN_BOTS=/(googlebot|Googlebot-Mobile|Googlebot-Image|Google favicon|Mediapartners-Google|bingbot|slurp|java|wget|Commons-HttpClient|Python-urllib|libwww|httpunit|nutch|phpcrawl|msnbot|jyxobot|FAST-WebCrawler|FAST Enterprise Crawler|biglotron|teoma|convera|seekbot|gigablast|exabot|ngbot|ia_archiver|GingerCrawler|webmon |httrack|webcrawler|grub.org|UsineNouvelleCrawler|antibot|netresearchserver|speedy|fluffy|bibnum.bnf|findlink|msrbot|panscient|yacybot|AISearchBot|IOI|ips-agent|tagoobot|MJ12bot|dotbot|woriobot|yanga|buzzbot|mlbot|yandexbot|purebot|Linguee Bot|Voyager|CyberPatrol|voilabot|baiduspider|citeseerxbot|spbot|twengabot|postrank|turnitinbot|scribdbot|page2rss|sitebot|linkdex|Adidxbot|blekkobot|ezooms|dotbot|Mail.RU_Bot|discobot|heritrix|findthatfile|europarchive.org|NerdByNature.Bot|sistrix crawler|ahrefsbot|Aboundex|domaincrawler|wbsearchbot|summify|ccbot|edisterbot|seznambot|ec2linkfinder|gslfbot|aihitbot|intelium_bot|facebookexternalhit|yeti|RetrevoPageAnalyzer|lb-spider|sogou|lssbot|careerbot|wotbox|wocbot|ichiro|DuckDuckBot|lssrocketcrawler|drupact|webcompanycrawler|acoonbot|openindexspider|gnam gnam spider|web-archive-net.com.bot|backlinkcrawler|coccoc|integromedb|content crawler spider|toplistbot|seokicks-robot|it2media-domain-crawler|ip-web-crawler.com|siteexplorer.info|elisabot|proximic|changedetection|blexbot|arabot|WeSEE:Search|niki-bot|CrystalSemanticsBot|rogerbot|360Spider|psbot|InterfaxScanBot|Lipperhey SEO Service|CC Metadata Scaper|g00g1e.net|GrapeshotCrawler|urlappendbot|brainobot|fr-crawler|binlar|SimpleCrawler|Livelapbot|Twitterbot|cXensebot|smtbot|bnf.fr_bot|A6-Indexer|ADmantX|Facebot|Twitterbot|OrangeBot|memorybot|AdvBot|MegaIndex|SemanticScholarBot|ltx71|nerdybot|xovibot|BUbiNG|Qwantify|archive.org_bot|Applebot|TweetmemeBot|crawler4j|findxbot|SemrushBot|yoozBot|lipperhey|y!j-asr|Domain Re-Animator Bot|AddThis|MJ12bot|UptimeRobot|AhrefsBot|BLEXBot|PetalBot|SiteAuditBot|ev-crawler|SeobilityBot|DataForSeoBot|Adsbot|adbeat_bot|ZoominfoBot|Wordpress)/i;return KNOWN_BOTS.test(navigator.userAgent);},errorHandler(e){console.warn(e);},init(){try{this.noCookies=this.getParamFromScriptTag('noCookies');this.cookiePeriod=parseInt(this.getParamFromScriptTag('d'))||45;this.getData();console.log('Addrevenue script initiated');}catch(e){this.errorHandler(e);}},getData(){try{const now=Date.now();this.paramsFromUrl=false;this.params.forEach(param=>this.getParam(param));if(this.expires&&now>this.expires&&!this.paramsFromUrl){console.log('Addrevenue local storage data is expired — clearing...');this.deleteAllCookies();return;}if(this.paramsFromUrl||!this.expires){this.expires=now+(parseInt(this.cookiePeriod)*86400000);}if(this.channelId&&!this.clickId)this.clickId=this.uniqid();this.storeData();}catch(e){this.errorHandler(e);}},storeData(){try{const data=Object.fromEntries(this.params.filter(key=>this[key]!==undefined&&this[key]!==null&&this[key]!=='').map(key=>[key,this[key]]));if(Object.keys(data).length>1){const jsonData=JSON.stringify(data);if(jsonData!=='{}'&&jsonData!=='null'){this.noCookies?this.setLocalStorage(this.baseCookieName,jsonData):this.setCookieAndLocalStorage(this.baseCookieName,jsonData);}}}catch(e){this.errorHandler(e);}},getParam(name){try{let cookieData=null;let cookieVal=null;let jsonData=this.getLocalStorage(this.baseCookieName);if(!jsonData||jsonData==='[object Object]')jsonData=this.getCookie(this.baseCookieName);if(jsonData)cookieData=JSON.parse(jsonData);if(cookieData)cookieVal=cookieData[name];const queryVal=this.getQueryString(name);const dataVal=this[name];let value=queryVal||cookieVal||dataVal;if(!value)return;if(queryVal)this.paramsFromUrl=true;value=this.sanitizeParams(value);this[name]=value;return value;}catch(e){this.errorHandler(e);}},getQueryString(name,url){try{let queryString=window.location.search;if(url)queryString=new URL(url).search;const urlParams=new URLSearchParams(queryString);let v=urlParams.get(name);if(v){if(name==='channelId'&&(v.length<6||v.length>8))v=null;if(name==='advertiserId'&&(v.length<3||v.length>8))v=null;}return v;}catch(e){this.errorHandler(e);}},getParamFromScriptTag(name){try{const scriptSrc=this.getScriptSrc();return(scriptSrc?this.getQueryString(name,scriptSrc):false);}catch(e){return false;}},getScriptSrc(){try{if(document.currentScript)return document.currentScript.src;const scripts=document.getElementsByTagName('script');for(let i=scripts.length-1;i>=0;i--){if(scripts[i].src.includes('addrevenue.io/track'))return scripts[i].src;}}catch(e){this.errorHandler(e);}},sanitizeParams(obj){if(typeof obj==='string'){obj=obj.trim().replace(/<\/?[^>]+(>|$)/g,"");if(['undefined','null',''].includes(obj))obj=null;return obj;}else if(Array.isArray(obj)){return obj.map(v=>this.sanitizeParams(v));}else if(obj&&typeof obj==='object'){const cleaned={};for(const[key,value]of Object.entries(obj)){cleaned[key]=this.sanitizeParams(value);}return cleaned;}return obj;},uniqid(){return Date.now().toString(16)+Math.floor(Math.random()*0x100000).toString(16);},getDomainFromUrl(url){try{if(!url)url=window.location.href;const hostname=new URL(url).hostname;const match=hostname.match(/^(?:.*?\.)?([a-zA-Z0-9\-_]{3,}\.(?:\w{2,8}|\w{2,4}\.\w{2,4}))$/);if(match&&match[1]){return match[1].toLowerCase();}return hostname.toLowerCase();}catch(e){this.errorHandler(e);}},heartbeat:async function(postData){const formData=new URLSearchParams();formData.append('advertiserId',this.advertiserId);formData.append('channelId',this.channelId);formData.append('type',postData.type);formData.append('url',postData.url);fetch(this.baseUrl+'/ajax/heartbeat',{method:'POST',headers:{'Content-Type':'application/x-www-form-urlencoded'},body:formData.toString()});},sendEvent:async function(type,postData){try{postData=postData||{};if(this.isBot()==true)return;postData=this.sanitizeParams(postData);postData.type=type;postData.url=window.location.href;if(!this.advertiserId&&postData.advertiserId)this.advertiserId=postData.advertiserId;if(!this.advertiserId)this.advertiserId=await this.getAdvertiserByUrl();this.heartbeat(postData);if(!this.advertiserId||this.advertiserId==-1)return;if(!this.channelId&&postData.discountCodes)this.channelId=await this.getChannelByDiscountCodes(postData.discountCodes);if(!this.channelId&&postData.crossDeviceId)this.channelId=await this.getChannelByCrossDeviceId(postData.crossDeviceId);if(!this.channelId&&!this.clickId)return;if(this.advertiserId)postData.advertiserId=this.advertiserId;if(this.channelId)postData.channelId=this.channelId;if(this.market)postData.market=this.market;if(this.clickId)postData.clickId=this.clickId;if(this.clickRef)postData.clickRef=this.clickRef;if(this.affiliateGclid)postData.affiliateGclid=this.affiliateGclid;if(this.shopifyEvent)postData.shopifyEvent=this.shopifyEvent;if(this.wctid)postData.wctid=this.wctid;postData.version='2.0';const response=await fetch(this.baseUrl+'/t',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(postData)});if(!response.ok)throw new Error('Addrevenue send event response was not ok');const data=await response.json();console.log('Addrevenue '+type+' event sent');if(this.deleteCookiesAfterPurchase)this.deleteAllCookies();return data;}catch(e){this.errorHandler(e);}},deleteAllCookies(){try{this.params.forEach(p=>this.deleteCookieAndLocalStorage(p));this.deleteCookie(this.baseCookieName);this.deleteLocalStorage(this.baseCookieName);this.data=undefined;console.log('Deleted all Addrevenue related cookies and local storage');}catch(e){this.errorHandler(e);}},getAdvertiserByUrl:async function(){try{const response=await fetch(this.baseUrl+'/fetch/advertiser/id?url='+encodeURI(window.location.href));if(!response.ok)throw new Error('Fetch advertiser response was not ok');const data=await response.text();const advertiserId=parseInt(data);return isNaN(advertiserId)?null:advertiserId;}catch(e){this.errorHandler(e);}},getChannelByDiscountCodes:async function(discountCodes){try{const response=await fetch(this.baseUrl+'/ajax/getChannelByDiscountCodes?advertiserId='+this.advertiserId+'&code='+discountCodes);if(!response.ok)throw new Error('Get channel by discount code response was not ok');const data=await response.text();const channelId=parseInt(data);return isNaN(channelId)?null:channelId;}catch(e){this.errorHandler(e);}},getChannelByCrossDeviceId:async function(crossDeviceId){try{const response=await fetch(this.baseUrl+'/ajax/getChannelByCrossDeviceId?advertiserId='+this.advertiserId+'&crossDeviceId='+crossDeviceId);if(!response.ok)throw new Error('Get channel by cross-device ID response was not ok');const data=await response.text();const channelId=parseInt(data);return isNaN(channelId)?null:channelId;}catch(e){this.errorHandler(e);}},cleanUrl(){const url=window.location.origin+window.location.pathname;window.history.replaceState({},document.title,url);}});function addrevenue_init(a,d){}async function addrevenue_event(type,postData){ADDREVENUE.sendEvent(type,postData);}ADDREVENUE.init();if(ADDREVENUE.getQueryString('addrevenueDeleteAllCookies'))ADDREVENUE.deleteAllCookies();if(ADDREVENUE.getQueryString('easylink'))ADDREVENUE.cleanUrl();window.ADDREVENUE_scriptLoaded=true;document.dispatchEvent(new Event('AddrevenueScriptLoaded'));