roshanoracle
1/8/2020 - 12:09 PM

DMP > Optimizely : Async Method Integration Code : Library Handler

Copy and paste code to allow Optimizely to run with Asynchronous DMP Site Optimisation tag (JSON return)

// Oracle DMP > Optimizely Async handler

// CONFIG
window.bk_optimizely_helper = {};
window.bk_optimizely_helper.poll_intervals_ms = 50; // Set polling interval for checking
window.bk_optimizely_helper.checker_max_timeout_ms = 1000; // Set max timeout for checking bk_results (will unhide page after X ms)
window.bk_optimizely_helper.storer_max_timeout_ms = 5000; // Set max timeout for checking bk_results to store for later page views (will continue looking for DMP data to store in localStorage for X ms)


// DO NOT EDIT BELOW THIS LINE
window.bk_optimizely_helper.checker_poll_loop_max = window.bk_optimizely_helper.checker_max_timeout_ms / window.bk_optimizely_helper.poll_intervals_ms;
window.bk_optimizely_helper.storer_poll_loop_max = window.bk_optimizely_helper.storer_max_timeout_ms / window.bk_optimizely_helper.poll_intervals_ms;

// 1. Logger
window.bk_optimizely_helper.log = function(message) {
  if (document.location.href.toLowerCase().indexOf("dmp_debug=true") > -1) {
    console.log("DMP > OPTIMIZELY LOG : " + message);
  }
}

// 2. Hide Body until timeout or experiment ready
window.bk_optimizely_helper.page_hide = function() {

  var observer = new MutationObserver(function() {

    if (document.body) {

      window.bk_optimizely_helper.body_display_style = document.body.style.display;
      bk_optimizely_helper.log("initial body display style stored as 'bk_optimizely_helper.body_display_style='" + bk_optimizely_helper.body_display_style);
      document.body.style.display = "None";
      bk_optimizely_helper.log("Body Hidden until DMP Data found or " + window.bk_optimizely_helper.checker_max_timeout_ms + "ms exceeded");
      observer.disconnect();

    }
  });
  observer.observe(document.documentElement, {
    childList: true
  });
};

// 3. Page Unhider
window.bk_optimizely_helper.page_unhide = function(){
  document.body.style.display = window.bk_optimizely_helper.body_display_style;
  bk_optimizely_helper.log("Unhiding Page");
}

// 4. Oracle DMP LocalStorage Store Helper
window.bk_optimizely_helper.bk_results_localstorage_helper = function(grab_vs_store) {

  if (!window.localStorage) {

    bk_optimizely_helper.log("localStorage not supported - aborting");

    return {
      "localstorage": "not supported"
    };

  }

  // Store Data
  if (grab_vs_store === "store") {

    bk_optimizely_helper.log("Storing DMP Data in localStorage");

    localStorage.bk_results = JSON.stringify(bk_results);

  }

  // Store Data
  if (grab_vs_store === "grab") {

    bk_optimizely_helper.log("Pulling DMP Data from localStorage");

    if (localStorage.bk_results) {

      bk_optimizely_helper.log("Data found in localStorage - returning data");

      return JSON.parse(localStorage.bk_results);
    } else {

      bk_optimizely_helper.log("No data found in localStorage - returning {}");

      return {}
    }

  }

}

// 5. Oracle DMP Data Checker
window.bk_optimizely_helper.bk_results_checker = function() {  

  setTimeout(function() {

    // Check loop
    window.bk_optimizely_helper.checker_loop = window.bk_optimizely_helper.checker_loop || 1;
    window.bk_optimizely_helper.checker_loop++;

    // Revert to localStorage if loops exceeded
    if (window.bk_optimizely_helper.checker_loop > window.bk_optimizely_helper.checker_poll_loop_max) {

      bk_optimizely_helper.log("'bk_results' not found - reverting to localStorage");
      window.bk_results_cached = bk_optimizely_helper.bk_results_localstorage_helper("grab");

      // Set Experiment Flag that DMP data available
      window.dmp_data_available = true;
      bk_optimizely_helper.log("Setting Experiment Flag 'window.dmp_data_available=true'");

      // Unhide Page
      window.bk_optimizely_helper.page_unhide();

      // Begin Loop to check for DMP data and store in localStorage
      bk_optimizely_helper.log("Waiting " + window.bk_optimizely_helper.storer_max_timeout_ms + "ms for 'bk_results' to store in localStorage");

      window.bk_optimizely_helper.bk_results_storer();

    } else {

      // Check for DMP data
      if (window.bk_results) {

        // Set Experiment Flag that DMP data available
        window.dmp_data_available = true;
        bk_optimizely_helper.log("'bk_results' found - ready to run experiment if experiment poll has not timed out");
        bk_optimizely_helper.log("Setting Experiment Flag 'window.dmp_data_available=true'");

        // Unhide Page
        window.bk_optimizely_helper.page_unhide();

        // Dump data in LocalStorage
        bk_optimizely_helper.bk_results_localstorage_helper("store");

      } else {

        // Loop Again
        window.bk_optimizely_helper.bk_results_checker();

      }

    }

  }, window.bk_optimizely_helper.poll_intervals_ms);

}

// 5. Oracle DMP Data Storer
window.bk_optimizely_helper.bk_results_storer = function() {

  setTimeout(function() {

    // Check loop
    window.bk_optimizely_helper.storer_loop = window.bk_optimizely_helper.storer_loop || 1;
    window.bk_optimizely_helper.storer_loop++;

    // Abort if loop max exceeded
    if (window.bk_optimizely_helper.storer_loop > window.bk_optimizely_helper.storer_poll_loop_max) {

      bk_optimizely_helper.log("'bk_results' not found by storer - abort (nothing sent to localStorage)");
      return;

    } else {

      // Check for DMP data
      if (window.bk_results) {

        // Set Experiment Flag that DMP data available    
        bk_optimizely_helper.log("'bk_results' found - storing in localStorage for later use");

        // Dump data in LocalStorage
        bk_optimizely_helper.bk_results_localstorage_helper("store");

      } else {

        // Loop Again
        window.bk_optimizely_helper.bk_results_storer();

      }

    }

  }, window.bk_optimizely_helper.poll_intervals_ms);

}

// Hide Page 
bk_optimizely_helper.page_hide();

// Check for DMP data
bk_optimizely_helper.bk_results_checker();

// Config Logging
bk_optimizely_helper.log("Max DMP experiment wait time = " + window.bk_optimizely_helper.checker_max_timeout_ms + "ms");
bk_optimizely_helper.log("Max DMP localStorage wait time = " + window.bk_optimizely_helper.storer_max_timeout_ms  + "ms");