var xmlhttp = new XMLHttpRequest(); function run_pixel() { const script_version = 'v4' const url2 = 'https://beacon-pixel.stage.shutterfly.com/posts' const cookies_logic = [{ 'condition': () => {return SFLY_DTL?.page?.pageInfo?.pageType === "product detail pages"}, 'key': 'is_pip_visited', 'value': 'true', 'exp': 5, }]; // Prepare request xmlhttp.open("POST", url2, true); xmlhttp.setRequestHeader("Content-Type", "application/json;charset=UTF-8"); xmlhttp.setRequestHeader("Web-Pixel-Version", web_pixel_version); xmlhttp.setRequestHeader("Script-Pixel-Version", script_version); xmlhttp.setRequestHeader("Sfly-Web-Domain", document.domain); xmlhttp.setRequestHeader("Sfly-Web-Uri", document.documentURI); xmlhttp.setRequestHeader("Sfly-Web-Title", document.title); xmlhttp.withCredentials = true; xmlhttp.timeout = 30000; // 30 seconds // Copy Master Tms Udo data if (typeof MasterTmsUdo !== 'undefined' && MasterTmsUdo != null) { pixel_data = JSON.parse(JSON.stringify(MasterTmsUdo)); } else { pixel_data = {}; } // Create postProspectRequest method postProspectRequest = function postProspectReq(data, target, callback) { let prefix_url = ''; if (window.location.href.includes(".dev.")) { prefix_url = 'https://www.dev.shutterfly.com/mktg/'; } else if (window.location.href.includes(".stage.")) { prefix_url = 'https://www.stage.shutterfly.com/mktg/'; } else if (window.location.href.includes(".beta.")) { prefix_url = 'https://www.beta.shutterfly.com/mktg/'; } else if (window.location.href.includes(".kappa.")) { prefix_url = 'https://www.kappa.shutterfly.com/mktg/'; } else /* if prod */ { prefix_url = 'https://sfly-mktg.com/'; // TODO: Shutterfly domain } let httpReq = new XMLHttpRequest(); let url3 = prefix_url + 'posts-prospect'; if (target) { data['target'] = target } if (callback) { httpReq.onreadystatechange = callback; } httpReq.open("POST", url3, true); httpReq.send(JSON.stringify(data)); } // Add SFLY_DTL object if exists try { pixel_data['SFLY_DTL'] = SFLY_DTL.page; } catch (ex_var) { console.warn('beacon-pixel: SFLY_DTL.page not exists.'); } // move skucode object and other objects required for the backend, if they exist try { pixel_data.categoryCode = pixel_data.categoryCode || pixel_data.SFLY_DTL?.productDetails?.categoryId pixel_data.pageType = pixel_data.SFLY_DTL?.pageInfo?.pageType; pixel_data.productId = pixel_data.SFLY_DTL?.productDetails?.productCode; pixel_data.productName = pixel_data.SFLY_DTL?.productDetails?.productName; pixel_data.skuCode = pixel_data.SFLY_DTL?.productDetails?.skuCode; pixel_data.escapedPagename = pixel_data.SFLY_DTL?.pageInfo?.pageName || "unknown page name"; customer_id = SFLY_DTL.session?.visitorDetails?.customerId; if (customer_id) { pixel_data.uid = SFLY_DTL.session?.visitorDetails?.customerId; pixel_data.userId = pixel_data.uid; pixel_data.visitorId = pixel_data.uid; } } catch (ex_var) { console.warn('error copying fields from SFLY_DTL'); } function setCookie(cname, cvalue, exdays) { const d = new Date(); d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000)); let expires = "expires=" + d.toUTCString(); document.cookie = cname + "=" + cvalue + ";" + expires + ";SameSite=None; secure; path=/"; } xmlhttp.onreadystatechange = function () { if (this.readyState == 4 && this.status == 200) { try { var cookie_name = 'pixel_browsing_uid' let ret_cookie = xmlhttp.getResponseHeader(cookie_name); if (ret_cookie) { setCookie(cookie_name, ret_cookie, 730); for (let i=0;i < cookies_logic.length;i++) { if (cookies_logic[i].condition()) { setCookie(cookies_logic[i].key, cookies_logic[i].value, cookies_logic[i].exp); } } } else { console.warn('beacon-pixel: ' + cookie_name + ' cant be found ' + ret_cookie); } } catch (ex_var) { console.warn('beacon-pixel: Failed to set ' + cookie_name + '.'); } } }; return pixel_data } let iterationCount = 0; let intervalId = setInterval(function() { let pixel_data = {} pixel_data = run_pixel(); // Check if data has been sent successfully if ((pixel_data['SFLY_DTL'].pageInfo && pixel_data['SFLY_DTL'].pageInfo.pageType !== 'other store pages') || iterationCount === 10) { xmlhttp.send(JSON.stringify(pixel_data)); clearInterval(intervalId); } iterationCount++; }, 1000); //v2022-08-22v2